1 // Code generated by command: go run fe_amd64_asm.go -out ../fe_amd64.s -stubs ../fe_amd64.go -pkg field. DO NOT EDIT.
2
3 //go:build !purego
4
5 #include "textflag.h"
6
7 // func feMul(out *Element, a *Element, b *Element)
8 TEXT ·feMul(SB), NOSPLIT, $0-24
9 MOVQ a+8(FP), CX
10 MOVQ b+16(FP), BX
11
12 // r0 = a0×b0
13 MOVQ (CX), AX
14 MULQ (BX)
15 MOVQ AX, DI
16 MOVQ DX, SI
17
18 // r0 += 19×a1×b4
19 MOVQ 8(CX), AX
20 IMUL3Q $0x13, AX, AX
21 MULQ 32(BX)
22 ADDQ AX, DI
23 ADCQ DX, SI
24
25 // r0 += 19×a2×b3
26 MOVQ 16(CX), AX
27 IMUL3Q $0x13, AX, AX
28 MULQ 24(BX)
29 ADDQ AX, DI
30 ADCQ DX, SI
31
32 // r0 += 19×a3×b2
33 MOVQ 24(CX), AX
34 IMUL3Q $0x13, AX, AX
35 MULQ 16(BX)
36 ADDQ AX, DI
37 ADCQ DX, SI
38
39 // r0 += 19×a4×b1
40 MOVQ 32(CX), AX
41 IMUL3Q $0x13, AX, AX
42 MULQ 8(BX)
43 ADDQ AX, DI
44 ADCQ DX, SI
45
46 // r1 = a0×b1
47 MOVQ (CX), AX
48 MULQ 8(BX)
49 MOVQ AX, R9
50 MOVQ DX, R8
51
52 // r1 += a1×b0
53 MOVQ 8(CX), AX
54 MULQ (BX)
55 ADDQ AX, R9
56 ADCQ DX, R8
57
58 // r1 += 19×a2×b4
59 MOVQ 16(CX), AX
60 IMUL3Q $0x13, AX, AX
61 MULQ 32(BX)
62 ADDQ AX, R9
63 ADCQ DX, R8
64
65 // r1 += 19×a3×b3
66 MOVQ 24(CX), AX
67 IMUL3Q $0x13, AX, AX
68 MULQ 24(BX)
69 ADDQ AX, R9
70 ADCQ DX, R8
71
72 // r1 += 19×a4×b2
73 MOVQ 32(CX), AX
74 IMUL3Q $0x13, AX, AX
75 MULQ 16(BX)
76 ADDQ AX, R9
77 ADCQ DX, R8
78
79 // r2 = a0×b2
80 MOVQ (CX), AX
81 MULQ 16(BX)
82 MOVQ AX, R11
83 MOVQ DX, R10
84
85 // r2 += a1×b1
86 MOVQ 8(CX), AX
87 MULQ 8(BX)
88 ADDQ AX, R11
89 ADCQ DX, R10
90
91 // r2 += a2×b0
92 MOVQ 16(CX), AX
93 MULQ (BX)
94 ADDQ AX, R11
95 ADCQ DX, R10
96
97 // r2 += 19×a3×b4
98 MOVQ 24(CX), AX
99 IMUL3Q $0x13, AX, AX
100 MULQ 32(BX)
101 ADDQ AX, R11
102 ADCQ DX, R10
103
104 // r2 += 19×a4×b3
105 MOVQ 32(CX), AX
106 IMUL3Q $0x13, AX, AX
107 MULQ 24(BX)
108 ADDQ AX, R11
109 ADCQ DX, R10
110
111 // r3 = a0×b3
112 MOVQ (CX), AX
113 MULQ 24(BX)
114 MOVQ AX, R13
115 MOVQ DX, R12
116
117 // r3 += a1×b2
118 MOVQ 8(CX), AX
119 MULQ 16(BX)
120 ADDQ AX, R13
121 ADCQ DX, R12
122
123 // r3 += a2×b1
124 MOVQ 16(CX), AX
125 MULQ 8(BX)
126 ADDQ AX, R13
127 ADCQ DX, R12
128
129 // r3 += a3×b0
130 MOVQ 24(CX), AX
131 MULQ (BX)
132 ADDQ AX, R13
133 ADCQ DX, R12
134
135 // r3 += 19×a4×b4
136 MOVQ 32(CX), AX
137 IMUL3Q $0x13, AX, AX
138 MULQ 32(BX)
139 ADDQ AX, R13
140 ADCQ DX, R12
141
142 // r4 = a0×b4
143 MOVQ (CX), AX
144 MULQ 32(BX)
145 MOVQ AX, R15
146 MOVQ DX, R14
147
148 // r4 += a1×b3
149 MOVQ 8(CX), AX
150 MULQ 24(BX)
151 ADDQ AX, R15
152 ADCQ DX, R14
153
154 // r4 += a2×b2
155 MOVQ 16(CX), AX
156 MULQ 16(BX)
157 ADDQ AX, R15
158 ADCQ DX, R14
159
160 // r4 += a3×b1
161 MOVQ 24(CX), AX
162 MULQ 8(BX)
163 ADDQ AX, R15
164 ADCQ DX, R14
165
166 // r4 += a4×b0
167 MOVQ 32(CX), AX
168 MULQ (BX)
169 ADDQ AX, R15
170 ADCQ DX, R14
171
172 // First reduction chain
173 MOVQ $0x0007ffffffffffff, AX
174 SHLQ $0x0d, DI, SI
175 SHLQ $0x0d, R9, R8
176 SHLQ $0x0d, R11, R10
177 SHLQ $0x0d, R13, R12
178 SHLQ $0x0d, R15, R14
179 ANDQ AX, DI
180 IMUL3Q $0x13, R14, R14
181 ADDQ R14, DI
182 ANDQ AX, R9
183 ADDQ SI, R9
184 ANDQ AX, R11
185 ADDQ R8, R11
186 ANDQ AX, R13
187 ADDQ R10, R13
188 ANDQ AX, R15
189 ADDQ R12, R15
190
191 // Second reduction chain (carryPropagate)
192 MOVQ DI, SI
193 SHRQ $0x33, SI
194 MOVQ R9, R8
195 SHRQ $0x33, R8
196 MOVQ R11, R10
197 SHRQ $0x33, R10
198 MOVQ R13, R12
199 SHRQ $0x33, R12
200 MOVQ R15, R14
201 SHRQ $0x33, R14
202 ANDQ AX, DI
203 IMUL3Q $0x13, R14, R14
204 ADDQ R14, DI
205 ANDQ AX, R9
206 ADDQ SI, R9
207 ANDQ AX, R11
208 ADDQ R8, R11
209 ANDQ AX, R13
210 ADDQ R10, R13
211 ANDQ AX, R15
212 ADDQ R12, R15
213
214 // Store output
215 MOVQ out+0(FP), AX
216 MOVQ DI, (AX)
217 MOVQ R9, 8(AX)
218 MOVQ R11, 16(AX)
219 MOVQ R13, 24(AX)
220 MOVQ R15, 32(AX)
221 RET
222
223 // func feSquare(out *Element, a *Element)
224 TEXT ·feSquare(SB), NOSPLIT, $0-16
225 MOVQ a+8(FP), CX
226
227 // r0 = l0×l0
228 MOVQ (CX), AX
229 MULQ (CX)
230 MOVQ AX, SI
231 MOVQ DX, BX
232
233 // r0 += 38×l1×l4
234 MOVQ 8(CX), AX
235 IMUL3Q $0x26, AX, AX
236 MULQ 32(CX)
237 ADDQ AX, SI
238 ADCQ DX, BX
239
240 // r0 += 38×l2×l3
241 MOVQ 16(CX), AX
242 IMUL3Q $0x26, AX, AX
243 MULQ 24(CX)
244 ADDQ AX, SI
245 ADCQ DX, BX
246
247 // r1 = 2×l0×l1
248 MOVQ (CX), AX
249 SHLQ $0x01, AX
250 MULQ 8(CX)
251 MOVQ AX, R8
252 MOVQ DX, DI
253
254 // r1 += 38×l2×l4
255 MOVQ 16(CX), AX
256 IMUL3Q $0x26, AX, AX
257 MULQ 32(CX)
258 ADDQ AX, R8
259 ADCQ DX, DI
260
261 // r1 += 19×l3×l3
262 MOVQ 24(CX), AX
263 IMUL3Q $0x13, AX, AX
264 MULQ 24(CX)
265 ADDQ AX, R8
266 ADCQ DX, DI
267
268 // r2 = 2×l0×l2
269 MOVQ (CX), AX
270 SHLQ $0x01, AX
271 MULQ 16(CX)
272 MOVQ AX, R10
273 MOVQ DX, R9
274
275 // r2 += l1×l1
276 MOVQ 8(CX), AX
277 MULQ 8(CX)
278 ADDQ AX, R10
279 ADCQ DX, R9
280
281 // r2 += 38×l3×l4
282 MOVQ 24(CX), AX
283 IMUL3Q $0x26, AX, AX
284 MULQ 32(CX)
285 ADDQ AX, R10
286 ADCQ DX, R9
287
288 // r3 = 2×l0×l3
289 MOVQ (CX), AX
290 SHLQ $0x01, AX
291 MULQ 24(CX)
292 MOVQ AX, R12
293 MOVQ DX, R11
294
295 // r3 += 2×l1×l2
296 MOVQ 8(CX), AX
297 IMUL3Q $0x02, AX, AX
298 MULQ 16(CX)
299 ADDQ AX, R12
300 ADCQ DX, R11
301
302 // r3 += 19×l4×l4
303 MOVQ 32(CX), AX
304 IMUL3Q $0x13, AX, AX
305 MULQ 32(CX)
306 ADDQ AX, R12
307 ADCQ DX, R11
308
309 // r4 = 2×l0×l4
310 MOVQ (CX), AX
311 SHLQ $0x01, AX
312 MULQ 32(CX)
313 MOVQ AX, R14
314 MOVQ DX, R13
315
316 // r4 += 2×l1×l3
317 MOVQ 8(CX), AX
318 IMUL3Q $0x02, AX, AX
319 MULQ 24(CX)
320 ADDQ AX, R14
321 ADCQ DX, R13
322
323 // r4 += l2×l2
324 MOVQ 16(CX), AX
325 MULQ 16(CX)
326 ADDQ AX, R14
327 ADCQ DX, R13
328
329 // First reduction chain
330 MOVQ $0x0007ffffffffffff, AX
331 SHLQ $0x0d, SI, BX
332 SHLQ $0x0d, R8, DI
333 SHLQ $0x0d, R10, R9
334 SHLQ $0x0d, R12, R11
335 SHLQ $0x0d, R14, R13
336 ANDQ AX, SI
337 IMUL3Q $0x13, R13, R13
338 ADDQ R13, SI
339 ANDQ AX, R8
340 ADDQ BX, R8
341 ANDQ AX, R10
342 ADDQ DI, R10
343 ANDQ AX, R12
344 ADDQ R9, R12
345 ANDQ AX, R14
346 ADDQ R11, R14
347
348 // Second reduction chain (carryPropagate)
349 MOVQ SI, BX
350 SHRQ $0x33, BX
351 MOVQ R8, DI
352 SHRQ $0x33, DI
353 MOVQ R10, R9
354 SHRQ $0x33, R9
355 MOVQ R12, R11
356 SHRQ $0x33, R11
357 MOVQ R14, R13
358 SHRQ $0x33, R13
359 ANDQ AX, SI
360 IMUL3Q $0x13, R13, R13
361 ADDQ R13, SI
362 ANDQ AX, R8
363 ADDQ BX, R8
364 ANDQ AX, R10
365 ADDQ DI, R10
366 ANDQ AX, R12
367 ADDQ R9, R12
368 ANDQ AX, R14
369 ADDQ R11, R14
370
371 // Store output
372 MOVQ out+0(FP), AX
373 MOVQ SI, (AX)
374 MOVQ R8, 8(AX)
375 MOVQ R10, 16(AX)
376 MOVQ R12, 24(AX)
377 MOVQ R14, 32(AX)
378 RET
379
View as plain text