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