home bbs files messages ]

Forums before death by AOL, social media and spammers... "We can't have nice things"

   comp.lang.asm.x86      Ahh, the lost art of x86 assembly      4,675 messages   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]

   Message 4,462 of 4,675   
   James Van Buskirk to Terje Mathisen   
   Re: Bit reversal in AVX2   
   24 May 22 00:59:00   
   
   From: not_valid@nospicedham.comcast.net   
      
   "Terje Mathisen"  wrote in message news:t6htq1$ujc$1@gioia.aioe.org...   
      
   > James Van Buskirk wrote:   
      
   > > I have an update coming for bitrev2.   
      
   > Nice. :-)   
      
   Here it is. I have actually added some comments which show the   
   contents of the register written, either a working register (when   
   the data are the indices in the original array of the components)   
   or a permutation register required for vpermd (a pity that AVX2   
   doesn't have a lane-crossing version of palignr or a rotate   
   instruction.)   
      
   Didn't show any improvement in performance, but it certainly is   
   cleaner code.   
      
   D:\gfortran\james\bitrev>type bitrev2a.asm   
   format MS64 COFF   
      
   section '.text' code readable writeable executable   
   public bitrev2   
   bitrev2:   
      sub rsp, 56   
      vmovdqu [rsp+32], xmm6   
      vmovdqu [rsp+16], xmm7   
      vmovdqu [rsp], xmm8   
      
      vmovdqu ymm0, [rcx]                 ;  0  1  2  3  4  5  6  7   
      vmovdqu ymm4, [rcx+32]              ;  8  9 10 11 12 13 14 15   
      vmovdqu ymm2, [rcx+64]              ; 16 17 18 19 20 21 22 23   
      vmovdqu ymm6, [rcx+96]              ; 24 25 26 27 28 29 30 31   
      vmovdqu ymm1, [rcx+128]             ; 32 33 34 35 36 37 38 39   
      vmovdqu ymm5, [rcx+160]             ; 40 41 42 43 44 45 46 47   
      vmovdqu ymm3, [rcx+192]             ; 48 49 50 51 52 53 54 55   
      vmovdqu ymm8, [rcx+224]             ; 56 57 58 59 60 61 62 63   
      
      vmovdqu ymm7, yword [perm0+24]      ;  7  0  1  2  3  4  5  6   
      vpermd ymm1, ymm7, ymm1             ; 39 32 33 34 35 36 37 38   
      vpermq ymm2, ymm2, 147              ; 22 23 16 17 18 19 20 21   
      vmovdqu ymm7, yword [perm0+16]      ;  5  6  7  0  1  2  3  4   
      vpermd ymm3, ymm7, ymm3             ; 53 54 55 48 49 50 51 52   
      vpermq ymm4, ymm4, 78               ; 12 13 14 15  8  9 10 11   
      vmovdqu ymm7, yword [perm0+8]       ;  3  4  5  6  7  0  1  2   
      vpermd ymm5, ymm7, ymm5             ; 43 44 45 46 47 40 41 42   
      vpermq ymm6, ymm6, 57               ; 26 27 28 29 30 31 24 25   
      vmovdqu ymm7, yword [perm0]         ;  1  2  3  4  5  6  7  0   
      vpermd ymm8, ymm7, ymm8             ; 57 58 59 60 61 62 63 56   
      
      vpblendd ymm7, ymm0, ymm1, 170      ;  0 32  2 34  4 36  6 38   
      vpblendd ymm0, ymm0, ymm1, 85       ; 39  1 33  3 35  5 37  7   
      vpblendd ymm1, ymm2, ymm3, 170      ; 22 54 16 48 18 50 20 52   
      vpblendd ymm2, ymm2, ymm3, 85       ; 53 23 55 17 49 19 51 21   
      vpblendd ymm3, ymm4, ymm5, 170      ; 12 44 14 46  8 40 10 42   
      vpblendd ymm4, ymm4, ymm5, 85       ; 43 13 45 15 47  9 41 11   
      vpblendd ymm5, ymm6, ymm8, 170      ; 26 58 28 60 30 62 24 56   
      vpblendd ymm6, ymm6, ymm8, 85       ; 57 27 59 29 61 31 63 25   
      
      vpblendd ymm8, ymm7, ymm1, 204      ;  0 32 16 48  4 36 20 52   
      vpblendd ymm7, ymm7, ymm1, 51       ; 22 54  2 34 18 50  6 38   
      vpblendd ymm1, ymm0, ymm2, 102      ; 39 23 55  3 35 19 51  7   
      vpblendd ymm0, ymm0, ymm2, 153      ; 53  1 33 17 49  5 37 21   
      vpblendd ymm2, ymm3, ymm5, 204      ; 12 44 28 60  8 40 24 56   
      vpblendd ymm3, ymm3, ymm5, 51       ; 26 58 14 46 30 62 10 42   
      vpblendd ymm5, ymm4, ymm6, 102      ; 43 27 59 15 47 31 63 11   
      vpblendd ymm4, ymm4, ymm6, 153      ; 57 13 45 29 61  9 41 25   
      
      vpblendd ymm6, ymm8, ymm2, 240      ;  0 32 16 48  8 40 24 56   
      vpblendd ymm8, ymm8, ymm2, 15       ; 12 44 28 60  4 36 20 52   
      vpblendd ymm2, ymm7, ymm3, 60       ; 22 54 14 46 30 62  6 38   
      vpblendd ymm7, ymm7, ymm3, 195      ; 26 58  2 34 18 50 10 42   
      vpblendd ymm3, ymm1, ymm5, 120      ; 39 23 55 15 47 31 63  7   
      vpblendd ymm1, ymm1, ymm5, 135      ; 43 27 59  3 35 19 51 11   
      vpblendd ymm5, ymm0, ymm4, 30       ; 53 13 45 29 61  5 37 21   
      vpblendd ymm0, ymm0, ymm4, 225      ; 57  1 33 17 49  9 41 25   
      
      vpermq  ymm8, ymm8, 78              ;  4 36 20 52 12 44 28 60   
      vpermq  ymm2, ymm2, 147             ;  6 38 22 54 14 46 30 62   
      vpermq  ymm7, ymm7, 57              ;  2 34 18 50 10 42 26 58   
      vmovdqu ymm4, yword [perm0+24]      ;  7  0  1  2  3  4  5  6   
      vpermd  ymm3, ymm4, ymm3            ;  7 39 23 55 15 47 31 63   
      vmovdqu ymm4, yword [perm0+8]       ;  3  4  5  6  7  0  1  2   
      vpermd  ymm1, ymm4, ymm1            ;  3 35 19 51 11 43 27 59   
      vmovdqu ymm4, yword [perm0+16]      ;  5  6  7  0  1  2  3  4   
      vpermd  ymm5, ymm4, ymm5            ;  5 37 21 53 13 45 29 61   
      vmovdqu ymm4, yword [perm0]         ;  1  2  3  4  5  6  7  0   
      vpermd  ymm0, ymm4, ymm0            ;  1 33 17 49  9 41 25 57   
      
      vmovdqu [rcx], ymm6   
      vmovdqu [rcx+32], ymm8   
      vmovdqu [rcx+64], ymm7   
      vmovdqu [rcx+96], ymm2   
      vmovdqu [rcx+128], ymm0   
      vmovdqu [rcx+160], ymm5   
      vmovdqu [rcx+192], ymm1   
      vmovdqu [rcx+224], ymm3   
      
   .epilog:   
      vmovdqu xmm6, [rsp+32]   
      vmovdqu xmm7, [rsp+16]   
      vmovdqu xmm8, [rsp]   
      add rsp, 56   
      ret   
      
   section '.data' data readable writeable align 32   
      align 32   
      perm0 dd 1,2,3,4,5,6,7,0,1,2,3,4,5,6   
      
   D:\gfortran\james\bitrev>fasm bitrev2a.asm   
   flat assembler  version 1.71.49  (1048576 kilobytes memory)   
   3 passes, 723 bytes.   
      
   D:\gfortran\james\bitrev>gfortran -O3 timer.f90 bitrev1.obj bitrev2a.obj   
   bitrev3   
   .obj bitrev4.obj rdtscp.obj -otimer   
      
   D:\gfortran\james\bitrev>timer   
   [...]   
   bitrev2: check = 0.00000000   
   22872   
   22703   
   22721   
   22724   
   22752   
   22672   
   22709   
   22740   
   22736   
   22721   
   22706   
   22727   
   22709   
   22721   
   22706   
   22718   
   22712   
   22718   
   22706   
   22727   
   22712   
   22718   
   22706   
   [...]   
      
   --- SoupGate-Win32 v1.05   
    * Origin: you cannot sedate... all the things you hate (1:229/2)   

[   << oldest   |   < older   |   list   |   newer >   |   newest >>   ]


(c) 1994,  bbs@darkrealms.ca