poulpy/poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft16_avx_fma.s
poulpy-backend/src/cpu_spqlios/spqlios-arithmetic/spqlios/reim/reim_fft16_avx_fma.sRaw
1#rdi datare ptr
2#rsi dataim ptr
3#rdx om ptr
4.globl reim_fft16_avx_fma
5reim_fft16_avx_fma:
6vmovupd (%rdi),%ymm0 # ra0
7vmovupd 0x20(%rdi),%ymm1 # ra4
8vmovupd 0x40(%rdi),%ymm2 # ra8
9vmovupd 0x60(%rdi),%ymm3 # ra12
10vmovupd (%rsi),%ymm4 # ia0
11vmovupd 0x20(%rsi),%ymm5 # ia4
12vmovupd 0x40(%rsi),%ymm6 # ia8
13vmovupd 0x60(%rsi),%ymm7 # ia12
14
15vmovupd (%rdx),%xmm12
16vinsertf128 $1, %xmm12, %ymm12, %ymm12 # omriri
17vshufpd $15, %ymm12, %ymm12, %ymm13 # ymm13: omai
18vshufpd $0, %ymm12, %ymm12, %ymm12 # ymm12: omar
19vmulpd %ymm6,%ymm13,%ymm8 # ia0.omai
20vmulpd %ymm7,%ymm13,%ymm9 # ia4.omai
21vmulpd %ymm2,%ymm13,%ymm10 # ra0.omai
22vmulpd %ymm3,%ymm13,%ymm11 # ra4.omai
23vfmsub231pd %ymm2,%ymm12,%ymm8 # rprod0
24vfmsub231pd %ymm3,%ymm12,%ymm9 # rprod4
25vfmadd231pd %ymm6,%ymm12,%ymm10 # iprod0
26vfmadd231pd %ymm7,%ymm12,%ymm11 # iprod4
27vsubpd %ymm8,%ymm0,%ymm2
28vsubpd %ymm9,%ymm1,%ymm3
29vsubpd %ymm10,%ymm4,%ymm6
30vsubpd %ymm11,%ymm5,%ymm7
31vaddpd %ymm8,%ymm0,%ymm0
32vaddpd %ymm9,%ymm1,%ymm1
33vaddpd %ymm10,%ymm4,%ymm4
34vaddpd %ymm11,%ymm5,%ymm5
35
361:
37vmovupd 16(%rdx),%xmm12
38vinsertf128 $1, %xmm12, %ymm12, %ymm12 # omriri
39vshufpd $15, %ymm12, %ymm12, %ymm13 # ymm13: omai
40vshufpd $0, %ymm12, %ymm12, %ymm12 # ymm12: omar
41vmulpd %ymm5,%ymm13,%ymm8 # ia0.omai (tw)
42vmulpd %ymm7,%ymm12,%ymm9 # ia4.omar (itw)
43vmulpd %ymm1,%ymm13,%ymm10 # ra0.omai (tw)
44vmulpd %ymm3,%ymm12,%ymm11 # ra4.omar (itw)
45vfmsub231pd %ymm1,%ymm12,%ymm8 # rprod0 (tw)
46vfmadd231pd %ymm3,%ymm13,%ymm9 # rprod4 (itw)
47vfmadd231pd %ymm5,%ymm12,%ymm10 # iprod0 (tw)
48vfmsub231pd %ymm7,%ymm13,%ymm11 # iprod4 (itw)
49vsubpd %ymm8,%ymm0,%ymm1
50vaddpd %ymm9,%ymm2,%ymm3
51vsubpd %ymm10,%ymm4,%ymm5
52vaddpd %ymm11,%ymm6,%ymm7
53vaddpd %ymm8,%ymm0,%ymm0
54vsubpd %ymm9,%ymm2,%ymm2
55vaddpd %ymm10,%ymm4,%ymm4
56vsubpd %ymm11,%ymm6,%ymm6
57
582:
59vmovupd 0x20(%rdx),%ymm12
60vshufpd $15, %ymm12, %ymm12, %ymm13 # ymm13: omaiii'i'
61vshufpd $0, %ymm12, %ymm12, %ymm12 # ymm12: omarrr'r'
62
63vperm2f128 $0x31,%ymm2,%ymm0,%ymm8 # ymm8 contains re to mul (tw)
64vperm2f128 $0x31,%ymm3,%ymm1,%ymm9 # ymm9 contains re to mul (itw)
65vperm2f128 $0x31,%ymm6,%ymm4,%ymm10 # ymm10 contains im to mul (tw)
66vperm2f128 $0x31,%ymm7,%ymm5,%ymm11 # ymm11 contains im to mul (itw)
67vperm2f128 $0x20,%ymm2,%ymm0,%ymm0 # ymm0 contains re to add (tw)
68vperm2f128 $0x20,%ymm3,%ymm1,%ymm1 # ymm1 contains re to add (itw)
69vperm2f128 $0x20,%ymm6,%ymm4,%ymm2 # ymm2 contains im to add (tw)
70vperm2f128 $0x20,%ymm7,%ymm5,%ymm3 # ymm3 contains im to add (itw)
71
72vmulpd %ymm10,%ymm13,%ymm4 # ia0.omai (tw)
73vmulpd %ymm11,%ymm12,%ymm5 # ia4.omar (itw)
74vmulpd %ymm8,%ymm13,%ymm6 # ra0.omai (tw)
75vmulpd %ymm9,%ymm12,%ymm7 # ra4.omar (itw)
76vfmsub231pd %ymm8,%ymm12,%ymm4 # rprod0 (tw)
77vfmadd231pd %ymm9,%ymm13,%ymm5 # rprod4 (itw)
78vfmadd231pd %ymm10,%ymm12,%ymm6 # iprod0 (tw)
79vfmsub231pd %ymm11,%ymm13,%ymm7 # iprod4 (itw)
80vsubpd %ymm4,%ymm0,%ymm8
81vaddpd %ymm5,%ymm1,%ymm9
82vsubpd %ymm6,%ymm2,%ymm10
83vaddpd %ymm7,%ymm3,%ymm11
84vaddpd %ymm4,%ymm0,%ymm0
85vsubpd %ymm5,%ymm1,%ymm1
86vaddpd %ymm6,%ymm2,%ymm2
87vsubpd %ymm7,%ymm3,%ymm3
88
89#vperm2f128 $0x31,%ymm10,%ymm2,%ymm6
90#vperm2f128 $0x31,%ymm11,%ymm3,%ymm7
91#vperm2f128 $0x20,%ymm10,%ymm2,%ymm4
92#vperm2f128 $0x20,%ymm11,%ymm3,%ymm5
93#vperm2f128 $0x31,%ymm8,%ymm0,%ymm2
94#vperm2f128 $0x31,%ymm9,%ymm1,%ymm3
95#vperm2f128 $0x20,%ymm8,%ymm0,%ymm0
96#vperm2f128 $0x20,%ymm9,%ymm1,%ymm1
97
983:
99vmovupd 0x40(%rdx),%ymm12
100vmovupd 0x60(%rdx),%ymm13
101
102#vperm2f128 $0x31,%ymm2,%ymm0,%ymm8 # ymm8 contains re to mul (tw)
103#vperm2f128 $0x31,%ymm3,%ymm1,%ymm9 # ymm9 contains re to mul (itw)
104#vperm2f128 $0x31,%ymm6,%ymm4,%ymm10 # ymm10 contains im to mul (tw)
105#vperm2f128 $0x31,%ymm7,%ymm5,%ymm11 # ymm11 contains im to mul (itw)
106#vperm2f128 $0x20,%ymm2,%ymm0,%ymm0 # ymm0 contains re to add (tw)
107#vperm2f128 $0x20,%ymm3,%ymm1,%ymm1 # ymm1 contains re to add (itw)
108#vperm2f128 $0x20,%ymm6,%ymm4,%ymm2 # ymm2 contains im to add (tw)
109#vperm2f128 $0x20,%ymm7,%ymm5,%ymm3 # ymm3 contains im to add (itw)
110
111vunpckhpd %ymm1,%ymm0,%ymm4 # (0,1) -> (0,4)
112vunpckhpd %ymm3,%ymm2,%ymm6 # (2,3) -> (2,6)
113vunpckhpd %ymm9,%ymm8,%ymm5 # (8,9) -> (1,5)
114vunpckhpd %ymm11,%ymm10,%ymm7 # (10,11) -> (3,7)
115vunpcklpd %ymm1,%ymm0,%ymm0
116vunpcklpd %ymm3,%ymm2,%ymm2
117vunpcklpd %ymm9,%ymm8,%ymm1
118vunpcklpd %ymm11,%ymm10,%ymm3
119
120vmulpd %ymm6,%ymm13,%ymm8 # ia0.omai (tw)
121vmulpd %ymm7,%ymm12,%ymm9 # ia4.omar (itw)
122vmulpd %ymm4,%ymm13,%ymm10 # ra0.omai (tw)
123vmulpd %ymm5,%ymm12,%ymm11 # ra4.omar (itw)
124vfmsub231pd %ymm4,%ymm12,%ymm8 # rprod0 (tw)
125vfmadd231pd %ymm5,%ymm13,%ymm9 # rprod4 (itw)
126vfmadd231pd %ymm6,%ymm12,%ymm10 # iprod0 (tw)
127vfmsub231pd %ymm7,%ymm13,%ymm11 # iprod4 (itw)
128vsubpd %ymm8,%ymm0,%ymm4
129vaddpd %ymm9,%ymm1,%ymm5
130vsubpd %ymm10,%ymm2,%ymm6
131vaddpd %ymm11,%ymm3,%ymm7
132vaddpd %ymm8,%ymm0,%ymm0
133vsubpd %ymm9,%ymm1,%ymm1
134vaddpd %ymm10,%ymm2,%ymm2
135vsubpd %ymm11,%ymm3,%ymm3
136
137vunpckhpd %ymm7,%ymm3,%ymm11 # (0,4) -> (0,1)
138vunpckhpd %ymm5,%ymm1,%ymm9 # (2,6) -> (2,3)
139vunpcklpd %ymm7,%ymm3,%ymm10
140vunpcklpd %ymm5,%ymm1,%ymm8
141vunpckhpd %ymm6,%ymm2,%ymm3 # (1,5) -> (8,9)
142vunpckhpd %ymm4,%ymm0,%ymm1 # (3,7) -> (10,11)
143vunpcklpd %ymm6,%ymm2,%ymm2
144vunpcklpd %ymm4,%ymm0,%ymm0
145
146vperm2f128 $0x31,%ymm10,%ymm2,%ymm6
147vperm2f128 $0x31,%ymm11,%ymm3,%ymm7
148vperm2f128 $0x20,%ymm10,%ymm2,%ymm4
149vperm2f128 $0x20,%ymm11,%ymm3,%ymm5
150vperm2f128 $0x31,%ymm8,%ymm0,%ymm2
151vperm2f128 $0x31,%ymm9,%ymm1,%ymm3
152vperm2f128 $0x20,%ymm8,%ymm0,%ymm0
153vperm2f128 $0x20,%ymm9,%ymm1,%ymm1
154
1554:
156vmovupd %ymm0,(%rdi) # ra0
157vmovupd %ymm1,0x20(%rdi) # ra4
158vmovupd %ymm2,0x40(%rdi) # ra8
159vmovupd %ymm3,0x60(%rdi) # ra12
160vmovupd %ymm4,(%rsi) # ia0
161vmovupd %ymm5,0x20(%rsi) # ia4
162vmovupd %ymm6,0x40(%rsi) # ia8
163vmovupd %ymm7,0x60(%rsi) # ia12
164vzeroupper
165ret
166.size reim_fft16_avx_fma, .-reim_fft16_avx_fma
167.section .note.GNU-stack,"",@progbits