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