Skip to content

Commit 257c38d

Browse files
authored
Merge pull request #565 from pq-code-package/nttunpack-macro
x86: Rewrite nttunpack to use a macro instead of function calls
2 parents 0d8fcae + 0f8b131 commit 257c38d

File tree

2 files changed

+173
-42
lines changed

2 files changed

+173
-42
lines changed

dev/x86_64/src/nttunpack.S

Lines changed: 29 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -43,31 +43,16 @@ vpsrlq $32,%ymm\r0,%ymm\r0
4343
vpblendd $0xAA,%ymm\r1,%ymm\r0,%ymm\r3
4444
.endm
4545

46-
47-
.text
48-
.balign 4
49-
.global MLD_ASM_NAMESPACE(nttunpack_avx2)
50-
MLD_ASM_FN_SYMBOL(nttunpack_avx2)
51-
52-
call nttunpack128_avx
53-
add $256,%rdi
54-
call nttunpack128_avx
55-
add $256,%rdi
56-
call nttunpack128_avx
57-
add $256,%rdi
58-
call nttunpack128_avx
59-
ret
60-
61-
nttunpack128_avx:
46+
.macro nttunpack_64_coefficients offset
6247
#load
63-
vmovdqa (%rdi),%ymm4
64-
vmovdqa 32(%rdi),%ymm5
65-
vmovdqa 64(%rdi),%ymm6
66-
vmovdqa 96(%rdi),%ymm7
67-
vmovdqa 128(%rdi),%ymm8
68-
vmovdqa 160(%rdi),%ymm9
69-
vmovdqa 192(%rdi),%ymm10
70-
vmovdqa 224(%rdi),%ymm11
48+
vmovdqa (\offset + 0)(%rdi), %ymm4
49+
vmovdqa (\offset + 32)(%rdi), %ymm5
50+
vmovdqa (\offset + 64)(%rdi), %ymm6
51+
vmovdqa (\offset + 96)(%rdi), %ymm7
52+
vmovdqa (\offset + 128)(%rdi), %ymm8
53+
vmovdqa (\offset + 160)(%rdi), %ymm9
54+
vmovdqa (\offset + 192)(%rdi), %ymm10
55+
vmovdqa (\offset + 224)(%rdi), %ymm11
7156

7257
shuffle8 4,8,3,8
7358
shuffle8 5,9,4,9
@@ -85,14 +70,26 @@ shuffle2 3,4,5,4
8570
shuffle2 10,11,3,11
8671

8772
#store
88-
vmovdqa %ymm9,(%rdi)
89-
vmovdqa %ymm8,32(%rdi)
90-
vmovdqa %ymm7,64(%rdi)
91-
vmovdqa %ymm6,96(%rdi)
92-
vmovdqa %ymm5,128(%rdi)
93-
vmovdqa %ymm4,160(%rdi)
94-
vmovdqa %ymm3,192(%rdi)
95-
vmovdqa %ymm11,224(%rdi)
73+
vmovdqa %ymm9, (\offset + 0)(%rdi)
74+
vmovdqa %ymm8, (\offset + 32)(%rdi)
75+
vmovdqa %ymm7, (\offset + 64)(%rdi)
76+
vmovdqa %ymm6, (\offset + 96)(%rdi)
77+
vmovdqa %ymm5, (\offset + 128)(%rdi)
78+
vmovdqa %ymm4, (\offset + 160)(%rdi)
79+
vmovdqa %ymm3, (\offset + 192)(%rdi)
80+
vmovdqa %ymm11, (\offset + 224)(%rdi)
81+
.endm
82+
83+
84+
.text
85+
.balign 4
86+
.global MLD_ASM_NAMESPACE(nttunpack_avx2)
87+
MLD_ASM_FN_SYMBOL(nttunpack_avx2)
88+
89+
nttunpack_64_coefficients 0
90+
nttunpack_64_coefficients 4*64
91+
nttunpack_64_coefficients 4*64*2
92+
nttunpack_64_coefficients 4*64*3
9693

9794
ret
9895

