arnaucube
arnaucube/poulpyPublic Self-hosted repository
poulpy/poulpy-cpu-avx/src/reim/fft16_avx2_fma.s
poulpy-cpu-avx/src/reim/fft16_avx2_fma.sRaw
  1# ----------------------------------------------------------------------
  2# This kernel is a direct port of the FFT16 routine from spqlios-arithmetic
  3# (https://github.com/tfhe/spqlios-arithmetic)
  4# ----------------------------------------------------------------------
  5#
  6
  7.text
  8.globl  fft16_avx2_fma_asm
  9.hidden fft16_avx2_fma_asm
 10.p2align 4, 0x90
 11.type   fft16_avx2_fma_asm,@function
 12fft16_avx2_fma_asm:
 13.att_syntax prefix
 14
 15# SysV args: %rdi = re*, %rsi = im*, %rdx = omg*
 16# stage 0: load inputs
 17vmovupd     (%rdi),%ymm0       # ra0
 18vmovupd     0x20(%rdi),%ymm1   # ra4
 19vmovupd     0x40(%rdi),%ymm2   # ra8
 20vmovupd     0x60(%rdi),%ymm3   # ra12
 21vmovupd     (%rsi),%ymm4       # ia0
 22vmovupd     0x20(%rsi),%ymm5   # ia4
 23vmovupd     0x40(%rsi),%ymm6   # ia8
 24vmovupd     0x60(%rsi),%ymm7   # ia12
 25
 26# stage 1
 27vmovupd     (%rdx),%xmm12
 28vinsertf128 $1, %xmm12, %ymm12, %ymm12   # omriri
 29vshufpd     $15, %ymm12, %ymm12, %ymm13  # omai
 30vshufpd     $0,  %ymm12, %ymm12, %ymm12  # omar
 31vmulpd      %ymm6,%ymm13,%ymm8
 32vmulpd      %ymm7,%ymm13,%ymm9
 33vmulpd      %ymm2,%ymm13,%ymm10
 34vmulpd      %ymm3,%ymm13,%ymm11
 35vfmsub231pd %ymm2,%ymm12,%ymm8
 36vfmsub231pd %ymm3,%ymm12,%ymm9
 37vfmadd231pd %ymm6,%ymm12,%ymm10
 38vfmadd231pd %ymm7,%ymm12,%ymm11
 39vsubpd      %ymm8,%ymm0,%ymm2
 40vsubpd      %ymm9,%ymm1,%ymm3
 41vsubpd      %ymm10,%ymm4,%ymm6
 42vsubpd      %ymm11,%ymm5,%ymm7
 43vaddpd      %ymm8,%ymm0,%ymm0
 44vaddpd      %ymm9,%ymm1,%ymm1
 45vaddpd      %ymm10,%ymm4,%ymm4
 46vaddpd      %ymm11,%ymm5,%ymm5
 47
 48# stage 2
 49vmovupd     16(%rdx),%xmm12
 50vinsertf128 $1, %xmm12, %ymm12, %ymm12   # omriri
 51vshufpd     $15, %ymm12, %ymm12, %ymm13  # omai
 52vshufpd     $0,  %ymm12, %ymm12, %ymm12  # omar
 53vmulpd      %ymm5,%ymm13,%ymm8
 54vmulpd      %ymm7,%ymm12,%ymm9
 55vmulpd      %ymm1,%ymm13,%ymm10
 56vmulpd      %ymm3,%ymm12,%ymm11
 57vfmsub231pd %ymm1,%ymm12,%ymm8
 58vfmadd231pd %ymm3,%ymm13,%ymm9
 59vfmadd231pd %ymm5,%ymm12,%ymm10
 60vfmsub231pd %ymm7,%ymm13,%ymm11
 61vsubpd      %ymm8,%ymm0,%ymm1
 62vaddpd      %ymm9,%ymm2,%ymm3
 63vsubpd      %ymm10,%ymm4,%ymm5
 64vaddpd      %ymm11,%ymm6,%ymm7
 65vaddpd      %ymm8,%ymm0,%ymm0
 66vsubpd      %ymm9,%ymm2,%ymm2
 67vaddpd      %ymm10,%ymm4,%ymm4
 68vsubpd      %ymm11,%ymm6,%ymm6
 69
 70# stage 3
 71vmovupd     0x20(%rdx),%ymm12
 72vshufpd     $15, %ymm12, %ymm12, %ymm13  # omai
 73vshufpd     $0,  %ymm12, %ymm12, %ymm12  # omar
 74
 75vperm2f128  $0x31,%ymm2,%ymm0,%ymm8
 76vperm2f128  $0x31,%ymm3,%ymm1,%ymm9
 77vperm2f128  $0x31,%ymm6,%ymm4,%ymm10
 78vperm2f128  $0x31,%ymm7,%ymm5,%ymm11
 79vperm2f128  $0x20,%ymm2,%ymm0,%ymm0
 80vperm2f128  $0x20,%ymm3,%ymm1,%ymm1
 81vperm2f128  $0x20,%ymm6,%ymm4,%ymm2
 82vperm2f128  $0x20,%ymm7,%ymm5,%ymm3
 83
 84vmulpd      %ymm10,%ymm13,%ymm4
 85vmulpd      %ymm11,%ymm12,%ymm5
 86vmulpd      %ymm8,%ymm13,%ymm6
 87vmulpd      %ymm9,%ymm12,%ymm7
 88vfmsub231pd %ymm8,%ymm12,%ymm4
 89vfmadd231pd %ymm9,%ymm13,%ymm5
 90vfmadd231pd %ymm10,%ymm12,%ymm6
 91vfmsub231pd %ymm11,%ymm13,%ymm7
 92vsubpd      %ymm4,%ymm0,%ymm8
 93vaddpd      %ymm5,%ymm1,%ymm9
 94vsubpd      %ymm6,%ymm2,%ymm10
 95vaddpd      %ymm7,%ymm3,%ymm11
 96vaddpd      %ymm4,%ymm0,%ymm0
 97vsubpd      %ymm5,%ymm1,%ymm1
 98vaddpd      %ymm6,%ymm2,%ymm2
 99vsubpd      %ymm7,%ymm3,%ymm3
