arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/cplx/cplx_ifft16_avx_fma.s
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/cplx/cplx_ifft16_avx_fma.sRaw
  1# shifted FFT over X^16-i
  2# 1st argument (rdi) contains 16 complexes
  3# 2nd argument (rsi) contains: 8 complexes
  4#     omega,alpha,beta,j.beta,gamma,j.gamma,k.gamma,kj.gamma
  5#     alpha = sqrt(omega), beta = sqrt(alpha), gamma = sqrt(beta)
  6#     j = sqrt(i), k=sqrt(j)
  7.globl cplx_ifft16_avx_fma
  8cplx_ifft16_avx_fma:
  9vmovupd (%rdi),%ymm8        # load data into registers %ymm8 -> %ymm15
 10vmovupd 0x20(%rdi),%ymm9
 11vmovupd 0x40(%rdi),%ymm10
 12vmovupd 0x60(%rdi),%ymm11
 13vmovupd 0x80(%rdi),%ymm12
 14vmovupd 0xa0(%rdi),%ymm13
 15vmovupd 0xc0(%rdi),%ymm14
 16vmovupd 0xe0(%rdi),%ymm15
 17
 18.fourth_pass:
 19vmovupd 0(%rsi),%ymm0                 /* gamma   */
 20vmovupd 32(%rsi),%ymm2                /* delta   */
 21vshufpd $15, %ymm0, %ymm0, %ymm1      /* ymm1: gama.iiii */
 22vshufpd $15, %ymm2, %ymm2, %ymm3      /* ymm3: delta.iiii */
 23vshufpd $0,  %ymm0, %ymm0, %ymm0      /* ymm0: gama.rrrr */
 24vshufpd $0,  %ymm2, %ymm2, %ymm2      /* ymm2: delta.rrrr */
 25vperm2f128 $0x31,%ymm10,%ymm8,%ymm4   # ymm4 contains c1,c5
 26vperm2f128 $0x31,%ymm11,%ymm9,%ymm5   # ymm5 contains c3,c7
 27vperm2f128 $0x31,%ymm14,%ymm12,%ymm6  # ymm6 contains c9,c13
 28vperm2f128 $0x31,%ymm15,%ymm13,%ymm7  # ymm7 contains c11,c15
 29vperm2f128 $0x20,%ymm10,%ymm8,%ymm8   # ymm8 contains c0,c4
 30vperm2f128 $0x20,%ymm11,%ymm9,%ymm9   # ymm9 contains c2,c6
 31vperm2f128 $0x20,%ymm14,%ymm12,%ymm10 # ymm10 contains c8,c12
 32vperm2f128 $0x20,%ymm15,%ymm13,%ymm11 # ymm11 contains c10,c14
 33vsubpd %ymm4,%ymm8,%ymm12  # tw:  to mul by gamma
 34vsubpd %ymm5,%ymm9,%ymm13  # itw: to mul by i.gamma
 35vsubpd %ymm6,%ymm10,%ymm14 # tw:  to mul by delta
 36vsubpd %ymm7,%ymm11,%ymm15 # itw: to mul by i.delta
 37vaddpd %ymm4,%ymm8,%ymm8
 38vaddpd %ymm5,%ymm9,%ymm9
 39vaddpd %ymm6,%ymm10,%ymm10
 40vaddpd %ymm7,%ymm11,%ymm11
 41vshufpd $5, %ymm12, %ymm12, %ymm4
 42vshufpd $5, %ymm13, %ymm13, %ymm5
 43vshufpd $5, %ymm14, %ymm14, %ymm6
 44vshufpd $5, %ymm15, %ymm15, %ymm7
 45vmulpd %ymm4,%ymm1,%ymm4
 46vmulpd %ymm5,%ymm0,%ymm5
 47vmulpd %ymm6,%ymm3,%ymm6
 48vmulpd %ymm7,%ymm2,%ymm7
 49vfmaddsub231pd  %ymm12, %ymm0, %ymm4     # ymm4 = (ymm0 * ymm12) +/- ymm4
 50vfmsubadd231pd  %ymm13, %ymm1, %ymm5
 51vfmaddsub231pd  %ymm14, %ymm2, %ymm6
 52vfmsubadd231pd  %ymm15, %ymm3, %ymm7
 53
 54vperm2f128 $0x20,%ymm6,%ymm10,%ymm12  # ymm4 contains c1,c5 -- x gamma
 55vperm2f128 $0x20,%ymm7,%ymm11,%ymm13  # ymm5 contains c3,c7 -- x igamma
 56vperm2f128 $0x31,%ymm6,%ymm10,%ymm14  # ymm6 contains c9,c13 -- x delta
 57vperm2f128 $0x31,%ymm7,%ymm11,%ymm15  # ymm7 contains c11,c15 -- x idelta
 58vperm2f128 $0x31,%ymm4,%ymm8,%ymm10   # ymm10 contains c8,c12
 59vperm2f128 $0x31,%ymm5,%ymm9,%ymm11   # ymm11 contains c10,c14
 60vperm2f128 $0x20,%ymm4,%ymm8,%ymm8    # ymm8 contains c0,c4
 61vperm2f128 $0x20,%ymm5,%ymm9,%ymm9    # ymm9 contains c2,c6
 62
 63
 64.third_pass:
 65vmovupd 64(%rsi),%xmm0                /* gamma   */
 66vmovupd 80(%rsi),%xmm2                /* delta   */
 67vinsertf128 $1, %xmm0, %ymm0, %ymm0
 68vinsertf128 $1, %xmm2, %ymm2, %ymm2
 69vshufpd $15, %ymm0, %ymm0, %ymm1      /* ymm1: gama.iiii */
 70vshufpd $15, %ymm2, %ymm2, %ymm3      /* ymm3: delta.iiii */
 71vshufpd $0,  %ymm0, %ymm0, %ymm0      /* ymm0: gama.rrrr */
 72vshufpd $0,  %ymm2, %ymm2, %ymm2      /* ymm2: delta.rrrr */
 73vsubpd %ymm9,%ymm8,%ymm4
 74vsubpd %ymm11,%ymm10,%ymm5
 75vsubpd %ymm13,%ymm12,%ymm6
 76vsubpd %ymm15,%ymm14,%ymm7
 77vaddpd %ymm9,%ymm8,%ymm8
 78vaddpd %ymm11,%ymm10,%ymm10
 79vaddpd %ymm13,%ymm12,%ymm12
 80vaddpd %ymm15,%ymm14,%ymm14
 81vshufpd $5, %ymm4, %ymm4, %ymm9
 82vshufpd $5, %ymm5, %ymm5, %ymm11
 83vshufpd $5, %ymm6, %ymm6, %ymm13
 84vshufpd $5, %ymm7, %ymm7, %ymm15
 85vmulpd %ymm9,%ymm1,%ymm9
 86vmulpd %ymm11,%ymm0,%ymm11
 87vmulpd %ymm13,%ymm3,%ymm13
 88vmulpd %ymm15,%ymm2,%ymm15
 89vfmaddsub231pd  %ymm4, %ymm0, %ymm9     # ymm9 = (ymm0 * ymm4) +/- ymm9
 90vfmsubadd231pd  %ymm5, %ymm1, %ymm11
 91vfmaddsub231pd  %ymm6, %ymm2, %ymm13
 92vfmsubadd231pd  %ymm7, %ymm3, %ymm15
 93
 94.second_pass:
 95vmovupd 96(%rsi),%xmm0                /* omri   */
 96vinsertf128 $1, %xmm0, %ymm0, %ymm0   /* omriri */
 97vshufpd $15, %ymm0, %ymm0, %ymm1      /* ymm1: omiiii */
 98vshufpd $0,  %ymm0, %ymm0, %ymm0      /* ymm0: omrrrr */
 99vsubpd %ymm10,%ymm8,%ymm4
