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