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)
9TEXT ·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)
225TEXT ·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