100vsubpd %ymm11,%ymm9,%ymm5
101vsubpd %ymm14,%ymm12,%ymm6
102vsubpd %ymm15,%ymm13,%ymm7
103vaddpd %ymm10,%ymm8,%ymm8
104vaddpd %ymm11,%ymm9,%ymm9
105vaddpd %ymm14,%ymm12,%ymm12
106vaddpd %ymm15,%ymm13,%ymm13
107vshufpd $5, %ymm4, %ymm4, %ymm10
108vshufpd $5, %ymm5, %ymm5, %ymm11
109vshufpd $5, %ymm6, %ymm6, %ymm14
110vshufpd $5, %ymm7, %ymm7, %ymm15
111vmulpd %ymm10,%ymm1,%ymm10
112vmulpd %ymm11,%ymm1,%ymm11
113vmulpd %ymm14,%ymm0,%ymm14
114vmulpd %ymm15,%ymm0,%ymm15
115vfmaddsub231pd  %ymm4, %ymm0, %ymm10     # ymm10 = (ymm0 * ymm4) +/- ymm10
116vfmaddsub231pd  %ymm5, %ymm0, %ymm11
117vfmsubadd231pd  %ymm6, %ymm1, %ymm14
118vfmsubadd231pd  %ymm7, %ymm1, %ymm15
119
120.first_pass:
121vmovupd 112(%rsi),%xmm0               /* omri   */
122vinsertf128 $1, %xmm0, %ymm0, %ymm0   /* omriri */
123vshufpd $15, %ymm0, %ymm0, %ymm1      /* ymm1: omiiii */
124vshufpd $0,  %ymm0, %ymm0, %ymm0      /* ymm0: omrrrr */
125vsubpd %ymm12,%ymm8,%ymm4
126vsubpd %ymm13,%ymm9,%ymm5
127vsubpd %ymm14,%ymm10,%ymm6
128vsubpd %ymm15,%ymm11,%ymm7
129vaddpd %ymm12,%ymm8,%ymm8
130vaddpd %ymm13,%ymm9,%ymm9
131vaddpd %ymm14,%ymm10,%ymm10
132vaddpd %ymm15,%ymm11,%ymm11
133vshufpd $5, %ymm4, %ymm4, %ymm12
134vshufpd $5, %ymm5, %ymm5, %ymm13
135vshufpd $5, %ymm6, %ymm6, %ymm14
136vshufpd $5, %ymm7, %ymm7, %ymm15
137vmulpd %ymm12,%ymm1,%ymm12
138vmulpd %ymm13,%ymm1,%ymm13
139vmulpd %ymm14,%ymm1,%ymm14
140vmulpd %ymm15,%ymm1,%ymm15
141vfmaddsub231pd  %ymm4, %ymm0, %ymm12     # ymm12 = (ymm0 * ymm4) +/- ymm12
142vfmaddsub231pd  %ymm5, %ymm0, %ymm13
143vfmaddsub231pd  %ymm6, %ymm0, %ymm14
144vfmaddsub231pd  %ymm7, %ymm0, %ymm15
145
146.save_and_return:
147vmovupd %ymm8,(%rdi)
148vmovupd %ymm9,0x20(%rdi)
149vmovupd %ymm10,0x40(%rdi)
150vmovupd %ymm11,0x60(%rdi)
151vmovupd %ymm12,0x80(%rdi)
152vmovupd %ymm13,0xa0(%rdi)
153vmovupd %ymm14,0xc0(%rdi)
154vmovupd %ymm15,0xe0(%rdi)
155ret
156.size	cplx_ifft16_avx_fma, .-cplx_ifft16_avx_fma
157.section .note.GNU-stack,"",@progbits