mldsa/native/x86_64/src/nttunpack.S

Lines changed: 144 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,6 @@
3434
.global MLD_ASM_NAMESPACE(nttunpack_avx2)
3535
MLD_ASM_FN_SYMBOL(nttunpack_avx2)
3636

37-
callq nttunpack128_avx
38-
addq $0x100, %rdi # imm = 0x100
39-
callq nttunpack128_avx
40-
addq $0x100, %rdi # imm = 0x100
41-
callq nttunpack128_avx
42-
addq $0x100, %rdi # imm = 0x100
43-
callq nttunpack128_avx
44-
retq
45-
46-
nttunpack128_avx:
4737
vmovdqa (%rdi), %ymm4
4838
vmovdqa 0x20(%rdi), %ymm5
4939
vmovdqa 0x40(%rdi), %ymm6
@@ -92,6 +82,150 @@ nttunpack128_avx:
9282
vmovdqa %ymm4, 0xa0(%rdi)
9383
vmovdqa %ymm3, 0xc0(%rdi)
9484
vmovdqa %ymm11, 0xe0(%rdi)
85+
vmovdqa 0x100(%rdi), %ymm4
86+
vmovdqa 0x120(%rdi), %ymm5
87+
vmovdqa 0x140(%rdi), %ymm6
88+
vmovdqa 0x160(%rdi), %ymm7
89+
vmovdqa 0x180(%rdi), %ymm8
90+
vmovdqa 0x1a0(%rdi), %ymm9
91+
vmovdqa 0x1c0(%rdi), %ymm10
92+
vmovdqa 0x1e0(%rdi), %ymm11
93+
vperm2i128 $0x20, %ymm8, %ymm4, %ymm3 # ymm3 = ymm4[0,1],ymm8[0,1]
94+
vperm2i128 $0x31, %ymm8, %ymm4, %ymm8 # ymm8 = ymm4[2,3],ymm8[2,3]
95+
vperm2i128 $0x20, %ymm9, %ymm5, %ymm4 # ymm4 = ymm5[0,1],ymm9[0,1]
96+
vperm2i128 $0x31, %ymm9, %ymm5, %ymm9 # ymm9 = ymm5[2,3],ymm9[2,3]
97+
vperm2i128 $0x20, %ymm10, %ymm6, %ymm5 # ymm5 = ymm6[0,1],ymm10[0,1]
98+
vperm2i128 $0x31, %ymm10, %ymm6, %ymm10 # ymm10 = ymm6[2,3],ymm10[2,3]
99+
vperm2i128 $0x20, %ymm11, %ymm7, %ymm6 # ymm6 = ymm7[0,1],ymm11[0,1]
100+
vperm2i128 $0x31, %ymm11, %ymm7, %ymm11 # ymm11 = ymm7[2,3],ymm11[2,3]
101+
vpunpcklqdq %ymm5, %ymm3, %ymm7 # ymm7 = ymm3[0],ymm5[0],ymm3[2],ymm5[2]
102+
vpunpckhqdq %ymm5, %ymm3, %ymm5 # ymm5 = ymm3[1],ymm5[1],ymm3[3],ymm5[3]
103+
vpunpcklqdq %ymm10, %ymm8, %ymm3 # ymm3 = ymm8[0],ymm10[0],ymm8[2],ymm10[2]
104+
vpunpckhqdq %ymm10, %ymm8, %ymm10 # ymm10 = ymm8[1],ymm10[1],ymm8[3],ymm10[3]
105+
vpunpcklqdq %ymm6, %ymm4, %ymm8 # ymm8 = ymm4[0],ymm6[0],ymm4[2],ymm6[2]
106+
vpunpckhqdq %ymm6, %ymm4, %ymm6 # ymm6 = ymm4[1],ymm6[1],ymm4[3],ymm6[3]
107+
vpunpcklqdq %ymm11, %ymm9, %ymm4 # ymm4 = ymm9[0],ymm11[0],ymm9[2],ymm11[2]
108+
vpunpckhqdq %ymm11, %ymm9, %ymm11 # ymm11 = ymm9[1],ymm11[1],ymm9[3],ymm11[3]
109+
vmovsldup %ymm8, %ymm9 # ymm9 = ymm8[0,0,2,2,4,4,6,6]
110+
vpblendd $0xaa, %ymm9, %ymm7, %ymm9 # ymm9 = ymm7[0],ymm9[1],ymm7[2],ymm9[3],ymm7[4],ymm9[5],ymm7[6],ymm9[7]
111+
vpsrlq $0x20, %ymm7, %ymm7
112+
vpblendd $0xaa, %ymm8, %ymm7, %ymm8 # ymm8 = ymm7[0],ymm8[1],ymm7[2],ymm8[3],ymm7[4],ymm8[5],ymm7[6],ymm8[7]
113+
vmovsldup %ymm6, %ymm7 # ymm7 = ymm6[0,0,2,2,4,4,6,6]
114+
vpblendd $0xaa, %ymm7, %ymm5, %ymm7 # ymm7 = ymm5[0],ymm7[1],ymm5[2],ymm7[3],ymm5[4],ymm7[5],ymm5[6],ymm7[7]
115+
vpsrlq $0x20, %ymm5, %ymm5
116+
vpblendd $0xaa, %ymm6, %ymm5, %ymm6 # ymm6 = ymm5[0],ymm6[1],ymm5[2],ymm6[3],ymm5[4],ymm6[5],ymm5[6],ymm6[7]
117+
vmovsldup %ymm4, %ymm5 # ymm5 = ymm4[0,0,2,2,4,4,6,6]
118+
vpblendd $0xaa, %ymm5, %ymm3, %ymm5 # ymm5 = ymm3[0],ymm5[1],ymm3[2],ymm5[3],ymm3[4],ymm5[5],ymm3[6],ymm5[7]
119+
vpsrlq $0x20, %ymm3, %ymm3
120+
vpblendd $0xaa, %ymm4, %ymm3, %ymm4 # ymm4 = ymm3[0],ymm4[1],ymm3[2],ymm4[3],ymm3[4],ymm4[5],ymm3[6],ymm4[7]
121+
vmovsldup %ymm11, %ymm3 # ymm3 = ymm11[0,0,2,2,4,4,6,6]
122+
vpblendd $0xaa, %ymm3, %ymm10, %ymm3 # ymm3 = ymm10[0],ymm3[1],ymm10[2],ymm3[3],ymm10[4],ymm3[5],ymm10[6],ymm3[7]
123+
vpsrlq $0x20, %ymm10, %ymm10
124+
vpblendd $0xaa, %ymm11, %ymm10, %ymm11 # ymm11 = ymm10[0],ymm11[1],ymm10[2],ymm11[3],ymm10[4],ymm11[5],ymm10[6],ymm11[7]
125+
vmovdqa %ymm9, 0x100(%rdi)
126+
vmovdqa %ymm8, 0x120(%rdi)
127+
vmovdqa %ymm7, 0x140(%rdi)
128+
vmovdqa %ymm6, 0x160(%rdi)
129+
vmovdqa %ymm5, 0x180(%rdi)
130+
vmovdqa %ymm4, 0x1a0(%rdi)
131+
vmovdqa %ymm3, 0x1c0(%rdi)
132+
vmovdqa %ymm11, 0x1e0(%rdi)
133+
vmovdqa 0x200(%rdi), %ymm4
134+
vmovdqa 0x220(%rdi), %ymm5
135+
vmovdqa 0x240(%rdi), %ymm6
136+
vmovdqa 0x260(%rdi), %ymm7
137+
vmovdqa 0x280(%rdi), %ymm8
138+
vmovdqa 0x2a0(%rdi), %ymm9
139+
vmovdqa 0x2c0(%rdi), %ymm10
140+
vmovdqa 0x2e0(%rdi), %ymm11
141+
vperm2i128 $0x20, %ymm8, %ymm4, %ymm3 # ymm3 = ymm4[0,1],ymm8[0,1]
142+
vperm2i128 $0x31, %ymm8, %ymm4, %ymm8 # ymm8 = ymm4[2,3],ymm8[2,3]
143+
vperm2i128 $0x20, %ymm9, %ymm5, %ymm4 # ymm4 = ymm5[0,1],ymm9[0,1]
144+
vperm2i128 $0x31, %ymm9, %ymm5, %ymm9 # ymm9 = ymm5[2,3],ymm9[2,3]
145+
vperm2i128 $0x20, %ymm10, %ymm6, %ymm5 # ymm5 = ymm6[0,1],ymm10[0,1]
146+
vperm2i128 $0x31, %ymm10, %ymm6, %ymm10 # ymm10 = ymm6[2,3],ymm10[2,3]
147+
vperm2i128 $0x20, %ymm11, %ymm7, %ymm6 # ymm6 = ymm7[0,1],ymm11[0,1]
148+
vperm2i128 $0x31, %ymm11, %ymm7, %ymm11 # ymm11 = ymm7[2,3],ymm11[2,3]
149+
vpunpcklqdq %ymm5, %ymm3, %ymm7 # ymm7 = ymm3[0],ymm5[0],ymm3[2],ymm5[2]
150+
vpunpckhqdq %ymm5, %ymm3, %ymm5 # ymm5 = ymm3[1],ymm5[1],ymm3[3],ymm5[3]
151+
vpunpcklqdq %ymm10, %ymm8, %ymm3 # ymm3 = ymm8[0],ymm10[0],ymm8[2],ymm10[2]
152+
vpunpckhqdq %ymm10, %ymm8, %ymm10 # ymm10 = ymm8[1],ymm10[1],ymm8[3],ymm10[3]
153+
vpunpcklqdq %ymm6, %ymm4, %ymm8 # ymm8 = ymm4[0],ymm6[0],ymm4[2],ymm6[2]
154+
vpunpckhqdq %ymm6, %ymm4, %ymm6 # ymm6 = ymm4[1],ymm6[1],ymm4[3],ymm6[3]
155+
vpunpcklqdq %ymm11, %ymm9, %ymm4 # ymm4 = ymm9[0],ymm11[0],ymm9[2],ymm11[2]
156+
vpunpckhqdq %ymm11, %ymm9, %ymm11 # ymm11 = ymm9[1],ymm11[1],ymm9[3],ymm11[3]
157+
vmovsldup %ymm8, %ymm9 # ymm9 = ymm8[0,0,2,2,4,4,6,6]
158+
vpblendd $0xaa, %ymm9, %ymm7, %ymm9 # ymm9 = ymm7[0],ymm9[1],ymm7[2],ymm9[3],ymm7[4],ymm9[5],ymm7[6],ymm9[7]
159+
vpsrlq $0x20, %ymm7, %ymm7
160+
vpblendd $0xaa, %ymm8, %ymm7, %ymm8 # ymm8 = ymm7[0],ymm8[1],ymm7[2],ymm8[3],ymm7[4],ymm8[5],ymm7[6],ymm8[7]
161+
vmovsldup %ymm6, %ymm7 # ymm7 = ymm6[0,0,2,2,4,4,6,6]
162+
vpblendd $0xaa, %ymm7, %ymm5, %ymm7 # ymm7 = ymm5[0],ymm7[1],ymm5[2],ymm7[3],ymm5[4],ymm7[5],ymm5[6],ymm7[7]
163+
vpsrlq $0x20, %ymm5, %ymm5
164+
vpblendd $0xaa, %ymm6, %ymm5, %ymm6 # ymm6 = ymm5[0],ymm6[1],ymm5[2],ymm6[3],ymm5[4],ymm6[5],ymm5[6],ymm6[7]
165+
vmovsldup %ymm4, %ymm5 # ymm5 = ymm4[0,0,2,2,4,4,6,6]
166+
vpblendd $0xaa, %ymm5, %ymm3, %ymm5 # ymm5 = ymm3[0],ymm5[1],ymm3[2],ymm5[3],ymm3[4],ymm5[5],ymm3[6],ymm5[7]
167+
vpsrlq $0x20, %ymm3, %ymm3
168+
vpblendd $0xaa, %ymm4, %ymm3, %ymm4 # ymm4 = ymm3[0],ymm4[1],ymm3[2],ymm4[3],ymm3[4],ymm4[5],ymm3[6],ymm4[7]
169+
vmovsldup %ymm11, %ymm3 # ymm3 = ymm11[0,0,2,2,4,4,6,6]
170+
vpblendd $0xaa, %ymm3, %ymm10, %ymm3 # ymm3 = ymm10[0],ymm3[1],ymm10[2],ymm3[3],ymm10[4],ymm3[5],ymm10[6],ymm3[7]
171+
vpsrlq $0x20, %ymm10, %ymm10
172+
vpblendd $0xaa, %ymm11, %ymm10, %ymm11 # ymm11 = ymm10[0],ymm11[1],ymm10[2],ymm11[3],ymm10[4],ymm11[5],ymm10[6],ymm11[7]
173+
vmovdqa %ymm9, 0x200(%rdi)
174+
vmovdqa %ymm8, 0x220(%rdi)
175+
vmovdqa %ymm7, 0x240(%rdi)
176+
vmovdqa %ymm6, 0x260(%rdi)
177+
vmovdqa %ymm5, 0x280(%rdi)
178+
vmovdqa %ymm4, 0x2a0(%rdi)
179+
vmovdqa %ymm3, 0x2c0(%rdi)
180+
vmovdqa %ymm11, 0x2e0(%rdi)
181+
vmovdqa 0x300(%rdi), %ymm4
182+
vmovdqa 0x320(%rdi), %ymm5
183+
vmovdqa 0x340(%rdi), %ymm6
184+
vmovdqa 0x360(%rdi), %ymm7
185+
vmovdqa 0x380(%rdi), %ymm8
186+
vmovdqa 0x3a0(%rdi), %ymm9
187+
vmovdqa 0x3c0(%rdi), %ymm10
188+
vmovdqa 0x3e0(%rdi), %ymm11
189+
vperm2i128 $0x20, %ymm8, %ymm4, %ymm3 # ymm3 = ymm4[0,1],ymm8[0,1]
190+
vperm2i128 $0x31, %ymm8, %ymm4, %ymm8 # ymm8 = ymm4[2,3],ymm8[2,3]
191+
vperm2i128 $0x20, %ymm9, %ymm5, %ymm4 # ymm4 = ymm5[0,1],ymm9[0,1]
192+
vperm2i128 $0x31, %ymm9, %ymm5, %ymm9 # ymm9 = ymm5[2,3],ymm9[2,3]
193+
vperm2i128 $0x20, %ymm10, %ymm6, %ymm5 # ymm5 = ymm6[0,1],ymm10[0,1]
194+
vperm2i128 $0x31, %ymm10, %ymm6, %ymm10 # ymm10 = ymm6[2,3],ymm10[2,3]
195+
vperm2i128 $0x20, %ymm11, %ymm7, %ymm6 # ymm6 = ymm7[0,1],ymm11[0,1]
196+
vperm2i128 $0x31, %ymm11, %ymm7, %ymm11 # ymm11 = ymm7[2,3],ymm11[2,3]
197+
vpunpcklqdq %ymm5, %ymm3, %ymm7 # ymm7 = ymm3[0],ymm5[0],ymm3[2],ymm5[2]
198+
vpunpckhqdq %ymm5, %ymm3, %ymm5 # ymm5 = ymm3[1],ymm5[1],ymm3[3],ymm5[3]
199+
vpunpcklqdq %ymm10, %ymm8, %ymm3 # ymm3 = ymm8[0],ymm10[0],ymm8[2],ymm10[2]
200+
vpunpckhqdq %ymm10, %ymm8, %ymm10 # ymm10 = ymm8[1],ymm10[1],ymm8[3],ymm10[3]
201+
vpunpcklqdq %ymm6, %ymm4, %ymm8 # ymm8 = ymm4[0],ymm6[0],ymm4[2],ymm6[2]
202+
vpunpckhqdq %ymm6, %ymm4, %ymm6 # ymm6 = ymm4[1],ymm6[1],ymm4[3],ymm6[3]
203+
vpunpcklqdq %ymm11, %ymm9, %ymm4 # ymm4 = ymm9[0],ymm11[0],ymm9[2],ymm11[2]
204+
vpunpckhqdq %ymm11, %ymm9, %ymm11 # ymm11 = ymm9[1],ymm11[1],ymm9[3],ymm11[3]
205+
vmovsldup %ymm8, %ymm9 # ymm9 = ymm8[0,0,2,2,4,4,6,6]
206+
vpblendd $0xaa, %ymm9, %ymm7, %ymm9 # ymm9 = ymm7[0],ymm9[1],ymm7[2],ymm9[3],ymm7[4],ymm9[5],ymm7[6],ymm9[7]
207+
vpsrlq $0x20, %ymm7, %ymm7
208+
vpblendd $0xaa, %ymm8, %ymm7, %ymm8 # ymm8 = ymm7[0],ymm8[1],ymm7[2],ymm8[3],ymm7[4],ymm8[5],ymm7[6],ymm8[7]
209+
vmovsldup %ymm6, %ymm7 # ymm7 = ymm6[0,0,2,2,4,4,6,6]
210+
vpblendd $0xaa, %ymm7, %ymm5, %ymm7 # ymm7 = ymm5[0],ymm7[1],ymm5[2],ymm7[3],ymm5[4],ymm7[5],ymm5[6],ymm7[7]
211+
vpsrlq $0x20, %ymm5, %ymm5
212+
vpblendd $0xaa, %ymm6, %ymm5, %ymm6 # ymm6 = ymm5[0],ymm6[1],ymm5[2],ymm6[3],ymm5[4],ymm6[5],ymm5[6],ymm6[7]
213+
vmovsldup %ymm4, %ymm5 # ymm5 = ymm4[0,0,2,2,4,4,6,6]
214+
vpblendd $0xaa, %ymm5, %ymm3, %ymm5 # ymm5 = ymm3[0],ymm5[1],ymm3[2],ymm5[3],ymm3[4],ymm5[5],ymm3[6],ymm5[7]
215+
vpsrlq $0x20, %ymm3, %ymm3
216+
vpblendd $0xaa, %ymm4, %ymm3, %ymm4 # ymm4 = ymm3[0],ymm4[1],ymm3[2],ymm4[3],ymm3[4],ymm4[5],ymm3[6],ymm4[7]
217+
vmovsldup %ymm11, %ymm3 # ymm3 = ymm11[0,0,2,2,4,4,6,6]
218+
vpblendd $0xaa, %ymm3, %ymm10, %ymm3 # ymm3 = ymm10[0],ymm3[1],ymm10[2],ymm3[3],ymm10[4],ymm3[5],ymm10[6],ymm3[7]
219+
vpsrlq $0x20, %ymm10, %ymm10
220+
vpblendd $0xaa, %ymm11, %ymm10, %ymm11 # ymm11 = ymm10[0],ymm11[1],ymm10[2],ymm11[3],ymm10[4],ymm11[5],ymm10[6],ymm11[7]
221+
vmovdqa %ymm9, 0x300(%rdi)
222+
vmovdqa %ymm8, 0x320(%rdi)
223+
vmovdqa %ymm7, 0x340(%rdi)
224+
vmovdqa %ymm6, 0x360(%rdi)
225+
vmovdqa %ymm5, 0x380(%rdi)
226+
vmovdqa %ymm4, 0x3a0(%rdi)
227+
vmovdqa %ymm3, 0x3c0(%rdi)
228+
vmovdqa %ymm11, 0x3e0(%rdi)
95229
retq
96230

97231
#endif /* MLD_ARITH_BACKEND_X86_64_DEFAULT && !MLD_CONFIG_MULTILEVEL_NO_SHARED \

0 commit comments

Comments
 (0)