100
101# stage 4
102vmovupd     0x40(%rdx),%ymm12
103vmovupd     0x60(%rdx),%ymm13
104
105vunpckhpd   %ymm1,%ymm0,%ymm4
106vunpckhpd   %ymm3,%ymm2,%ymm6
107vunpckhpd   %ymm9,%ymm8,%ymm5
108vunpckhpd   %ymm11,%ymm10,%ymm7
109vunpcklpd   %ymm1,%ymm0,%ymm0
110vunpcklpd   %ymm3,%ymm2,%ymm2
111vunpcklpd   %ymm9,%ymm8,%ymm1
112vunpcklpd   %ymm11,%ymm10,%ymm3
113
114vmulpd      %ymm6,%ymm13,%ymm8
115vmulpd      %ymm7,%ymm12,%ymm9
116vmulpd      %ymm4,%ymm13,%ymm10
117vmulpd      %ymm5,%ymm12,%ymm11
118vfmsub231pd %ymm4,%ymm12,%ymm8
119vfmadd231pd %ymm5,%ymm13,%ymm9
120vfmadd231pd %ymm6,%ymm12,%ymm10
121vfmsub231pd %ymm7,%ymm13,%ymm11
122vsubpd      %ymm8,%ymm0,%ymm4
123vaddpd      %ymm9,%ymm1,%ymm5
124vsubpd      %ymm10,%ymm2,%ymm6
125vaddpd      %ymm11,%ymm3,%ymm7
126vaddpd      %ymm8,%ymm0,%ymm0
127vsubpd      %ymm9,%ymm1,%ymm1
128vaddpd      %ymm10,%ymm2,%ymm2
129vsubpd      %ymm11,%ymm3,%ymm3
130
131vunpckhpd   %ymm7,%ymm3,%ymm11
132vunpckhpd   %ymm5,%ymm1,%ymm9
133vunpcklpd   %ymm7,%ymm3,%ymm10
134vunpcklpd   %ymm5,%ymm1,%ymm8
135vunpckhpd   %ymm6,%ymm2,%ymm3
136vunpckhpd   %ymm4,%ymm0,%ymm1
137vunpcklpd   %ymm6,%ymm2,%ymm2
138vunpcklpd   %ymm4,%ymm0,%ymm0
139
140vperm2f128  $0x31,%ymm10,%ymm2,%ymm6
141vperm2f128  $0x31,%ymm11,%ymm3,%ymm7
142vperm2f128  $0x20,%ymm10,%ymm2,%ymm4
143vperm2f128  $0x20,%ymm11,%ymm3,%ymm5
144vperm2f128  $0x31,%ymm8,%ymm0,%ymm2
145vperm2f128  $0x31,%ymm9,%ymm1,%ymm3
146vperm2f128  $0x20,%ymm8,%ymm0,%ymm0
147vperm2f128  $0x20,%ymm9,%ymm1,%ymm1
148
149# stores
150vmovupd     %ymm0,(%rdi)       # ra0
151vmovupd     %ymm1,0x20(%rdi)   # ra4
152vmovupd     %ymm2,0x40(%rdi)   # ra8
153vmovupd     %ymm3,0x60(%rdi)   # ra12
154vmovupd     %ymm4,(%rsi)       # ia0
155vmovupd     %ymm5,0x20(%rsi)   # ia4
156vmovupd     %ymm6,0x40(%rsi)   # ia8
157vmovupd     %ymm7,0x60(%rsi)   # ia12
158vzeroupper
159ret
160
161.size   fft16_avx2_fma_asm, .-fft16_avx2_fma_asm
162.section .note.GNU-stack,"",@progbits