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// +build amd64,gc,!purego
4
5#include "textflag.h"
6
7// func feMul(out *Element, a *Element, b *Element)
8TEXT ·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)
224TEXT ·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