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), DX
20 LEAQ (DX)(DX*8), AX
21 LEAQ (DX)(AX*2), AX
22 MULQ 32(BX)
23 ADDQ AX, DI
24 ADCQ DX, SI
25
26 // r0 += 19×a2×b3
27 MOVQ 16(CX), DX
28 LEAQ (DX)(DX*8), AX
29 LEAQ (DX)(AX*2), AX
30 MULQ 24(BX)
31 ADDQ AX, DI
32 ADCQ DX, SI
33
34 // r0 += 19×a3×b2
35 MOVQ 24(CX), DX
36 LEAQ (DX)(DX*8), AX
37 LEAQ (DX)(AX*2), AX
38 MULQ 16(BX)
39 ADDQ AX, DI
40 ADCQ DX, SI
41
42 // r0 += 19×a4×b1
43 MOVQ 32(CX), DX
44 LEAQ (DX)(DX*8), AX
45 LEAQ (DX)(AX*2), AX
46 MULQ 8(BX)
47 ADDQ AX, DI
48 ADCQ DX, SI
49
50 // r1 = a0×b1
51 MOVQ (CX), AX
52 MULQ 8(BX)
53 MOVQ AX, R9
54 MOVQ DX, R8
55
56 // r1 += a1×b0
57 MOVQ 8(CX), AX
58 MULQ (BX)
59 ADDQ AX, R9
60 ADCQ DX, R8
61
62 // r1 += 19×a2×b4
63 MOVQ 16(CX), DX
64 LEAQ (DX)(DX*8), AX
65 LEAQ (DX)(AX*2), AX
66 MULQ 32(BX)
67 ADDQ AX, R9
68 ADCQ DX, R8
69
70 // r1 += 19×a3×b3
71 MOVQ 24(CX), DX
72 LEAQ (DX)(DX*8), AX
73 LEAQ (DX)(AX*2), AX
74 MULQ 24(BX)
75 ADDQ AX, R9
76 ADCQ DX, R8
77
78 // r1 += 19×a4×b2
79 MOVQ 32(CX), DX
80 LEAQ (DX)(DX*8), AX
81 LEAQ (DX)(AX*2), AX
82 MULQ 16(BX)
83 ADDQ AX, R9
84 ADCQ DX, R8
85
86 // r2 = a0×b2
87 MOVQ (CX), AX
88 MULQ 16(BX)
89 MOVQ AX, R11
90 MOVQ DX, R10
91
92 // r2 += a1×b1
93 MOVQ 8(CX), AX
94 MULQ 8(BX)
95 ADDQ AX, R11
96 ADCQ DX, R10
97
98 // r2 += a2×b0
99 MOVQ 16(CX), AX
100 MULQ (BX)
101 ADDQ AX, R11
102 ADCQ DX, R10
103
104 // r2 += 19×a3×b4
105 MOVQ 24(CX), DX
106 LEAQ (DX)(DX*8), AX
107 LEAQ (DX)(AX*2), AX
108 MULQ 32(BX)
109 ADDQ AX, R11
110 ADCQ DX, R10
111
112 // r2 += 19×a4×b3
113 MOVQ 32(CX), DX
114 LEAQ (DX)(DX*8), AX
115 LEAQ (DX)(AX*2), AX
116 MULQ 24(BX)
117 ADDQ AX, R11
118 ADCQ DX, R10
119
120 // r3 = a0×b3
121 MOVQ (CX), AX
122 MULQ 24(BX)
123 MOVQ AX, R13
124 MOVQ DX, R12
125
126 // r3 += a1×b2
127 MOVQ 8(CX), AX
128 MULQ 16(BX)
129 ADDQ AX, R13
130 ADCQ DX, R12
131
132 // r3 += a2×b1
133 MOVQ 16(CX), AX
134 MULQ 8(BX)
135 ADDQ AX, R13
136 ADCQ DX, R12
137
138 // r3 += a3×b0
139 MOVQ 24(CX), AX
140 MULQ (BX)
141 ADDQ AX, R13
142 ADCQ DX, R12
143
144 // r3 += 19×a4×b4
145 MOVQ 32(CX), DX
146 LEAQ (DX)(DX*8), AX
147 LEAQ (DX)(AX*2), AX
148 MULQ 32(BX)
149 ADDQ AX, R13
150 ADCQ DX, R12
151
152 // r4 = a0×b4
153 MOVQ (CX), AX
154 MULQ 32(BX)
155 MOVQ AX, R15
156 MOVQ DX, R14
157
158 // r4 += a1×b3
159 MOVQ 8(CX), AX
160 MULQ 24(BX)
161 ADDQ AX, R15
162 ADCQ DX, R14
163
164 // r4 += a2×b2
165 MOVQ 16(CX), AX
166 MULQ 16(BX)
167 ADDQ AX, R15
168 ADCQ DX, R14
169
170 // r4 += a3×b1
171 MOVQ 24(CX), AX
172 MULQ 8(BX)
173 ADDQ AX, R15
174 ADCQ DX, R14
175
176 // r4 += a4×b0
177 MOVQ 32(CX), AX
178 MULQ (BX)
179 ADDQ AX, R15
180 ADCQ DX, R14
181
182 // First reduction chain
183 MOVQ $0x0007ffffffffffff, AX
184 SHLQ $0x0d, DI, SI
185 SHLQ $0x0d, R9, R8
186 SHLQ $0x0d, R11, R10
187 SHLQ $0x0d, R13, R12
188 SHLQ $0x0d, R15, R14
189 ANDQ AX, DI
190 IMUL3Q $0x13, R14, R14
191 ADDQ R14, DI
192 ANDQ AX, R9
193 ADDQ SI, R9
194 ANDQ AX, R11
195 ADDQ R8, R11
196 ANDQ AX, R13
197 ADDQ R10, R13
198 ANDQ AX, R15
199 ADDQ R12, R15
200
201 // Second reduction chain (carryPropagate)
202 MOVQ DI, SI
203 SHRQ $0x33, SI
204 MOVQ R9, R8
205 SHRQ $0x33, R8
206 MOVQ R11, R10
207 SHRQ $0x33, R10
208 MOVQ R13, R12
209 SHRQ $0x33, R12
210 MOVQ R15, R14
211 SHRQ $0x33, R14
212 ANDQ AX, DI
213 IMUL3Q $0x13, R14, R14
214 ADDQ R14, DI
215 ANDQ AX, R9
216 ADDQ SI, R9
217 ANDQ AX, R11
218 ADDQ R8, R11
219 ANDQ AX, R13
220 ADDQ R10, R13
221 ANDQ AX, R15
222 ADDQ R12, R15
223
224 // Store output
225 MOVQ out+0(FP), AX
226 MOVQ DI, (AX)
227 MOVQ R9, 8(AX)
228 MOVQ R11, 16(AX)
229 MOVQ R13, 24(AX)
230 MOVQ R15, 32(AX)
231 RET
232
View as plain text