Advertisement
xiahanlu

快速显存拷贝

Jun 7th, 2018
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;**************************************************************************************************
  2. ;CSurfaceCopy32.asm - simple vram copy rountine [RGB32 or RGB24]
  3. ;same as memcpy, but add pitch - offset and height [Y scanline]
  4. ;
  5. ;Strategy:
  6. ; Small size copy
  7. ;       - easy, no care
  8. ; Source/target aligned or same address offset, num is align
  9. ;       - Simple, aligned copy or/corrent offset, copy it
  10. ; Source/target aligned or same address offset, num is unalign
  11. ;       - Simple, rep movsb it
  12. ;           [
  13. ;              Under certain conditions, Rep, movsd/movsb,
  14. ;              Rep, and stdsd/stdsb copy speeds equal to movq/movaps in SSE/MMX
  15. ;
  16. ;              % Move the entire cache line at once
  17. ;              % source address and destination address are aligned by 8
  18. ;              % increment is forward (clear direction sign)
  19. ;              % counter (ECX) is greater than or equal to 64
  20. ;              % The difference between *EDI and ESI is numerically greater than or equal to 32
  21. ;              % source memory and destination memory must be write back or combination write mode
  22. ;           ]
  23. ;
  24. ;       - For misaligned addresses, we can always convert to\
  25. ;           target alignment and the source is misaligned.
  26. ;            Read the two MEM block, and use the palignr assembler instructions \
  27. ;                   [http://www.felixcloutier.com/x86/PALIGNR.html] \
  28. ;          to fit the source operands aligned to the write,   \
  29. ;            for boundary access, #GP (0) exception may be generated. Please note   -   moecmks
  30. ;**************************************************************************************************
  31.  
  32.     .386
  33.     .mmx
  34.     .xmm
  35.     .model flat, c
  36.  
  37. ;; save stack frame [use default TEB chunk]
  38. ifdef __X86_32_
  39.     STF_SAVE  equ   0700h
  40. elseifdef __X86_WOW64_
  41.     STF_SAVE  equ   01ACh
  42. elseifdef __X86_64_
  43.     STF_SAVE  equ   02D0h
  44. else
  45.     STF_SAVE  equ   01ACh
  46. endif
  47. ;;  for prg-code align
  48.     ALIGN_Z   equ   align 16
  49.  
  50.     .code
  51. CSurfaceCopy32 proc C
  52.     option prologue:none, epilogue:none
  53.  
  54.     ;; esp + 4 <- target pointer
  55.     ;; esp + 8 <- target x
  56.     ;; esp + 12<- target y
  57.     ;; esp + 16<- target pitch
  58.     ;; esp + 20<- source pointer
  59.     ;; esp + 24<- source x
  60.     ;; esp + 28<- source y
  61.     ;; esp + 32<- source pitch
  62.     ;; esp + 36<- copy's width
  63.     ;; esp + 40<- copy's height
  64.  
  65.     push  esi
  66.     push  edi
  67.     push  ebx
  68.     push  ebp     ;; save  context  register  
  69. ; save  esp
  70.   assume  fs:nothing
  71.     mov   fs:[STF_SAVE], esp
  72.     cld
  73.    
  74.     ;; reloc  target start address
  75.     mov   edi,  [esp+4 + 16] ;; edi <- target pointer
  76.     mov   ebx,  [esp+8 + 16] ;; ebx <- target x  
  77.     mov   ecx,  [esp+12+ 16] ;; ecx <- target y
  78.     mov   edx,  [esp+16+ 16] ;; edx <- target pitch  
  79.    
  80.     test  edi,  edi          ;; null  pointer ?
  81.     jz    V_EXIT
  82.    
  83.     shl   ebx,  2  
  84.     add   edi,  ebx
  85.     imul  ecx,  edx
  86.     add   edi,  ecx          ;; edi <- target start pointer[save]
  87.    
  88.     ;; reloc  source start address
  89.     mov   esi,  [esp+20+ 16] ;; esi <- source pointer
  90.     mov   ebx,  [esp+24+ 16] ;; ebx <- source x  
  91.     mov   ecx,  [esp+28+ 16] ;; ecx <- source y
  92.     mov   ebp,  [esp+32+ 16] ;; ebp <- source pitch  
  93.    
  94.     test  esi,  esi          ;; null  pointer ?
  95.     jz    V_EXIT
  96.    
  97.     shl   ebx,  2  
  98.     add   esi,  ebx
  99.     imul  ecx,  ebp
  100.     add   esi,  ecx          ;; esi <- source start pointer[save]
  101.    
  102.     ;; get width/height, pitch RVA.
  103.     mov   ecx,  [esp+36 +16] ;; ecx <- width
  104.     mov   ebx,  [esp+40 +16] ;; ebx <- height
  105.    
  106.     test  ecx,  ecx          ;; width is ZERO ?
  107.     jz    V_EXIT
  108.    
  109.     test  ebx,  ebx          ;; height is ZERO ?
  110.     jz    V_EXIT
  111.    
  112.     lea   eax,  [ecx*4]
  113.     test  edx,      15       ;; check pitch align 16??
  114.     jne unAlignPitchWind
  115.     test  ebp,      15       ;;  check pitch align 16??
  116.     jne unAlignPitchWind  
  117.     sub   edx,  eax          ;; edx <- target pitch RVA
  118.     sub   ebp,  eax          ;; ebp <- source pitch RVA
  119.     mov   esp,  ecx
  120.    
  121.     ;; register dispatch
  122.     ;;
  123.     ;; eax <- none
  124.     ;; ebx <- height
  125.     ;; ecx <- width
  126.     ;; edx <- target pitch RVA
  127.     ;; ebp <- source pitch RVA
  128.     ;; edi <- target pointer
  129.     ;; esi <- source pointer  
  130.     ;; esp <- width
  131.    
  132.     ;  small size ???
  133.     ;---------------------------------------------------------------------------------------------
  134.         cmp   ecx,   31
  135.         ja    @F
  136.         jmp   dword ptr smallCopyRoutine[ecx*4]
  137.        
  138.         ; check align
  139.         ; ------------------------------------------------------------------------------
  140.         ALIGN_Z
  141.         @@:
  142.           mov   eax,  edi
  143.           mov   esp,  esi
  144.           and   eax,  1100b
  145.           and   esp,  1100b
  146.           shr   esp,    2 ;; DDSS
  147.           or    eax,  esp
  148.           mov   esp,  ecx
  149.           jmp   dword ptr chkAlignRoutine[eax*4]
  150.     ;  small size ???
  151.     ;---------------------------------------------------------------------------------------------
  152.     unAlignPitchWind:
  153.          sub   edx,  eax          ;; edx <- target pitch RVA
  154.          sub   ebp,  eax          ;; ebp <- source pitch RVA
  155.          mov   esp,  ecx
  156.          cmp   ecx,   31
  157.          ja    @F
  158.          jmp   dword ptr smallCopyRoutine[ecx*4]
  159.        
  160.         ; check align
  161.         ; ------------------------------------------------------------------------------
  162.         ALIGN_Z
  163.         @@:
  164.           mov   eax,  edi
  165.           mov   esp,  esi
  166.           and   eax,  1100b
  167.           and   esp,  1100b
  168.           shr   esp,    2 ;; DDSS
  169.           or    eax,  esp
  170.           mov   esp,  ecx
  171.           jmp   cAR_SXXX
  172.     ALIGN_Z  
  173. cAR_S0D0: ;; aligned 16 (TODO:SSE Unwind!!!)
  174.     test  ecx,  15
  175.     jz    cAR_A16_pure
  176.     sub   ecx,  16
  177.     sub   esp,  16
  178.     ALIGN_Z
  179. cAR_A16_dirty:
  180.     movdqa  xmm0,  [esi+000h]
  181.     movdqa  xmm1,  [esi+010h]
  182.     movdqa  xmm2,  [esi+020h]
  183.     movdqa  xmm3,  [esi+030h]
  184.    
  185.     ;; maybe use movntdqa/prefetch ??
  186.     movdqa  [edi+000h], xmm0
  187.     movdqa  [edi+010h], xmm1
  188.     movdqa  [edi+020h], xmm2
  189.     movdqa  [edi+030h], xmm3
  190.  
  191.     add   esi,  64
  192.     add   edi,  64
  193.     sub   ecx,  16
  194.     jg    cAR_A16_dirty  
  195.     add   ecx,  16
  196.   @@:
  197.     mov   eax,  [esi]
  198.     lea   esi,  [esi+4]
  199.     mov   [edi],  eax
  200.     dec   ecx
  201.     lea   edi,  [edi+4]  
  202.     jnz   @B    
  203.     add   esi,  ebp
  204.     add   edi,  edx  
  205.     mov   ecx,  esp
  206.     dec   ebx
  207.     jnz   cAR_A16_dirty
  208.     jmp   V_EXIT
  209.    
  210.     ALIGN_Z
  211. cAR_A16_pure:
  212.     movdqa  xmm0,  [esi+000h]
  213.     movdqa  xmm1,  [esi+010h]
  214.     movdqa  xmm2,  [esi+020h]
  215.     movdqa  xmm3,  [esi+030h]
  216.    
  217.     movdqa  [edi+000h], xmm0
  218.     movdqa  [edi+010h], xmm1
  219.     movdqa  [edi+020h], xmm2
  220.     movdqa  [edi+030h], xmm3
  221.  
  222.     add   esi,  64
  223.     add   edi,  64
  224.     sub   ecx,  16
  225.     jnz   cAR_A16_pure      
  226.     add   esi,  ebp
  227.     add   edi,  edx  
  228.     mov   ecx,  esp
  229.     dec   ebx
  230.     jnz   cAR_A16_pure
  231.     jmp   V_EXIT
  232.  
  233.     ALIGN_Z
  234. cAR_S0D8: ;; aligned 8
  235. cAR_S8D0: ;; aligned 8
  236. cAR_S8D8: ;; aligned 8
  237. cAR_SXXX:
  238.     test  ecx,  7
  239.     jz    cAR_A8_pure
  240.     sub   ecx,  8
  241.     sub   esp,  8
  242.     ALIGN_Z
  243. cAR_A8_dirty:
  244.     movq  mm0,  [esi+000h]
  245.     movq  mm1,  [esi+008h]
  246.     movq  mm2,  [esi+010h]
  247.     movq  mm3,  [esi+018h]
  248.    
  249.     movq  [edi+000h], mm0
  250.     movq  [edi+008h], mm1
  251.     movq  [edi+010h], mm2
  252.     movq  [edi+018h], mm3
  253.  
  254.     add   esi,  32
  255.     add   edi,  32
  256.     sub   ecx,   8
  257.     jg    cAR_A8_dirty  
  258.     add   ecx,   8
  259.   @@:
  260.     mov   eax,  [esi]
  261.     lea   esi,  [esi+4]
  262.     mov   [edi],  eax
  263.     dec   ecx
  264.     lea   edi,  [edi+4]  
  265.     jnz   @B    
  266.     add   esi,  ebp
  267.     add   edi,  edx  
  268.     mov   ecx,  esp
  269.     dec   ebx
  270.     jnz   cAR_A8_dirty
  271.     emms
  272.     jmp   V_EXIT
  273.    
  274.     ALIGN_Z
  275. cAR_A8_pure:
  276.     movq  mm0,  [esi+000h]
  277.     movq  mm1,  [esi+008h]
  278.     movq  mm2,  [esi+010h]
  279.     movq  mm3,  [esi+018h]
  280.    
  281.     movq  [edi+000h], mm0
  282.     movq  [edi+008h], mm1
  283.     movq  [edi+010h], mm2
  284.     movq  [edi+018h], mm3
  285.  
  286.     add   esi,  32
  287.     add   edi,  32
  288.     sub   ecx,   8
  289.     jnz   cAR_A8_pure      
  290.     add   esi,  ebp
  291.     add   edi,  edx  
  292.     mov   ecx,  esp
  293.     dec   ebx
  294.     jnz   cAR_A8_pure
  295.     emms
  296.     jmp   V_EXIT
  297.  
  298.     ALIGN_Z
  299. cAR_S4D4: ;; offset aligned one
  300. cAR_SCDC: ;; offset aligned one
  301. cAR_S4DC: ;; offset aligned one
  302. cAR_SCD4: ;; offset aligned one
  303.     lea   eax,  [esp]
  304.     neg   eax
  305.     sub   esp,  1
  306.     test  esp,  7  
  307.     lea   esi,  [esi+4]
  308.     lea   edi,  [edi+4]
  309.     lea   edx,  [edx+4]
  310.     lea   ebp,  [ebp+4]
  311.     mov   ecx,  esp
  312.     jz    cAR_A8cc_pure
  313.     sub   esp,  8
  314.     mov   ecx,  esp  
  315.     ALIGN_Z
  316. cAR_A8cc_dirty:
  317.     movq  mm0,  [esi+000h]
  318.     movq  mm1,  [esi+008h]
  319.     movq  mm2,  [esi+010h]
  320.     movq  mm3,  [esi+018h]
  321.    
  322.     movq  [edi+000h], mm0
  323.     movq  [edi+008h], mm1
  324.     movq  [edi+010h], mm2
  325.     movq  [edi+018h], mm3
  326.  
  327.     add   esi,  32
  328.     add   edi,  32
  329.     sub   ecx,   8
  330.     jg    cAR_A8cc_dirty
  331.     add   ecx,   8
  332.   @@:
  333.     mov   eax,  [esi]
  334.     lea   esi,  [esi+4]
  335.     mov   [edi],  eax
  336.     dec   ecx
  337.     lea   edi,  [edi+4]  
  338.     jnz   @B    
  339.     lea   eax,  [esp+8+1]
  340.     neg   eax
  341.     mov   ecx,  [esi+eax*4]
  342.     add   esi,  ebp
  343.     mov   [edi+eax*4],  ecx
  344.     mov   ecx,  esp
  345.     add   edi,  edx  
  346.     mov   eax,  eax ;; spare  
  347.     dec   ebx
  348.     jnz   cAR_A8cc_dirty
  349.     emms
  350.     jmp   V_EXIT
  351.    
  352.     ALIGN_Z
  353. cAR_A8cc_pure:
  354.     movq  mm0,  [esi+000h]
  355.     movq  mm1,  [esi+008h]
  356.     movq  mm2,  [esi+010h]
  357.     movq  mm3,  [esi+018h]
  358.    
  359.     movq  [edi+000h], mm0
  360.     movq  [edi+008h], mm1
  361.     movq  [edi+010h], mm2
  362.     movq  [edi+018h], mm3
  363.  
  364.     add   esi,  32
  365.     add   edi,  32
  366.     sub   ecx,   8
  367.     jnz   cAR_A8cc_pure  
  368.     mov   ecx,  [esi+eax*4]    
  369.     add   esi,  ebp
  370.     mov   [edi+eax*4],  ecx
  371.     mov   ecx,  esp
  372.     add   edi,  edx
  373.     mov   eax,  eax  
  374.     dec   ebx
  375.     jnz   cAR_A8cc_pure
  376.     emms
  377.     jmp   V_EXIT
  378.  
  379.     ALIGN_Z
  380. cAR_S4D0: ;; ========================= target aligned 16- SYS-4 level %
  381.     movdqa  xmm0,   [esi-04H]
  382.     test  ecx,  15
  383.     jz    cAR_S4D0_pure
  384.     sub   ecx,  16
  385.     sub   esp,  16
  386.     ALIGN_Z
  387.   cAR_S4D0_dirty:
  388.     movdqa  xmm1,   [esi-04H+010h]
  389.     movdqa  xmm2,   [esi-04H+020h]
  390.     movdqa  xmm3,   [esi-04H+030h]    
  391.     movdqa  xmm4,   [esi-04H+040h]  
  392.      
  393.     movdqa  xmm7,   xmm4
  394.     palignr xmm4,   xmm3,   4     ;; fit, <-xmm4 <-target[3]
  395.     palignr xmm3,   xmm2,   4     ;; fit, <-xmm3 <-target[2]
  396.     palignr xmm2,   xmm1,   4     ;; fit, <-xmm2 <-target[1]  
  397.     palignr xmm1,   xmm0,   4     ;; fit, <-xmm1 <-target[0]  
  398.     movdqa  xmm0,   xmm7
  399.  
  400.     ;; write back buffer
  401.     movdqa  [edi+000h],  xmm1
  402.     movdqa  [edi+010h],  xmm2
  403.     movdqa  [edi+020h],  xmm3
  404.     movdqa  [edi+030h],  xmm4    
  405.    
  406.     add   esi,  64
  407.     add   edi,  64
  408.     sub   ecx,  16
  409.     jg    cAR_S4D0_dirty
  410.     add   ecx,  16
  411.   @@:
  412.     mov   eax,  [esi]
  413.     lea   esi,  [esi+4]
  414.     mov   [edi],  eax
  415.     dec   ecx
  416.     lea   edi,  [edi+4]  
  417.     jnz   @B      
  418.     add   esi,  ebp
  419.     add   edi,  edx  
  420.     mov   ecx,  esp
  421.     dec   ebx
  422.     movdqa  xmm0,   [esi-04H]
  423.     jnz   cAR_S4D0_dirty
  424.     jmp   V_EXIT
  425.      
  426.    ;--------------------------------------------------------------------
  427.     ALIGN_Z
  428.   cAR_S4D0_pure:  
  429.     movdqa  xmm1,   [esi-04H+010h]
  430.     movdqa  xmm2,   [esi-04H+020h]
  431.     movdqa  xmm3,   [esi-04H+030h]    
  432.     movdqa  xmm4,   [esi-04H+040h]
  433.    
  434.     movdqa  xmm7,   xmm4
  435.     palignr xmm4,   xmm3,   4     ;; fit, <-xmm4 <-target[3]
  436.     palignr xmm3,   xmm2,   4     ;; fit, <-xmm3 <-target[2]
  437.     palignr xmm2,   xmm1,   4     ;; fit, <-xmm2 <-target[1]  
  438.     palignr xmm1,   xmm0,   4     ;; fit, <-xmm1 <-target[0]  
  439.     movdqa  xmm0,   xmm7      
  440.  
  441.     ;; write back buffer
  442.     movdqa  [edi+000h],  xmm1
  443.     movdqa  [edi+010h],  xmm2
  444.     movdqa  [edi+020h],  xmm3
  445.     movdqa  [edi+030h],  xmm4    
  446.    
  447.     add   esi,  64
  448.     add   edi,  64
  449.     sub   ecx,  16
  450.     jnz   cAR_S4D0_pure      
  451.     add   esi,  ebp
  452.     add   edi,  edx  
  453.     mov   ecx,  esp
  454.     dec   ebx
  455.     movdqa  xmm0,   [esi-04H]
  456.     jnz   cAR_S4D0_pure
  457.     jmp   V_EXIT
  458.  
  459.     ALIGN_Z    
  460. cAR_S0DC: ;; unaligned ================================== SYS-4 level 1 BUG
  461.    
  462.     movdqa  xmm0,   [esi]
  463.     lea   eax,  [esp]
  464.     neg   eax
  465.     sub   esp,  1
  466.     test  esp,  15
  467.     lea   esi,  [esi+4]
  468.     lea   edi,  [edi+4]
  469.     lea   edx,  [edx+4]
  470.     lea   ebp,  [ebp+4]
  471.     mov   ecx,  esp
  472.     jz    cAR_S0DC_pure
  473.     sub   esp,  16
  474.     mov   ecx,  esp      
  475.     ALIGN_Z
  476.   cAR_S0DC_dirty:
  477.     movdqa  xmm1,   [esi-04H+010h]
  478.     movdqa  xmm2,   [esi-04H+020h]
  479.     movdqa  xmm3,   [esi-04H+030h]    
  480.     movdqa  xmm4,   [esi-04H+040h]
  481.    
  482.     movdqa  xmm7,   xmm4
  483.     palignr xmm4,   xmm3,    4    ;; fit, <-xmm4 <-target[3]
  484.     palignr xmm3,   xmm2,    4    ;; fit, <-xmm3 <-target[2]
  485.     palignr xmm2,   xmm1,    4    ;; fit, <-xmm2 <-target[1]  
  486.     palignr xmm1,   xmm0,    4    ;; fit, <-xmm1 <-target[0]  
  487.     movdqa  xmm0,   xmm7      
  488.  
  489.     ;; write back buffer
  490.     movdqa  [edi+000h],  xmm1
  491.     movdqa  [edi+010h],  xmm2
  492.     movdqa  [edi+020h],  xmm3
  493.     movdqa  [edi+030h],  xmm4    
  494.    
  495.     add   esi,  64
  496.     add   edi,  64
  497.     sub   ecx,  16
  498.     jg    cAR_S0DC_dirty
  499.     add   ecx,  16
  500.   @@:
  501.     mov   eax,  [esi]
  502.     lea   esi,  [esi+4]
  503.     mov   [edi],  eax
  504.     dec   ecx
  505.     lea   edi,  [edi+4]  
  506.     jnz   @B
  507.     lea   eax,  [esp+16+1]
  508.     neg   eax
  509.     mov   ecx,  [esi+eax*4]
  510.     add   esi,  ebp
  511.     mov   [edi+eax*4],  ecx
  512.     mov   ecx,  esp
  513.     add   edi,  edx  
  514.     mov   eax,  eax ;; spare  
  515.     dec   ebx
  516.     movdqa  xmm0,   [esi-04H]
  517.     jnz   cAR_S0DC_dirty
  518.     jmp   V_EXIT  
  519.        
  520.   cAR_S0DC_pure:
  521.     movdqa  xmm1,   [esi-04H+010h]
  522.     movdqa  xmm2,   [esi-04H+020h]
  523.     movdqa  xmm3,   [esi-04H+030h]    
  524.     movdqa  xmm4,   [esi-04H+040h]
  525.    
  526.     movdqa  xmm7,   xmm4
  527.     palignr xmm4,   xmm3,    4    ;; fit, <-xmm4 <-target[3]
  528.     palignr xmm3,   xmm2,    4    ;; fit, <-xmm3 <-target[2]
  529.     palignr xmm2,   xmm1,    4    ;; fit, <-xmm2 <-target[1]  
  530.     palignr xmm1,   xmm0,    4    ;; fit, <-xmm1 <-target[0]  
  531.     movdqa  xmm0,   xmm7      
  532.  
  533.     ;; write back buffer
  534.     movdqa  [edi+000h],  xmm1
  535.     movdqa  [edi+010h],  xmm2
  536.     movdqa  [edi+020h],  xmm3
  537.     movdqa  [edi+030h],  xmm4    
  538.    
  539.     add   esi,  64
  540.     add   edi,  64
  541.     sub   ecx,  16
  542.     jnz   cAR_S0DC_pure
  543.     mov   ecx,  [esi+eax*4]
  544.     add   esi,  ebp
  545.     mov   [edi+eax*4],  ecx
  546.     mov   ecx,  esp
  547.     add   edi,  edx  
  548.     mov   eax,  eax ;; spare  
  549.     dec   ebx
  550.     movdqa  xmm0,   [esi-04H]
  551.     jnz   cAR_S0DC_pure
  552.     jmp   V_EXIT  
  553.  
  554. cAR_SCD8: ;; unaligned ================================== SYS-4 level 2
  555.  
  556.     movdqa  xmm0,   [esi+4h]
  557.     lea   eax,  [esp]
  558.     neg   eax
  559.     sub   esp,  2
  560.     test  esp,  15
  561.     lea   esi,  [esi+8]
  562.     lea   edi,  [edi+8]
  563.     lea   edx,  [edx+8]
  564.     lea   ebp,  [ebp+8]
  565.     mov   ecx,  esp
  566.     jz    cAR_SCD8_pure
  567.     sub   esp,  16
  568.     mov   ecx,  esp      
  569.     ALIGN_Z
  570.   cAR_SCD8_dirty:
  571.     movdqa  xmm1,   [esi-04H+010h]
  572.     movdqa  xmm2,   [esi-04H+020h]
  573.     movdqa  xmm3,   [esi-04H+030h]    
  574.     movdqa  xmm4,   [esi-04H+040h]
  575.    
  576.     movdqa  xmm7,   xmm4
  577.     palignr xmm4,   xmm3,    4    ;; fit, <-xmm4 <-target[3]
  578.     palignr xmm3,   xmm2,    4    ;; fit, <-xmm3 <-target[2]
  579.     palignr xmm2,   xmm1,    4    ;; fit, <-xmm2 <-target[1]  
  580.     palignr xmm1,   xmm0,    4    ;; fit, <-xmm1 <-target[0]  
  581.     movdqa  xmm0,   xmm7      
  582.  
  583.     ;; write back buffer
  584.     movdqa  [edi+000h],  xmm1
  585.     movdqa  [edi+010h],  xmm2
  586.     movdqa  [edi+020h],  xmm3
  587.     movdqa  [edi+030h],  xmm4    
  588.    
  589.     add   esi,  64
  590.     add   edi,  64
  591.     sub   ecx,  16
  592.     jg    cAR_SCD8_dirty
  593.     add   ecx,  16
  594.   @@:
  595.     mov   eax,  [esi]
  596.     lea   esi,  [esi+4]
  597.     mov   [edi],  eax
  598.     dec   ecx
  599.     lea   edi,  [edi+4]  
  600.     jnz   @B
  601.     lea   eax,  [esp+16+2]
  602.     neg   eax
  603.     mov   ecx,  [esi+eax*4]
  604.     mov   [edi+eax*4],  ecx
  605.     mov   ecx,  [esi+eax*4+4]
  606.     mov   [edi+eax*4+4],  ecx
  607.     add   esi,  ebp
  608.     mov   ecx,  esp
  609.     add   edi,  edx  
  610.     mov   eax,  eax ;; spare  
  611.     dec   ebx
  612.     movdqa  xmm0,   [esi-04H]
  613.     jnz   cAR_SCD8_dirty
  614.     jmp   V_EXIT  
  615.        
  616.   cAR_SCD8_pure:
  617.     movdqa  xmm1,   [esi-04H+010h]
  618.     movdqa  xmm2,   [esi-04H+020h]
  619.     movdqa  xmm3,   [esi-04H+030h]    
  620.     movdqa  xmm4,   [esi-04H+040h]
  621.    
  622.     movdqa  xmm7,   xmm4
  623.     palignr xmm4,   xmm3,    4    ;; fit, <-xmm4 <-target[3]
  624.     palignr xmm3,   xmm2,    4    ;; fit, <-xmm3 <-target[2]
  625.     palignr xmm2,   xmm1,    4    ;; fit, <-xmm2 <-target[1]  
  626.     palignr xmm1,   xmm0,    4    ;; fit, <-xmm1 <-target[0]  
  627.     movdqa  xmm0,   xmm7      
  628.  
  629.     ;; write back buffer
  630.     movdqa  [edi+000h],  xmm1
  631.     movdqa  [edi+010h],  xmm2
  632.     movdqa  [edi+020h],  xmm3
  633.     movdqa  [edi+030h],  xmm4    
  634.    
  635.     add   esi,  64
  636.     add   edi,  64
  637.     sub   ecx,  16
  638.     jnz   cAR_SCD8_pure
  639.     mov   ecx,  [esi+eax*4]
  640.     mov   [edi+eax*4],  ecx
  641.     mov   ecx,  [esi+eax*4+4]
  642.     mov   [edi+eax*4+4],  ecx
  643.     add   esi,  ebp
  644.     mov   ecx,  esp
  645.     add   edi,  edx  
  646.     mov   eax,  eax ;; spare  
  647.     dec   ebx
  648.     movdqa  xmm0,   [esi-04H]
  649.     jnz   cAR_SCD8_pure
  650.     jmp   V_EXIT  
  651.  
  652.  
  653. cAR_S8D4: ;; unaligned ================================== SYS-4 level 3
  654.     movdqa  xmm0,   [esi+8h]
  655.     lea   eax,  [esp]
  656.     neg   eax
  657.     sub   esp,  3
  658.     test  esp,  15
  659.     lea   esi,  [esi+12]
  660.     lea   edi,  [edi+12]
  661.     lea   edx,  [edx+12]
  662.     lea   ebp,  [ebp+12]
  663.     mov   ecx,  esp
  664.     jz    cAR_S8D4_pure
  665.     sub   esp,  16
  666.     mov   ecx,  esp      
  667.     ALIGN_Z
  668.   cAR_S8D4_dirty:
  669.     movdqa  xmm1,   [esi-04H+010h]
  670.     movdqa  xmm2,   [esi-04H+020h]
  671.     movdqa  xmm3,   [esi-04H+030h]    
  672.     movdqa  xmm4,   [esi-04H+040h]
  673.    
  674.     movdqa  xmm7,   xmm4
  675.     palignr xmm4,   xmm3,    4    ;; fit, <-xmm4 <-target[3]
  676.     palignr xmm3,   xmm2,    4    ;; fit, <-xmm3 <-target[2]
  677.     palignr xmm2,   xmm1,    4    ;; fit, <-xmm2 <-target[1]  
  678.     palignr xmm1,   xmm0,    4    ;; fit, <-xmm1 <-target[0]  
  679.     movdqa  xmm0,   xmm7      
  680.  
  681.     ;; write back buffer
  682.     movdqa  [edi+000h],  xmm1
  683.     movdqa  [edi+010h],  xmm2
  684.     movdqa  [edi+020h],  xmm3
  685.     movdqa  [edi+030h],  xmm4    
  686.    
  687.     add   esi,  64
  688.     add   edi,  64
  689.     sub   ecx,  16
  690.     jg    cAR_S8D4_dirty
  691.     add   ecx,  16
  692.   @@:
  693.     mov   eax,  [esi]
  694.     lea   esi,  [esi+4]
  695.     mov   [edi],  eax
  696.     dec   ecx
  697.     lea   edi,  [edi+4]  
  698.     jnz   @B
  699.     lea   eax,  [esp+16+3]
  700.     neg   eax
  701.     mov   ecx,  [esi+eax*4]
  702.     mov   [edi+eax*4],  ecx
  703.     mov   ecx,  [esi+eax*4+4]
  704.     mov   [edi+eax*4+4],  ecx
  705.     mov   ecx,  [esi+eax*4+8]
  706.     mov   [edi+eax*4+8],  ecx
  707.     add   esi,  ebp
  708.     mov   ecx,  esp
  709.     add   edi,  edx  
  710.     mov   eax,  eax ;; spare  
  711.     dec   ebx
  712.     movdqa  xmm0,   [esi-04H]
  713.     jnz   cAR_S8D4_dirty
  714.     jmp   V_EXIT  
  715.        
  716.   cAR_S8D4_pure:
  717.     movdqa  xmm1,   [esi-04H+010h]
  718.     movdqa  xmm2,   [esi-04H+020h]
  719.     movdqa  xmm3,   [esi-04H+030h]    
  720.     movdqa  xmm4,   [esi-04H+040h]
  721.    
  722.     movdqa  xmm7,   xmm4
  723.     palignr xmm4,   xmm3,    4    ;; fit, <-xmm4 <-target[3]
  724.     palignr xmm3,   xmm2,    4    ;; fit, <-xmm3 <-target[2]
  725.     palignr xmm2,   xmm1,    4    ;; fit, <-xmm2 <-target[1]  
  726.     palignr xmm1,   xmm0,    4    ;; fit, <-xmm1 <-target[0]  
  727.     movdqa  xmm0,   xmm7      
  728.  
  729.     ;; write back buffer
  730.     movdqa  [edi+000h],  xmm1
  731.     movdqa  [edi+010h],  xmm2
  732.     movdqa  [edi+020h],  xmm3
  733.     movdqa  [edi+030h],  xmm4    
  734.    
  735.     add   esi,  64
  736.     add   edi,  64
  737.     sub   ecx,  16
  738.     jnz   cAR_S8D4_pure
  739.     mov   ecx,  [esi+eax*4]
  740.     mov   [edi+eax*4],  ecx
  741.     mov   ecx,  [esi+eax*4+4]
  742.     mov   [edi+eax*4+4],  ecx
  743.     mov   ecx,  [esi+eax*4+8]
  744.     mov   [edi+eax*4+8],  ecx
  745.     add   esi,  ebp
  746.     mov   ecx,  esp
  747.     add   edi,  edx  
  748.     mov   eax,  eax ;; spare  
  749.     dec   ebx
  750.     movdqa  xmm0,   [esi-04H]
  751.     jnz   cAR_S8D4_pure
  752.     jmp   V_EXIT  
  753.  
  754.  
  755. cAR_SCD0: ;; target aligned 16 ========================== SYS-C level %
  756.     movdqa  xmm0,   [esi-0CH]
  757.     test  ecx,  15
  758.     jz    cAR_SCD0_pure  
  759.     sub   ecx,  16
  760.     mov   esp,  ecx
  761.     ALIGN_Z
  762.   cAR_SCD0_dirty:
  763.     movdqa  xmm1,   [esi-0CH+010h]
  764.     movdqa  xmm2,   [esi-0CH+020h]
  765.     movdqa  xmm3,   [esi-0CH+030h]    
  766.     movdqa  xmm4,   [esi-0CH+040h]
  767.    
  768.     movdqa  xmm7,   xmm4
  769.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  770.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  771.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  772.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  773.     movdqa  xmm0,   xmm7      
  774.  
  775.     ;; write back buffer
  776.     movdqa  [edi+000h],  xmm1
  777.     movdqa  [edi+010h],  xmm2
  778.     movdqa  [edi+020h],  xmm3
  779.     movdqa  [edi+030h],  xmm4    
  780.    
  781.     add   esi,  64
  782.     add   edi,  64
  783.     sub   ecx,  16
  784.     jg    cAR_SCD0_dirty
  785.     add   ecx,  16
  786.   @@:
  787.     mov   eax,  [esi]
  788.     lea   esi,  [esi+4]
  789.     mov   [edi],  eax
  790.     dec   ecx
  791.     lea   edi,  [edi+4]  
  792.     jnz   @B    
  793.     add   esi,  ebp
  794.     add   edi,  edx  
  795.     mov   ecx,  esp
  796.     dec   ebx
  797.     movdqa  xmm0,   [esi-0CH]
  798.     jnz   cAR_SCD0_dirty
  799.     jmp   V_EXIT
  800.    ;--------------------------------------------------------------------
  801.     ALIGN_Z
  802.   cAR_SCD0_pure:  
  803.     movdqa  xmm1,   [esi-0CH+010h]
  804.     movdqa  xmm2,   [esi-0CH+020h]
  805.     movdqa  xmm3,   [esi-0CH+030h]    
  806.     movdqa  xmm4,   [esi-0CH+040h]
  807.    
  808.     movdqa  xmm7,   xmm4
  809.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  810.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  811.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  812.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  813.     movdqa  xmm0,   xmm7      
  814.  
  815.     ;; write back buffer
  816.     movdqa  [edi+000h],  xmm1
  817.     movdqa  [edi+010h],  xmm2
  818.     movdqa  [edi+020h],  xmm3
  819.     movdqa  [edi+030h],  xmm4  
  820.    
  821.     add   esi,  64
  822.     add   edi,  64
  823.     sub   ecx,  16
  824.     jnz   cAR_SCD0_pure      
  825.     add   esi,  ebp
  826.     add   edi,  edx  
  827.     mov   ecx,  esp
  828.     dec   ebx
  829.     movdqa  xmm0,   [esi-0CH]
  830.     jnz   cAR_SCD0_pure
  831.     jmp   V_EXIT
  832.  
  833.  
  834. cAR_S8DC: ;; unaligned ================================== SYS-C level 1 BUG
  835.     movdqa  xmm0,   [esi-08h]
  836.     lea   eax,  [esp]
  837.     neg   eax
  838.     sub   esp,  1
  839.     test  esp,  15
  840.     lea   esi,  [esi+4]
  841.     lea   edi,  [edi+4]
  842.     lea   edx,  [edx+4]
  843.     lea   ebp,  [ebp+4]
  844.     mov   ecx,  esp
  845.     jz    cAR_S8DC_pure
  846.     sub   esp,  16
  847.     mov   ecx,  esp      
  848.     ALIGN_Z
  849.   cAR_S8DC_dirty:
  850.     movdqa  xmm1,   [esi-0CH+010h]
  851.     movdqa  xmm2,   [esi-0CH+020h]
  852.     movdqa  xmm3,   [esi-0CH+030h]    
  853.     movdqa  xmm4,   [esi-0CH+040h]
  854.    
  855.     movdqa  xmm7,   xmm4
  856.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  857.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  858.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  859.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  860.     movdqa  xmm0,   xmm7      
  861.  
  862.     ;; write back buffer
  863.     movdqa  [edi+000h],  xmm1
  864.     movdqa  [edi+010h],  xmm2
  865.     movdqa  [edi+020h],  xmm3
  866.     movdqa  [edi+030h],  xmm4    
  867.    
  868.     add   esi,  64
  869.     add   edi,  64
  870.     sub   ecx,  16
  871.     jg    cAR_S8DC_dirty
  872.     add   ecx,  16
  873.   @@:
  874.     mov   eax,  [esi]
  875.     lea   esi,  [esi+4]
  876.     mov   [edi],  eax
  877.     dec   ecx
  878.     lea   edi,  [edi+4]  
  879.     jnz   @B
  880.     lea   eax,  [esp+16+1]
  881.     neg   eax
  882.     mov   ecx,  [esi+eax*4]
  883.     add   esi,  ebp
  884.     mov   [edi+eax*4],  ecx
  885.     mov   ecx,  esp
  886.     add   edi,  edx  
  887.     mov   eax,  eax ;; spare  
  888.     dec   ebx
  889.     movdqa  xmm0,   [esi-0CH]
  890.     jnz   cAR_S8DC_dirty
  891.     jmp   V_EXIT  
  892.        
  893.   cAR_S8DC_pure:
  894.     movdqa  xmm1,   [esi-0CH+010h]
  895.     movdqa  xmm2,   [esi-0CH+020h]
  896.     movdqa  xmm3,   [esi-0CH+030h]    
  897.     movdqa  xmm4,   [esi-0CH+040h]
  898.    
  899.     movdqa  xmm7,   xmm4
  900.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  901.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  902.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  903.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  904.     movdqa  xmm0,   xmm7      
  905.  
  906.     ;; write back buffer
  907.     movdqa  [edi+000h],  xmm1
  908.     movdqa  [edi+010h],  xmm2
  909.     movdqa  [edi+020h],  xmm3
  910.     movdqa  [edi+030h],  xmm4    
  911.    
  912.     add   esi,  64
  913.     add   edi,  64
  914.     sub   ecx,  16
  915.     jnz   cAR_S8DC_pure
  916.     mov   ecx,  [esi+eax*4]
  917.     add   esi,  ebp
  918.     mov   [edi+eax*4],  ecx
  919.     mov   ecx,  esp
  920.     add   edi,  edx  
  921.     mov   eax,  eax ;; spare  
  922.     dec   ebx
  923.     movdqa  xmm0,   [esi-0CH]
  924.     jnz   cAR_S8DC_pure
  925.     jmp   V_EXIT
  926.  
  927. cAR_S4D8: ;; unaligned ================================== SYS-C level 2
  928.  
  929.     movdqa  xmm0,   [esi-04H]
  930.     lea   eax,  [esp]
  931.     neg   eax
  932.     sub   esp,  2
  933.     test  esp,  15
  934.     lea   esi,  [esi+8]
  935.     lea   edi,  [edi+8]
  936.     lea   ebp,  [ebp+8]
  937.     lea   edx,  [edx+8]
  938.     mov   ecx,  esp
  939.     jz    cAR_S4D8_pure
  940.     sub   esp,  16
  941.     mov   ecx,  esp      
  942.     ALIGN_Z
  943.   cAR_S4D8_dirty:
  944.     movdqa  xmm1,   [esi-0CH+010h]
  945.     movdqa  xmm2,   [esi-0CH+020h]
  946.     movdqa  xmm3,   [esi-0CH+030h]    
  947.     movdqa  xmm4,   [esi-0CH+040h]
  948.    
  949.     movdqa  xmm7,   xmm4
  950.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  951.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  952.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  953.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  954.     movdqa  xmm0,   xmm7      
  955.  
  956.     ;; write back buffer
  957.     movdqa  [edi+000h],  xmm1
  958.     movdqa  [edi+010h],  xmm2
  959.     movdqa  [edi+020h],  xmm3
  960.     movdqa  [edi+030h],  xmm4    
  961.    
  962.     add   esi,  64
  963.     add   edi,  64
  964.     sub   ecx,  16
  965.     jg    cAR_S4D8_dirty
  966.     add   ecx,  16
  967.   @@:
  968.     mov   eax,  [esi]
  969.     lea   esi,  [esi+4]
  970.     mov   [edi],  eax
  971.     dec   ecx
  972.     lea   edi,  [edi+4]  
  973.     jnz   @B
  974.     lea   eax,  [esp+16+2]
  975.     neg   eax
  976.     mov   ecx,  [esi+eax*4]
  977.     mov   [edi+eax*4],  ecx
  978.     mov   ecx,  [esi+eax*4+4]
  979.     mov   [edi+eax*4+4],  ecx
  980.     add   esi,  ebp
  981.     mov   ecx,  esp
  982.     add   edi,  edx  
  983.     dec   ebx
  984.     movdqa  xmm0,   [esi-0CH]
  985.     jnz   cAR_S4D8_dirty
  986.     jmp   V_EXIT  
  987.      
  988.   cAR_S4D8_pure:
  989.     movdqa  xmm1,   [esi-0CH+010h]
  990.     movdqa  xmm2,   [esi-0CH+020h]
  991.     movdqa  xmm3,   [esi-0CH+030h]    
  992.     movdqa  xmm4,   [esi-0CH+040h]
  993.    
  994.     movdqa  xmm7,   xmm4
  995.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  996.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  997.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  998.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  999.     movdqa  xmm0,   xmm7      
  1000.  
  1001.     ;; write back buffer
  1002.     movdqa  [edi+000h],  xmm1
  1003.     movdqa  [edi+010h],  xmm2
  1004.     movdqa  [edi+020h],  xmm3
  1005.     movdqa  [edi+030h],  xmm4    
  1006.    
  1007.     add   esi,  64
  1008.     add   edi,  64
  1009.     sub   ecx,  16
  1010.     jnz   cAR_S4D8_pure
  1011.     mov   ecx,  [esi+eax*4]
  1012.     mov   [edi+eax*4],  ecx
  1013.     mov   ecx,  [esi+eax*4+4]
  1014.     mov   [edi+eax*4+4],  ecx
  1015.     add   esi,  ebp
  1016.     mov   ecx,  esp
  1017.     add   edi,  edx  
  1018.     dec   ebx
  1019.     movdqa  xmm0,   [esi-0CH]
  1020.     jnz   cAR_S4D8_pure
  1021.     jmp   V_EXIT
  1022.  
  1023. cAR_S0D4: ;; unaligned ================================== SYS-C level 3
  1024.  
  1025.     movdqa  xmm0,   [esi]
  1026.     lea   eax,  [esp]
  1027.     neg   eax
  1028.     sub   esp,  3
  1029.     test  esp,  15
  1030.     lea   esi,  [esi+12]
  1031.     lea   edi,  [edi+12]
  1032.     lea   ebp,  [ebp+12]
  1033.     lea   edx,  [edx+12]
  1034.     mov   ecx,  esp
  1035.     jz    cAR_S0D4_pure
  1036.     sub   esp,  16
  1037.     mov   ecx,  esp      
  1038.     ALIGN_Z
  1039.   cAR_S0D4_dirty:
  1040.     movdqa  xmm1,   [esi-0CH+010h]
  1041.     movdqa  xmm2,   [esi-0CH+020h]
  1042.     movdqa  xmm3,   [esi-0CH+030h]    
  1043.     movdqa  xmm4,   [esi-0CH+040h]
  1044.    
  1045.     movdqa  xmm7,   xmm4
  1046.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  1047.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  1048.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  1049.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  1050.     movdqa  xmm0,   xmm7      
  1051.  
  1052.     ;; write back buffer
  1053.     movdqa  [edi+000h],  xmm1
  1054.     movdqa  [edi+010h],  xmm2
  1055.     movdqa  [edi+020h],  xmm3
  1056.     movdqa  [edi+030h],  xmm4    
  1057.    
  1058.     add   esi,  64
  1059.     add   edi,  64
  1060.     sub   ecx,  16
  1061.     jg    cAR_S0D4_dirty
  1062.     add   ecx,  16
  1063.   @@:
  1064.     mov   eax,  [esi]
  1065.     lea   esi,  [esi+4]
  1066.     mov   [edi],  eax
  1067.     dec   ecx
  1068.     lea   edi,  [edi+4]  
  1069.     jnz   @B
  1070.     lea   eax,  [esp+16+3]
  1071.     neg   eax
  1072.     mov   ecx,  [esi+eax*4]
  1073.     mov   [edi+eax*4],  ecx
  1074.     mov   ecx,  [esi+eax*4+4]
  1075.     mov   [edi+eax*4+4],  ecx
  1076.     mov   ecx,  [esi+eax*4+8]
  1077.     mov   [edi+eax*4+8],  ecx
  1078.     add   esi,  ebp
  1079.     mov   ecx,  esp
  1080.     add   edi,  edx  
  1081.     dec   ebx
  1082.     movdqa  xmm0,   [esi-0CH]
  1083.     jnz   cAR_S0D4_dirty
  1084.     jmp   V_EXIT  
  1085.      
  1086.   cAR_S0D4_pure:
  1087.     movdqa  xmm1,   [esi-0CH+010h]
  1088.     movdqa  xmm2,   [esi-0CH+020h]
  1089.     movdqa  xmm3,   [esi-0CH+030h]    
  1090.     movdqa  xmm4,   [esi-0CH+040h]
  1091.    
  1092.     movdqa  xmm7,   xmm4
  1093.     palignr xmm4,   xmm3,   12    ;; fit, <-xmm4 <-target[3]
  1094.     palignr xmm3,   xmm2,   12    ;; fit, <-xmm3 <-target[2]
  1095.     palignr xmm2,   xmm1,   12    ;; fit, <-xmm2 <-target[1]  
  1096.     palignr xmm1,   xmm0,   12    ;; fit, <-xmm1 <-target[0]  
  1097.     movdqa  xmm0,   xmm7      
  1098.  
  1099.     ;; write back buffer
  1100.     movdqa  [edi+000h],  xmm1
  1101.     movdqa  [edi+010h],  xmm2
  1102.     movdqa  [edi+020h],  xmm3
  1103.     movdqa  [edi+030h],  xmm4    
  1104.    
  1105.     add   esi,  64
  1106.     add   edi,  64
  1107.     sub   ecx,  16
  1108.     jnz   cAR_S0D4_pure
  1109.     mov   ecx,  [esi+eax*4]
  1110.     mov   [edi+eax*4],  ecx
  1111.     mov   ecx,  [esi+eax*4+4]
  1112.     mov   [edi+eax*4+4],  ecx
  1113.     mov   ecx,  [esi+eax*4+8]
  1114.     mov   [edi+eax*4+8],  ecx
  1115.     add   esi,  ebp
  1116.     mov   ecx,  esp
  1117.     add   edi,  edx  
  1118.     dec   ebx
  1119.     movdqa  xmm0,   [esi-0CH]
  1120.     jnz   cAR_S0D4_pure
  1121.     jmp   V_EXIT
  1122.  
  1123.     ALIGN_Z
  1124. V_EXIT:
  1125.     mov   esp,  fs:[STF_SAVE]
  1126.     pop   ebp
  1127.     pop   ebx
  1128.     pop   edi
  1129.     pop   esi
  1130.     ret
  1131.    
  1132.     ALIGN_Z
  1133. ;---------------------------------------------------------------------------------------------
  1134. chkAlignRoutine dd cAR_S0D0, cAR_S4D0, cAR_S8D0, cAR_SCD0 ;; 00xx
  1135.                 dd cAR_S0D4, cAR_S4D4, cAR_S8D4, cAR_SCD4 ;; 01xx
  1136.                 dd cAR_S0D8, cAR_S4D8, cAR_S8D8, cAR_SCD8 ;; 10xx
  1137.                 dd cAR_S0DC, cAR_S4DC, cAR_S8DC, cAR_SCDC ;; 11xx
  1138. chkUnAlignRoutine dd cAR_S0D0, cAR_S4D0, cAR_S8D0, cAR_SCD0 ;; 00xx
  1139.                 dd cAR_S0D4, cAR_S4D4, cAR_S8D4, cAR_SCD4 ;; 01xx
  1140.                 dd cAR_S0D8, cAR_S4D8, cAR_S8D8, cAR_SCD8 ;; 10xx
  1141.                 dd cAR_S0DC, cAR_S4DC, cAR_S8DC, cAR_SCDC ;; 11xx
  1142. ;---------------------------------------------------------------------------------------------
  1143. ; smallCopyRoutine MACRO
  1144. ;---------------------------------------------------------------------------------------------
  1145.     sCR_start macro s
  1146.         ALIGN_Z
  1147.       sCR&s&:
  1148.      
  1149.       endm
  1150.      
  1151.     sCR_end macro s
  1152.         lea   esi,  [esi+ebp+0&s&h*4]
  1153.         lea   edi,  [edi+edx+0&s&h*4]
  1154.         dec   ebx
  1155.         jnz   sCR&s&
  1156.         jmp   V_EXIT
  1157.          
  1158.       endm
  1159.     ; ----------------------------------------------------
  1160.     ; step
  1161.     ; ----------------------------------------------------
  1162.     sCRc1 macro s
  1163.         mov   eax,  [esi+s]
  1164.         mov   [edi+s],  eax
  1165.        
  1166.       endm
  1167.      
  1168.     sCRc2 macro s
  1169.         mov   eax,  [esi+s]
  1170.         mov   ecx,  [esi+s+4]
  1171.         mov   [edi+s],  eax
  1172.         mov   [edi+s+4],ecx    
  1173.       endm
  1174.      
  1175.     sCRc4 macro s
  1176.         sCRc2 s
  1177.         sCRc2 s + 08h
  1178.       endm
  1179.  
  1180.     sCRc8 macro s
  1181.         sCRc4 s
  1182.         sCRc4 s + 10h  
  1183.       endm
  1184.      
  1185.     sCRc16 macro s
  1186.         sCRc8 s
  1187.         sCRc8 s + 20h    
  1188.       endm
  1189.      
  1190.     sCR_start 01
  1191.     sCRc1 00h
  1192.     sCR_end 01 ;; ----------------- width 1
  1193.  
  1194.     sCR_start 02
  1195.     sCRc2 00h
  1196.     sCR_end 02 ;; ----------------- width 2  
  1197.    
  1198.     sCR_start 03
  1199.     sCRc2 00h
  1200.     sCRc1 08h
  1201.     sCR_end 03 ;; ----------------- width 3
  1202.    
  1203.     sCR_start 04
  1204.     sCRc4 00h
  1205.     sCR_end 04 ;; ----------------- width 4
  1206.    
  1207.     sCR_start 05
  1208.     sCRc4 00h
  1209.     sCRc1 10h
  1210.     sCR_end 05 ;; ----------------- width 5
  1211.  
  1212.     sCR_start 06
  1213.     sCRc4 00h
  1214.     sCRc2 10h
  1215.     sCR_end 06 ;; ----------------- width 6
  1216.    
  1217.     sCR_start 07
  1218.     sCRc4 00h
  1219.     sCRc2 10h
  1220.     sCRc1 18h
  1221.     sCR_end 07 ;; ----------------- width 7
  1222.    
  1223.     sCR_start 08
  1224.     sCRc8 00h    
  1225.     sCR_end 08 ;; ----------------- width 8
  1226.    
  1227.     sCR_start 09
  1228.     sCRc8 00h    
  1229.     sCRc1 20h
  1230.     sCR_end 09 ;; ----------------- width 9
  1231.  
  1232.     sCR_start 0A
  1233.     sCRc8 00h    
  1234.     sCRc2 20h
  1235.     sCR_end 0A ;; ----------------- width 10  
  1236.    
  1237.     sCR_start 0B
  1238.     sCRc8 00h    
  1239.     sCRc2 20h
  1240.     sCRc1 28h
  1241.     sCR_end 0B ;; ----------------- width 11
  1242.    
  1243.     sCR_start 0C
  1244.     sCRc8 00h    
  1245.     sCRc4 20h
  1246.     sCR_end 0C ;; ----------------- width 12
  1247.    
  1248.     sCR_start 0D
  1249.     sCRc8 00h    
  1250.     sCRc4 20h
  1251.     sCRc1 30h
  1252.     sCR_end 0D ;; ----------------- width 13
  1253.  
  1254.     sCR_start 0E
  1255.     sCRc8 00h    
  1256.     sCRc4 20h
  1257.     sCRc2 30h
  1258.     sCR_end 0E ;; ----------------- width 14    
  1259.    
  1260.     sCR_start 0F
  1261.     sCRc8 00h    
  1262.     sCRc4 20h
  1263.     sCRc2 30h
  1264.     sCRc1 38h
  1265.     sCR_end 0F ;; ----------------- width 15
  1266.    
  1267.     sCR_start 10
  1268.     sCRc16 00h
  1269.     sCR_end 10 ;; ----------------- width 16
  1270.    
  1271.     sCR_start 11
  1272.     sCRc16 00h
  1273.     sCRc1 40h
  1274.     sCR_end 11 ;; ----------------- width 17
  1275.  
  1276.     sCR_start 12
  1277.     sCRc16 00h
  1278.     sCRc2 40h
  1279.     sCR_end 12 ;; ----------------- width 18    
  1280.    
  1281.     sCR_start 13
  1282.     sCRc16 00h
  1283.     sCRc2 40h
  1284.     sCRc1 48h
  1285.     sCR_end 13 ;; ----------------- width 19
  1286.    
  1287.     sCR_start 14
  1288.     sCRc16 00h
  1289.     sCRc4 40h
  1290.     sCR_end 14 ;; ----------------- width 20
  1291.    
  1292.     sCR_start 15
  1293.     sCRc16 00h
  1294.     sCRc4 40h
  1295.     sCRc1 50h
  1296.     sCR_end 15 ;; ----------------- width 21
  1297.  
  1298.     sCR_start 16
  1299.     sCRc16 00h
  1300.     sCRc4 40h
  1301.     sCRc2 50h
  1302.     sCR_end 16 ;; ----------------- width 22    
  1303.    
  1304.     sCR_start 17
  1305.     sCRc16 00h
  1306.     sCRc4 40h
  1307.     sCRc2 50h
  1308.     sCRc1 58h
  1309.     sCR_end 17 ;; ----------------- width 23
  1310.    
  1311.     sCR_start 18
  1312.     sCRc16 00h
  1313.     sCRc8 40h
  1314.     sCR_end 18 ;; ----------------- width 24
  1315.    
  1316.     sCR_start 19
  1317.     sCRc16 00h
  1318.     sCRc8 40h
  1319.     sCRc1 60h
  1320.     sCR_end 19 ;; ----------------- width 25
  1321.  
  1322.     sCR_start 1A
  1323.     sCRc16 00h
  1324.     sCRc8 40h
  1325.     sCRc2 60h
  1326.     sCR_end 1A ;; ----------------- width 26  
  1327.    
  1328.     sCR_start 1B
  1329.     sCRc16 00h
  1330.     sCRc8 40h
  1331.     sCRc2 60h
  1332.     sCRc1 68h  
  1333.     sCR_end 1B ;; ----------------- width 27
  1334.    
  1335.     sCR_start 1C
  1336.     sCRc16 00h
  1337.     sCRc8 40h
  1338.     sCRc4 60h
  1339.     sCR_end 1C ;; ----------------- width 28
  1340.    
  1341.     sCR_start 1D
  1342.     sCRc16 00h
  1343.     sCRc8 40h
  1344.     sCRc4 60h
  1345.     sCRc1 70h
  1346.     sCR_end 1D ;; ----------------- width 29
  1347.  
  1348.     sCR_start 1E
  1349.     sCRc16 00h
  1350.     sCRc8 40h
  1351.     sCRc4 60h
  1352.     sCRc2 70h
  1353.     sCR_end 1E ;; ----------------- width 30
  1354.    
  1355.     sCR_start 1F
  1356.     sCRc16 00h
  1357.     sCRc8 40h
  1358.     sCRc4 60h
  1359.     sCRc2 70h
  1360.     sCRc1 78h
  1361.     sCR_end 1F ;; ----------------- width 31
  1362.    
  1363.     ALIGN_Z
  1364.    
  1365. ;---------------------------------------------------------------------------------------------
  1366. smallCopyRoutine dd sCR1F, sCR01, sCR02, sCR03, sCR04, sCR05, sCR06, sCR07
  1367.                  dd sCR08, sCR09, sCR0A, sCR0B, sCR0C, sCR0D, sCR0E, sCR0F
  1368.                  dd sCR10, sCR11, sCR12, sCR13, sCR14, sCR15, sCR16, sCR17  
  1369.                  dd sCR18, sCR19, sCR1A, sCR1B, sCR1C, sCR1D, sCR1E, sCR1F
  1370.        
  1371. CSurfaceCopy32 endp
  1372.   end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement