Advertisement
Guest User

SwapA2

a guest
Mar 21st, 2018
449
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  2. ;
  3. ; Swap2
  4. ;
  5. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  6.  
  7. Const32 segment align(32) ".Const"
  8.  
  9. himask DQ 0FF00FF00FF00FF00H, 0FF00FF00FF00FF00H, \
  10.           0FF00FF00FF00FF00H, 0FF00FF00FF00FF00H
  11. lomask DQ 000FF00FF00FF00FFH, 000FF00FF00FF00FFH, \
  12.           000FF00FF00FF00FFH, 000FF00FF00FF00FFH
  13.  
  14. Const32 ends
  15.  
  16. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  17.  
  18. .Code
  19.  
  20. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  21. ;
  22. ; Version 4
  23. ;
  24. Swap2 Proc ; lpbaBuffer:RCX, cbBuffer:RDX
  25.    
  26.     test edx, 0FFFFFF80H    ;
  27.     jnz check_front_align   ; more than 127 bytes? use AVX
  28.    
  29.     test dx, 0FFF8H         ;
  30.     jz noalign_check_4      ; less than 8? maybe 4...
  31.  
  32.     mov r10, 0FF00FF00FF00FF00H ; AND mask
  33.     mov r11, 000FF00FF00FF00FFH ; AND mask
  34. align 4                         ; align code
  35. noalign_loop_8:                 ;
  36.     sub rdx, 8                  ; next 8 bytes
  37.     mov r8, [rcx + rdx]         ; swap bytes
  38.     mov r9, r8                  ;
  39.     and r8, r10                 ;
  40.     and r9, r11                 ;
  41.     shr r8, 8                   ;
  42.     shl r9, 8                   ;
  43.     or r9, r8                   ;
  44.     mov [rcx + rdx], r9         ;
  45. noalign_check_8:                ;
  46.     test dx, 0FFF8H             ;
  47.     jnz noalign_loop_8          ; 8 more?
  48.  
  49. noalign_check_4:         ;
  50.     test dl, 0FCH        ; 4 more bytes?
  51.     jz @F                ;
  52.     sub rdx, 4           ; next 4 bytes
  53.     mov r8d, [rcx + rdx] ; swap bytes
  54.     mov r9d, r8d         ;
  55.     and r8d, 0FF00FF00H  ;
  56.     and r9d, 000FF00FFH  ;
  57.     shr r8d, 8           ;
  58.     shl r9d, 8           ;
  59.     or r9d, r8d          ;
  60.     mov [rcx + rdx], r9d ;
  61. @@:                      ;
  62.  
  63.     test dl, 0FEH           ;
  64.     jz @F                   ; 2 more bytes?
  65.     mov ax, [rcx + rdx - 2] ; swap bytes
  66.     rol ax, 8               ;
  67.     mov [rcx + rdx - 2], ax ;
  68.  
  69. @@: ret     ; end...
  70.     int 3   ;
  71.  
  72. ; AVX start , align front of data
  73.  
  74. align 4                     ; Align the code on 4 byte boundary
  75. loop_front_align:           ;
  76.     mov ax, word ptr [rcx]  ; Swap bytes
  77.     rol ax, 8               ;
  78.     mov word ptr [rcx], ax  ;
  79.     add rcx, 2              ;
  80.     sub rdx, 2              ;
  81. check_front_align:          ;
  82.     test cl, 1FH            ;
  83.     jnz loop_front_align    ; Not aligned? continue
  84.        
  85. ; AVX start , align back of data
  86.  
  87.     test dl, 1FH                 ;
  88.     jz @F                        ; Aligned? skip...
  89. align 4                          ; Align code on 4 byte boundary
  90. loop_back_align:                 ;
  91.     sub rdx, 2                   ; Swap bytes
  92.     mov ax, word ptr [rcx + rdx] ;
  93.     rol ax, 8                    ;
  94.     mov word ptr [rcx + rdx], ax ;
  95. check_back_align:                ;
  96.     test dl, 1FH                 ;
  97.     jnz loop_back_align          ; Not aligned? continue
  98. @@:
  99.  
  100.     vmovdqa ymm6, ymmword ptr himask ; AND mask
  101.     vmovdqa ymm7, ymmword ptr lomask ; AND mask
  102.  
  103. ; AVX loop
  104.  
  105. align 4                                         ; align code
  106. stream:                                         ;
  107.     vmovdqa ymm0, ymmword ptr[rcx + rdx - 32]   ; load block of 32 bytes
  108.     vpand ymm1, ymm6, ymm0                      ; AND high
  109.     vpand ymm2, ymm7, ymm0                      ; AND low
  110.     vpsrldq ymm3, ymm1, 1                       ; shift 1 byte right
  111.     vpslldq ymm4, ymm2, 1                       ; shift 1 byte left
  112.     vpor ymm5, ymm3, ymm4                       ; high OR low
  113.     vmovdqa ymmword ptr[rcx + rdx - 32], ymm5   ; store block of 32 bytes
  114.     sub rdx, 32                                 ;
  115.     jnz stream                                  ; next 32 bytes?
  116.  
  117.     ret
  118.  
  119. Swap2 EndP
  120.  
  121. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  122.  
  123. End
  124.  
  125. ; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement