1 #ifndef MPFQ_FIXMP_X86_64_H_
2 #define MPFQ_FIXMP_X86_64_H_
3 
4 /* MPFQ generated file -- do not edit */
5 
6 #include <gmp.h>
7 #include <limits.h>
8 #ifdef	MPFQ_LAST_GENERATED_TAG
9 #undef	MPFQ_LAST_GENERATED_TAG
10 #endif
11 #define MPFQ_LAST_GENERATED_TAG      fixmp
12 
13 /* Active handler: Mpfq::fixmp::x86_64 */
14 /* Options used:{ features={ gcc_inline_assembly=1, }, tag=fixmp, w=64, } */
15 
16 
17 #ifdef  __cplusplus
18 extern "C" {
19 #endif
20 #define HAVE_native_mpfq_fixmp_1_add
21 static inline
22 mp_limb_t mpfq_fixmp_1_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
23 #define HAVE_native_mpfq_fixmp_1_sub
24 static inline
25 mp_limb_t mpfq_fixmp_1_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
26 #define HAVE_native_mpfq_fixmp_1_add_nc
27 static inline
28 void mpfq_fixmp_1_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
29 #define HAVE_native_mpfq_fixmp_1_sub_nc
30 static inline
31 void mpfq_fixmp_1_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
32 #define HAVE_native_mpfq_fixmp_1_addmul1
33 static inline
34 mp_limb_t mpfq_fixmp_1_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
35 #define HAVE_native_mpfq_fixmp_1_addmul1_nc
36 static inline
37 void mpfq_fixmp_1_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
38 #define HAVE_native_mpfq_fixmp_1_addmul1_shortz
39 static inline
40 mp_limb_t mpfq_fixmp_1_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
41 #define HAVE_native_mpfq_fixmp_1_mul
42 static inline
43 void mpfq_fixmp_1_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
44 #define HAVE_native_mpfq_fixmp_1_sqr
45 static inline
46 void mpfq_fixmp_1_sqr(mp_limb_t *, const mp_limb_t *);
47 #define HAVE_native_mpfq_fixmp_1_mul1
48 static inline
49 void mpfq_fixmp_1_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
50 #define HAVE_native_mpfq_fixmp_1_mulredc
51 static inline
52 void mpfq_fixmp_1_mulredc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
53 #define HAVE_native_mpfq_fixmp_2_add
54 static inline
55 mp_limb_t mpfq_fixmp_2_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
56 #define HAVE_native_mpfq_fixmp_2_sub
57 static inline
58 mp_limb_t mpfq_fixmp_2_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
59 #define HAVE_native_mpfq_fixmp_2_add_nc
60 static inline
61 void mpfq_fixmp_2_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
62 #define HAVE_native_mpfq_fixmp_2_sub_nc
63 static inline
64 void mpfq_fixmp_2_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
65 #define HAVE_native_mpfq_fixmp_2_addmul1
66 static inline
67 mp_limb_t mpfq_fixmp_2_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
68 #define HAVE_native_mpfq_fixmp_2_addmul1_nc
69 static inline
70 void mpfq_fixmp_2_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
71 #define HAVE_native_mpfq_fixmp_2_addmul1_shortz
72 static inline
73 mp_limb_t mpfq_fixmp_2_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
74 #define HAVE_native_mpfq_fixmp_2_mul
75 static inline
76 void mpfq_fixmp_2_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
77 #define HAVE_native_mpfq_fixmp_2_sqr
78 static inline
79 void mpfq_fixmp_2_sqr(mp_limb_t *, const mp_limb_t *);
80 #define HAVE_native_mpfq_fixmp_2_mul1
81 static inline
82 void mpfq_fixmp_2_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
83 #define HAVE_native_mpfq_fixmp_3_add
84 static inline
85 mp_limb_t mpfq_fixmp_3_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
86 #define HAVE_native_mpfq_fixmp_3_sub
87 static inline
88 mp_limb_t mpfq_fixmp_3_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
89 #define HAVE_native_mpfq_fixmp_3_add_nc
90 static inline
91 void mpfq_fixmp_3_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
92 #define HAVE_native_mpfq_fixmp_3_sub_nc
93 static inline
94 void mpfq_fixmp_3_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
95 #define HAVE_native_mpfq_fixmp_3_addmul1
96 static inline
97 mp_limb_t mpfq_fixmp_3_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
98 #define HAVE_native_mpfq_fixmp_3_addmul1_nc
99 static inline
100 void mpfq_fixmp_3_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
101 #define HAVE_native_mpfq_fixmp_3_addmul1_shortz
102 static inline
103 mp_limb_t mpfq_fixmp_3_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
104 #define HAVE_native_mpfq_fixmp_3_mul
105 static inline
106 void mpfq_fixmp_3_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
107 #define HAVE_native_mpfq_fixmp_3_sqr
108 static inline
109 void mpfq_fixmp_3_sqr(mp_limb_t *, const mp_limb_t *);
110 #define HAVE_native_mpfq_fixmp_3_mul1
111 static inline
112 void mpfq_fixmp_3_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
113 #define HAVE_native_mpfq_fixmp_4_add
114 static inline
115 mp_limb_t mpfq_fixmp_4_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
116 #define HAVE_native_mpfq_fixmp_4_sub
117 static inline
118 mp_limb_t mpfq_fixmp_4_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
119 #define HAVE_native_mpfq_fixmp_4_add_nc
120 static inline
121 void mpfq_fixmp_4_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
122 #define HAVE_native_mpfq_fixmp_4_sub_nc
123 static inline
124 void mpfq_fixmp_4_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
125 #define HAVE_native_mpfq_fixmp_4_addmul1
126 static inline
127 mp_limb_t mpfq_fixmp_4_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
128 #define HAVE_native_mpfq_fixmp_4_addmul1_nc
129 static inline
130 void mpfq_fixmp_4_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
131 #define HAVE_native_mpfq_fixmp_4_addmul1_shortz
132 static inline
133 mp_limb_t mpfq_fixmp_4_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
134 #define HAVE_native_mpfq_fixmp_4_mul
135 static inline
136 void mpfq_fixmp_4_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
137 #define HAVE_native_mpfq_fixmp_4_sqr
138 static inline
139 void mpfq_fixmp_4_sqr(mp_limb_t *, const mp_limb_t *);
140 #define HAVE_native_mpfq_fixmp_4_mul1
141 static inline
142 void mpfq_fixmp_4_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
143 #define HAVE_native_mpfq_fixmp_5_add
144 static inline
145 mp_limb_t mpfq_fixmp_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
146 #define HAVE_native_mpfq_fixmp_5_sub
147 static inline
148 mp_limb_t mpfq_fixmp_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
149 #define HAVE_native_mpfq_fixmp_5_add_nc
150 static inline
151 void mpfq_fixmp_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
152 #define HAVE_native_mpfq_fixmp_5_sub_nc
153 static inline
154 void mpfq_fixmp_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
155 #define HAVE_native_mpfq_fixmp_5_addmul1
156 static inline
157 mp_limb_t mpfq_fixmp_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
158 #define HAVE_native_mpfq_fixmp_5_addmul1_nc
159 static inline
160 void mpfq_fixmp_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
161 #define HAVE_native_mpfq_fixmp_5_addmul1_shortz
162 static inline
163 mp_limb_t mpfq_fixmp_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
164 #define HAVE_native_mpfq_fixmp_5_mul
165 static inline
166 void mpfq_fixmp_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
167 #define HAVE_native_mpfq_fixmp_5_sqr
168 static inline
169 void mpfq_fixmp_5_sqr(mp_limb_t *, const mp_limb_t *);
170 #define HAVE_native_mpfq_fixmp_5_mul1
171 static inline
172 void mpfq_fixmp_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
173 #define HAVE_native_mpfq_fixmp_6_add
174 static inline
175 mp_limb_t mpfq_fixmp_6_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
176 #define HAVE_native_mpfq_fixmp_6_sub
177 static inline
178 mp_limb_t mpfq_fixmp_6_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
179 #define HAVE_native_mpfq_fixmp_6_add_nc
180 static inline
181 void mpfq_fixmp_6_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
182 #define HAVE_native_mpfq_fixmp_6_sub_nc
183 static inline
184 void mpfq_fixmp_6_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
185 #define HAVE_native_mpfq_fixmp_6_addmul1
186 static inline
187 mp_limb_t mpfq_fixmp_6_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
188 #define HAVE_native_mpfq_fixmp_6_addmul1_nc
189 static inline
190 void mpfq_fixmp_6_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
191 #define HAVE_native_mpfq_fixmp_6_addmul1_shortz
192 static inline
193 mp_limb_t mpfq_fixmp_6_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
194 #define HAVE_native_mpfq_fixmp_6_mul
195 static inline
196 void mpfq_fixmp_6_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
197 #define HAVE_native_mpfq_fixmp_6_sqr
198 static inline
199 void mpfq_fixmp_6_sqr(mp_limb_t *, const mp_limb_t *);
200 #define HAVE_native_mpfq_fixmp_6_mul1
201 static inline
202 void mpfq_fixmp_6_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
203 #define HAVE_native_mpfq_fixmp_7_add
204 static inline
205 mp_limb_t mpfq_fixmp_7_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
206 #define HAVE_native_mpfq_fixmp_7_sub
207 static inline
208 mp_limb_t mpfq_fixmp_7_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
209 #define HAVE_native_mpfq_fixmp_7_add_nc
210 static inline
211 void mpfq_fixmp_7_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
212 #define HAVE_native_mpfq_fixmp_7_sub_nc
213 static inline
214 void mpfq_fixmp_7_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
215 #define HAVE_native_mpfq_fixmp_7_addmul1
216 static inline
217 mp_limb_t mpfq_fixmp_7_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
218 #define HAVE_native_mpfq_fixmp_7_addmul1_nc
219 static inline
220 void mpfq_fixmp_7_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
221 #define HAVE_native_mpfq_fixmp_7_addmul1_shortz
222 static inline
223 mp_limb_t mpfq_fixmp_7_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
224 #define HAVE_native_mpfq_fixmp_7_mul
225 static inline
226 void mpfq_fixmp_7_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
227 #define HAVE_native_mpfq_fixmp_7_sqr
228 static inline
229 void mpfq_fixmp_7_sqr(mp_limb_t *, const mp_limb_t *);
230 #define HAVE_native_mpfq_fixmp_7_mul1
231 static inline
232 void mpfq_fixmp_7_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
233 #define HAVE_native_mpfq_fixmp_8_add
234 static inline
235 mp_limb_t mpfq_fixmp_8_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
236 #define HAVE_native_mpfq_fixmp_8_sub
237 static inline
238 mp_limb_t mpfq_fixmp_8_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
239 #define HAVE_native_mpfq_fixmp_8_add_nc
240 static inline
241 void mpfq_fixmp_8_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
242 #define HAVE_native_mpfq_fixmp_8_sub_nc
243 static inline
244 void mpfq_fixmp_8_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
245 #define HAVE_native_mpfq_fixmp_8_addmul1
246 static inline
247 mp_limb_t mpfq_fixmp_8_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
248 #define HAVE_native_mpfq_fixmp_8_addmul1_nc
249 static inline
250 void mpfq_fixmp_8_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
251 #define HAVE_native_mpfq_fixmp_8_addmul1_shortz
252 static inline
253 mp_limb_t mpfq_fixmp_8_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
254 #define HAVE_native_mpfq_fixmp_8_mul
255 static inline
256 void mpfq_fixmp_8_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
257 #define HAVE_native_mpfq_fixmp_8_sqr
258 static inline
259 void mpfq_fixmp_8_sqr(mp_limb_t *, const mp_limb_t *);
260 #define HAVE_native_mpfq_fixmp_8_mul1
261 static inline
262 void mpfq_fixmp_8_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
263 #define HAVE_native_mpfq_fixmp_9_add
264 static inline
265 mp_limb_t mpfq_fixmp_9_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
266 #define HAVE_native_mpfq_fixmp_9_sub
267 static inline
268 mp_limb_t mpfq_fixmp_9_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
269 #define HAVE_native_mpfq_fixmp_9_add_nc
270 static inline
271 void mpfq_fixmp_9_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
272 #define HAVE_native_mpfq_fixmp_9_sub_nc
273 static inline
274 void mpfq_fixmp_9_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
275 #define HAVE_native_mpfq_fixmp_9_addmul1
276 static inline
277 mp_limb_t mpfq_fixmp_9_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
278 #define HAVE_native_mpfq_fixmp_9_addmul1_nc
279 static inline
280 void mpfq_fixmp_9_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
281 #define HAVE_native_mpfq_fixmp_9_addmul1_shortz
282 static inline
283 mp_limb_t mpfq_fixmp_9_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
284 #define HAVE_native_mpfq_fixmp_9_mul
285 static inline
286 void mpfq_fixmp_9_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
287 #define HAVE_native_mpfq_fixmp_9_sqr
288 static inline
289 void mpfq_fixmp_9_sqr(mp_limb_t *, const mp_limb_t *);
290 #define HAVE_native_mpfq_fixmp_9_mul1
291 static inline
292 void mpfq_fixmp_9_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
293 #define HAVE_native_mpfq_fixmp_10_add
294 static inline
295 mp_limb_t mpfq_fixmp_10_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
296 #define HAVE_native_mpfq_fixmp_10_sub
297 static inline
298 mp_limb_t mpfq_fixmp_10_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
299 #define HAVE_native_mpfq_fixmp_10_add_nc
300 static inline
301 void mpfq_fixmp_10_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
302 #define HAVE_native_mpfq_fixmp_10_sub_nc
303 static inline
304 void mpfq_fixmp_10_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
305 #define HAVE_native_mpfq_fixmp_10_addmul1
306 static inline
307 mp_limb_t mpfq_fixmp_10_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
308 #define HAVE_native_mpfq_fixmp_10_addmul1_nc
309 static inline
310 void mpfq_fixmp_10_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
311 #define HAVE_native_mpfq_fixmp_10_addmul1_shortz
312 static inline
313 mp_limb_t mpfq_fixmp_10_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
314 #define HAVE_native_mpfq_fixmp_10_mul
315 static inline
316 void mpfq_fixmp_10_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
317 #define HAVE_native_mpfq_fixmp_10_sqr
318 static inline
319 void mpfq_fixmp_10_sqr(mp_limb_t *, const mp_limb_t *);
320 #define HAVE_native_mpfq_fixmp_10_mul1
321 static inline
322 void mpfq_fixmp_10_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
323 #define HAVE_native_mpfq_fixmp_11_add
324 static inline
325 mp_limb_t mpfq_fixmp_11_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
326 #define HAVE_native_mpfq_fixmp_11_sub
327 static inline
328 mp_limb_t mpfq_fixmp_11_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
329 #define HAVE_native_mpfq_fixmp_11_add_nc
330 static inline
331 void mpfq_fixmp_11_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
332 #define HAVE_native_mpfq_fixmp_11_sub_nc
333 static inline
334 void mpfq_fixmp_11_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
335 #define HAVE_native_mpfq_fixmp_11_addmul1
336 static inline
337 mp_limb_t mpfq_fixmp_11_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
338 #define HAVE_native_mpfq_fixmp_11_addmul1_nc
339 static inline
340 void mpfq_fixmp_11_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
341 #define HAVE_native_mpfq_fixmp_11_addmul1_shortz
342 static inline
343 mp_limb_t mpfq_fixmp_11_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
344 #define HAVE_native_mpfq_fixmp_11_mul
345 static inline
346 void mpfq_fixmp_11_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
347 #define HAVE_native_mpfq_fixmp_11_sqr
348 static inline
349 void mpfq_fixmp_11_sqr(mp_limb_t *, const mp_limb_t *);
350 #define HAVE_native_mpfq_fixmp_11_mul1
351 static inline
352 void mpfq_fixmp_11_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
353 #define HAVE_native_mpfq_fixmp_12_add
354 static inline
355 mp_limb_t mpfq_fixmp_12_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
356 #define HAVE_native_mpfq_fixmp_12_sub
357 static inline
358 mp_limb_t mpfq_fixmp_12_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
359 #define HAVE_native_mpfq_fixmp_12_add_nc
360 static inline
361 void mpfq_fixmp_12_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
362 #define HAVE_native_mpfq_fixmp_12_sub_nc
363 static inline
364 void mpfq_fixmp_12_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
365 #define HAVE_native_mpfq_fixmp_12_addmul1
366 static inline
367 mp_limb_t mpfq_fixmp_12_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
368 #define HAVE_native_mpfq_fixmp_12_addmul1_nc
369 static inline
370 void mpfq_fixmp_12_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
371 #define HAVE_native_mpfq_fixmp_12_addmul1_shortz
372 static inline
373 mp_limb_t mpfq_fixmp_12_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
374 #define HAVE_native_mpfq_fixmp_12_mul
375 static inline
376 void mpfq_fixmp_12_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
377 #define HAVE_native_mpfq_fixmp_12_sqr
378 static inline
379 void mpfq_fixmp_12_sqr(mp_limb_t *, const mp_limb_t *);
380 #define HAVE_native_mpfq_fixmp_12_mul1
381 static inline
382 void mpfq_fixmp_12_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
383 #define HAVE_native_mpfq_fixmp_13_add
384 static inline
385 mp_limb_t mpfq_fixmp_13_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
386 #define HAVE_native_mpfq_fixmp_13_sub
387 static inline
388 mp_limb_t mpfq_fixmp_13_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
389 #define HAVE_native_mpfq_fixmp_13_add_nc
390 static inline
391 void mpfq_fixmp_13_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
392 #define HAVE_native_mpfq_fixmp_13_sub_nc
393 static inline
394 void mpfq_fixmp_13_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
395 #define HAVE_native_mpfq_fixmp_13_addmul1
396 static inline
397 mp_limb_t mpfq_fixmp_13_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
398 #define HAVE_native_mpfq_fixmp_13_addmul1_nc
399 static inline
400 void mpfq_fixmp_13_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
401 #define HAVE_native_mpfq_fixmp_13_addmul1_shortz
402 static inline
403 mp_limb_t mpfq_fixmp_13_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
404 #define HAVE_native_mpfq_fixmp_13_mul
405 static inline
406 void mpfq_fixmp_13_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
407 #define HAVE_native_mpfq_fixmp_13_sqr
408 static inline
409 void mpfq_fixmp_13_sqr(mp_limb_t *, const mp_limb_t *);
410 #define HAVE_native_mpfq_fixmp_13_mul1
411 static inline
412 void mpfq_fixmp_13_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
413 #define HAVE_native_mpfq_fixmp_14_add
414 static inline
415 mp_limb_t mpfq_fixmp_14_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
416 #define HAVE_native_mpfq_fixmp_14_sub
417 static inline
418 mp_limb_t mpfq_fixmp_14_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
419 #define HAVE_native_mpfq_fixmp_14_add_nc
420 static inline
421 void mpfq_fixmp_14_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
422 #define HAVE_native_mpfq_fixmp_14_sub_nc
423 static inline
424 void mpfq_fixmp_14_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
425 #define HAVE_native_mpfq_fixmp_14_addmul1
426 static inline
427 mp_limb_t mpfq_fixmp_14_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
428 #define HAVE_native_mpfq_fixmp_14_addmul1_nc
429 static inline
430 void mpfq_fixmp_14_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
431 #define HAVE_native_mpfq_fixmp_14_addmul1_shortz
432 static inline
433 mp_limb_t mpfq_fixmp_14_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
434 #define HAVE_native_mpfq_fixmp_14_mul
435 static inline
436 void mpfq_fixmp_14_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
437 #define HAVE_native_mpfq_fixmp_14_sqr
438 static inline
439 void mpfq_fixmp_14_sqr(mp_limb_t *, const mp_limb_t *);
440 #define HAVE_native_mpfq_fixmp_14_mul1
441 static inline
442 void mpfq_fixmp_14_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
443 #define HAVE_native_mpfq_fixmp_15_add
444 static inline
445 mp_limb_t mpfq_fixmp_15_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
446 #define HAVE_native_mpfq_fixmp_15_sub
447 static inline
448 mp_limb_t mpfq_fixmp_15_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
449 #define HAVE_native_mpfq_fixmp_15_add_nc
450 static inline
451 void mpfq_fixmp_15_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
452 #define HAVE_native_mpfq_fixmp_15_sub_nc
453 static inline
454 void mpfq_fixmp_15_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
455 #define HAVE_native_mpfq_fixmp_15_addmul1
456 static inline
457 mp_limb_t mpfq_fixmp_15_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
458 #define HAVE_native_mpfq_fixmp_15_addmul1_nc
459 static inline
460 void mpfq_fixmp_15_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
461 #define HAVE_native_mpfq_fixmp_15_addmul1_shortz
462 static inline
463 mp_limb_t mpfq_fixmp_15_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
464 #define HAVE_native_mpfq_fixmp_15_mul
465 static inline
466 void mpfq_fixmp_15_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
467 #define HAVE_native_mpfq_fixmp_15_sqr
468 static inline
469 void mpfq_fixmp_15_sqr(mp_limb_t *, const mp_limb_t *);
470 #define HAVE_native_mpfq_fixmp_15_mul1
471 static inline
472 void mpfq_fixmp_15_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
473 #define HAVE_native_mpfq_fixmp_0_5_add
474 static inline
475 mp_limb_t mpfq_fixmp_0_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
476 #define HAVE_native_mpfq_fixmp_0_5_sub
477 static inline
478 mp_limb_t mpfq_fixmp_0_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
479 #define HAVE_native_mpfq_fixmp_0_5_add_nc
480 static inline
481 void mpfq_fixmp_0_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
482 #define HAVE_native_mpfq_fixmp_0_5_sub_nc
483 static inline
484 void mpfq_fixmp_0_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
485 #define HAVE_native_mpfq_fixmp_0_5_addmul1
486 static inline
487 mp_limb_t mpfq_fixmp_0_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
488 #define HAVE_native_mpfq_fixmp_0_5_addmul1_nc
489 static inline
490 void mpfq_fixmp_0_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
491 #define HAVE_native_mpfq_fixmp_0_5_addmul1_shortz
492 static inline
493 mp_limb_t mpfq_fixmp_0_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
494 #define HAVE_native_mpfq_fixmp_0_5_mul
495 static inline
496 void mpfq_fixmp_0_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
497 #define HAVE_native_mpfq_fixmp_0_5_sqr
498 static inline
499 void mpfq_fixmp_0_5_sqr(mp_limb_t *, const mp_limb_t *);
500 #define HAVE_native_mpfq_fixmp_0_5_mul1
501 static inline
502 void mpfq_fixmp_0_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
503 #define HAVE_native_mpfq_fixmp_0_5_addmul05
504 static inline
505 mp_limb_t mpfq_fixmp_0_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
506 #define HAVE_native_mpfq_fixmp_0_5_addmul05_nc
507 static inline
508 void mpfq_fixmp_0_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
509 #define HAVE_native_mpfq_fixmp_0_5_mul05
510 static inline
511 void mpfq_fixmp_0_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
512 #define HAVE_native_mpfq_fixmp_1_5_add
513 static inline
514 mp_limb_t mpfq_fixmp_1_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
515 #define HAVE_native_mpfq_fixmp_1_5_sub
516 static inline
517 mp_limb_t mpfq_fixmp_1_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
518 #define HAVE_native_mpfq_fixmp_1_5_add_nc
519 static inline
520 void mpfq_fixmp_1_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
521 #define HAVE_native_mpfq_fixmp_1_5_sub_nc
522 static inline
523 void mpfq_fixmp_1_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
524 #define HAVE_native_mpfq_fixmp_1_5_addmul1
525 static inline
526 mp_limb_t mpfq_fixmp_1_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
527 #define HAVE_native_mpfq_fixmp_1_5_addmul1_nc
528 static inline
529 void mpfq_fixmp_1_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
530 #define HAVE_native_mpfq_fixmp_1_5_addmul1_shortz
531 static inline
532 mp_limb_t mpfq_fixmp_1_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
533 #define HAVE_native_mpfq_fixmp_1_5_mul
534 static inline
535 void mpfq_fixmp_1_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
536 #define HAVE_native_mpfq_fixmp_1_5_sqr
537 static inline
538 void mpfq_fixmp_1_5_sqr(mp_limb_t *, const mp_limb_t *);
539 #define HAVE_native_mpfq_fixmp_1_5_mul1
540 static inline
541 void mpfq_fixmp_1_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
542 #define HAVE_native_mpfq_fixmp_1_5_addmul05
543 static inline
544 mp_limb_t mpfq_fixmp_1_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
545 #define HAVE_native_mpfq_fixmp_1_5_addmul05_nc
546 static inline
547 void mpfq_fixmp_1_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
548 #define HAVE_native_mpfq_fixmp_1_5_mul05
549 static inline
550 void mpfq_fixmp_1_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
551 #define HAVE_native_mpfq_fixmp_2_5_add
552 static inline
553 mp_limb_t mpfq_fixmp_2_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
554 #define HAVE_native_mpfq_fixmp_2_5_sub
555 static inline
556 mp_limb_t mpfq_fixmp_2_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
557 #define HAVE_native_mpfq_fixmp_2_5_add_nc
558 static inline
559 void mpfq_fixmp_2_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
560 #define HAVE_native_mpfq_fixmp_2_5_sub_nc
561 static inline
562 void mpfq_fixmp_2_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
563 #define HAVE_native_mpfq_fixmp_2_5_addmul1
564 static inline
565 mp_limb_t mpfq_fixmp_2_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
566 #define HAVE_native_mpfq_fixmp_2_5_addmul1_nc
567 static inline
568 void mpfq_fixmp_2_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
569 #define HAVE_native_mpfq_fixmp_2_5_addmul1_shortz
570 static inline
571 mp_limb_t mpfq_fixmp_2_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
572 #define HAVE_native_mpfq_fixmp_2_5_mul
573 static inline
574 void mpfq_fixmp_2_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
575 #define HAVE_native_mpfq_fixmp_2_5_sqr
576 static inline
577 void mpfq_fixmp_2_5_sqr(mp_limb_t *, const mp_limb_t *);
578 #define HAVE_native_mpfq_fixmp_2_5_mul1
579 static inline
580 void mpfq_fixmp_2_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
581 #define HAVE_native_mpfq_fixmp_2_5_addmul05
582 static inline
583 mp_limb_t mpfq_fixmp_2_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
584 #define HAVE_native_mpfq_fixmp_2_5_addmul05_nc
585 static inline
586 void mpfq_fixmp_2_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
587 #define HAVE_native_mpfq_fixmp_2_5_mul05
588 static inline
589 void mpfq_fixmp_2_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
590 #define HAVE_native_mpfq_fixmp_3_5_add
591 static inline
592 mp_limb_t mpfq_fixmp_3_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
593 #define HAVE_native_mpfq_fixmp_3_5_sub
594 static inline
595 mp_limb_t mpfq_fixmp_3_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
596 #define HAVE_native_mpfq_fixmp_3_5_add_nc
597 static inline
598 void mpfq_fixmp_3_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
599 #define HAVE_native_mpfq_fixmp_3_5_sub_nc
600 static inline
601 void mpfq_fixmp_3_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
602 #define HAVE_native_mpfq_fixmp_3_5_addmul1
603 static inline
604 mp_limb_t mpfq_fixmp_3_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
605 #define HAVE_native_mpfq_fixmp_3_5_addmul1_nc
606 static inline
607 void mpfq_fixmp_3_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
608 #define HAVE_native_mpfq_fixmp_3_5_addmul1_shortz
609 static inline
610 mp_limb_t mpfq_fixmp_3_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
611 #define HAVE_native_mpfq_fixmp_3_5_mul
612 static inline
613 void mpfq_fixmp_3_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
614 #define HAVE_native_mpfq_fixmp_3_5_sqr
615 static inline
616 void mpfq_fixmp_3_5_sqr(mp_limb_t *, const mp_limb_t *);
617 #define HAVE_native_mpfq_fixmp_3_5_mul1
618 static inline
619 void mpfq_fixmp_3_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
620 #define HAVE_native_mpfq_fixmp_3_5_addmul05
621 static inline
622 mp_limb_t mpfq_fixmp_3_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
623 #define HAVE_native_mpfq_fixmp_3_5_addmul05_nc
624 static inline
625 void mpfq_fixmp_3_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
626 #define HAVE_native_mpfq_fixmp_3_5_mul05
627 static inline
628 void mpfq_fixmp_3_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
629 #define HAVE_native_mpfq_fixmp_4_5_add
630 static inline
631 mp_limb_t mpfq_fixmp_4_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
632 #define HAVE_native_mpfq_fixmp_4_5_sub
633 static inline
634 mp_limb_t mpfq_fixmp_4_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
635 #define HAVE_native_mpfq_fixmp_4_5_add_nc
636 static inline
637 void mpfq_fixmp_4_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
638 #define HAVE_native_mpfq_fixmp_4_5_sub_nc
639 static inline
640 void mpfq_fixmp_4_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
641 #define HAVE_native_mpfq_fixmp_4_5_addmul1
642 static inline
643 mp_limb_t mpfq_fixmp_4_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
644 #define HAVE_native_mpfq_fixmp_4_5_addmul1_nc
645 static inline
646 void mpfq_fixmp_4_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
647 #define HAVE_native_mpfq_fixmp_4_5_addmul1_shortz
648 static inline
649 mp_limb_t mpfq_fixmp_4_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
650 #define HAVE_native_mpfq_fixmp_4_5_mul
651 static inline
652 void mpfq_fixmp_4_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
653 #define HAVE_native_mpfq_fixmp_4_5_sqr
654 static inline
655 void mpfq_fixmp_4_5_sqr(mp_limb_t *, const mp_limb_t *);
656 #define HAVE_native_mpfq_fixmp_4_5_mul1
657 static inline
658 void mpfq_fixmp_4_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
659 #define HAVE_native_mpfq_fixmp_4_5_addmul05
660 static inline
661 mp_limb_t mpfq_fixmp_4_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
662 #define HAVE_native_mpfq_fixmp_4_5_addmul05_nc
663 static inline
664 void mpfq_fixmp_4_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
665 #define HAVE_native_mpfq_fixmp_4_5_mul05
666 static inline
667 void mpfq_fixmp_4_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
668 #define HAVE_native_mpfq_fixmp_5_5_add
669 static inline
670 mp_limb_t mpfq_fixmp_5_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
671 #define HAVE_native_mpfq_fixmp_5_5_sub
672 static inline
673 mp_limb_t mpfq_fixmp_5_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
674 #define HAVE_native_mpfq_fixmp_5_5_add_nc
675 static inline
676 void mpfq_fixmp_5_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
677 #define HAVE_native_mpfq_fixmp_5_5_sub_nc
678 static inline
679 void mpfq_fixmp_5_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
680 #define HAVE_native_mpfq_fixmp_5_5_addmul1
681 static inline
682 mp_limb_t mpfq_fixmp_5_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
683 #define HAVE_native_mpfq_fixmp_5_5_addmul1_nc
684 static inline
685 void mpfq_fixmp_5_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
686 #define HAVE_native_mpfq_fixmp_5_5_addmul1_shortz
687 static inline
688 mp_limb_t mpfq_fixmp_5_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
689 #define HAVE_native_mpfq_fixmp_5_5_mul
690 static inline
691 void mpfq_fixmp_5_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
692 #define HAVE_native_mpfq_fixmp_5_5_sqr
693 static inline
694 void mpfq_fixmp_5_5_sqr(mp_limb_t *, const mp_limb_t *);
695 #define HAVE_native_mpfq_fixmp_5_5_mul1
696 static inline
697 void mpfq_fixmp_5_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
698 #define HAVE_native_mpfq_fixmp_5_5_addmul05
699 static inline
700 mp_limb_t mpfq_fixmp_5_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
701 #define HAVE_native_mpfq_fixmp_5_5_addmul05_nc
702 static inline
703 void mpfq_fixmp_5_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
704 #define HAVE_native_mpfq_fixmp_5_5_mul05
705 static inline
706 void mpfq_fixmp_5_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
707 #define HAVE_native_mpfq_fixmp_6_5_add
708 static inline
709 mp_limb_t mpfq_fixmp_6_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
710 #define HAVE_native_mpfq_fixmp_6_5_sub
711 static inline
712 mp_limb_t mpfq_fixmp_6_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
713 #define HAVE_native_mpfq_fixmp_6_5_add_nc
714 static inline
715 void mpfq_fixmp_6_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
716 #define HAVE_native_mpfq_fixmp_6_5_sub_nc
717 static inline
718 void mpfq_fixmp_6_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
719 #define HAVE_native_mpfq_fixmp_6_5_addmul1
720 static inline
721 mp_limb_t mpfq_fixmp_6_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
722 #define HAVE_native_mpfq_fixmp_6_5_addmul1_nc
723 static inline
724 void mpfq_fixmp_6_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
725 #define HAVE_native_mpfq_fixmp_6_5_addmul1_shortz
726 static inline
727 mp_limb_t mpfq_fixmp_6_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
728 #define HAVE_native_mpfq_fixmp_6_5_mul
729 static inline
730 void mpfq_fixmp_6_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
731 #define HAVE_native_mpfq_fixmp_6_5_sqr
732 static inline
733 void mpfq_fixmp_6_5_sqr(mp_limb_t *, const mp_limb_t *);
734 #define HAVE_native_mpfq_fixmp_6_5_mul1
735 static inline
736 void mpfq_fixmp_6_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
737 #define HAVE_native_mpfq_fixmp_6_5_addmul05
738 static inline
739 mp_limb_t mpfq_fixmp_6_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
740 #define HAVE_native_mpfq_fixmp_6_5_addmul05_nc
741 static inline
742 void mpfq_fixmp_6_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
743 #define HAVE_native_mpfq_fixmp_6_5_mul05
744 static inline
745 void mpfq_fixmp_6_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
746 #define HAVE_native_mpfq_fixmp_7_5_add
747 static inline
748 mp_limb_t mpfq_fixmp_7_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
749 #define HAVE_native_mpfq_fixmp_7_5_sub
750 static inline
751 mp_limb_t mpfq_fixmp_7_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
752 #define HAVE_native_mpfq_fixmp_7_5_add_nc
753 static inline
754 void mpfq_fixmp_7_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
755 #define HAVE_native_mpfq_fixmp_7_5_sub_nc
756 static inline
757 void mpfq_fixmp_7_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
758 #define HAVE_native_mpfq_fixmp_7_5_addmul1
759 static inline
760 mp_limb_t mpfq_fixmp_7_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
761 #define HAVE_native_mpfq_fixmp_7_5_addmul1_nc
762 static inline
763 void mpfq_fixmp_7_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
764 #define HAVE_native_mpfq_fixmp_7_5_addmul1_shortz
765 static inline
766 mp_limb_t mpfq_fixmp_7_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
767 #define HAVE_native_mpfq_fixmp_7_5_mul
768 static inline
769 void mpfq_fixmp_7_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
770 #define HAVE_native_mpfq_fixmp_7_5_sqr
771 static inline
772 void mpfq_fixmp_7_5_sqr(mp_limb_t *, const mp_limb_t *);
773 #define HAVE_native_mpfq_fixmp_7_5_mul1
774 static inline
775 void mpfq_fixmp_7_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
776 #define HAVE_native_mpfq_fixmp_7_5_addmul05
777 static inline
778 mp_limb_t mpfq_fixmp_7_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
779 #define HAVE_native_mpfq_fixmp_7_5_addmul05_nc
780 static inline
781 void mpfq_fixmp_7_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
782 #define HAVE_native_mpfq_fixmp_7_5_mul05
783 static inline
784 void mpfq_fixmp_7_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
785 #define HAVE_native_mpfq_fixmp_8_5_add
786 static inline
787 mp_limb_t mpfq_fixmp_8_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
788 #define HAVE_native_mpfq_fixmp_8_5_sub
789 static inline
790 mp_limb_t mpfq_fixmp_8_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
791 #define HAVE_native_mpfq_fixmp_8_5_add_nc
792 static inline
793 void mpfq_fixmp_8_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
794 #define HAVE_native_mpfq_fixmp_8_5_sub_nc
795 static inline
796 void mpfq_fixmp_8_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
797 #define HAVE_native_mpfq_fixmp_8_5_addmul1
798 static inline
799 mp_limb_t mpfq_fixmp_8_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
800 #define HAVE_native_mpfq_fixmp_8_5_addmul1_nc
801 static inline
802 void mpfq_fixmp_8_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
803 #define HAVE_native_mpfq_fixmp_8_5_addmul1_shortz
804 static inline
805 mp_limb_t mpfq_fixmp_8_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
806 #define HAVE_native_mpfq_fixmp_8_5_mul
807 static inline
808 void mpfq_fixmp_8_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
809 #define HAVE_native_mpfq_fixmp_8_5_sqr
810 static inline
811 void mpfq_fixmp_8_5_sqr(mp_limb_t *, const mp_limb_t *);
812 #define HAVE_native_mpfq_fixmp_8_5_mul1
813 static inline
814 void mpfq_fixmp_8_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
815 #define HAVE_native_mpfq_fixmp_8_5_addmul05
816 static inline
817 mp_limb_t mpfq_fixmp_8_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
818 #define HAVE_native_mpfq_fixmp_8_5_addmul05_nc
819 static inline
820 void mpfq_fixmp_8_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
821 #define HAVE_native_mpfq_fixmp_8_5_mul05
822 static inline
823 void mpfq_fixmp_8_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
824 #define HAVE_native_mpfq_fixmp_9_5_add
825 static inline
826 mp_limb_t mpfq_fixmp_9_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
827 #define HAVE_native_mpfq_fixmp_9_5_sub
828 static inline
829 mp_limb_t mpfq_fixmp_9_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
830 #define HAVE_native_mpfq_fixmp_9_5_add_nc
831 static inline
832 void mpfq_fixmp_9_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
833 #define HAVE_native_mpfq_fixmp_9_5_sub_nc
834 static inline
835 void mpfq_fixmp_9_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
836 #define HAVE_native_mpfq_fixmp_9_5_addmul1
837 static inline
838 mp_limb_t mpfq_fixmp_9_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
839 #define HAVE_native_mpfq_fixmp_9_5_addmul1_nc
840 static inline
841 void mpfq_fixmp_9_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
842 #define HAVE_native_mpfq_fixmp_9_5_addmul1_shortz
843 static inline
844 mp_limb_t mpfq_fixmp_9_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
845 #define HAVE_native_mpfq_fixmp_9_5_mul
846 static inline
847 void mpfq_fixmp_9_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
848 #define HAVE_native_mpfq_fixmp_9_5_sqr
849 static inline
850 void mpfq_fixmp_9_5_sqr(mp_limb_t *, const mp_limb_t *);
851 #define HAVE_native_mpfq_fixmp_9_5_mul1
852 static inline
853 void mpfq_fixmp_9_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
854 #define HAVE_native_mpfq_fixmp_9_5_addmul05
855 static inline
856 mp_limb_t mpfq_fixmp_9_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
857 #define HAVE_native_mpfq_fixmp_9_5_addmul05_nc
858 static inline
859 void mpfq_fixmp_9_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
860 #define HAVE_native_mpfq_fixmp_9_5_mul05
861 static inline
862 void mpfq_fixmp_9_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
863 #define HAVE_native_mpfq_fixmp_10_5_add
864 static inline
865 mp_limb_t mpfq_fixmp_10_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
866 #define HAVE_native_mpfq_fixmp_10_5_sub
867 static inline
868 mp_limb_t mpfq_fixmp_10_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
869 #define HAVE_native_mpfq_fixmp_10_5_add_nc
870 static inline
871 void mpfq_fixmp_10_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
872 #define HAVE_native_mpfq_fixmp_10_5_sub_nc
873 static inline
874 void mpfq_fixmp_10_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
875 #define HAVE_native_mpfq_fixmp_10_5_addmul1
876 static inline
877 mp_limb_t mpfq_fixmp_10_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
878 #define HAVE_native_mpfq_fixmp_10_5_addmul1_nc
879 static inline
880 void mpfq_fixmp_10_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
881 #define HAVE_native_mpfq_fixmp_10_5_addmul1_shortz
882 static inline
883 mp_limb_t mpfq_fixmp_10_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
884 #define HAVE_native_mpfq_fixmp_10_5_mul
885 static inline
886 void mpfq_fixmp_10_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
887 #define HAVE_native_mpfq_fixmp_10_5_sqr
888 static inline
889 void mpfq_fixmp_10_5_sqr(mp_limb_t *, const mp_limb_t *);
890 #define HAVE_native_mpfq_fixmp_10_5_mul1
891 static inline
892 void mpfq_fixmp_10_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
893 #define HAVE_native_mpfq_fixmp_10_5_addmul05
894 static inline
895 mp_limb_t mpfq_fixmp_10_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
896 #define HAVE_native_mpfq_fixmp_10_5_addmul05_nc
897 static inline
898 void mpfq_fixmp_10_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
899 #define HAVE_native_mpfq_fixmp_10_5_mul05
900 static inline
901 void mpfq_fixmp_10_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
902 #define HAVE_native_mpfq_fixmp_11_5_add
903 static inline
904 mp_limb_t mpfq_fixmp_11_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
905 #define HAVE_native_mpfq_fixmp_11_5_sub
906 static inline
907 mp_limb_t mpfq_fixmp_11_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
908 #define HAVE_native_mpfq_fixmp_11_5_add_nc
909 static inline
910 void mpfq_fixmp_11_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
911 #define HAVE_native_mpfq_fixmp_11_5_sub_nc
912 static inline
913 void mpfq_fixmp_11_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
914 #define HAVE_native_mpfq_fixmp_11_5_addmul1
915 static inline
916 mp_limb_t mpfq_fixmp_11_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
917 #define HAVE_native_mpfq_fixmp_11_5_addmul1_nc
918 static inline
919 void mpfq_fixmp_11_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
920 #define HAVE_native_mpfq_fixmp_11_5_addmul1_shortz
921 static inline
922 mp_limb_t mpfq_fixmp_11_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
923 #define HAVE_native_mpfq_fixmp_11_5_mul
924 static inline
925 void mpfq_fixmp_11_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
926 #define HAVE_native_mpfq_fixmp_11_5_sqr
927 static inline
928 void mpfq_fixmp_11_5_sqr(mp_limb_t *, const mp_limb_t *);
929 #define HAVE_native_mpfq_fixmp_11_5_mul1
930 static inline
931 void mpfq_fixmp_11_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
932 #define HAVE_native_mpfq_fixmp_11_5_addmul05
933 static inline
934 mp_limb_t mpfq_fixmp_11_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
935 #define HAVE_native_mpfq_fixmp_11_5_addmul05_nc
936 static inline
937 void mpfq_fixmp_11_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
938 #define HAVE_native_mpfq_fixmp_11_5_mul05
939 static inline
940 void mpfq_fixmp_11_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
941 #define HAVE_native_mpfq_fixmp_12_5_add
942 static inline
943 mp_limb_t mpfq_fixmp_12_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
944 #define HAVE_native_mpfq_fixmp_12_5_sub
945 static inline
946 mp_limb_t mpfq_fixmp_12_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
947 #define HAVE_native_mpfq_fixmp_12_5_add_nc
948 static inline
949 void mpfq_fixmp_12_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
950 #define HAVE_native_mpfq_fixmp_12_5_sub_nc
951 static inline
952 void mpfq_fixmp_12_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
953 #define HAVE_native_mpfq_fixmp_12_5_addmul1
954 static inline
955 mp_limb_t mpfq_fixmp_12_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
956 #define HAVE_native_mpfq_fixmp_12_5_addmul1_nc
957 static inline
958 void mpfq_fixmp_12_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
959 #define HAVE_native_mpfq_fixmp_12_5_addmul1_shortz
960 static inline
961 mp_limb_t mpfq_fixmp_12_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
962 #define HAVE_native_mpfq_fixmp_12_5_mul
963 static inline
964 void mpfq_fixmp_12_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
965 #define HAVE_native_mpfq_fixmp_12_5_sqr
966 static inline
967 void mpfq_fixmp_12_5_sqr(mp_limb_t *, const mp_limb_t *);
968 #define HAVE_native_mpfq_fixmp_12_5_mul1
969 static inline
970 void mpfq_fixmp_12_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
971 #define HAVE_native_mpfq_fixmp_12_5_addmul05
972 static inline
973 mp_limb_t mpfq_fixmp_12_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
974 #define HAVE_native_mpfq_fixmp_12_5_addmul05_nc
975 static inline
976 void mpfq_fixmp_12_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
977 #define HAVE_native_mpfq_fixmp_12_5_mul05
978 static inline
979 void mpfq_fixmp_12_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
980 #define HAVE_native_mpfq_fixmp_13_5_add
981 static inline
982 mp_limb_t mpfq_fixmp_13_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
983 #define HAVE_native_mpfq_fixmp_13_5_sub
984 static inline
985 mp_limb_t mpfq_fixmp_13_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
986 #define HAVE_native_mpfq_fixmp_13_5_add_nc
987 static inline
988 void mpfq_fixmp_13_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
989 #define HAVE_native_mpfq_fixmp_13_5_sub_nc
990 static inline
991 void mpfq_fixmp_13_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
992 #define HAVE_native_mpfq_fixmp_13_5_addmul1
993 static inline
994 mp_limb_t mpfq_fixmp_13_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
995 #define HAVE_native_mpfq_fixmp_13_5_addmul1_nc
996 static inline
997 void mpfq_fixmp_13_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
998 #define HAVE_native_mpfq_fixmp_13_5_addmul1_shortz
999 static inline
1000 mp_limb_t mpfq_fixmp_13_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1001 #define HAVE_native_mpfq_fixmp_13_5_mul
1002 static inline
1003 void mpfq_fixmp_13_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
1004 #define HAVE_native_mpfq_fixmp_13_5_sqr
1005 static inline
1006 void mpfq_fixmp_13_5_sqr(mp_limb_t *, const mp_limb_t *);
1007 #define HAVE_native_mpfq_fixmp_13_5_mul1
1008 static inline
1009 void mpfq_fixmp_13_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1010 #define HAVE_native_mpfq_fixmp_13_5_addmul05
1011 static inline
1012 mp_limb_t mpfq_fixmp_13_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1013 #define HAVE_native_mpfq_fixmp_13_5_addmul05_nc
1014 static inline
1015 void mpfq_fixmp_13_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1016 #define HAVE_native_mpfq_fixmp_13_5_mul05
1017 static inline
1018 void mpfq_fixmp_13_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1019 #define HAVE_native_mpfq_fixmp_14_5_add
1020 static inline
1021 mp_limb_t mpfq_fixmp_14_5_add(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
1022 #define HAVE_native_mpfq_fixmp_14_5_sub
1023 static inline
1024 mp_limb_t mpfq_fixmp_14_5_sub(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
1025 #define HAVE_native_mpfq_fixmp_14_5_add_nc
1026 static inline
1027 void mpfq_fixmp_14_5_add_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
1028 #define HAVE_native_mpfq_fixmp_14_5_sub_nc
1029 static inline
1030 void mpfq_fixmp_14_5_sub_nc(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
1031 #define HAVE_native_mpfq_fixmp_14_5_addmul1
1032 static inline
1033 mp_limb_t mpfq_fixmp_14_5_addmul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1034 #define HAVE_native_mpfq_fixmp_14_5_addmul1_nc
1035 static inline
1036 void mpfq_fixmp_14_5_addmul1_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1037 #define HAVE_native_mpfq_fixmp_14_5_addmul1_shortz
1038 static inline
1039 mp_limb_t mpfq_fixmp_14_5_addmul1_shortz(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1040 #define HAVE_native_mpfq_fixmp_14_5_mul
1041 static inline
1042 void mpfq_fixmp_14_5_mul(mp_limb_t *, const mp_limb_t *, const mp_limb_t *);
1043 #define HAVE_native_mpfq_fixmp_14_5_sqr
1044 static inline
1045 void mpfq_fixmp_14_5_sqr(mp_limb_t *, const mp_limb_t *);
1046 #define HAVE_native_mpfq_fixmp_14_5_mul1
1047 static inline
1048 void mpfq_fixmp_14_5_mul1(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1049 #define HAVE_native_mpfq_fixmp_14_5_addmul05
1050 static inline
1051 mp_limb_t mpfq_fixmp_14_5_addmul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1052 #define HAVE_native_mpfq_fixmp_14_5_addmul05_nc
1053 static inline
1054 void mpfq_fixmp_14_5_addmul05_nc(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1055 #define HAVE_native_mpfq_fixmp_14_5_mul05
1056 static inline
1057 void mpfq_fixmp_14_5_mul05(mp_limb_t *, const mp_limb_t *, mp_limb_t);
1058 #ifdef  __cplusplus
1059 }
1060 #endif
1061 
1062 /* Implementations for inlines */
1063 /* x, y, and z have 1 words. Result in z. Return carry bit */
1064 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
1065 static inline
mpfq_fixmp_1_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1066 mp_limb_t mpfq_fixmp_1_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1067 {
1068     mp_limb_t carry;
1069     __asm__ __volatile__(
1070         "movq    %[x0], %%rax\n"
1071         "addq    %[y0], %%rax\n"
1072         "movq    %%rax, %[z0]\n"
1073         "movq $0, %%rax\n"
1074         "adcq $0, %%rax\n"
1075     : [z0]"=m"(z[0]), "=&a"(carry)
1076     : [x0]"m"(x[0]), [y0]"m"(y[0])
1077     );
1078     return carry;
1079 }
1080 
1081 /* x, y, and z have 1 words. Result in z. Return borrow bit */
1082 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
1083 static inline
mpfq_fixmp_1_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1084 mp_limb_t mpfq_fixmp_1_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1085 {
1086     mp_limb_t carry;
1087     __asm__ __volatile__(
1088         "movq    %[x0], %%rax\n"
1089         "subq    %[y0], %%rax\n"
1090         "movq    %%rax, %[z0]\n"
1091         "movq $0, %%rax\n"
1092         "adcq $0, %%rax\n"
1093     : [z0]"=m"(z[0]), "=&a"(carry)
1094     : [x0]"m"(x[0]), [y0]"m"(y[0])
1095     );
1096     return carry;
1097 }
1098 
1099 /* x, y, and z have 1 words. Result in z. Carry bit is lost. */
1100 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
1101 static inline
mpfq_fixmp_1_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1102 void mpfq_fixmp_1_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1103 {
1104     *z = *x + *y;
1105 }
1106 
1107 /* x, y, and z have 1 words. Result in z. Borrow bit is lost. */
1108 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
1109 static inline
mpfq_fixmp_1_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1110 void mpfq_fixmp_1_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1111 {
1112     *z = *x - *y;
1113 }
1114 
1115 /* x has 1 words, z has 3.
1116  * Put (z+x*c) in z. Return carry bit. */
1117 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
1118 static inline
mpfq_fixmp_1_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1119 mp_limb_t mpfq_fixmp_1_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1120 {
1121     mp_limb_t carry;
1122     __asm__ __volatile__(
1123         "mulq    %[mult]\n"
1124         "addq    %%rax, %[z0]\n"
1125         "adcq    $0, %%rdx\n"
1126         "xorq    %%rax, %%rax\n"
1127         "addq    %%rdx, %[z1]\n"
1128         "adcq    $0, %%rax\n"
1129     : "=a"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1])
1130     : [x0]"0"(x[0]), [mult]"m"(c)
1131     : "%rdx");
1132     return carry;
1133 }
1134 
1135 /* x has 1 words, z has 3.
1136  * Put (z+x*c) in z. Carry bit is lost. */
1137 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
1138 static inline
mpfq_fixmp_1_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1139 void mpfq_fixmp_1_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1140 {
1141     mp_limb_t junk;
1142     __asm__ __volatile__(
1143         "mulq    %[mult]\n"
1144         "addq    %%rax, %[z0]\n"
1145         "adcq    $0, %%rdx\n"
1146         "addq    %%rdx, %[z1]\n"
1147     : "=a"(junk), [z0]"+m"(z[0]), [z1]"+m"(z[1])
1148     : [x0]"0"(x[0]), [mult]"m"(c)
1149     : "%rdx");
1150 }
1151 
1152 /* x has 1 words, z has 2.
1153  * Put (z+x*c) in z. Return carry word. */
1154 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
1155 static inline
mpfq_fixmp_1_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1156 mp_limb_t mpfq_fixmp_1_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1157 {
1158     mp_limb_t carry;
1159     mp_limb_t junk;
1160     __asm__ __volatile__(
1161         "mulq    %[mult]\n"
1162         "addq    %%rax, %[z0]\n"
1163         "adcq    $0, %%rdx\n"
1164     : "=a"(junk), [z0]"+m"(z[0]), "=&d"(carry)
1165     : [x0]"0"(x[0]), [mult]"m"(c)
1166     );
1167     return carry;
1168 }
1169 
1170 /* x and y have 1 words, z has 4. Put x*y in z. */
1171 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
1172 static inline
mpfq_fixmp_1_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1173 void mpfq_fixmp_1_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1174 {
1175     __asm__ __volatile__(
1176         "mulq %[y0]\n"
1177               : "=a" (z[0]), "=d" (z[1])
1178 #if GNUC_VERSION_ATMOST(4, 2, 1)
1179               /* gcc-4.2.1 on openbsd-5.3 says constraints are impossible
1180                * here (??) */
1181               : "0" (x[0]), [y0] "rm" (y[0])
1182 #else
1183               : "0" (x[0]), [y0] "rm1" (y[0])
1184 #endif
1185               );
1186 }
1187 
1188 /* x has 1 words, z has 4. Put x*y in z. */
1189 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
1190 static inline
mpfq_fixmp_1_sqr(mp_limb_t * z,const mp_limb_t * x)1191 void mpfq_fixmp_1_sqr(mp_limb_t * z, const mp_limb_t * x)
1192 {
1193     __asm__ __volatile__(
1194         "mulq %%rax\n"
1195     : "=a" (z[0]), "=d" (z[1])
1196     : "0" (x[0])
1197     );
1198 }
1199 
1200 /* x has 1 words, z has 3. Put x*y in z. */
1201 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
1202 static inline
mpfq_fixmp_1_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1203 void mpfq_fixmp_1_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1204 {
1205     __asm__ __volatile__(
1206         "mulq    %[mult]\n"
1207     : [z0]"=a"(z[0]), [z1]"=d"(z[1])
1208     : [x0]"0"(x[0]), [mult]"m"(c)
1209     );
1210 }
1211 
1212 /* x, y, z and p have 1 words.
1213  * only one word is read from invp.
1214  * We expect that x and y are both < p.
1215  * Assuming R=W^2 is the redc modulus, we return x*y/R mod p in z */
1216 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mulredc */
1217 static inline
mpfq_fixmp_1_mulredc(mp_limb_t * pz,const mp_limb_t * x,const mp_limb_t * y,const mp_limb_t * p,const mp_limb_t * invp)1218 void mpfq_fixmp_1_mulredc(mp_limb_t * pz, const mp_limb_t * x, const mp_limb_t * y, const mp_limb_t * p, const mp_limb_t * invp)
1219 {
1220     mp_limb_t z;
1221     __asm__ __volatile__(
1222     "movq    %[x0], %%rax\n"
1223     "mulq    %[y0]\n"
1224     "movq    %%rdx, %[z]\n"
1225     "imul    %[invp0], %%rax\n"
1226     "mulq    %[p0]\n"
1227     "addq    $0xFFFFFFFFFFFFFFFF, %%rax\n" // set carry if ax is not 0
1228     "adcq    $0, %[z]\n"                   // this should not produce any carry
1229     "movq    %[z], %%rax\n"                 // ax = z
1230     "subq    %[p0], %%rax\n"                // ax -= p
1231     "addq    %%rdx, %[z]\n"                 // z += dx
1232     "addq    %%rdx, %%rax\n"                // ax += dx  (ax = z-p+dx)
1233     "cmovc   %%rax, %[z]\n"                 // z c_= ax
1234     : [z]"=&r"(z)
1235     : [x0]"rm"(x[0]), [y0]"rm"(y[0]), [p0]"rm"(p[0]), [invp0]"rm"(invp[0])
1236     : "%rax", "%rdx");
1237     *pz = z;
1238 }
1239 
1240 /* x, y, and z have 2 words. Result in z. Return carry bit */
1241 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
1242 static inline
mpfq_fixmp_2_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1243 mp_limb_t mpfq_fixmp_2_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1244 {
1245     mp_limb_t carry;
1246     __asm__ __volatile__(
1247         "movq    %[x0], %%rax\n"
1248         "addq    %[y0], %%rax\n"
1249         "movq    %%rax, %[z0]\n"
1250         "movq    %[x1], %%rax\n"
1251         "adcq    %[y1], %%rax\n"
1252         "movq    %%rax, %[z1]\n"
1253         "movq $0, %%rax\n"
1254         "adcq $0, %%rax\n"
1255     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), "=&a"(carry)
1256     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
1257     );
1258     return carry;
1259 }
1260 
1261 /* x, y, and z have 2 words. Result in z. Return borrow bit */
1262 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
1263 static inline
mpfq_fixmp_2_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1264 mp_limb_t mpfq_fixmp_2_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1265 {
1266     mp_limb_t carry;
1267     __asm__ __volatile__(
1268         "movq    %[x0], %%rax\n"
1269         "subq    %[y0], %%rax\n"
1270         "movq    %%rax, %[z0]\n"
1271         "movq    %[x1], %%rax\n"
1272         "sbbq    %[y1], %%rax\n"
1273         "movq    %%rax, %[z1]\n"
1274         "movq $0, %%rax\n"
1275         "adcq $0, %%rax\n"
1276     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), "=&a"(carry)
1277     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
1278     );
1279     return carry;
1280 }
1281 
1282 /* x, y, and z have 2 words. Result in z. Carry bit is lost. */
1283 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
1284 static inline
mpfq_fixmp_2_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1285 void mpfq_fixmp_2_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1286 {
1287     __asm__ __volatile__(
1288         "movq    %[x0], %%rax\n"
1289         "addq    %[y0], %%rax\n"
1290         "movq    %%rax, %[z0]\n"
1291         "movq    %[x1], %%rax\n"
1292         "adcq    %[y1], %%rax\n"
1293         "movq    %%rax, %[z1]\n"
1294     : [z0]"=m"(z[0]), [z1]"=m"(z[1])
1295     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
1296     : "%rax");
1297 }
1298 
1299 /* x, y, and z have 2 words. Result in z. Borrow bit is lost. */
1300 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
1301 static inline
mpfq_fixmp_2_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1302 void mpfq_fixmp_2_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1303 {
1304     __asm__ __volatile__(
1305         "movq    %[x0], %%rax\n"
1306         "subq    %[y0], %%rax\n"
1307         "movq    %%rax, %[z0]\n"
1308         "movq    %[x1], %%rax\n"
1309         "sbbq    %[y1], %%rax\n"
1310         "movq    %%rax, %[z1]\n"
1311     : [z0]"=m"(z[0]), [z1]"=m"(z[1])
1312     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
1313     : "%rax");
1314 }
1315 
1316 /* x has 2 words, z has 4.
1317  * Put (z+x*c) in z. Return carry bit. */
1318 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
1319 static inline
mpfq_fixmp_2_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1320 mp_limb_t mpfq_fixmp_2_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1321 {
1322     mp_limb_t carry;
1323     __asm__ __volatile__(
1324         "movq    %[x0], %%rax\n"
1325         "mulq    %[mult]\n"
1326         "addq    %%rax, %[z0]\n"
1327         "movq    %[x1], %%rax\n"
1328         "adcq    $0, %%rdx\n"
1329         "movq    %%rdx, %%rcx\n"
1330         "mulq    %[mult]\n"
1331         "addq    %%rax, %%rcx\n"
1332         "adcq    $0, %%rdx\n"
1333         "addq    %%rcx, %[z1]\n"
1334         "adcq    $0, %%rdx\n"
1335         "xorq    %%rcx, %%rcx\n"
1336         "addq    %%rdx, %[z2]\n"
1337         "adcq    $0, %%rcx\n"
1338         "movq    %%rcx, %[carry]\n"
1339     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
1340     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
1341     : "%rax", "%rcx", "%rdx");
1342     return carry;
1343 }
1344 
1345 /* x has 2 words, z has 4.
1346  * Put (z+x*c) in z. Carry bit is lost. */
1347 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
1348 static inline
mpfq_fixmp_2_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1349 void mpfq_fixmp_2_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1350 {
1351     __asm__ __volatile__(
1352         "movq    %[x0], %%rax\n"
1353         "mulq    %[mult]\n"
1354         "addq    %%rax, %[z0]\n"
1355         "movq    %[x1], %%rax\n"
1356         "adcq    $0, %%rdx\n"
1357         "movq    %%rdx, %%rcx\n"
1358         "mulq    %[mult]\n"
1359         "addq    %%rax, %%rcx\n"
1360         "adcq    $0, %%rdx\n"
1361         "addq    %%rcx, %[z1]\n"
1362         "adcq    $0, %%rdx\n"
1363         "addq    %%rdx, %[z2]\n"
1364     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
1365     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
1366     : "%rax", "%rcx", "%rdx");
1367 }
1368 
1369 /* x has 2 words, z has 3.
1370  * Put (z+x*c) in z. Return carry word. */
1371 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
1372 static inline
mpfq_fixmp_2_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1373 mp_limb_t mpfq_fixmp_2_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1374 {
1375     mp_limb_t carry;
1376     __asm__ __volatile__(
1377         "movq    %[x0], %%rax\n"
1378         "mulq    %[mult]\n"
1379         "addq    %%rax, %[z0]\n"
1380         "movq    %[x1], %%rax\n"
1381         "adcq    $0, %%rdx\n"
1382         "movq    %%rdx, %%rcx\n"
1383         "mulq    %[mult]\n"
1384         "addq    %%rax, %%rcx\n"
1385         "adcq    $0, %%rdx\n"
1386         "addq    %%rcx, %[z1]\n"
1387         "adcq    $0, %%rdx\n"
1388         "movq    %%rdx, %[carry]\n"
1389     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
1390     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
1391     : "%rax", "%rcx", "%rdx");
1392     return carry;
1393 }
1394 
1395 /* x and y have 2 words, z has 6. Put x*y in z. */
1396 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
1397 static inline
mpfq_fixmp_2_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1398 void mpfq_fixmp_2_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1399 {
1400     __asm__ __volatile__(
1401         "### x*y[0]\n"
1402         "movq    %2, %%r8\n"
1403         "movq    %0, %%rdi\n"
1404         "movq    0(%%r8), %%r9\n"
1405         "movq    %1, %%rsi\n"
1406         "movq    0(%%rsi), %%rax\n"
1407         "mulq    %%r9\n"
1408         "movq    %%rax, 0(%%rdi)\n"
1409         "movq    8(%%rsi), %%rax\n"
1410         "movq    %%rdx, %%rcx\n"
1411         "mulq    %%r9\n"
1412         "addq    %%rax, %%rcx\n"
1413         "adcq    $0, %%rdx\n"
1414         "movq    %%rcx, 8(%%rdi)\n"
1415         "movq    %%rdx, 16(%%rdi)\n"
1416         "movq    $0, 24(%%rdi)\n"
1417         "### x*y[1]\n"
1418         "movq    8(%%r8), %%r9\n"
1419         "movq    0(%%rsi), %%rax\n"
1420         "mulq    %%r9\n"
1421         "addq    %%rax, 8(%%rdi)\n"
1422         "movq    8(%%rsi), %%rax\n"
1423         "adcq    $0, %%rdx\n"
1424         "movq    %%rdx, %%rcx\n"
1425         "mulq    %%r9\n"
1426         "addq    %%rax, %%rcx\n"
1427         "adcq    $0, %%rdx\n"
1428         "addq    %%rcx, 16(%%rdi)\n"
1429         "adcq    $0, %%rdx\n"
1430         "movq    %%rdx, 24(%%rdi)\n"
1431       : "+m" (z)
1432       : "m" (x), "m" (y)
1433       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
1434 }
1435 
1436 /* x has 2 words, z has 6. Put x*y in z. */
1437 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
1438 static inline
mpfq_fixmp_2_sqr(mp_limb_t * z,const mp_limb_t * x)1439 void mpfq_fixmp_2_sqr(mp_limb_t * z, const mp_limb_t * x)
1440 {
1441     __asm__ __volatile__(
1442         "movq    %1, %%r8\n"
1443         "movq    %0, %%rdi\n"
1444         "movq    (%%r8), %%rax\n"
1445         "mulq    %%rax\n"
1446         "movq    %%rax, (%%rdi)\n"
1447         "movq    8(%%r8), %%rax\n"
1448         "movq    %%rdx, %%r9\n"
1449         "mulq    %%rax\n"
1450         "movq    %%rax, %%r10\n"
1451         "movq    (%%r8), %%rax\n"
1452         "movq    %%rdx, %%r11\n"
1453         "mulq    8(%%r8)\n"
1454         "addq    %%rax, %%r9\n"
1455         "adcq    %%rdx, %%r10\n"
1456         "adcq    $0, %%r11\n"
1457         "addq    %%rax, %%r9\n"
1458         "movq    %%r9, 8(%%rdi)\n"
1459         "adcq    %%rdx, %%r10\n"
1460         "movq    %%r10, 16(%%rdi)\n"
1461         "adcq    $0, %%r11\n"
1462         "movq    %%r11, 24(%%rdi)\n"
1463     : "+m" (z)
1464     : "m" (x)
1465     : "%rax", "%rdx", "%rdi", "%r8", "%r9", "%r10", "%r11", "memory");
1466 }
1467 
1468 /* x has 2 words, z has 4. Put x*y in z. */
1469 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
1470 static inline
mpfq_fixmp_2_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1471 void mpfq_fixmp_2_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1472 {
1473     __asm__ __volatile__(
1474         "movq    %[x0], %%rax\n"
1475         "mulq    %[mult]\n"
1476         "movq    %%rax, %[z0]\n"
1477         "movq    %[x1], %%rax\n"
1478         "movq    %%rdx, %%rcx\n"
1479         "mulq    %[mult]\n"
1480         "addq    %%rax, %%rcx\n"
1481         "adcq    $0, %%rdx\n"
1482         "movq    %%rcx, %[z1]\n"
1483         "movq    %%rdx, %[z2]\n"
1484     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2])
1485     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
1486     : "%rax", "%rcx", "%rdx");
1487 }
1488 
1489 /* x, y, and z have 3 words. Result in z. Return carry bit */
1490 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
1491 static inline
mpfq_fixmp_3_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1492 mp_limb_t mpfq_fixmp_3_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1493 {
1494     mp_limb_t carry;
1495     __asm__ __volatile__(
1496         "movq    %[x0], %%rax\n"
1497         "addq    %[y0], %%rax\n"
1498         "movq    %%rax, %[z0]\n"
1499         "movq    %[x1], %%rax\n"
1500         "adcq    %[y1], %%rax\n"
1501         "movq    %%rax, %[z1]\n"
1502         "movq    %[x2], %%rax\n"
1503         "adcq    %[y2], %%rax\n"
1504         "movq    %%rax, %[z2]\n"
1505         "movq $0, %%rax\n"
1506         "adcq $0, %%rax\n"
1507     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), "=&a"(carry)
1508     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
1509     );
1510     return carry;
1511 }
1512 
1513 /* x, y, and z have 3 words. Result in z. Return borrow bit */
1514 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
1515 static inline
mpfq_fixmp_3_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1516 mp_limb_t mpfq_fixmp_3_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1517 {
1518     mp_limb_t carry;
1519     __asm__ __volatile__(
1520         "movq    %[x0], %%rax\n"
1521         "subq    %[y0], %%rax\n"
1522         "movq    %%rax, %[z0]\n"
1523         "movq    %[x1], %%rax\n"
1524         "sbbq    %[y1], %%rax\n"
1525         "movq    %%rax, %[z1]\n"
1526         "movq    %[x2], %%rax\n"
1527         "sbbq    %[y2], %%rax\n"
1528         "movq    %%rax, %[z2]\n"
1529         "movq $0, %%rax\n"
1530         "adcq $0, %%rax\n"
1531     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), "=&a"(carry)
1532     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
1533     );
1534     return carry;
1535 }
1536 
1537 /* x, y, and z have 3 words. Result in z. Carry bit is lost. */
1538 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
1539 static inline
mpfq_fixmp_3_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1540 void mpfq_fixmp_3_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1541 {
1542     __asm__ __volatile__(
1543         "movq    %[x0], %%rax\n"
1544         "addq    %[y0], %%rax\n"
1545         "movq    %%rax, %[z0]\n"
1546         "movq    %[x1], %%rax\n"
1547         "adcq    %[y1], %%rax\n"
1548         "movq    %%rax, %[z1]\n"
1549         "movq    %[x2], %%rax\n"
1550         "adcq    %[y2], %%rax\n"
1551         "movq    %%rax, %[z2]\n"
1552     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2])
1553     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
1554     : "%rax");
1555 }
1556 
1557 /* x, y, and z have 3 words. Result in z. Borrow bit is lost. */
1558 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
1559 static inline
mpfq_fixmp_3_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1560 void mpfq_fixmp_3_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1561 {
1562     __asm__ __volatile__(
1563         "movq    %[x0], %%rax\n"
1564         "subq    %[y0], %%rax\n"
1565         "movq    %%rax, %[z0]\n"
1566         "movq    %[x1], %%rax\n"
1567         "sbbq    %[y1], %%rax\n"
1568         "movq    %%rax, %[z1]\n"
1569         "movq    %[x2], %%rax\n"
1570         "sbbq    %[y2], %%rax\n"
1571         "movq    %%rax, %[z2]\n"
1572     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2])
1573     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
1574     : "%rax");
1575 }
1576 
1577 /* x has 3 words, z has 5.
1578  * Put (z+x*c) in z. Return carry bit. */
1579 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
1580 static inline
mpfq_fixmp_3_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1581 mp_limb_t mpfq_fixmp_3_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1582 {
1583     mp_limb_t carry;
1584     __asm__ __volatile__(
1585         "movq    %[x0], %%rax\n"
1586         "mulq    %[mult]\n"
1587         "addq    %%rax, %[z0]\n"
1588         "movq    %[x1], %%rax\n"
1589         "adcq    $0, %%rdx\n"
1590         "movq    %%rdx, %%rcx\n"
1591         "mulq    %[mult]\n"
1592         "addq    %%rax, %%rcx\n"
1593         "adcq    $0, %%rdx\n"
1594         "movq    %[x2], %%rax\n"
1595         "addq    %%rcx, %[z1]\n"
1596         "adcq    $0, %%rdx\n"
1597         "movq    %%rdx, %%rcx\n"
1598         "mulq    %[mult]\n"
1599         "addq    %%rax, %%rcx\n"
1600         "adcq    $0, %%rdx\n"
1601         "addq    %%rcx, %[z2]\n"
1602         "adcq    $0, %%rdx\n"
1603         "xorq    %%rcx, %%rcx\n"
1604         "addq    %%rdx, %[z3]\n"
1605         "adcq    $0, %%rcx\n"
1606         "movq    %%rcx, %[carry]\n"
1607     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
1608     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
1609     : "%rax", "%rcx", "%rdx");
1610     return carry;
1611 }
1612 
1613 /* x has 3 words, z has 5.
1614  * Put (z+x*c) in z. Carry bit is lost. */
1615 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
1616 static inline
mpfq_fixmp_3_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1617 void mpfq_fixmp_3_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1618 {
1619     __asm__ __volatile__(
1620         "movq    %[x0], %%rax\n"
1621         "mulq    %[mult]\n"
1622         "addq    %%rax, %[z0]\n"
1623         "movq    %[x1], %%rax\n"
1624         "adcq    $0, %%rdx\n"
1625         "movq    %%rdx, %%rcx\n"
1626         "mulq    %[mult]\n"
1627         "addq    %%rax, %%rcx\n"
1628         "adcq    $0, %%rdx\n"
1629         "movq    %[x2], %%rax\n"
1630         "addq    %%rcx, %[z1]\n"
1631         "adcq    $0, %%rdx\n"
1632         "movq    %%rdx, %%rcx\n"
1633         "mulq    %[mult]\n"
1634         "addq    %%rax, %%rcx\n"
1635         "adcq    $0, %%rdx\n"
1636         "addq    %%rcx, %[z2]\n"
1637         "adcq    $0, %%rdx\n"
1638         "addq    %%rdx, %[z3]\n"
1639     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
1640     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
1641     : "%rax", "%rcx", "%rdx");
1642 }
1643 
1644 /* x has 3 words, z has 4.
1645  * Put (z+x*c) in z. Return carry word. */
1646 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
1647 static inline
mpfq_fixmp_3_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1648 mp_limb_t mpfq_fixmp_3_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1649 {
1650     mp_limb_t carry;
1651     __asm__ __volatile__(
1652         "movq    %[x0], %%rax\n"
1653         "mulq    %[mult]\n"
1654         "addq    %%rax, %[z0]\n"
1655         "movq    %[x1], %%rax\n"
1656         "adcq    $0, %%rdx\n"
1657         "movq    %%rdx, %%rcx\n"
1658         "mulq    %[mult]\n"
1659         "addq    %%rax, %%rcx\n"
1660         "adcq    $0, %%rdx\n"
1661         "movq    %[x2], %%rax\n"
1662         "addq    %%rcx, %[z1]\n"
1663         "adcq    $0, %%rdx\n"
1664         "movq    %%rdx, %%rcx\n"
1665         "mulq    %[mult]\n"
1666         "addq    %%rax, %%rcx\n"
1667         "adcq    $0, %%rdx\n"
1668         "addq    %%rcx, %[z2]\n"
1669         "adcq    $0, %%rdx\n"
1670         "movq    %%rdx, %[carry]\n"
1671     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
1672     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
1673     : "%rax", "%rcx", "%rdx");
1674     return carry;
1675 }
1676 
1677 /* x and y have 3 words, z has 8. Put x*y in z. */
1678 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
1679 static inline
mpfq_fixmp_3_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1680 void mpfq_fixmp_3_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1681 {
1682     __asm__ __volatile__(
1683         "### x*y[0]\n"
1684         "movq    %2, %%r8\n"
1685         "movq    %0, %%rdi\n"
1686         "movq    0(%%r8), %%r9\n"
1687         "movq    %1, %%rsi\n"
1688         "movq    0(%%rsi), %%rax\n"
1689         "mulq    %%r9\n"
1690         "movq    %%rax, 0(%%rdi)\n"
1691         "movq    8(%%rsi), %%rax\n"
1692         "movq    %%rdx, %%rcx\n"
1693         "mulq    %%r9\n"
1694         "addq    %%rax, %%rcx\n"
1695         "adcq    $0, %%rdx\n"
1696         "movq    16(%%rsi), %%rax\n"
1697         "movq    %%rcx, 8(%%rdi)\n"
1698         "movq    %%rdx, %%rcx\n"
1699         "mulq    %%r9\n"
1700         "addq    %%rax, %%rcx\n"
1701         "adcq    $0, %%rdx\n"
1702         "movq    %%rcx, 16(%%rdi)\n"
1703         "movq    %%rdx, 24(%%rdi)\n"
1704         "movq    $0, 32(%%rdi)\n"
1705         "movq    $0, 40(%%rdi)\n"
1706         "### x*y[1]\n"
1707         "movq    8(%%r8), %%r9\n"
1708         "movq    0(%%rsi), %%rax\n"
1709         "mulq    %%r9\n"
1710         "addq    %%rax, 8(%%rdi)\n"
1711         "movq    8(%%rsi), %%rax\n"
1712         "adcq    $0, %%rdx\n"
1713         "movq    %%rdx, %%rcx\n"
1714         "mulq    %%r9\n"
1715         "addq    %%rax, %%rcx\n"
1716         "adcq    $0, %%rdx\n"
1717         "movq    16(%%rsi), %%rax\n"
1718         "addq    %%rcx, 16(%%rdi)\n"
1719         "adcq    $0, %%rdx\n"
1720         "movq    %%rdx, %%rcx\n"
1721         "mulq    %%r9\n"
1722         "addq    %%rax, %%rcx\n"
1723         "adcq    $0, %%rdx\n"
1724         "addq    %%rcx, 24(%%rdi)\n"
1725         "adcq    $0, %%rdx\n"
1726         "movq    %%rdx, 32(%%rdi)\n"
1727         "### x*y[2]\n"
1728         "movq    16(%%r8), %%r9\n"
1729         "movq    0(%%rsi), %%rax\n"
1730         "mulq    %%r9\n"
1731         "addq    %%rax, 16(%%rdi)\n"
1732         "movq    8(%%rsi), %%rax\n"
1733         "adcq    $0, %%rdx\n"
1734         "movq    %%rdx, %%rcx\n"
1735         "mulq    %%r9\n"
1736         "addq    %%rax, %%rcx\n"
1737         "adcq    $0, %%rdx\n"
1738         "movq    16(%%rsi), %%rax\n"
1739         "addq    %%rcx, 24(%%rdi)\n"
1740         "adcq    $0, %%rdx\n"
1741         "movq    %%rdx, %%rcx\n"
1742         "mulq    %%r9\n"
1743         "addq    %%rax, %%rcx\n"
1744         "adcq    $0, %%rdx\n"
1745         "addq    %%rcx, 32(%%rdi)\n"
1746         "adcq    $0, %%rdx\n"
1747         "movq    %%rdx, 40(%%rdi)\n"
1748       : "+m" (z)
1749       : "m" (x), "m" (y)
1750       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
1751 }
1752 
1753 /* x has 3 words, z has 8. Put x*y in z. */
1754 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
1755 static inline
mpfq_fixmp_3_sqr(mp_limb_t * z,const mp_limb_t * x)1756 void mpfq_fixmp_3_sqr(mp_limb_t * z, const mp_limb_t * x)
1757 {
1758     __asm__ __volatile__(
1759         "movq    %1, %%rsi\n"
1760         "movq    %0, %%rdi\n"
1761         "### diagonal elements\n"
1762         "movq    (%%rsi), %%rax\n"
1763         "mulq    %%rax\n"
1764         "movq    %%rax, (%%rdi)\n"
1765         "movq    8(%%rsi), %%rax\n"
1766         "movq    %%rdx, 8(%%rdi)\n"
1767         "mulq    %%rax\n"
1768         "movq    %%rax, 16(%%rdi)\n"
1769         "movq    16(%%rsi), %%rax\n"
1770         "movq    %%rdx, 24(%%rdi)\n"
1771         "mulq    %%rax\n"
1772         "movq    %%rax, 32(%%rdi)\n"
1773         "movq    %%rdx, 40(%%rdi)\n"
1774         "### precompute triangle\n"
1775         "### x[0]*x[1,2]\n"
1776         "movq    (%%rsi), %%rcx\n"
1777         "movq    8(%%rsi), %%rax\n"
1778         "mulq    %%rcx\n"
1779         "movq    %%rax, %%r8\n"
1780         "movq    %%rdx, %%r9\n"
1781         "movq    16(%%rsi), %%rax\n"
1782         "mulq    %%rcx\n"
1783         "addq    %%rax, %%r9\n"
1784         "adcq    $0, %%rdx\n"
1785         "movq    %%rdx, %%r10\n"
1786         "### x[1]*x[2]\n"
1787         "movq    8(%%rsi), %%rax\n"
1788         "mulq    16(%%rsi)\n"
1789         "addq    %%rax, %%r10\n"
1790         "adcq    $0, %%rdx\n"
1791         "### Shift triangle\n"
1792         "addq    %%r8, %%r8\n"
1793         "adcq    %%r9, %%r9\n"
1794         "adcq    %%r10, %%r10\n"
1795         "adcq    %%rdx, %%rdx\n"
1796         "adcq    $0, 40(%%rdi)\n"
1797         "### add shifted triangle to diagonal\n"
1798         "addq    %%r8, 8(%%rdi)\n"
1799         "adcq    %%r9, 16(%%rdi)\n"
1800         "adcq    %%r10, 24(%%rdi)\n"
1801         "adcq    %%rdx, 32(%%rdi)\n"
1802         "adcq    $0, 40(%%rdi)\n"
1803     : "+m" (z)
1804     : "m" (x)
1805     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "%r10", "memory");
1806 }
1807 
1808 /* x has 3 words, z has 5. Put x*y in z. */
1809 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
1810 static inline
mpfq_fixmp_3_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1811 void mpfq_fixmp_3_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1812 {
1813     __asm__ __volatile__(
1814         "movq    %[x0], %%rax\n"
1815         "mulq    %[mult]\n"
1816         "movq    %%rax, %[z0]\n"
1817         "movq    %[x1], %%rax\n"
1818         "movq    %%rdx, %%rcx\n"
1819         "mulq    %[mult]\n"
1820         "addq    %%rax, %%rcx\n"
1821         "adcq    $0, %%rdx\n"
1822         "movq    %[x2], %%rax\n"
1823         "movq    %%rcx, %[z1]\n"
1824         "movq    %%rdx, %%rcx\n"
1825         "mulq    %[mult]\n"
1826         "addq    %%rax, %%rcx\n"
1827         "adcq    $0, %%rdx\n"
1828         "movq    %%rcx, %[z2]\n"
1829         "movq    %%rdx, %[z3]\n"
1830     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3])
1831     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
1832     : "%rax", "%rcx", "%rdx");
1833 }
1834 
1835 /* x, y, and z have 4 words. Result in z. Return carry bit */
1836 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
1837 static inline
mpfq_fixmp_4_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1838 mp_limb_t mpfq_fixmp_4_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1839 {
1840     mp_limb_t carry;
1841     __asm__ __volatile__(
1842         "movq    %[x0], %%rax\n"
1843         "addq    %[y0], %%rax\n"
1844         "movq    %%rax, %[z0]\n"
1845         "movq    %[x1], %%rax\n"
1846         "adcq    %[y1], %%rax\n"
1847         "movq    %%rax, %[z1]\n"
1848         "movq    %[x2], %%rax\n"
1849         "adcq    %[y2], %%rax\n"
1850         "movq    %%rax, %[z2]\n"
1851         "movq    %[x3], %%rax\n"
1852         "adcq    %[y3], %%rax\n"
1853         "movq    %%rax, %[z3]\n"
1854         "movq $0, %%rax\n"
1855         "adcq $0, %%rax\n"
1856     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3]), "=&a"(carry)
1857     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
1858     );
1859     return carry;
1860 }
1861 
1862 /* x, y, and z have 4 words. Result in z. Return borrow bit */
1863 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
1864 static inline
mpfq_fixmp_4_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1865 mp_limb_t mpfq_fixmp_4_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1866 {
1867     mp_limb_t carry;
1868     __asm__ __volatile__(
1869         "movq    %[x0], %%rax\n"
1870         "subq    %[y0], %%rax\n"
1871         "movq    %%rax, %[z0]\n"
1872         "movq    %[x1], %%rax\n"
1873         "sbbq    %[y1], %%rax\n"
1874         "movq    %%rax, %[z1]\n"
1875         "movq    %[x2], %%rax\n"
1876         "sbbq    %[y2], %%rax\n"
1877         "movq    %%rax, %[z2]\n"
1878         "movq    %[x3], %%rax\n"
1879         "sbbq    %[y3], %%rax\n"
1880         "movq    %%rax, %[z3]\n"
1881         "movq $0, %%rax\n"
1882         "adcq $0, %%rax\n"
1883     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3]), "=&a"(carry)
1884     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
1885     );
1886     return carry;
1887 }
1888 
1889 /* x, y, and z have 4 words. Result in z. Carry bit is lost. */
1890 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
1891 static inline
mpfq_fixmp_4_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1892 void mpfq_fixmp_4_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1893 {
1894     __asm__ __volatile__(
1895         "movq    %[x0], %%rax\n"
1896         "addq    %[y0], %%rax\n"
1897         "movq    %%rax, %[z0]\n"
1898         "movq    %[x1], %%rax\n"
1899         "adcq    %[y1], %%rax\n"
1900         "movq    %%rax, %[z1]\n"
1901         "movq    %[x2], %%rax\n"
1902         "adcq    %[y2], %%rax\n"
1903         "movq    %%rax, %[z2]\n"
1904         "movq    %[x3], %%rax\n"
1905         "adcq    %[y3], %%rax\n"
1906         "movq    %%rax, %[z3]\n"
1907     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3])
1908     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
1909     : "%rax");
1910 }
1911 
1912 /* x, y, and z have 4 words. Result in z. Borrow bit is lost. */
1913 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
1914 static inline
mpfq_fixmp_4_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)1915 void mpfq_fixmp_4_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
1916 {
1917     __asm__ __volatile__(
1918         "movq    %[x0], %%rax\n"
1919         "subq    %[y0], %%rax\n"
1920         "movq    %%rax, %[z0]\n"
1921         "movq    %[x1], %%rax\n"
1922         "sbbq    %[y1], %%rax\n"
1923         "movq    %%rax, %[z1]\n"
1924         "movq    %[x2], %%rax\n"
1925         "sbbq    %[y2], %%rax\n"
1926         "movq    %%rax, %[z2]\n"
1927         "movq    %[x3], %%rax\n"
1928         "sbbq    %[y3], %%rax\n"
1929         "movq    %%rax, %[z3]\n"
1930     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3])
1931     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
1932     : "%rax");
1933 }
1934 
1935 /* x has 4 words, z has 6.
1936  * Put (z+x*c) in z. Return carry bit. */
1937 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
1938 static inline
mpfq_fixmp_4_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1939 mp_limb_t mpfq_fixmp_4_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1940 {
1941     mp_limb_t carry;
1942     __asm__ __volatile__(
1943         "movq    %[x0], %%rax\n"
1944         "mulq    %[mult]\n"
1945         "addq    %%rax, %[z0]\n"
1946         "movq    %[x1], %%rax\n"
1947         "adcq    $0, %%rdx\n"
1948         "movq    %%rdx, %%rcx\n"
1949         "mulq    %[mult]\n"
1950         "addq    %%rax, %%rcx\n"
1951         "adcq    $0, %%rdx\n"
1952         "movq    %[x2], %%rax\n"
1953         "addq    %%rcx, %[z1]\n"
1954         "adcq    $0, %%rdx\n"
1955         "movq    %%rdx, %%rcx\n"
1956         "mulq    %[mult]\n"
1957         "addq    %%rax, %%rcx\n"
1958         "adcq    $0, %%rdx\n"
1959         "movq    %[x3], %%rax\n"
1960         "addq    %%rcx, %[z2]\n"
1961         "adcq    $0, %%rdx\n"
1962         "movq    %%rdx, %%rcx\n"
1963         "mulq    %[mult]\n"
1964         "addq    %%rax, %%rcx\n"
1965         "adcq    $0, %%rdx\n"
1966         "addq    %%rcx, %[z3]\n"
1967         "adcq    $0, %%rdx\n"
1968         "xorq    %%rcx, %%rcx\n"
1969         "addq    %%rdx, %[z4]\n"
1970         "adcq    $0, %%rcx\n"
1971         "movq    %%rcx, %[carry]\n"
1972     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3]), [z4]"+m"(z[4])
1973     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
1974     : "%rax", "%rcx", "%rdx");
1975     return carry;
1976 }
1977 
1978 /* x has 4 words, z has 6.
1979  * Put (z+x*c) in z. Carry bit is lost. */
1980 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
1981 static inline
mpfq_fixmp_4_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)1982 void mpfq_fixmp_4_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
1983 {
1984     __asm__ __volatile__(
1985         "movq    %[x0], %%rax\n"
1986         "mulq    %[mult]\n"
1987         "addq    %%rax, %[z0]\n"
1988         "movq    %[x1], %%rax\n"
1989         "adcq    $0, %%rdx\n"
1990         "movq    %%rdx, %%rcx\n"
1991         "mulq    %[mult]\n"
1992         "addq    %%rax, %%rcx\n"
1993         "adcq    $0, %%rdx\n"
1994         "movq    %[x2], %%rax\n"
1995         "addq    %%rcx, %[z1]\n"
1996         "adcq    $0, %%rdx\n"
1997         "movq    %%rdx, %%rcx\n"
1998         "mulq    %[mult]\n"
1999         "addq    %%rax, %%rcx\n"
2000         "adcq    $0, %%rdx\n"
2001         "movq    %[x3], %%rax\n"
2002         "addq    %%rcx, %[z2]\n"
2003         "adcq    $0, %%rdx\n"
2004         "movq    %%rdx, %%rcx\n"
2005         "mulq    %[mult]\n"
2006         "addq    %%rax, %%rcx\n"
2007         "adcq    $0, %%rdx\n"
2008         "addq    %%rcx, %[z3]\n"
2009         "adcq    $0, %%rdx\n"
2010         "addq    %%rdx, %[z4]\n"
2011     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3]), [z4]"+m"(z[4])
2012     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
2013     : "%rax", "%rcx", "%rdx");
2014 }
2015 
2016 /* x has 4 words, z has 5.
2017  * Put (z+x*c) in z. Return carry word. */
2018 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
2019 static inline
mpfq_fixmp_4_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)2020 mp_limb_t mpfq_fixmp_4_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
2021 {
2022     mp_limb_t carry;
2023     __asm__ __volatile__(
2024         "movq    %[x0], %%rax\n"
2025         "mulq    %[mult]\n"
2026         "addq    %%rax, %[z0]\n"
2027         "movq    %[x1], %%rax\n"
2028         "adcq    $0, %%rdx\n"
2029         "movq    %%rdx, %%rcx\n"
2030         "mulq    %[mult]\n"
2031         "addq    %%rax, %%rcx\n"
2032         "adcq    $0, %%rdx\n"
2033         "movq    %[x2], %%rax\n"
2034         "addq    %%rcx, %[z1]\n"
2035         "adcq    $0, %%rdx\n"
2036         "movq    %%rdx, %%rcx\n"
2037         "mulq    %[mult]\n"
2038         "addq    %%rax, %%rcx\n"
2039         "adcq    $0, %%rdx\n"
2040         "movq    %[x3], %%rax\n"
2041         "addq    %%rcx, %[z2]\n"
2042         "adcq    $0, %%rdx\n"
2043         "movq    %%rdx, %%rcx\n"
2044         "mulq    %[mult]\n"
2045         "addq    %%rax, %%rcx\n"
2046         "adcq    $0, %%rdx\n"
2047         "addq    %%rcx, %[z3]\n"
2048         "adcq    $0, %%rdx\n"
2049         "movq    %%rdx, %[carry]\n"
2050     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3]), [z4]"+m"(z[4])
2051     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
2052     : "%rax", "%rcx", "%rdx");
2053     return carry;
2054 }
2055 
2056 /* x and y have 4 words, z has 10. Put x*y in z. */
2057 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
2058 static inline
mpfq_fixmp_4_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2059 void mpfq_fixmp_4_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2060 {
2061     __asm__ __volatile__(
2062         "### x*y[0]\n"
2063         "movq    %2, %%r8\n"
2064         "movq    %0, %%rdi\n"
2065         "movq    0(%%r8), %%r9\n"
2066         "movq    %1, %%rsi\n"
2067         "movq    0(%%rsi), %%rax\n"
2068         "mulq    %%r9\n"
2069         "movq    %%rax, 0(%%rdi)\n"
2070         "movq    8(%%rsi), %%rax\n"
2071         "movq    %%rdx, %%rcx\n"
2072         "mulq    %%r9\n"
2073         "addq    %%rax, %%rcx\n"
2074         "adcq    $0, %%rdx\n"
2075         "movq    16(%%rsi), %%rax\n"
2076         "movq    %%rcx, 8(%%rdi)\n"
2077         "movq    %%rdx, %%rcx\n"
2078         "mulq    %%r9\n"
2079         "addq    %%rax, %%rcx\n"
2080         "adcq    $0, %%rdx\n"
2081         "movq    24(%%rsi), %%rax\n"
2082         "movq    %%rcx, 16(%%rdi)\n"
2083         "movq    %%rdx, %%rcx\n"
2084         "mulq    %%r9\n"
2085         "addq    %%rax, %%rcx\n"
2086         "adcq    $0, %%rdx\n"
2087         "movq    %%rcx, 24(%%rdi)\n"
2088         "movq    %%rdx, 32(%%rdi)\n"
2089         "movq    $0, 40(%%rdi)\n"
2090         "movq    $0, 48(%%rdi)\n"
2091         "movq    $0, 56(%%rdi)\n"
2092         "### x*y[1]\n"
2093         "movq    8(%%r8), %%r9\n"
2094         "movq    0(%%rsi), %%rax\n"
2095         "mulq    %%r9\n"
2096         "addq    %%rax, 8(%%rdi)\n"
2097         "movq    8(%%rsi), %%rax\n"
2098         "adcq    $0, %%rdx\n"
2099         "movq    %%rdx, %%rcx\n"
2100         "mulq    %%r9\n"
2101         "addq    %%rax, %%rcx\n"
2102         "adcq    $0, %%rdx\n"
2103         "movq    16(%%rsi), %%rax\n"
2104         "addq    %%rcx, 16(%%rdi)\n"
2105         "adcq    $0, %%rdx\n"
2106         "movq    %%rdx, %%rcx\n"
2107         "mulq    %%r9\n"
2108         "addq    %%rax, %%rcx\n"
2109         "adcq    $0, %%rdx\n"
2110         "movq    24(%%rsi), %%rax\n"
2111         "addq    %%rcx, 24(%%rdi)\n"
2112         "adcq    $0, %%rdx\n"
2113         "movq    %%rdx, %%rcx\n"
2114         "mulq    %%r9\n"
2115         "addq    %%rax, %%rcx\n"
2116         "adcq    $0, %%rdx\n"
2117         "addq    %%rcx, 32(%%rdi)\n"
2118         "adcq    $0, %%rdx\n"
2119         "movq    %%rdx, 40(%%rdi)\n"
2120         "### x*y[2]\n"
2121         "movq    16(%%r8), %%r9\n"
2122         "movq    0(%%rsi), %%rax\n"
2123         "mulq    %%r9\n"
2124         "addq    %%rax, 16(%%rdi)\n"
2125         "movq    8(%%rsi), %%rax\n"
2126         "adcq    $0, %%rdx\n"
2127         "movq    %%rdx, %%rcx\n"
2128         "mulq    %%r9\n"
2129         "addq    %%rax, %%rcx\n"
2130         "adcq    $0, %%rdx\n"
2131         "movq    16(%%rsi), %%rax\n"
2132         "addq    %%rcx, 24(%%rdi)\n"
2133         "adcq    $0, %%rdx\n"
2134         "movq    %%rdx, %%rcx\n"
2135         "mulq    %%r9\n"
2136         "addq    %%rax, %%rcx\n"
2137         "adcq    $0, %%rdx\n"
2138         "movq    24(%%rsi), %%rax\n"
2139         "addq    %%rcx, 32(%%rdi)\n"
2140         "adcq    $0, %%rdx\n"
2141         "movq    %%rdx, %%rcx\n"
2142         "mulq    %%r9\n"
2143         "addq    %%rax, %%rcx\n"
2144         "adcq    $0, %%rdx\n"
2145         "addq    %%rcx, 40(%%rdi)\n"
2146         "adcq    $0, %%rdx\n"
2147         "movq    %%rdx, 48(%%rdi)\n"
2148         "### x*y[3]\n"
2149         "movq    24(%%r8), %%r9\n"
2150         "movq    0(%%rsi), %%rax\n"
2151         "mulq    %%r9\n"
2152         "addq    %%rax, 24(%%rdi)\n"
2153         "movq    8(%%rsi), %%rax\n"
2154         "adcq    $0, %%rdx\n"
2155         "movq    %%rdx, %%rcx\n"
2156         "mulq    %%r9\n"
2157         "addq    %%rax, %%rcx\n"
2158         "adcq    $0, %%rdx\n"
2159         "movq    16(%%rsi), %%rax\n"
2160         "addq    %%rcx, 32(%%rdi)\n"
2161         "adcq    $0, %%rdx\n"
2162         "movq    %%rdx, %%rcx\n"
2163         "mulq    %%r9\n"
2164         "addq    %%rax, %%rcx\n"
2165         "adcq    $0, %%rdx\n"
2166         "movq    24(%%rsi), %%rax\n"
2167         "addq    %%rcx, 40(%%rdi)\n"
2168         "adcq    $0, %%rdx\n"
2169         "movq    %%rdx, %%rcx\n"
2170         "mulq    %%r9\n"
2171         "addq    %%rax, %%rcx\n"
2172         "adcq    $0, %%rdx\n"
2173         "addq    %%rcx, 48(%%rdi)\n"
2174         "adcq    $0, %%rdx\n"
2175         "movq    %%rdx, 56(%%rdi)\n"
2176       : "+m" (z)
2177       : "m" (x), "m" (y)
2178       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
2179 }
2180 
2181 /* x has 4 words, z has 10. Put x*y in z. */
2182 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
2183 static inline
mpfq_fixmp_4_sqr(mp_limb_t * z,const mp_limb_t * x)2184 void mpfq_fixmp_4_sqr(mp_limb_t * z, const mp_limb_t * x)
2185 {
2186     __asm__ __volatile__(
2187         "movq	%1, %%rsi\n"
2188         "movq	%0, %%rdi\n"
2189         "### diagonal elements\n"
2190         "movq    (%%rsi), %%rax\n"
2191         "mulq	%%rax\n"
2192         "movq    %%rax, (%%rdi)\n"
2193         "movq    8(%%rsi), %%rax\n"
2194         "movq    %%rdx, 8(%%rdi)\n"
2195         "mulq	%%rax\n"
2196         "movq    %%rax, 16(%%rdi)\n"
2197         "movq	16(%%rsi), %%rax\n"
2198         "movq    %%rdx, 24(%%rdi)\n"
2199         "mulq    %%rax\n"
2200         "movq    %%rax, 32(%%rdi)\n"
2201         "movq	24(%%rsi), %%rax\n"
2202         "movq    %%rdx, 40(%%rdi)\n"
2203         "mulq    %%rax\n"
2204         "movq    %%rax, 48(%%rdi)\n"
2205         "movq    %%rdx, 56(%%rdi)\n"
2206         "### precompute triangle\n"
2207         "### x[0]*x[1:3]\n"
2208         "movq	(%%rsi), %%rcx\n"
2209         "movq	8(%%rsi), %%rax\n"
2210         "mulq	%%rcx\n"
2211         "movq	%%rax, %%r8\n"
2212         "movq	%%rdx, %%r9\n"
2213         "movq    16(%%rsi), %%rax\n"
2214         "mulq	%%rcx\n"
2215         "addq	%%rax, %%r9\n"
2216         "adcq	$0, %%rdx\n"
2217         "movq	%%rdx, %%r10\n"
2218         "movq    24(%%rsi), %%rax\n"
2219         "mulq	%%rcx\n"
2220         "addq	%%rax, %%r10\n"
2221         "adcq	$0, %%rdx\n"
2222         "movq	%%rdx, %%r11\n"
2223         "### x[1]*x[2:3]\n"
2224         "movq	8(%%rsi), %%rcx\n"
2225         "movq	16(%%rsi), %%rax\n"
2226         "xorq	%%r12, %%r12\n"
2227         "mulq	%%rcx\n"
2228         "addq	%%rax, %%r10\n"
2229         "adcq	%%rdx, %%r11\n"
2230         "adcq	$0, %%r12\n"
2231         "movq	24(%%rsi), %%rax\n"
2232         "mulq	%%rcx\n"
2233         "addq    %%rax, %%r11\n"
2234         "adcq	$0, %%rdx\n"
2235         "addq    %%rdx, %%r12\n"
2236         "### x[2]*x[3]\n"
2237         "movq	16(%%rsi), %%rax\n"
2238         "mulq	24(%%rsi)\n"
2239         "addq	%%rax, %%r12\n"
2240         "adcq	$0, %%rdx\n"
2241         "### Shift triangle\n"
2242         "addq	%%r8, %%r8\n"
2243         "adcq	%%r9, %%r9\n"
2244         "adcq	%%r10, %%r10\n"
2245         "adcq	%%r11, %%r11\n"
2246         "adcq	%%r12, %%r12\n"
2247         "adcq	%%rdx, %%rdx\n"
2248         "adcq	$0, 56(%%rdi)\n"
2249         "### add shifted triangle to diagonal\n"
2250         "addq	%%r8, 8(%%rdi)\n"
2251         "adcq	%%r9, 16(%%rdi)\n"
2252         "adcq	%%r10, 24(%%rdi)\n"
2253         "adcq	%%r11, 32(%%rdi)\n"
2254         "adcq	%%r12, 40(%%rdi)\n"
2255         "adcq	%%rdx, 48(%%rdi)\n"
2256         "adcq	$0, 56(%%rdi)\n"
2257     : "+m" (z)
2258     : "m" (x)
2259     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "%r10", "%r11", "%r12", "memory");
2260 }
2261 
2262 /* x has 4 words, z has 6. Put x*y in z. */
2263 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
2264 static inline
mpfq_fixmp_4_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)2265 void mpfq_fixmp_4_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
2266 {
2267     __asm__ __volatile__(
2268         "movq    %[x0], %%rax\n"
2269         "mulq    %[mult]\n"
2270         "movq    %%rax, %[z0]\n"
2271         "movq    %[x1], %%rax\n"
2272         "movq    %%rdx, %%rcx\n"
2273         "mulq    %[mult]\n"
2274         "addq    %%rax, %%rcx\n"
2275         "adcq    $0, %%rdx\n"
2276         "movq    %[x2], %%rax\n"
2277         "movq    %%rcx, %[z1]\n"
2278         "movq    %%rdx, %%rcx\n"
2279         "mulq    %[mult]\n"
2280         "addq    %%rax, %%rcx\n"
2281         "adcq    $0, %%rdx\n"
2282         "movq    %[x3], %%rax\n"
2283         "movq    %%rcx, %[z2]\n"
2284         "movq    %%rdx, %%rcx\n"
2285         "mulq    %[mult]\n"
2286         "addq    %%rax, %%rcx\n"
2287         "adcq    $0, %%rdx\n"
2288         "movq    %%rcx, %[z3]\n"
2289         "movq    %%rdx, %[z4]\n"
2290     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3]), [z4]"=m"(z[4])
2291     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
2292     : "%rax", "%rcx", "%rdx");
2293 }
2294 
2295 /* x, y, and z have 5 words. Result in z. Return carry bit */
2296 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
2297 static inline
mpfq_fixmp_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2298 mp_limb_t mpfq_fixmp_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2299 {
2300     mp_limb_t carry;
2301     __asm__ __volatile__(
2302         "movq    %[z], %%rdi\n"
2303         "movq    %[x], %%rsi\n"
2304         "movq    %[y], %%rdx\n"
2305         "movq    0(%%rsi), %%rax\n"
2306         "addq    0(%%rdx), %%rax\n"
2307         "movq    %%rax, 0(%%rdi)\n"
2308         "movq    8(%%rsi), %%rax\n"
2309         "adcq    8(%%rdx), %%rax\n"
2310         "movq    %%rax, 8(%%rdi)\n"
2311         "movq    16(%%rsi), %%rax\n"
2312         "adcq    16(%%rdx), %%rax\n"
2313         "movq    %%rax, 16(%%rdi)\n"
2314         "movq    24(%%rsi), %%rax\n"
2315         "adcq    24(%%rdx), %%rax\n"
2316         "movq    %%rax, 24(%%rdi)\n"
2317         "movq    32(%%rsi), %%rax\n"
2318         "adcq    32(%%rdx), %%rax\n"
2319         "movq    %%rax, 32(%%rdi)\n"
2320         "movq $0, %%rax\n"
2321         "adcq $0, %%rax\n"
2322     : "=&a"(carry)
2323     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2324     : "%rdx", "%rsi", "%rdi", "memory");
2325     return carry;
2326 }
2327 
2328 /* x, y, and z have 5 words. Result in z. Return borrow bit */
2329 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
2330 static inline
mpfq_fixmp_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2331 mp_limb_t mpfq_fixmp_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2332 {
2333     mp_limb_t carry;
2334     __asm__ __volatile__(
2335         "movq    %[z], %%rdi\n"
2336         "movq    %[x], %%rsi\n"
2337         "movq    %[y], %%rdx\n"
2338         "movq    0(%%rsi), %%rax\n"
2339         "subq    0(%%rdx), %%rax\n"
2340         "movq    %%rax, 0(%%rdi)\n"
2341         "movq    8(%%rsi), %%rax\n"
2342         "sbbq    8(%%rdx), %%rax\n"
2343         "movq    %%rax, 8(%%rdi)\n"
2344         "movq    16(%%rsi), %%rax\n"
2345         "sbbq    16(%%rdx), %%rax\n"
2346         "movq    %%rax, 16(%%rdi)\n"
2347         "movq    24(%%rsi), %%rax\n"
2348         "sbbq    24(%%rdx), %%rax\n"
2349         "movq    %%rax, 24(%%rdi)\n"
2350         "movq    32(%%rsi), %%rax\n"
2351         "sbbq    32(%%rdx), %%rax\n"
2352         "movq    %%rax, 32(%%rdi)\n"
2353         "movq $0, %%rax\n"
2354         "adcq $0, %%rax\n"
2355     : "=&a"(carry)
2356     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2357     : "%rdx", "%rsi", "%rdi", "memory");
2358     return carry;
2359 }
2360 
2361 /* x, y, and z have 5 words. Result in z. Carry bit is lost. */
2362 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
2363 static inline
mpfq_fixmp_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2364 void mpfq_fixmp_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2365 {
2366     __asm__ __volatile__(
2367         "movq    %[z], %%rdi\n"
2368         "movq    %[x], %%rsi\n"
2369         "movq    %[y], %%rdx\n"
2370         "movq    0(%%rsi), %%rax\n"
2371         "addq    0(%%rdx), %%rax\n"
2372         "movq    %%rax, 0(%%rdi)\n"
2373         "movq    8(%%rsi), %%rax\n"
2374         "adcq    8(%%rdx), %%rax\n"
2375         "movq    %%rax, 8(%%rdi)\n"
2376         "movq    16(%%rsi), %%rax\n"
2377         "adcq    16(%%rdx), %%rax\n"
2378         "movq    %%rax, 16(%%rdi)\n"
2379         "movq    24(%%rsi), %%rax\n"
2380         "adcq    24(%%rdx), %%rax\n"
2381         "movq    %%rax, 24(%%rdi)\n"
2382         "movq    32(%%rsi), %%rax\n"
2383         "adcq    32(%%rdx), %%rax\n"
2384         "movq    %%rax, 32(%%rdi)\n"
2385     :
2386     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2387     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
2388 }
2389 
2390 /* x, y, and z have 5 words. Result in z. Borrow bit is lost. */
2391 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
2392 static inline
mpfq_fixmp_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2393 void mpfq_fixmp_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2394 {
2395     __asm__ __volatile__(
2396         "movq    %[z], %%rdi\n"
2397         "movq    %[x], %%rsi\n"
2398         "movq    %[y], %%rdx\n"
2399         "movq    0(%%rsi), %%rax\n"
2400         "subq    0(%%rdx), %%rax\n"
2401         "movq    %%rax, 0(%%rdi)\n"
2402         "movq    8(%%rsi), %%rax\n"
2403         "sbbq    8(%%rdx), %%rax\n"
2404         "movq    %%rax, 8(%%rdi)\n"
2405         "movq    16(%%rsi), %%rax\n"
2406         "sbbq    16(%%rdx), %%rax\n"
2407         "movq    %%rax, 16(%%rdi)\n"
2408         "movq    24(%%rsi), %%rax\n"
2409         "sbbq    24(%%rdx), %%rax\n"
2410         "movq    %%rax, 24(%%rdi)\n"
2411         "movq    32(%%rsi), %%rax\n"
2412         "sbbq    32(%%rdx), %%rax\n"
2413         "movq    %%rax, 32(%%rdi)\n"
2414     :
2415     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2416     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
2417 }
2418 
2419 /* x has 5 words, z has 7.
2420  * Put (z+x*c) in z. Return carry bit. */
2421 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
2422 static inline
mpfq_fixmp_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)2423 mp_limb_t mpfq_fixmp_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
2424 {
2425     mp_limb_t carry;
2426     __asm__ __volatile__(
2427         "movq    %[z], %%rdi\n"
2428         "movq    %[x], %%rsi\n"
2429         "movq    0(%%rsi), %%rax\n"
2430         "mulq    %[mult]\n"
2431         "addq    %%rax, 0(%%rdi)\n"
2432         "movq    8(%%rsi), %%rax\n"
2433         "adcq    $0, %%rdx\n"
2434         "movq    %%rdx, %%rcx\n"
2435         "mulq    %[mult]\n"
2436         "addq    %%rax, %%rcx\n"
2437         "adcq    $0, %%rdx\n"
2438         "movq    16(%%rsi), %%rax\n"
2439         "addq    %%rcx, 8(%%rdi)\n"
2440         "adcq    $0, %%rdx\n"
2441         "movq    %%rdx, %%rcx\n"
2442         "mulq    %[mult]\n"
2443         "addq    %%rax, %%rcx\n"
2444         "adcq    $0, %%rdx\n"
2445         "movq    24(%%rsi), %%rax\n"
2446         "addq    %%rcx, 16(%%rdi)\n"
2447         "adcq    $0, %%rdx\n"
2448         "movq    %%rdx, %%rcx\n"
2449         "mulq    %[mult]\n"
2450         "addq    %%rax, %%rcx\n"
2451         "adcq    $0, %%rdx\n"
2452         "movq    32(%%rsi), %%rax\n"
2453         "addq    %%rcx, 24(%%rdi)\n"
2454         "adcq    $0, %%rdx\n"
2455         "movq    %%rdx, %%rcx\n"
2456         "mulq    %[mult]\n"
2457         "addq    %%rax, %%rcx\n"
2458         "adcq    $0, %%rdx\n"
2459         "addq    %%rcx, 32(%%rdi)\n"
2460         "adcq    $0, %%rdx\n"
2461         "xorq    %%rcx, %%rcx\n"
2462         "addq    %%rdx, 40(%%rdi)\n"
2463         "adcq    $0, %%rcx\n"
2464         "movq    %%rcx, %[carry]\n"
2465     : [carry]"=g"(carry), [z] "+m" (z)
2466     : [mult] "r" (c), [x] "m" (x)
2467     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
2468     return carry;
2469 }
2470 
2471 /* x has 5 words, z has 7.
2472  * Put (z+x*c) in z. Carry bit is lost. */
2473 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
2474 static inline
mpfq_fixmp_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)2475 void mpfq_fixmp_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
2476 {
2477     __asm__ __volatile__(
2478         "movq    %[z], %%rdi\n"
2479         "movq    %[x], %%rsi\n"
2480         "movq    0(%%rsi), %%rax\n"
2481         "mulq    %[mult]\n"
2482         "addq    %%rax, 0(%%rdi)\n"
2483         "movq    8(%%rsi), %%rax\n"
2484         "adcq    $0, %%rdx\n"
2485         "movq    %%rdx, %%rcx\n"
2486         "mulq    %[mult]\n"
2487         "addq    %%rax, %%rcx\n"
2488         "adcq    $0, %%rdx\n"
2489         "movq    16(%%rsi), %%rax\n"
2490         "addq    %%rcx, 8(%%rdi)\n"
2491         "adcq    $0, %%rdx\n"
2492         "movq    %%rdx, %%rcx\n"
2493         "mulq    %[mult]\n"
2494         "addq    %%rax, %%rcx\n"
2495         "adcq    $0, %%rdx\n"
2496         "movq    24(%%rsi), %%rax\n"
2497         "addq    %%rcx, 16(%%rdi)\n"
2498         "adcq    $0, %%rdx\n"
2499         "movq    %%rdx, %%rcx\n"
2500         "mulq    %[mult]\n"
2501         "addq    %%rax, %%rcx\n"
2502         "adcq    $0, %%rdx\n"
2503         "movq    32(%%rsi), %%rax\n"
2504         "addq    %%rcx, 24(%%rdi)\n"
2505         "adcq    $0, %%rdx\n"
2506         "movq    %%rdx, %%rcx\n"
2507         "mulq    %[mult]\n"
2508         "addq    %%rax, %%rcx\n"
2509         "adcq    $0, %%rdx\n"
2510         "addq    %%rcx, 32(%%rdi)\n"
2511         "adcq    $0, %%rdx\n"
2512         "addq    %%rdx, 40(%%rdi)\n"
2513     : [z] "+m" (z)
2514     : [mult] "r" (c), [x] "m" (x)
2515     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
2516 }
2517 
2518 /* x has 5 words, z has 6.
2519  * Put (z+x*c) in z. Return carry word. */
2520 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
2521 static inline
mpfq_fixmp_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)2522 mp_limb_t mpfq_fixmp_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
2523 {
2524     mp_limb_t carry;
2525     __asm__ __volatile__(
2526         "movq    %[z], %%rdi\n"
2527         "movq    %[x], %%rsi\n"
2528         "movq    0(%%rsi), %%rax\n"
2529         "mulq    %[mult]\n"
2530         "addq    %%rax, 0(%%rdi)\n"
2531         "movq    8(%%rsi), %%rax\n"
2532         "adcq    $0, %%rdx\n"
2533         "movq    %%rdx, %%rcx\n"
2534         "mulq    %[mult]\n"
2535         "addq    %%rax, %%rcx\n"
2536         "adcq    $0, %%rdx\n"
2537         "movq    16(%%rsi), %%rax\n"
2538         "addq    %%rcx, 8(%%rdi)\n"
2539         "adcq    $0, %%rdx\n"
2540         "movq    %%rdx, %%rcx\n"
2541         "mulq    %[mult]\n"
2542         "addq    %%rax, %%rcx\n"
2543         "adcq    $0, %%rdx\n"
2544         "movq    24(%%rsi), %%rax\n"
2545         "addq    %%rcx, 16(%%rdi)\n"
2546         "adcq    $0, %%rdx\n"
2547         "movq    %%rdx, %%rcx\n"
2548         "mulq    %[mult]\n"
2549         "addq    %%rax, %%rcx\n"
2550         "adcq    $0, %%rdx\n"
2551         "movq    32(%%rsi), %%rax\n"
2552         "addq    %%rcx, 24(%%rdi)\n"
2553         "adcq    $0, %%rdx\n"
2554         "movq    %%rdx, %%rcx\n"
2555         "mulq    %[mult]\n"
2556         "addq    %%rax, %%rcx\n"
2557         "adcq    $0, %%rdx\n"
2558         "addq    %%rcx, 32(%%rdi)\n"
2559         "adcq    $0, %%rdx\n"
2560         "movq    %%rdx, %[carry]\n"
2561     : [carry]"=g"(carry), [z] "+m" (z)
2562     : [mult] "r" (c), [x] "m" (x)
2563     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
2564     return carry;
2565 }
2566 
2567 /* x and y have 5 words, z has 12. Put x*y in z. */
2568 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
2569 static inline
mpfq_fixmp_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2570 void mpfq_fixmp_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2571 {
2572     __asm__ __volatile__(
2573         "### x*y[0]\n"
2574         "movq    %2, %%r8\n"
2575         "movq    %0, %%rdi\n"
2576         "movq    0(%%r8), %%r9\n"
2577         "movq    %1, %%rsi\n"
2578         "movq    0(%%rsi), %%rax\n"
2579         "mulq    %%r9\n"
2580         "movq    %%rax, 0(%%rdi)\n"
2581         "movq    8(%%rsi), %%rax\n"
2582         "movq    %%rdx, %%rcx\n"
2583         "mulq    %%r9\n"
2584         "addq    %%rax, %%rcx\n"
2585         "adcq    $0, %%rdx\n"
2586         "movq    16(%%rsi), %%rax\n"
2587         "movq    %%rcx, 8(%%rdi)\n"
2588         "movq    %%rdx, %%rcx\n"
2589         "mulq    %%r9\n"
2590         "addq    %%rax, %%rcx\n"
2591         "adcq    $0, %%rdx\n"
2592         "movq    24(%%rsi), %%rax\n"
2593         "movq    %%rcx, 16(%%rdi)\n"
2594         "movq    %%rdx, %%rcx\n"
2595         "mulq    %%r9\n"
2596         "addq    %%rax, %%rcx\n"
2597         "adcq    $0, %%rdx\n"
2598         "movq    32(%%rsi), %%rax\n"
2599         "movq    %%rcx, 24(%%rdi)\n"
2600         "movq    %%rdx, %%rcx\n"
2601         "mulq    %%r9\n"
2602         "addq    %%rax, %%rcx\n"
2603         "adcq    $0, %%rdx\n"
2604         "movq    %%rcx, 32(%%rdi)\n"
2605         "movq    %%rdx, 40(%%rdi)\n"
2606         "movq    $0, 48(%%rdi)\n"
2607         "movq    $0, 56(%%rdi)\n"
2608         "movq    $0, 64(%%rdi)\n"
2609         "movq    $0, 72(%%rdi)\n"
2610         "### x*y[1]\n"
2611         "movq    8(%%r8), %%r9\n"
2612         "movq    0(%%rsi), %%rax\n"
2613         "mulq    %%r9\n"
2614         "addq    %%rax, 8(%%rdi)\n"
2615         "movq    8(%%rsi), %%rax\n"
2616         "adcq    $0, %%rdx\n"
2617         "movq    %%rdx, %%rcx\n"
2618         "mulq    %%r9\n"
2619         "addq    %%rax, %%rcx\n"
2620         "adcq    $0, %%rdx\n"
2621         "movq    16(%%rsi), %%rax\n"
2622         "addq    %%rcx, 16(%%rdi)\n"
2623         "adcq    $0, %%rdx\n"
2624         "movq    %%rdx, %%rcx\n"
2625         "mulq    %%r9\n"
2626         "addq    %%rax, %%rcx\n"
2627         "adcq    $0, %%rdx\n"
2628         "movq    24(%%rsi), %%rax\n"
2629         "addq    %%rcx, 24(%%rdi)\n"
2630         "adcq    $0, %%rdx\n"
2631         "movq    %%rdx, %%rcx\n"
2632         "mulq    %%r9\n"
2633         "addq    %%rax, %%rcx\n"
2634         "adcq    $0, %%rdx\n"
2635         "movq    32(%%rsi), %%rax\n"
2636         "addq    %%rcx, 32(%%rdi)\n"
2637         "adcq    $0, %%rdx\n"
2638         "movq    %%rdx, %%rcx\n"
2639         "mulq    %%r9\n"
2640         "addq    %%rax, %%rcx\n"
2641         "adcq    $0, %%rdx\n"
2642         "addq    %%rcx, 40(%%rdi)\n"
2643         "adcq    $0, %%rdx\n"
2644         "movq    %%rdx, 48(%%rdi)\n"
2645         "### x*y[2]\n"
2646         "movq    16(%%r8), %%r9\n"
2647         "movq    0(%%rsi), %%rax\n"
2648         "mulq    %%r9\n"
2649         "addq    %%rax, 16(%%rdi)\n"
2650         "movq    8(%%rsi), %%rax\n"
2651         "adcq    $0, %%rdx\n"
2652         "movq    %%rdx, %%rcx\n"
2653         "mulq    %%r9\n"
2654         "addq    %%rax, %%rcx\n"
2655         "adcq    $0, %%rdx\n"
2656         "movq    16(%%rsi), %%rax\n"
2657         "addq    %%rcx, 24(%%rdi)\n"
2658         "adcq    $0, %%rdx\n"
2659         "movq    %%rdx, %%rcx\n"
2660         "mulq    %%r9\n"
2661         "addq    %%rax, %%rcx\n"
2662         "adcq    $0, %%rdx\n"
2663         "movq    24(%%rsi), %%rax\n"
2664         "addq    %%rcx, 32(%%rdi)\n"
2665         "adcq    $0, %%rdx\n"
2666         "movq    %%rdx, %%rcx\n"
2667         "mulq    %%r9\n"
2668         "addq    %%rax, %%rcx\n"
2669         "adcq    $0, %%rdx\n"
2670         "movq    32(%%rsi), %%rax\n"
2671         "addq    %%rcx, 40(%%rdi)\n"
2672         "adcq    $0, %%rdx\n"
2673         "movq    %%rdx, %%rcx\n"
2674         "mulq    %%r9\n"
2675         "addq    %%rax, %%rcx\n"
2676         "adcq    $0, %%rdx\n"
2677         "addq    %%rcx, 48(%%rdi)\n"
2678         "adcq    $0, %%rdx\n"
2679         "movq    %%rdx, 56(%%rdi)\n"
2680         "### x*y[3]\n"
2681         "movq    24(%%r8), %%r9\n"
2682         "movq    0(%%rsi), %%rax\n"
2683         "mulq    %%r9\n"
2684         "addq    %%rax, 24(%%rdi)\n"
2685         "movq    8(%%rsi), %%rax\n"
2686         "adcq    $0, %%rdx\n"
2687         "movq    %%rdx, %%rcx\n"
2688         "mulq    %%r9\n"
2689         "addq    %%rax, %%rcx\n"
2690         "adcq    $0, %%rdx\n"
2691         "movq    16(%%rsi), %%rax\n"
2692         "addq    %%rcx, 32(%%rdi)\n"
2693         "adcq    $0, %%rdx\n"
2694         "movq    %%rdx, %%rcx\n"
2695         "mulq    %%r9\n"
2696         "addq    %%rax, %%rcx\n"
2697         "adcq    $0, %%rdx\n"
2698         "movq    24(%%rsi), %%rax\n"
2699         "addq    %%rcx, 40(%%rdi)\n"
2700         "adcq    $0, %%rdx\n"
2701         "movq    %%rdx, %%rcx\n"
2702         "mulq    %%r9\n"
2703         "addq    %%rax, %%rcx\n"
2704         "adcq    $0, %%rdx\n"
2705         "movq    32(%%rsi), %%rax\n"
2706         "addq    %%rcx, 48(%%rdi)\n"
2707         "adcq    $0, %%rdx\n"
2708         "movq    %%rdx, %%rcx\n"
2709         "mulq    %%r9\n"
2710         "addq    %%rax, %%rcx\n"
2711         "adcq    $0, %%rdx\n"
2712         "addq    %%rcx, 56(%%rdi)\n"
2713         "adcq    $0, %%rdx\n"
2714         "movq    %%rdx, 64(%%rdi)\n"
2715         "### x*y[4]\n"
2716         "movq    32(%%r8), %%r9\n"
2717         "movq    0(%%rsi), %%rax\n"
2718         "mulq    %%r9\n"
2719         "addq    %%rax, 32(%%rdi)\n"
2720         "movq    8(%%rsi), %%rax\n"
2721         "adcq    $0, %%rdx\n"
2722         "movq    %%rdx, %%rcx\n"
2723         "mulq    %%r9\n"
2724         "addq    %%rax, %%rcx\n"
2725         "adcq    $0, %%rdx\n"
2726         "movq    16(%%rsi), %%rax\n"
2727         "addq    %%rcx, 40(%%rdi)\n"
2728         "adcq    $0, %%rdx\n"
2729         "movq    %%rdx, %%rcx\n"
2730         "mulq    %%r9\n"
2731         "addq    %%rax, %%rcx\n"
2732         "adcq    $0, %%rdx\n"
2733         "movq    24(%%rsi), %%rax\n"
2734         "addq    %%rcx, 48(%%rdi)\n"
2735         "adcq    $0, %%rdx\n"
2736         "movq    %%rdx, %%rcx\n"
2737         "mulq    %%r9\n"
2738         "addq    %%rax, %%rcx\n"
2739         "adcq    $0, %%rdx\n"
2740         "movq    32(%%rsi), %%rax\n"
2741         "addq    %%rcx, 56(%%rdi)\n"
2742         "adcq    $0, %%rdx\n"
2743         "movq    %%rdx, %%rcx\n"
2744         "mulq    %%r9\n"
2745         "addq    %%rax, %%rcx\n"
2746         "adcq    $0, %%rdx\n"
2747         "addq    %%rcx, 64(%%rdi)\n"
2748         "adcq    $0, %%rdx\n"
2749         "movq    %%rdx, 72(%%rdi)\n"
2750       : "+m" (z)
2751       : "m" (x), "m" (y)
2752       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
2753 }
2754 
2755 /* x has 5 words, z has 12. Put x*y in z. */
2756 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
2757 static inline
mpfq_fixmp_5_sqr(mp_limb_t * z,const mp_limb_t * x)2758 void mpfq_fixmp_5_sqr(mp_limb_t * z, const mp_limb_t * x)
2759 {
2760     mpfq_fixmp_5_mul(z, x, x);
2761 }
2762 
2763 /* x has 5 words, z has 7. Put x*y in z. */
2764 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
2765 static inline
mpfq_fixmp_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)2766 void mpfq_fixmp_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
2767 {
2768     __asm__ __volatile__(
2769         "movq    %[z], %%rdi\n"
2770         "movq    %[x], %%rsi\n"
2771         "movq    0(%%rsi), %%rax\n"
2772         "mulq    %[mult]\n"
2773         "movq    %%rax, 0(%%rdi)\n"
2774         "movq    8(%%rsi), %%rax\n"
2775         "movq    %%rdx, %%rcx\n"
2776         "mulq    %[mult]\n"
2777         "addq    %%rax, %%rcx\n"
2778         "adcq    $0, %%rdx\n"
2779         "movq    16(%%rsi), %%rax\n"
2780         "movq    %%rcx, 8(%%rdi)\n"
2781         "movq    %%rdx, %%rcx\n"
2782         "mulq    %[mult]\n"
2783         "addq    %%rax, %%rcx\n"
2784         "adcq    $0, %%rdx\n"
2785         "movq    24(%%rsi), %%rax\n"
2786         "movq    %%rcx, 16(%%rdi)\n"
2787         "movq    %%rdx, %%rcx\n"
2788         "mulq    %[mult]\n"
2789         "addq    %%rax, %%rcx\n"
2790         "adcq    $0, %%rdx\n"
2791         "movq    32(%%rsi), %%rax\n"
2792         "movq    %%rcx, 24(%%rdi)\n"
2793         "movq    %%rdx, %%rcx\n"
2794         "mulq    %[mult]\n"
2795         "addq    %%rax, %%rcx\n"
2796         "adcq    $0, %%rdx\n"
2797         "movq    %%rcx, 32(%%rdi)\n"
2798         "movq    %%rdx, 40(%%rdi)\n"
2799     :
2800     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
2801     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
2802 }
2803 
2804 /* x, y, and z have 6 words. Result in z. Return carry bit */
2805 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
2806 static inline
mpfq_fixmp_6_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2807 mp_limb_t mpfq_fixmp_6_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2808 {
2809     mp_limb_t carry;
2810     __asm__ __volatile__(
2811         "movq    %[z], %%rdi\n"
2812         "movq    %[x], %%rsi\n"
2813         "movq    %[y], %%rdx\n"
2814         "movq    0(%%rsi), %%rax\n"
2815         "addq    0(%%rdx), %%rax\n"
2816         "movq    %%rax, 0(%%rdi)\n"
2817         "movq    8(%%rsi), %%rax\n"
2818         "adcq    8(%%rdx), %%rax\n"
2819         "movq    %%rax, 8(%%rdi)\n"
2820         "movq    16(%%rsi), %%rax\n"
2821         "adcq    16(%%rdx), %%rax\n"
2822         "movq    %%rax, 16(%%rdi)\n"
2823         "movq    24(%%rsi), %%rax\n"
2824         "adcq    24(%%rdx), %%rax\n"
2825         "movq    %%rax, 24(%%rdi)\n"
2826         "movq    32(%%rsi), %%rax\n"
2827         "adcq    32(%%rdx), %%rax\n"
2828         "movq    %%rax, 32(%%rdi)\n"
2829         "movq    40(%%rsi), %%rax\n"
2830         "adcq    40(%%rdx), %%rax\n"
2831         "movq    %%rax, 40(%%rdi)\n"
2832         "movq $0, %%rax\n"
2833         "adcq $0, %%rax\n"
2834     : "=&a"(carry)
2835     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2836     : "%rdx", "%rsi", "%rdi", "memory");
2837     return carry;
2838 }
2839 
2840 /* x, y, and z have 6 words. Result in z. Return borrow bit */
2841 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
2842 static inline
mpfq_fixmp_6_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2843 mp_limb_t mpfq_fixmp_6_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2844 {
2845     mp_limb_t carry;
2846     __asm__ __volatile__(
2847         "movq    %[z], %%rdi\n"
2848         "movq    %[x], %%rsi\n"
2849         "movq    %[y], %%rdx\n"
2850         "movq    0(%%rsi), %%rax\n"
2851         "subq    0(%%rdx), %%rax\n"
2852         "movq    %%rax, 0(%%rdi)\n"
2853         "movq    8(%%rsi), %%rax\n"
2854         "sbbq    8(%%rdx), %%rax\n"
2855         "movq    %%rax, 8(%%rdi)\n"
2856         "movq    16(%%rsi), %%rax\n"
2857         "sbbq    16(%%rdx), %%rax\n"
2858         "movq    %%rax, 16(%%rdi)\n"
2859         "movq    24(%%rsi), %%rax\n"
2860         "sbbq    24(%%rdx), %%rax\n"
2861         "movq    %%rax, 24(%%rdi)\n"
2862         "movq    32(%%rsi), %%rax\n"
2863         "sbbq    32(%%rdx), %%rax\n"
2864         "movq    %%rax, 32(%%rdi)\n"
2865         "movq    40(%%rsi), %%rax\n"
2866         "sbbq    40(%%rdx), %%rax\n"
2867         "movq    %%rax, 40(%%rdi)\n"
2868         "movq $0, %%rax\n"
2869         "adcq $0, %%rax\n"
2870     : "=&a"(carry)
2871     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2872     : "%rdx", "%rsi", "%rdi", "memory");
2873     return carry;
2874 }
2875 
2876 /* x, y, and z have 6 words. Result in z. Carry bit is lost. */
2877 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
2878 static inline
mpfq_fixmp_6_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2879 void mpfq_fixmp_6_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2880 {
2881     __asm__ __volatile__(
2882         "movq    %[z], %%rdi\n"
2883         "movq    %[x], %%rsi\n"
2884         "movq    %[y], %%rdx\n"
2885         "movq    0(%%rsi), %%rax\n"
2886         "addq    0(%%rdx), %%rax\n"
2887         "movq    %%rax, 0(%%rdi)\n"
2888         "movq    8(%%rsi), %%rax\n"
2889         "adcq    8(%%rdx), %%rax\n"
2890         "movq    %%rax, 8(%%rdi)\n"
2891         "movq    16(%%rsi), %%rax\n"
2892         "adcq    16(%%rdx), %%rax\n"
2893         "movq    %%rax, 16(%%rdi)\n"
2894         "movq    24(%%rsi), %%rax\n"
2895         "adcq    24(%%rdx), %%rax\n"
2896         "movq    %%rax, 24(%%rdi)\n"
2897         "movq    32(%%rsi), %%rax\n"
2898         "adcq    32(%%rdx), %%rax\n"
2899         "movq    %%rax, 32(%%rdi)\n"
2900         "movq    40(%%rsi), %%rax\n"
2901         "adcq    40(%%rdx), %%rax\n"
2902         "movq    %%rax, 40(%%rdi)\n"
2903     :
2904     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2905     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
2906 }
2907 
2908 /* x, y, and z have 6 words. Result in z. Borrow bit is lost. */
2909 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
2910 static inline
mpfq_fixmp_6_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)2911 void mpfq_fixmp_6_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
2912 {
2913     __asm__ __volatile__(
2914         "movq    %[z], %%rdi\n"
2915         "movq    %[x], %%rsi\n"
2916         "movq    %[y], %%rdx\n"
2917         "movq    0(%%rsi), %%rax\n"
2918         "subq    0(%%rdx), %%rax\n"
2919         "movq    %%rax, 0(%%rdi)\n"
2920         "movq    8(%%rsi), %%rax\n"
2921         "sbbq    8(%%rdx), %%rax\n"
2922         "movq    %%rax, 8(%%rdi)\n"
2923         "movq    16(%%rsi), %%rax\n"
2924         "sbbq    16(%%rdx), %%rax\n"
2925         "movq    %%rax, 16(%%rdi)\n"
2926         "movq    24(%%rsi), %%rax\n"
2927         "sbbq    24(%%rdx), %%rax\n"
2928         "movq    %%rax, 24(%%rdi)\n"
2929         "movq    32(%%rsi), %%rax\n"
2930         "sbbq    32(%%rdx), %%rax\n"
2931         "movq    %%rax, 32(%%rdi)\n"
2932         "movq    40(%%rsi), %%rax\n"
2933         "sbbq    40(%%rdx), %%rax\n"
2934         "movq    %%rax, 40(%%rdi)\n"
2935     :
2936     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
2937     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
2938 }
2939 
2940 /* x has 6 words, z has 8.
2941  * Put (z+x*c) in z. Return carry bit. */
2942 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
2943 static inline
mpfq_fixmp_6_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)2944 mp_limb_t mpfq_fixmp_6_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
2945 {
2946     mp_limb_t carry;
2947     __asm__ __volatile__(
2948         "movq    %[z], %%rdi\n"
2949         "movq    %[x], %%rsi\n"
2950         "movq    0(%%rsi), %%rax\n"
2951         "mulq    %[mult]\n"
2952         "addq    %%rax, 0(%%rdi)\n"
2953         "movq    8(%%rsi), %%rax\n"
2954         "adcq    $0, %%rdx\n"
2955         "movq    %%rdx, %%rcx\n"
2956         "mulq    %[mult]\n"
2957         "addq    %%rax, %%rcx\n"
2958         "adcq    $0, %%rdx\n"
2959         "movq    16(%%rsi), %%rax\n"
2960         "addq    %%rcx, 8(%%rdi)\n"
2961         "adcq    $0, %%rdx\n"
2962         "movq    %%rdx, %%rcx\n"
2963         "mulq    %[mult]\n"
2964         "addq    %%rax, %%rcx\n"
2965         "adcq    $0, %%rdx\n"
2966         "movq    24(%%rsi), %%rax\n"
2967         "addq    %%rcx, 16(%%rdi)\n"
2968         "adcq    $0, %%rdx\n"
2969         "movq    %%rdx, %%rcx\n"
2970         "mulq    %[mult]\n"
2971         "addq    %%rax, %%rcx\n"
2972         "adcq    $0, %%rdx\n"
2973         "movq    32(%%rsi), %%rax\n"
2974         "addq    %%rcx, 24(%%rdi)\n"
2975         "adcq    $0, %%rdx\n"
2976         "movq    %%rdx, %%rcx\n"
2977         "mulq    %[mult]\n"
2978         "addq    %%rax, %%rcx\n"
2979         "adcq    $0, %%rdx\n"
2980         "movq    40(%%rsi), %%rax\n"
2981         "addq    %%rcx, 32(%%rdi)\n"
2982         "adcq    $0, %%rdx\n"
2983         "movq    %%rdx, %%rcx\n"
2984         "mulq    %[mult]\n"
2985         "addq    %%rax, %%rcx\n"
2986         "adcq    $0, %%rdx\n"
2987         "addq    %%rcx, 40(%%rdi)\n"
2988         "adcq    $0, %%rdx\n"
2989         "xorq    %%rcx, %%rcx\n"
2990         "addq    %%rdx, 48(%%rdi)\n"
2991         "adcq    $0, %%rcx\n"
2992         "movq    %%rcx, %[carry]\n"
2993     : [carry]"=g"(carry), [z] "+m" (z)
2994     : [mult] "r" (c), [x] "m" (x)
2995     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
2996     return carry;
2997 }
2998 
2999 /* x has 6 words, z has 8.
3000  * Put (z+x*c) in z. Carry bit is lost. */
3001 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
3002 static inline
mpfq_fixmp_6_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)3003 void mpfq_fixmp_6_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
3004 {
3005     __asm__ __volatile__(
3006         "movq    %[z], %%rdi\n"
3007         "movq    %[x], %%rsi\n"
3008         "movq    0(%%rsi), %%rax\n"
3009         "mulq    %[mult]\n"
3010         "addq    %%rax, 0(%%rdi)\n"
3011         "movq    8(%%rsi), %%rax\n"
3012         "adcq    $0, %%rdx\n"
3013         "movq    %%rdx, %%rcx\n"
3014         "mulq    %[mult]\n"
3015         "addq    %%rax, %%rcx\n"
3016         "adcq    $0, %%rdx\n"
3017         "movq    16(%%rsi), %%rax\n"
3018         "addq    %%rcx, 8(%%rdi)\n"
3019         "adcq    $0, %%rdx\n"
3020         "movq    %%rdx, %%rcx\n"
3021         "mulq    %[mult]\n"
3022         "addq    %%rax, %%rcx\n"
3023         "adcq    $0, %%rdx\n"
3024         "movq    24(%%rsi), %%rax\n"
3025         "addq    %%rcx, 16(%%rdi)\n"
3026         "adcq    $0, %%rdx\n"
3027         "movq    %%rdx, %%rcx\n"
3028         "mulq    %[mult]\n"
3029         "addq    %%rax, %%rcx\n"
3030         "adcq    $0, %%rdx\n"
3031         "movq    32(%%rsi), %%rax\n"
3032         "addq    %%rcx, 24(%%rdi)\n"
3033         "adcq    $0, %%rdx\n"
3034         "movq    %%rdx, %%rcx\n"
3035         "mulq    %[mult]\n"
3036         "addq    %%rax, %%rcx\n"
3037         "adcq    $0, %%rdx\n"
3038         "movq    40(%%rsi), %%rax\n"
3039         "addq    %%rcx, 32(%%rdi)\n"
3040         "adcq    $0, %%rdx\n"
3041         "movq    %%rdx, %%rcx\n"
3042         "mulq    %[mult]\n"
3043         "addq    %%rax, %%rcx\n"
3044         "adcq    $0, %%rdx\n"
3045         "addq    %%rcx, 40(%%rdi)\n"
3046         "adcq    $0, %%rdx\n"
3047         "addq    %%rdx, 48(%%rdi)\n"
3048     : [z] "+m" (z)
3049     : [mult] "r" (c), [x] "m" (x)
3050     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
3051 }
3052 
3053 /* x has 6 words, z has 7.
3054  * Put (z+x*c) in z. Return carry word. */
3055 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
3056 static inline
mpfq_fixmp_6_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)3057 mp_limb_t mpfq_fixmp_6_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
3058 {
3059     mp_limb_t carry;
3060     __asm__ __volatile__(
3061         "movq    %[z], %%rdi\n"
3062         "movq    %[x], %%rsi\n"
3063         "movq    0(%%rsi), %%rax\n"
3064         "mulq    %[mult]\n"
3065         "addq    %%rax, 0(%%rdi)\n"
3066         "movq    8(%%rsi), %%rax\n"
3067         "adcq    $0, %%rdx\n"
3068         "movq    %%rdx, %%rcx\n"
3069         "mulq    %[mult]\n"
3070         "addq    %%rax, %%rcx\n"
3071         "adcq    $0, %%rdx\n"
3072         "movq    16(%%rsi), %%rax\n"
3073         "addq    %%rcx, 8(%%rdi)\n"
3074         "adcq    $0, %%rdx\n"
3075         "movq    %%rdx, %%rcx\n"
3076         "mulq    %[mult]\n"
3077         "addq    %%rax, %%rcx\n"
3078         "adcq    $0, %%rdx\n"
3079         "movq    24(%%rsi), %%rax\n"
3080         "addq    %%rcx, 16(%%rdi)\n"
3081         "adcq    $0, %%rdx\n"
3082         "movq    %%rdx, %%rcx\n"
3083         "mulq    %[mult]\n"
3084         "addq    %%rax, %%rcx\n"
3085         "adcq    $0, %%rdx\n"
3086         "movq    32(%%rsi), %%rax\n"
3087         "addq    %%rcx, 24(%%rdi)\n"
3088         "adcq    $0, %%rdx\n"
3089         "movq    %%rdx, %%rcx\n"
3090         "mulq    %[mult]\n"
3091         "addq    %%rax, %%rcx\n"
3092         "adcq    $0, %%rdx\n"
3093         "movq    40(%%rsi), %%rax\n"
3094         "addq    %%rcx, 32(%%rdi)\n"
3095         "adcq    $0, %%rdx\n"
3096         "movq    %%rdx, %%rcx\n"
3097         "mulq    %[mult]\n"
3098         "addq    %%rax, %%rcx\n"
3099         "adcq    $0, %%rdx\n"
3100         "addq    %%rcx, 40(%%rdi)\n"
3101         "adcq    $0, %%rdx\n"
3102         "movq    %%rdx, %[carry]\n"
3103     : [carry]"=g"(carry), [z] "+m" (z)
3104     : [mult] "r" (c), [x] "m" (x)
3105     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
3106     return carry;
3107 }
3108 
3109 /* x and y have 6 words, z has 14. Put x*y in z. */
3110 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
3111 static inline
mpfq_fixmp_6_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)3112 void mpfq_fixmp_6_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
3113 {
3114     __asm__ __volatile__(
3115         "### x*y[0]\n"
3116         "movq    %2, %%r8\n"
3117         "movq    %0, %%rdi\n"
3118         "movq    0(%%r8), %%r9\n"
3119         "movq    %1, %%rsi\n"
3120         "movq    0(%%rsi), %%rax\n"
3121         "mulq    %%r9\n"
3122         "movq    %%rax, 0(%%rdi)\n"
3123         "movq    8(%%rsi), %%rax\n"
3124         "movq    %%rdx, %%rcx\n"
3125         "mulq    %%r9\n"
3126         "addq    %%rax, %%rcx\n"
3127         "adcq    $0, %%rdx\n"
3128         "movq    16(%%rsi), %%rax\n"
3129         "movq    %%rcx, 8(%%rdi)\n"
3130         "movq    %%rdx, %%rcx\n"
3131         "mulq    %%r9\n"
3132         "addq    %%rax, %%rcx\n"
3133         "adcq    $0, %%rdx\n"
3134         "movq    24(%%rsi), %%rax\n"
3135         "movq    %%rcx, 16(%%rdi)\n"
3136         "movq    %%rdx, %%rcx\n"
3137         "mulq    %%r9\n"
3138         "addq    %%rax, %%rcx\n"
3139         "adcq    $0, %%rdx\n"
3140         "movq    32(%%rsi), %%rax\n"
3141         "movq    %%rcx, 24(%%rdi)\n"
3142         "movq    %%rdx, %%rcx\n"
3143         "mulq    %%r9\n"
3144         "addq    %%rax, %%rcx\n"
3145         "adcq    $0, %%rdx\n"
3146         "movq    40(%%rsi), %%rax\n"
3147         "movq    %%rcx, 32(%%rdi)\n"
3148         "movq    %%rdx, %%rcx\n"
3149         "mulq    %%r9\n"
3150         "addq    %%rax, %%rcx\n"
3151         "adcq    $0, %%rdx\n"
3152         "movq    %%rcx, 40(%%rdi)\n"
3153         "movq    %%rdx, 48(%%rdi)\n"
3154         "movq    $0, 56(%%rdi)\n"
3155         "movq    $0, 64(%%rdi)\n"
3156         "movq    $0, 72(%%rdi)\n"
3157         "movq    $0, 80(%%rdi)\n"
3158         "movq    $0, 88(%%rdi)\n"
3159         "### x*y[1]\n"
3160         "movq    8(%%r8), %%r9\n"
3161         "movq    0(%%rsi), %%rax\n"
3162         "mulq    %%r9\n"
3163         "addq    %%rax, 8(%%rdi)\n"
3164         "movq    8(%%rsi), %%rax\n"
3165         "adcq    $0, %%rdx\n"
3166         "movq    %%rdx, %%rcx\n"
3167         "mulq    %%r9\n"
3168         "addq    %%rax, %%rcx\n"
3169         "adcq    $0, %%rdx\n"
3170         "movq    16(%%rsi), %%rax\n"
3171         "addq    %%rcx, 16(%%rdi)\n"
3172         "adcq    $0, %%rdx\n"
3173         "movq    %%rdx, %%rcx\n"
3174         "mulq    %%r9\n"
3175         "addq    %%rax, %%rcx\n"
3176         "adcq    $0, %%rdx\n"
3177         "movq    24(%%rsi), %%rax\n"
3178         "addq    %%rcx, 24(%%rdi)\n"
3179         "adcq    $0, %%rdx\n"
3180         "movq    %%rdx, %%rcx\n"
3181         "mulq    %%r9\n"
3182         "addq    %%rax, %%rcx\n"
3183         "adcq    $0, %%rdx\n"
3184         "movq    32(%%rsi), %%rax\n"
3185         "addq    %%rcx, 32(%%rdi)\n"
3186         "adcq    $0, %%rdx\n"
3187         "movq    %%rdx, %%rcx\n"
3188         "mulq    %%r9\n"
3189         "addq    %%rax, %%rcx\n"
3190         "adcq    $0, %%rdx\n"
3191         "movq    40(%%rsi), %%rax\n"
3192         "addq    %%rcx, 40(%%rdi)\n"
3193         "adcq    $0, %%rdx\n"
3194         "movq    %%rdx, %%rcx\n"
3195         "mulq    %%r9\n"
3196         "addq    %%rax, %%rcx\n"
3197         "adcq    $0, %%rdx\n"
3198         "addq    %%rcx, 48(%%rdi)\n"
3199         "adcq    $0, %%rdx\n"
3200         "movq    %%rdx, 56(%%rdi)\n"
3201         "### x*y[2]\n"
3202         "movq    16(%%r8), %%r9\n"
3203         "movq    0(%%rsi), %%rax\n"
3204         "mulq    %%r9\n"
3205         "addq    %%rax, 16(%%rdi)\n"
3206         "movq    8(%%rsi), %%rax\n"
3207         "adcq    $0, %%rdx\n"
3208         "movq    %%rdx, %%rcx\n"
3209         "mulq    %%r9\n"
3210         "addq    %%rax, %%rcx\n"
3211         "adcq    $0, %%rdx\n"
3212         "movq    16(%%rsi), %%rax\n"
3213         "addq    %%rcx, 24(%%rdi)\n"
3214         "adcq    $0, %%rdx\n"
3215         "movq    %%rdx, %%rcx\n"
3216         "mulq    %%r9\n"
3217         "addq    %%rax, %%rcx\n"
3218         "adcq    $0, %%rdx\n"
3219         "movq    24(%%rsi), %%rax\n"
3220         "addq    %%rcx, 32(%%rdi)\n"
3221         "adcq    $0, %%rdx\n"
3222         "movq    %%rdx, %%rcx\n"
3223         "mulq    %%r9\n"
3224         "addq    %%rax, %%rcx\n"
3225         "adcq    $0, %%rdx\n"
3226         "movq    32(%%rsi), %%rax\n"
3227         "addq    %%rcx, 40(%%rdi)\n"
3228         "adcq    $0, %%rdx\n"
3229         "movq    %%rdx, %%rcx\n"
3230         "mulq    %%r9\n"
3231         "addq    %%rax, %%rcx\n"
3232         "adcq    $0, %%rdx\n"
3233         "movq    40(%%rsi), %%rax\n"
3234         "addq    %%rcx, 48(%%rdi)\n"
3235         "adcq    $0, %%rdx\n"
3236         "movq    %%rdx, %%rcx\n"
3237         "mulq    %%r9\n"
3238         "addq    %%rax, %%rcx\n"
3239         "adcq    $0, %%rdx\n"
3240         "addq    %%rcx, 56(%%rdi)\n"
3241         "adcq    $0, %%rdx\n"
3242         "movq    %%rdx, 64(%%rdi)\n"
3243         "### x*y[3]\n"
3244         "movq    24(%%r8), %%r9\n"
3245         "movq    0(%%rsi), %%rax\n"
3246         "mulq    %%r9\n"
3247         "addq    %%rax, 24(%%rdi)\n"
3248         "movq    8(%%rsi), %%rax\n"
3249         "adcq    $0, %%rdx\n"
3250         "movq    %%rdx, %%rcx\n"
3251         "mulq    %%r9\n"
3252         "addq    %%rax, %%rcx\n"
3253         "adcq    $0, %%rdx\n"
3254         "movq    16(%%rsi), %%rax\n"
3255         "addq    %%rcx, 32(%%rdi)\n"
3256         "adcq    $0, %%rdx\n"
3257         "movq    %%rdx, %%rcx\n"
3258         "mulq    %%r9\n"
3259         "addq    %%rax, %%rcx\n"
3260         "adcq    $0, %%rdx\n"
3261         "movq    24(%%rsi), %%rax\n"
3262         "addq    %%rcx, 40(%%rdi)\n"
3263         "adcq    $0, %%rdx\n"
3264         "movq    %%rdx, %%rcx\n"
3265         "mulq    %%r9\n"
3266         "addq    %%rax, %%rcx\n"
3267         "adcq    $0, %%rdx\n"
3268         "movq    32(%%rsi), %%rax\n"
3269         "addq    %%rcx, 48(%%rdi)\n"
3270         "adcq    $0, %%rdx\n"
3271         "movq    %%rdx, %%rcx\n"
3272         "mulq    %%r9\n"
3273         "addq    %%rax, %%rcx\n"
3274         "adcq    $0, %%rdx\n"
3275         "movq    40(%%rsi), %%rax\n"
3276         "addq    %%rcx, 56(%%rdi)\n"
3277         "adcq    $0, %%rdx\n"
3278         "movq    %%rdx, %%rcx\n"
3279         "mulq    %%r9\n"
3280         "addq    %%rax, %%rcx\n"
3281         "adcq    $0, %%rdx\n"
3282         "addq    %%rcx, 64(%%rdi)\n"
3283         "adcq    $0, %%rdx\n"
3284         "movq    %%rdx, 72(%%rdi)\n"
3285         "### x*y[4]\n"
3286         "movq    32(%%r8), %%r9\n"
3287         "movq    0(%%rsi), %%rax\n"
3288         "mulq    %%r9\n"
3289         "addq    %%rax, 32(%%rdi)\n"
3290         "movq    8(%%rsi), %%rax\n"
3291         "adcq    $0, %%rdx\n"
3292         "movq    %%rdx, %%rcx\n"
3293         "mulq    %%r9\n"
3294         "addq    %%rax, %%rcx\n"
3295         "adcq    $0, %%rdx\n"
3296         "movq    16(%%rsi), %%rax\n"
3297         "addq    %%rcx, 40(%%rdi)\n"
3298         "adcq    $0, %%rdx\n"
3299         "movq    %%rdx, %%rcx\n"
3300         "mulq    %%r9\n"
3301         "addq    %%rax, %%rcx\n"
3302         "adcq    $0, %%rdx\n"
3303         "movq    24(%%rsi), %%rax\n"
3304         "addq    %%rcx, 48(%%rdi)\n"
3305         "adcq    $0, %%rdx\n"
3306         "movq    %%rdx, %%rcx\n"
3307         "mulq    %%r9\n"
3308         "addq    %%rax, %%rcx\n"
3309         "adcq    $0, %%rdx\n"
3310         "movq    32(%%rsi), %%rax\n"
3311         "addq    %%rcx, 56(%%rdi)\n"
3312         "adcq    $0, %%rdx\n"
3313         "movq    %%rdx, %%rcx\n"
3314         "mulq    %%r9\n"
3315         "addq    %%rax, %%rcx\n"
3316         "adcq    $0, %%rdx\n"
3317         "movq    40(%%rsi), %%rax\n"
3318         "addq    %%rcx, 64(%%rdi)\n"
3319         "adcq    $0, %%rdx\n"
3320         "movq    %%rdx, %%rcx\n"
3321         "mulq    %%r9\n"
3322         "addq    %%rax, %%rcx\n"
3323         "adcq    $0, %%rdx\n"
3324         "addq    %%rcx, 72(%%rdi)\n"
3325         "adcq    $0, %%rdx\n"
3326         "movq    %%rdx, 80(%%rdi)\n"
3327         "### x*y[5]\n"
3328         "movq    40(%%r8), %%r9\n"
3329         "movq    0(%%rsi), %%rax\n"
3330         "mulq    %%r9\n"
3331         "addq    %%rax, 40(%%rdi)\n"
3332         "movq    8(%%rsi), %%rax\n"
3333         "adcq    $0, %%rdx\n"
3334         "movq    %%rdx, %%rcx\n"
3335         "mulq    %%r9\n"
3336         "addq    %%rax, %%rcx\n"
3337         "adcq    $0, %%rdx\n"
3338         "movq    16(%%rsi), %%rax\n"
3339         "addq    %%rcx, 48(%%rdi)\n"
3340         "adcq    $0, %%rdx\n"
3341         "movq    %%rdx, %%rcx\n"
3342         "mulq    %%r9\n"
3343         "addq    %%rax, %%rcx\n"
3344         "adcq    $0, %%rdx\n"
3345         "movq    24(%%rsi), %%rax\n"
3346         "addq    %%rcx, 56(%%rdi)\n"
3347         "adcq    $0, %%rdx\n"
3348         "movq    %%rdx, %%rcx\n"
3349         "mulq    %%r9\n"
3350         "addq    %%rax, %%rcx\n"
3351         "adcq    $0, %%rdx\n"
3352         "movq    32(%%rsi), %%rax\n"
3353         "addq    %%rcx, 64(%%rdi)\n"
3354         "adcq    $0, %%rdx\n"
3355         "movq    %%rdx, %%rcx\n"
3356         "mulq    %%r9\n"
3357         "addq    %%rax, %%rcx\n"
3358         "adcq    $0, %%rdx\n"
3359         "movq    40(%%rsi), %%rax\n"
3360         "addq    %%rcx, 72(%%rdi)\n"
3361         "adcq    $0, %%rdx\n"
3362         "movq    %%rdx, %%rcx\n"
3363         "mulq    %%r9\n"
3364         "addq    %%rax, %%rcx\n"
3365         "adcq    $0, %%rdx\n"
3366         "addq    %%rcx, 80(%%rdi)\n"
3367         "adcq    $0, %%rdx\n"
3368         "movq    %%rdx, 88(%%rdi)\n"
3369       : "+m" (z)
3370       : "m" (x), "m" (y)
3371       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
3372 }
3373 
3374 /* x has 6 words, z has 14. Put x*y in z. */
3375 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
3376 static inline
mpfq_fixmp_6_sqr(mp_limb_t * z,const mp_limb_t * x)3377 void mpfq_fixmp_6_sqr(mp_limb_t * z, const mp_limb_t * x)
3378 {
3379     mpfq_fixmp_6_mul(z, x, x);
3380 }
3381 
3382 /* x has 6 words, z has 8. Put x*y in z. */
3383 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
3384 static inline
mpfq_fixmp_6_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)3385 void mpfq_fixmp_6_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
3386 {
3387     __asm__ __volatile__(
3388         "movq    %[z], %%rdi\n"
3389         "movq    %[x], %%rsi\n"
3390         "movq    0(%%rsi), %%rax\n"
3391         "mulq    %[mult]\n"
3392         "movq    %%rax, 0(%%rdi)\n"
3393         "movq    8(%%rsi), %%rax\n"
3394         "movq    %%rdx, %%rcx\n"
3395         "mulq    %[mult]\n"
3396         "addq    %%rax, %%rcx\n"
3397         "adcq    $0, %%rdx\n"
3398         "movq    16(%%rsi), %%rax\n"
3399         "movq    %%rcx, 8(%%rdi)\n"
3400         "movq    %%rdx, %%rcx\n"
3401         "mulq    %[mult]\n"
3402         "addq    %%rax, %%rcx\n"
3403         "adcq    $0, %%rdx\n"
3404         "movq    24(%%rsi), %%rax\n"
3405         "movq    %%rcx, 16(%%rdi)\n"
3406         "movq    %%rdx, %%rcx\n"
3407         "mulq    %[mult]\n"
3408         "addq    %%rax, %%rcx\n"
3409         "adcq    $0, %%rdx\n"
3410         "movq    32(%%rsi), %%rax\n"
3411         "movq    %%rcx, 24(%%rdi)\n"
3412         "movq    %%rdx, %%rcx\n"
3413         "mulq    %[mult]\n"
3414         "addq    %%rax, %%rcx\n"
3415         "adcq    $0, %%rdx\n"
3416         "movq    40(%%rsi), %%rax\n"
3417         "movq    %%rcx, 32(%%rdi)\n"
3418         "movq    %%rdx, %%rcx\n"
3419         "mulq    %[mult]\n"
3420         "addq    %%rax, %%rcx\n"
3421         "adcq    $0, %%rdx\n"
3422         "movq    %%rcx, 40(%%rdi)\n"
3423         "movq    %%rdx, 48(%%rdi)\n"
3424     :
3425     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
3426     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
3427 }
3428 
3429 /* x, y, and z have 7 words. Result in z. Return carry bit */
3430 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
3431 static inline
mpfq_fixmp_7_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)3432 mp_limb_t mpfq_fixmp_7_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
3433 {
3434     mp_limb_t carry;
3435     __asm__ __volatile__(
3436         "movq    %[z], %%rdi\n"
3437         "movq    %[x], %%rsi\n"
3438         "movq    %[y], %%rdx\n"
3439         "movq    0(%%rsi), %%rax\n"
3440         "addq    0(%%rdx), %%rax\n"
3441         "movq    %%rax, 0(%%rdi)\n"
3442         "movq    8(%%rsi), %%rax\n"
3443         "adcq    8(%%rdx), %%rax\n"
3444         "movq    %%rax, 8(%%rdi)\n"
3445         "movq    16(%%rsi), %%rax\n"
3446         "adcq    16(%%rdx), %%rax\n"
3447         "movq    %%rax, 16(%%rdi)\n"
3448         "movq    24(%%rsi), %%rax\n"
3449         "adcq    24(%%rdx), %%rax\n"
3450         "movq    %%rax, 24(%%rdi)\n"
3451         "movq    32(%%rsi), %%rax\n"
3452         "adcq    32(%%rdx), %%rax\n"
3453         "movq    %%rax, 32(%%rdi)\n"
3454         "movq    40(%%rsi), %%rax\n"
3455         "adcq    40(%%rdx), %%rax\n"
3456         "movq    %%rax, 40(%%rdi)\n"
3457         "movq    48(%%rsi), %%rax\n"
3458         "adcq    48(%%rdx), %%rax\n"
3459         "movq    %%rax, 48(%%rdi)\n"
3460         "movq $0, %%rax\n"
3461         "adcq $0, %%rax\n"
3462     : "=&a"(carry)
3463     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
3464     : "%rdx", "%rsi", "%rdi", "memory");
3465     return carry;
3466 }
3467 
3468 /* x, y, and z have 7 words. Result in z. Return borrow bit */
3469 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
3470 static inline
mpfq_fixmp_7_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)3471 mp_limb_t mpfq_fixmp_7_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
3472 {
3473     mp_limb_t carry;
3474     __asm__ __volatile__(
3475         "movq    %[z], %%rdi\n"
3476         "movq    %[x], %%rsi\n"
3477         "movq    %[y], %%rdx\n"
3478         "movq    0(%%rsi), %%rax\n"
3479         "subq    0(%%rdx), %%rax\n"
3480         "movq    %%rax, 0(%%rdi)\n"
3481         "movq    8(%%rsi), %%rax\n"
3482         "sbbq    8(%%rdx), %%rax\n"
3483         "movq    %%rax, 8(%%rdi)\n"
3484         "movq    16(%%rsi), %%rax\n"
3485         "sbbq    16(%%rdx), %%rax\n"
3486         "movq    %%rax, 16(%%rdi)\n"
3487         "movq    24(%%rsi), %%rax\n"
3488         "sbbq    24(%%rdx), %%rax\n"
3489         "movq    %%rax, 24(%%rdi)\n"
3490         "movq    32(%%rsi), %%rax\n"
3491         "sbbq    32(%%rdx), %%rax\n"
3492         "movq    %%rax, 32(%%rdi)\n"
3493         "movq    40(%%rsi), %%rax\n"
3494         "sbbq    40(%%rdx), %%rax\n"
3495         "movq    %%rax, 40(%%rdi)\n"
3496         "movq    48(%%rsi), %%rax\n"
3497         "sbbq    48(%%rdx), %%rax\n"
3498         "movq    %%rax, 48(%%rdi)\n"
3499         "movq $0, %%rax\n"
3500         "adcq $0, %%rax\n"
3501     : "=&a"(carry)
3502     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
3503     : "%rdx", "%rsi", "%rdi", "memory");
3504     return carry;
3505 }
3506 
3507 /* x, y, and z have 7 words. Result in z. Carry bit is lost. */
3508 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
3509 static inline
mpfq_fixmp_7_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)3510 void mpfq_fixmp_7_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
3511 {
3512     __asm__ __volatile__(
3513         "movq    %[z], %%rdi\n"
3514         "movq    %[x], %%rsi\n"
3515         "movq    %[y], %%rdx\n"
3516         "movq    0(%%rsi), %%rax\n"
3517         "addq    0(%%rdx), %%rax\n"
3518         "movq    %%rax, 0(%%rdi)\n"
3519         "movq    8(%%rsi), %%rax\n"
3520         "adcq    8(%%rdx), %%rax\n"
3521         "movq    %%rax, 8(%%rdi)\n"
3522         "movq    16(%%rsi), %%rax\n"
3523         "adcq    16(%%rdx), %%rax\n"
3524         "movq    %%rax, 16(%%rdi)\n"
3525         "movq    24(%%rsi), %%rax\n"
3526         "adcq    24(%%rdx), %%rax\n"
3527         "movq    %%rax, 24(%%rdi)\n"
3528         "movq    32(%%rsi), %%rax\n"
3529         "adcq    32(%%rdx), %%rax\n"
3530         "movq    %%rax, 32(%%rdi)\n"
3531         "movq    40(%%rsi), %%rax\n"
3532         "adcq    40(%%rdx), %%rax\n"
3533         "movq    %%rax, 40(%%rdi)\n"
3534         "movq    48(%%rsi), %%rax\n"
3535         "adcq    48(%%rdx), %%rax\n"
3536         "movq    %%rax, 48(%%rdi)\n"
3537     :
3538     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
3539     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
3540 }
3541 
3542 /* x, y, and z have 7 words. Result in z. Borrow bit is lost. */
3543 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
3544 static inline
mpfq_fixmp_7_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)3545 void mpfq_fixmp_7_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
3546 {
3547     __asm__ __volatile__(
3548         "movq    %[z], %%rdi\n"
3549         "movq    %[x], %%rsi\n"
3550         "movq    %[y], %%rdx\n"
3551         "movq    0(%%rsi), %%rax\n"
3552         "subq    0(%%rdx), %%rax\n"
3553         "movq    %%rax, 0(%%rdi)\n"
3554         "movq    8(%%rsi), %%rax\n"
3555         "sbbq    8(%%rdx), %%rax\n"
3556         "movq    %%rax, 8(%%rdi)\n"
3557         "movq    16(%%rsi), %%rax\n"
3558         "sbbq    16(%%rdx), %%rax\n"
3559         "movq    %%rax, 16(%%rdi)\n"
3560         "movq    24(%%rsi), %%rax\n"
3561         "sbbq    24(%%rdx), %%rax\n"
3562         "movq    %%rax, 24(%%rdi)\n"
3563         "movq    32(%%rsi), %%rax\n"
3564         "sbbq    32(%%rdx), %%rax\n"
3565         "movq    %%rax, 32(%%rdi)\n"
3566         "movq    40(%%rsi), %%rax\n"
3567         "sbbq    40(%%rdx), %%rax\n"
3568         "movq    %%rax, 40(%%rdi)\n"
3569         "movq    48(%%rsi), %%rax\n"
3570         "sbbq    48(%%rdx), %%rax\n"
3571         "movq    %%rax, 48(%%rdi)\n"
3572     :
3573     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
3574     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
3575 }
3576 
3577 /* x has 7 words, z has 9.
3578  * Put (z+x*c) in z. Return carry bit. */
3579 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
3580 static inline
mpfq_fixmp_7_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)3581 mp_limb_t mpfq_fixmp_7_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
3582 {
3583     mp_limb_t carry;
3584     __asm__ __volatile__(
3585         "movq    %[z], %%rdi\n"
3586         "movq    %[x], %%rsi\n"
3587         "movq    0(%%rsi), %%rax\n"
3588         "mulq    %[mult]\n"
3589         "addq    %%rax, 0(%%rdi)\n"
3590         "movq    8(%%rsi), %%rax\n"
3591         "adcq    $0, %%rdx\n"
3592         "movq    %%rdx, %%rcx\n"
3593         "mulq    %[mult]\n"
3594         "addq    %%rax, %%rcx\n"
3595         "adcq    $0, %%rdx\n"
3596         "movq    16(%%rsi), %%rax\n"
3597         "addq    %%rcx, 8(%%rdi)\n"
3598         "adcq    $0, %%rdx\n"
3599         "movq    %%rdx, %%rcx\n"
3600         "mulq    %[mult]\n"
3601         "addq    %%rax, %%rcx\n"
3602         "adcq    $0, %%rdx\n"
3603         "movq    24(%%rsi), %%rax\n"
3604         "addq    %%rcx, 16(%%rdi)\n"
3605         "adcq    $0, %%rdx\n"
3606         "movq    %%rdx, %%rcx\n"
3607         "mulq    %[mult]\n"
3608         "addq    %%rax, %%rcx\n"
3609         "adcq    $0, %%rdx\n"
3610         "movq    32(%%rsi), %%rax\n"
3611         "addq    %%rcx, 24(%%rdi)\n"
3612         "adcq    $0, %%rdx\n"
3613         "movq    %%rdx, %%rcx\n"
3614         "mulq    %[mult]\n"
3615         "addq    %%rax, %%rcx\n"
3616         "adcq    $0, %%rdx\n"
3617         "movq    40(%%rsi), %%rax\n"
3618         "addq    %%rcx, 32(%%rdi)\n"
3619         "adcq    $0, %%rdx\n"
3620         "movq    %%rdx, %%rcx\n"
3621         "mulq    %[mult]\n"
3622         "addq    %%rax, %%rcx\n"
3623         "adcq    $0, %%rdx\n"
3624         "movq    48(%%rsi), %%rax\n"
3625         "addq    %%rcx, 40(%%rdi)\n"
3626         "adcq    $0, %%rdx\n"
3627         "movq    %%rdx, %%rcx\n"
3628         "mulq    %[mult]\n"
3629         "addq    %%rax, %%rcx\n"
3630         "adcq    $0, %%rdx\n"
3631         "addq    %%rcx, 48(%%rdi)\n"
3632         "adcq    $0, %%rdx\n"
3633         "xorq    %%rcx, %%rcx\n"
3634         "addq    %%rdx, 56(%%rdi)\n"
3635         "adcq    $0, %%rcx\n"
3636         "movq    %%rcx, %[carry]\n"
3637     : [carry]"=g"(carry), [z] "+m" (z)
3638     : [mult] "r" (c), [x] "m" (x)
3639     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
3640     return carry;
3641 }
3642 
3643 /* x has 7 words, z has 9.
3644  * Put (z+x*c) in z. Carry bit is lost. */
3645 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
3646 static inline
mpfq_fixmp_7_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)3647 void mpfq_fixmp_7_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
3648 {
3649     __asm__ __volatile__(
3650         "movq    %[z], %%rdi\n"
3651         "movq    %[x], %%rsi\n"
3652         "movq    0(%%rsi), %%rax\n"
3653         "mulq    %[mult]\n"
3654         "addq    %%rax, 0(%%rdi)\n"
3655         "movq    8(%%rsi), %%rax\n"
3656         "adcq    $0, %%rdx\n"
3657         "movq    %%rdx, %%rcx\n"
3658         "mulq    %[mult]\n"
3659         "addq    %%rax, %%rcx\n"
3660         "adcq    $0, %%rdx\n"
3661         "movq    16(%%rsi), %%rax\n"
3662         "addq    %%rcx, 8(%%rdi)\n"
3663         "adcq    $0, %%rdx\n"
3664         "movq    %%rdx, %%rcx\n"
3665         "mulq    %[mult]\n"
3666         "addq    %%rax, %%rcx\n"
3667         "adcq    $0, %%rdx\n"
3668         "movq    24(%%rsi), %%rax\n"
3669         "addq    %%rcx, 16(%%rdi)\n"
3670         "adcq    $0, %%rdx\n"
3671         "movq    %%rdx, %%rcx\n"
3672         "mulq    %[mult]\n"
3673         "addq    %%rax, %%rcx\n"
3674         "adcq    $0, %%rdx\n"
3675         "movq    32(%%rsi), %%rax\n"
3676         "addq    %%rcx, 24(%%rdi)\n"
3677         "adcq    $0, %%rdx\n"
3678         "movq    %%rdx, %%rcx\n"
3679         "mulq    %[mult]\n"
3680         "addq    %%rax, %%rcx\n"
3681         "adcq    $0, %%rdx\n"
3682         "movq    40(%%rsi), %%rax\n"
3683         "addq    %%rcx, 32(%%rdi)\n"
3684         "adcq    $0, %%rdx\n"
3685         "movq    %%rdx, %%rcx\n"
3686         "mulq    %[mult]\n"
3687         "addq    %%rax, %%rcx\n"
3688         "adcq    $0, %%rdx\n"
3689         "movq    48(%%rsi), %%rax\n"
3690         "addq    %%rcx, 40(%%rdi)\n"
3691         "adcq    $0, %%rdx\n"
3692         "movq    %%rdx, %%rcx\n"
3693         "mulq    %[mult]\n"
3694         "addq    %%rax, %%rcx\n"
3695         "adcq    $0, %%rdx\n"
3696         "addq    %%rcx, 48(%%rdi)\n"
3697         "adcq    $0, %%rdx\n"
3698         "addq    %%rdx, 56(%%rdi)\n"
3699     : [z] "+m" (z)
3700     : [mult] "r" (c), [x] "m" (x)
3701     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
3702 }
3703 
3704 /* x has 7 words, z has 8.
3705  * Put (z+x*c) in z. Return carry word. */
3706 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
3707 static inline
mpfq_fixmp_7_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)3708 mp_limb_t mpfq_fixmp_7_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
3709 {
3710     mp_limb_t carry;
3711     __asm__ __volatile__(
3712         "movq    %[z], %%rdi\n"
3713         "movq    %[x], %%rsi\n"
3714         "movq    0(%%rsi), %%rax\n"
3715         "mulq    %[mult]\n"
3716         "addq    %%rax, 0(%%rdi)\n"
3717         "movq    8(%%rsi), %%rax\n"
3718         "adcq    $0, %%rdx\n"
3719         "movq    %%rdx, %%rcx\n"
3720         "mulq    %[mult]\n"
3721         "addq    %%rax, %%rcx\n"
3722         "adcq    $0, %%rdx\n"
3723         "movq    16(%%rsi), %%rax\n"
3724         "addq    %%rcx, 8(%%rdi)\n"
3725         "adcq    $0, %%rdx\n"
3726         "movq    %%rdx, %%rcx\n"
3727         "mulq    %[mult]\n"
3728         "addq    %%rax, %%rcx\n"
3729         "adcq    $0, %%rdx\n"
3730         "movq    24(%%rsi), %%rax\n"
3731         "addq    %%rcx, 16(%%rdi)\n"
3732         "adcq    $0, %%rdx\n"
3733         "movq    %%rdx, %%rcx\n"
3734         "mulq    %[mult]\n"
3735         "addq    %%rax, %%rcx\n"
3736         "adcq    $0, %%rdx\n"
3737         "movq    32(%%rsi), %%rax\n"
3738         "addq    %%rcx, 24(%%rdi)\n"
3739         "adcq    $0, %%rdx\n"
3740         "movq    %%rdx, %%rcx\n"
3741         "mulq    %[mult]\n"
3742         "addq    %%rax, %%rcx\n"
3743         "adcq    $0, %%rdx\n"
3744         "movq    40(%%rsi), %%rax\n"
3745         "addq    %%rcx, 32(%%rdi)\n"
3746         "adcq    $0, %%rdx\n"
3747         "movq    %%rdx, %%rcx\n"
3748         "mulq    %[mult]\n"
3749         "addq    %%rax, %%rcx\n"
3750         "adcq    $0, %%rdx\n"
3751         "movq    48(%%rsi), %%rax\n"
3752         "addq    %%rcx, 40(%%rdi)\n"
3753         "adcq    $0, %%rdx\n"
3754         "movq    %%rdx, %%rcx\n"
3755         "mulq    %[mult]\n"
3756         "addq    %%rax, %%rcx\n"
3757         "adcq    $0, %%rdx\n"
3758         "addq    %%rcx, 48(%%rdi)\n"
3759         "adcq    $0, %%rdx\n"
3760         "movq    %%rdx, %[carry]\n"
3761     : [carry]"=g"(carry), [z] "+m" (z)
3762     : [mult] "r" (c), [x] "m" (x)
3763     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
3764     return carry;
3765 }
3766 
3767 /* x and y have 7 words, z has 16. Put x*y in z. */
3768 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
3769 static inline
mpfq_fixmp_7_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)3770 void mpfq_fixmp_7_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
3771 {
3772     __asm__ __volatile__(
3773         "### x*y[0]\n"
3774         "movq    %2, %%r8\n"
3775         "movq    %0, %%rdi\n"
3776         "movq    0(%%r8), %%r9\n"
3777         "movq    %1, %%rsi\n"
3778         "movq    0(%%rsi), %%rax\n"
3779         "mulq    %%r9\n"
3780         "movq    %%rax, 0(%%rdi)\n"
3781         "movq    8(%%rsi), %%rax\n"
3782         "movq    %%rdx, %%rcx\n"
3783         "mulq    %%r9\n"
3784         "addq    %%rax, %%rcx\n"
3785         "adcq    $0, %%rdx\n"
3786         "movq    16(%%rsi), %%rax\n"
3787         "movq    %%rcx, 8(%%rdi)\n"
3788         "movq    %%rdx, %%rcx\n"
3789         "mulq    %%r9\n"
3790         "addq    %%rax, %%rcx\n"
3791         "adcq    $0, %%rdx\n"
3792         "movq    24(%%rsi), %%rax\n"
3793         "movq    %%rcx, 16(%%rdi)\n"
3794         "movq    %%rdx, %%rcx\n"
3795         "mulq    %%r9\n"
3796         "addq    %%rax, %%rcx\n"
3797         "adcq    $0, %%rdx\n"
3798         "movq    32(%%rsi), %%rax\n"
3799         "movq    %%rcx, 24(%%rdi)\n"
3800         "movq    %%rdx, %%rcx\n"
3801         "mulq    %%r9\n"
3802         "addq    %%rax, %%rcx\n"
3803         "adcq    $0, %%rdx\n"
3804         "movq    40(%%rsi), %%rax\n"
3805         "movq    %%rcx, 32(%%rdi)\n"
3806         "movq    %%rdx, %%rcx\n"
3807         "mulq    %%r9\n"
3808         "addq    %%rax, %%rcx\n"
3809         "adcq    $0, %%rdx\n"
3810         "movq    48(%%rsi), %%rax\n"
3811         "movq    %%rcx, 40(%%rdi)\n"
3812         "movq    %%rdx, %%rcx\n"
3813         "mulq    %%r9\n"
3814         "addq    %%rax, %%rcx\n"
3815         "adcq    $0, %%rdx\n"
3816         "movq    %%rcx, 48(%%rdi)\n"
3817         "movq    %%rdx, 56(%%rdi)\n"
3818         "movq    $0, 64(%%rdi)\n"
3819         "movq    $0, 72(%%rdi)\n"
3820         "movq    $0, 80(%%rdi)\n"
3821         "movq    $0, 88(%%rdi)\n"
3822         "movq    $0, 96(%%rdi)\n"
3823         "movq    $0, 104(%%rdi)\n"
3824         "### x*y[1]\n"
3825         "movq    8(%%r8), %%r9\n"
3826         "movq    0(%%rsi), %%rax\n"
3827         "mulq    %%r9\n"
3828         "addq    %%rax, 8(%%rdi)\n"
3829         "movq    8(%%rsi), %%rax\n"
3830         "adcq    $0, %%rdx\n"
3831         "movq    %%rdx, %%rcx\n"
3832         "mulq    %%r9\n"
3833         "addq    %%rax, %%rcx\n"
3834         "adcq    $0, %%rdx\n"
3835         "movq    16(%%rsi), %%rax\n"
3836         "addq    %%rcx, 16(%%rdi)\n"
3837         "adcq    $0, %%rdx\n"
3838         "movq    %%rdx, %%rcx\n"
3839         "mulq    %%r9\n"
3840         "addq    %%rax, %%rcx\n"
3841         "adcq    $0, %%rdx\n"
3842         "movq    24(%%rsi), %%rax\n"
3843         "addq    %%rcx, 24(%%rdi)\n"
3844         "adcq    $0, %%rdx\n"
3845         "movq    %%rdx, %%rcx\n"
3846         "mulq    %%r9\n"
3847         "addq    %%rax, %%rcx\n"
3848         "adcq    $0, %%rdx\n"
3849         "movq    32(%%rsi), %%rax\n"
3850         "addq    %%rcx, 32(%%rdi)\n"
3851         "adcq    $0, %%rdx\n"
3852         "movq    %%rdx, %%rcx\n"
3853         "mulq    %%r9\n"
3854         "addq    %%rax, %%rcx\n"
3855         "adcq    $0, %%rdx\n"
3856         "movq    40(%%rsi), %%rax\n"
3857         "addq    %%rcx, 40(%%rdi)\n"
3858         "adcq    $0, %%rdx\n"
3859         "movq    %%rdx, %%rcx\n"
3860         "mulq    %%r9\n"
3861         "addq    %%rax, %%rcx\n"
3862         "adcq    $0, %%rdx\n"
3863         "movq    48(%%rsi), %%rax\n"
3864         "addq    %%rcx, 48(%%rdi)\n"
3865         "adcq    $0, %%rdx\n"
3866         "movq    %%rdx, %%rcx\n"
3867         "mulq    %%r9\n"
3868         "addq    %%rax, %%rcx\n"
3869         "adcq    $0, %%rdx\n"
3870         "addq    %%rcx, 56(%%rdi)\n"
3871         "adcq    $0, %%rdx\n"
3872         "movq    %%rdx, 64(%%rdi)\n"
3873         "### x*y[2]\n"
3874         "movq    16(%%r8), %%r9\n"
3875         "movq    0(%%rsi), %%rax\n"
3876         "mulq    %%r9\n"
3877         "addq    %%rax, 16(%%rdi)\n"
3878         "movq    8(%%rsi), %%rax\n"
3879         "adcq    $0, %%rdx\n"
3880         "movq    %%rdx, %%rcx\n"
3881         "mulq    %%r9\n"
3882         "addq    %%rax, %%rcx\n"
3883         "adcq    $0, %%rdx\n"
3884         "movq    16(%%rsi), %%rax\n"
3885         "addq    %%rcx, 24(%%rdi)\n"
3886         "adcq    $0, %%rdx\n"
3887         "movq    %%rdx, %%rcx\n"
3888         "mulq    %%r9\n"
3889         "addq    %%rax, %%rcx\n"
3890         "adcq    $0, %%rdx\n"
3891         "movq    24(%%rsi), %%rax\n"
3892         "addq    %%rcx, 32(%%rdi)\n"
3893         "adcq    $0, %%rdx\n"
3894         "movq    %%rdx, %%rcx\n"
3895         "mulq    %%r9\n"
3896         "addq    %%rax, %%rcx\n"
3897         "adcq    $0, %%rdx\n"
3898         "movq    32(%%rsi), %%rax\n"
3899         "addq    %%rcx, 40(%%rdi)\n"
3900         "adcq    $0, %%rdx\n"
3901         "movq    %%rdx, %%rcx\n"
3902         "mulq    %%r9\n"
3903         "addq    %%rax, %%rcx\n"
3904         "adcq    $0, %%rdx\n"
3905         "movq    40(%%rsi), %%rax\n"
3906         "addq    %%rcx, 48(%%rdi)\n"
3907         "adcq    $0, %%rdx\n"
3908         "movq    %%rdx, %%rcx\n"
3909         "mulq    %%r9\n"
3910         "addq    %%rax, %%rcx\n"
3911         "adcq    $0, %%rdx\n"
3912         "movq    48(%%rsi), %%rax\n"
3913         "addq    %%rcx, 56(%%rdi)\n"
3914         "adcq    $0, %%rdx\n"
3915         "movq    %%rdx, %%rcx\n"
3916         "mulq    %%r9\n"
3917         "addq    %%rax, %%rcx\n"
3918         "adcq    $0, %%rdx\n"
3919         "addq    %%rcx, 64(%%rdi)\n"
3920         "adcq    $0, %%rdx\n"
3921         "movq    %%rdx, 72(%%rdi)\n"
3922         "### x*y[3]\n"
3923         "movq    24(%%r8), %%r9\n"
3924         "movq    0(%%rsi), %%rax\n"
3925         "mulq    %%r9\n"
3926         "addq    %%rax, 24(%%rdi)\n"
3927         "movq    8(%%rsi), %%rax\n"
3928         "adcq    $0, %%rdx\n"
3929         "movq    %%rdx, %%rcx\n"
3930         "mulq    %%r9\n"
3931         "addq    %%rax, %%rcx\n"
3932         "adcq    $0, %%rdx\n"
3933         "movq    16(%%rsi), %%rax\n"
3934         "addq    %%rcx, 32(%%rdi)\n"
3935         "adcq    $0, %%rdx\n"
3936         "movq    %%rdx, %%rcx\n"
3937         "mulq    %%r9\n"
3938         "addq    %%rax, %%rcx\n"
3939         "adcq    $0, %%rdx\n"
3940         "movq    24(%%rsi), %%rax\n"
3941         "addq    %%rcx, 40(%%rdi)\n"
3942         "adcq    $0, %%rdx\n"
3943         "movq    %%rdx, %%rcx\n"
3944         "mulq    %%r9\n"
3945         "addq    %%rax, %%rcx\n"
3946         "adcq    $0, %%rdx\n"
3947         "movq    32(%%rsi), %%rax\n"
3948         "addq    %%rcx, 48(%%rdi)\n"
3949         "adcq    $0, %%rdx\n"
3950         "movq    %%rdx, %%rcx\n"
3951         "mulq    %%r9\n"
3952         "addq    %%rax, %%rcx\n"
3953         "adcq    $0, %%rdx\n"
3954         "movq    40(%%rsi), %%rax\n"
3955         "addq    %%rcx, 56(%%rdi)\n"
3956         "adcq    $0, %%rdx\n"
3957         "movq    %%rdx, %%rcx\n"
3958         "mulq    %%r9\n"
3959         "addq    %%rax, %%rcx\n"
3960         "adcq    $0, %%rdx\n"
3961         "movq    48(%%rsi), %%rax\n"
3962         "addq    %%rcx, 64(%%rdi)\n"
3963         "adcq    $0, %%rdx\n"
3964         "movq    %%rdx, %%rcx\n"
3965         "mulq    %%r9\n"
3966         "addq    %%rax, %%rcx\n"
3967         "adcq    $0, %%rdx\n"
3968         "addq    %%rcx, 72(%%rdi)\n"
3969         "adcq    $0, %%rdx\n"
3970         "movq    %%rdx, 80(%%rdi)\n"
3971         "### x*y[4]\n"
3972         "movq    32(%%r8), %%r9\n"
3973         "movq    0(%%rsi), %%rax\n"
3974         "mulq    %%r9\n"
3975         "addq    %%rax, 32(%%rdi)\n"
3976         "movq    8(%%rsi), %%rax\n"
3977         "adcq    $0, %%rdx\n"
3978         "movq    %%rdx, %%rcx\n"
3979         "mulq    %%r9\n"
3980         "addq    %%rax, %%rcx\n"
3981         "adcq    $0, %%rdx\n"
3982         "movq    16(%%rsi), %%rax\n"
3983         "addq    %%rcx, 40(%%rdi)\n"
3984         "adcq    $0, %%rdx\n"
3985         "movq    %%rdx, %%rcx\n"
3986         "mulq    %%r9\n"
3987         "addq    %%rax, %%rcx\n"
3988         "adcq    $0, %%rdx\n"
3989         "movq    24(%%rsi), %%rax\n"
3990         "addq    %%rcx, 48(%%rdi)\n"
3991         "adcq    $0, %%rdx\n"
3992         "movq    %%rdx, %%rcx\n"
3993         "mulq    %%r9\n"
3994         "addq    %%rax, %%rcx\n"
3995         "adcq    $0, %%rdx\n"
3996         "movq    32(%%rsi), %%rax\n"
3997         "addq    %%rcx, 56(%%rdi)\n"
3998         "adcq    $0, %%rdx\n"
3999         "movq    %%rdx, %%rcx\n"
4000         "mulq    %%r9\n"
4001         "addq    %%rax, %%rcx\n"
4002         "adcq    $0, %%rdx\n"
4003         "movq    40(%%rsi), %%rax\n"
4004         "addq    %%rcx, 64(%%rdi)\n"
4005         "adcq    $0, %%rdx\n"
4006         "movq    %%rdx, %%rcx\n"
4007         "mulq    %%r9\n"
4008         "addq    %%rax, %%rcx\n"
4009         "adcq    $0, %%rdx\n"
4010         "movq    48(%%rsi), %%rax\n"
4011         "addq    %%rcx, 72(%%rdi)\n"
4012         "adcq    $0, %%rdx\n"
4013         "movq    %%rdx, %%rcx\n"
4014         "mulq    %%r9\n"
4015         "addq    %%rax, %%rcx\n"
4016         "adcq    $0, %%rdx\n"
4017         "addq    %%rcx, 80(%%rdi)\n"
4018         "adcq    $0, %%rdx\n"
4019         "movq    %%rdx, 88(%%rdi)\n"
4020         "### x*y[5]\n"
4021         "movq    40(%%r8), %%r9\n"
4022         "movq    0(%%rsi), %%rax\n"
4023         "mulq    %%r9\n"
4024         "addq    %%rax, 40(%%rdi)\n"
4025         "movq    8(%%rsi), %%rax\n"
4026         "adcq    $0, %%rdx\n"
4027         "movq    %%rdx, %%rcx\n"
4028         "mulq    %%r9\n"
4029         "addq    %%rax, %%rcx\n"
4030         "adcq    $0, %%rdx\n"
4031         "movq    16(%%rsi), %%rax\n"
4032         "addq    %%rcx, 48(%%rdi)\n"
4033         "adcq    $0, %%rdx\n"
4034         "movq    %%rdx, %%rcx\n"
4035         "mulq    %%r9\n"
4036         "addq    %%rax, %%rcx\n"
4037         "adcq    $0, %%rdx\n"
4038         "movq    24(%%rsi), %%rax\n"
4039         "addq    %%rcx, 56(%%rdi)\n"
4040         "adcq    $0, %%rdx\n"
4041         "movq    %%rdx, %%rcx\n"
4042         "mulq    %%r9\n"
4043         "addq    %%rax, %%rcx\n"
4044         "adcq    $0, %%rdx\n"
4045         "movq    32(%%rsi), %%rax\n"
4046         "addq    %%rcx, 64(%%rdi)\n"
4047         "adcq    $0, %%rdx\n"
4048         "movq    %%rdx, %%rcx\n"
4049         "mulq    %%r9\n"
4050         "addq    %%rax, %%rcx\n"
4051         "adcq    $0, %%rdx\n"
4052         "movq    40(%%rsi), %%rax\n"
4053         "addq    %%rcx, 72(%%rdi)\n"
4054         "adcq    $0, %%rdx\n"
4055         "movq    %%rdx, %%rcx\n"
4056         "mulq    %%r9\n"
4057         "addq    %%rax, %%rcx\n"
4058         "adcq    $0, %%rdx\n"
4059         "movq    48(%%rsi), %%rax\n"
4060         "addq    %%rcx, 80(%%rdi)\n"
4061         "adcq    $0, %%rdx\n"
4062         "movq    %%rdx, %%rcx\n"
4063         "mulq    %%r9\n"
4064         "addq    %%rax, %%rcx\n"
4065         "adcq    $0, %%rdx\n"
4066         "addq    %%rcx, 88(%%rdi)\n"
4067         "adcq    $0, %%rdx\n"
4068         "movq    %%rdx, 96(%%rdi)\n"
4069         "### x*y[6]\n"
4070         "movq    48(%%r8), %%r9\n"
4071         "movq    0(%%rsi), %%rax\n"
4072         "mulq    %%r9\n"
4073         "addq    %%rax, 48(%%rdi)\n"
4074         "movq    8(%%rsi), %%rax\n"
4075         "adcq    $0, %%rdx\n"
4076         "movq    %%rdx, %%rcx\n"
4077         "mulq    %%r9\n"
4078         "addq    %%rax, %%rcx\n"
4079         "adcq    $0, %%rdx\n"
4080         "movq    16(%%rsi), %%rax\n"
4081         "addq    %%rcx, 56(%%rdi)\n"
4082         "adcq    $0, %%rdx\n"
4083         "movq    %%rdx, %%rcx\n"
4084         "mulq    %%r9\n"
4085         "addq    %%rax, %%rcx\n"
4086         "adcq    $0, %%rdx\n"
4087         "movq    24(%%rsi), %%rax\n"
4088         "addq    %%rcx, 64(%%rdi)\n"
4089         "adcq    $0, %%rdx\n"
4090         "movq    %%rdx, %%rcx\n"
4091         "mulq    %%r9\n"
4092         "addq    %%rax, %%rcx\n"
4093         "adcq    $0, %%rdx\n"
4094         "movq    32(%%rsi), %%rax\n"
4095         "addq    %%rcx, 72(%%rdi)\n"
4096         "adcq    $0, %%rdx\n"
4097         "movq    %%rdx, %%rcx\n"
4098         "mulq    %%r9\n"
4099         "addq    %%rax, %%rcx\n"
4100         "adcq    $0, %%rdx\n"
4101         "movq    40(%%rsi), %%rax\n"
4102         "addq    %%rcx, 80(%%rdi)\n"
4103         "adcq    $0, %%rdx\n"
4104         "movq    %%rdx, %%rcx\n"
4105         "mulq    %%r9\n"
4106         "addq    %%rax, %%rcx\n"
4107         "adcq    $0, %%rdx\n"
4108         "movq    48(%%rsi), %%rax\n"
4109         "addq    %%rcx, 88(%%rdi)\n"
4110         "adcq    $0, %%rdx\n"
4111         "movq    %%rdx, %%rcx\n"
4112         "mulq    %%r9\n"
4113         "addq    %%rax, %%rcx\n"
4114         "adcq    $0, %%rdx\n"
4115         "addq    %%rcx, 96(%%rdi)\n"
4116         "adcq    $0, %%rdx\n"
4117         "movq    %%rdx, 104(%%rdi)\n"
4118       : "+m" (z)
4119       : "m" (x), "m" (y)
4120       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
4121 }
4122 
4123 /* x has 7 words, z has 16. Put x*y in z. */
4124 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
4125 static inline
mpfq_fixmp_7_sqr(mp_limb_t * z,const mp_limb_t * x)4126 void mpfq_fixmp_7_sqr(mp_limb_t * z, const mp_limb_t * x)
4127 {
4128     mpfq_fixmp_7_mul(z, x, x);
4129 }
4130 
4131 /* x has 7 words, z has 9. Put x*y in z. */
4132 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
4133 static inline
mpfq_fixmp_7_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)4134 void mpfq_fixmp_7_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
4135 {
4136     __asm__ __volatile__(
4137         "movq    %[z], %%rdi\n"
4138         "movq    %[x], %%rsi\n"
4139         "movq    0(%%rsi), %%rax\n"
4140         "mulq    %[mult]\n"
4141         "movq    %%rax, 0(%%rdi)\n"
4142         "movq    8(%%rsi), %%rax\n"
4143         "movq    %%rdx, %%rcx\n"
4144         "mulq    %[mult]\n"
4145         "addq    %%rax, %%rcx\n"
4146         "adcq    $0, %%rdx\n"
4147         "movq    16(%%rsi), %%rax\n"
4148         "movq    %%rcx, 8(%%rdi)\n"
4149         "movq    %%rdx, %%rcx\n"
4150         "mulq    %[mult]\n"
4151         "addq    %%rax, %%rcx\n"
4152         "adcq    $0, %%rdx\n"
4153         "movq    24(%%rsi), %%rax\n"
4154         "movq    %%rcx, 16(%%rdi)\n"
4155         "movq    %%rdx, %%rcx\n"
4156         "mulq    %[mult]\n"
4157         "addq    %%rax, %%rcx\n"
4158         "adcq    $0, %%rdx\n"
4159         "movq    32(%%rsi), %%rax\n"
4160         "movq    %%rcx, 24(%%rdi)\n"
4161         "movq    %%rdx, %%rcx\n"
4162         "mulq    %[mult]\n"
4163         "addq    %%rax, %%rcx\n"
4164         "adcq    $0, %%rdx\n"
4165         "movq    40(%%rsi), %%rax\n"
4166         "movq    %%rcx, 32(%%rdi)\n"
4167         "movq    %%rdx, %%rcx\n"
4168         "mulq    %[mult]\n"
4169         "addq    %%rax, %%rcx\n"
4170         "adcq    $0, %%rdx\n"
4171         "movq    48(%%rsi), %%rax\n"
4172         "movq    %%rcx, 40(%%rdi)\n"
4173         "movq    %%rdx, %%rcx\n"
4174         "mulq    %[mult]\n"
4175         "addq    %%rax, %%rcx\n"
4176         "adcq    $0, %%rdx\n"
4177         "movq    %%rcx, 48(%%rdi)\n"
4178         "movq    %%rdx, 56(%%rdi)\n"
4179     :
4180     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
4181     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
4182 }
4183 
4184 /* x, y, and z have 8 words. Result in z. Return carry bit */
4185 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
4186 static inline
mpfq_fixmp_8_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)4187 mp_limb_t mpfq_fixmp_8_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
4188 {
4189     mp_limb_t carry;
4190     __asm__ __volatile__(
4191         "movq    %[z], %%rdi\n"
4192         "movq    %[x], %%rsi\n"
4193         "movq    %[y], %%rdx\n"
4194         "movq    0(%%rsi), %%rax\n"
4195         "addq    0(%%rdx), %%rax\n"
4196         "movq    %%rax, 0(%%rdi)\n"
4197         "movq    8(%%rsi), %%rax\n"
4198         "adcq    8(%%rdx), %%rax\n"
4199         "movq    %%rax, 8(%%rdi)\n"
4200         "movq    16(%%rsi), %%rax\n"
4201         "adcq    16(%%rdx), %%rax\n"
4202         "movq    %%rax, 16(%%rdi)\n"
4203         "movq    24(%%rsi), %%rax\n"
4204         "adcq    24(%%rdx), %%rax\n"
4205         "movq    %%rax, 24(%%rdi)\n"
4206         "movq    32(%%rsi), %%rax\n"
4207         "adcq    32(%%rdx), %%rax\n"
4208         "movq    %%rax, 32(%%rdi)\n"
4209         "movq    40(%%rsi), %%rax\n"
4210         "adcq    40(%%rdx), %%rax\n"
4211         "movq    %%rax, 40(%%rdi)\n"
4212         "movq    48(%%rsi), %%rax\n"
4213         "adcq    48(%%rdx), %%rax\n"
4214         "movq    %%rax, 48(%%rdi)\n"
4215         "movq    56(%%rsi), %%rax\n"
4216         "adcq    56(%%rdx), %%rax\n"
4217         "movq    %%rax, 56(%%rdi)\n"
4218         "movq $0, %%rax\n"
4219         "adcq $0, %%rax\n"
4220     : "=&a"(carry)
4221     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
4222     : "%rdx", "%rsi", "%rdi", "memory");
4223     return carry;
4224 }
4225 
4226 /* x, y, and z have 8 words. Result in z. Return borrow bit */
4227 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
4228 static inline
mpfq_fixmp_8_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)4229 mp_limb_t mpfq_fixmp_8_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
4230 {
4231     mp_limb_t carry;
4232     __asm__ __volatile__(
4233         "movq    %[z], %%rdi\n"
4234         "movq    %[x], %%rsi\n"
4235         "movq    %[y], %%rdx\n"
4236         "movq    0(%%rsi), %%rax\n"
4237         "subq    0(%%rdx), %%rax\n"
4238         "movq    %%rax, 0(%%rdi)\n"
4239         "movq    8(%%rsi), %%rax\n"
4240         "sbbq    8(%%rdx), %%rax\n"
4241         "movq    %%rax, 8(%%rdi)\n"
4242         "movq    16(%%rsi), %%rax\n"
4243         "sbbq    16(%%rdx), %%rax\n"
4244         "movq    %%rax, 16(%%rdi)\n"
4245         "movq    24(%%rsi), %%rax\n"
4246         "sbbq    24(%%rdx), %%rax\n"
4247         "movq    %%rax, 24(%%rdi)\n"
4248         "movq    32(%%rsi), %%rax\n"
4249         "sbbq    32(%%rdx), %%rax\n"
4250         "movq    %%rax, 32(%%rdi)\n"
4251         "movq    40(%%rsi), %%rax\n"
4252         "sbbq    40(%%rdx), %%rax\n"
4253         "movq    %%rax, 40(%%rdi)\n"
4254         "movq    48(%%rsi), %%rax\n"
4255         "sbbq    48(%%rdx), %%rax\n"
4256         "movq    %%rax, 48(%%rdi)\n"
4257         "movq    56(%%rsi), %%rax\n"
4258         "sbbq    56(%%rdx), %%rax\n"
4259         "movq    %%rax, 56(%%rdi)\n"
4260         "movq $0, %%rax\n"
4261         "adcq $0, %%rax\n"
4262     : "=&a"(carry)
4263     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
4264     : "%rdx", "%rsi", "%rdi", "memory");
4265     return carry;
4266 }
4267 
4268 /* x, y, and z have 8 words. Result in z. Carry bit is lost. */
4269 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
4270 static inline
mpfq_fixmp_8_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)4271 void mpfq_fixmp_8_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
4272 {
4273     __asm__ __volatile__(
4274         "movq    %[z], %%rdi\n"
4275         "movq    %[x], %%rsi\n"
4276         "movq    %[y], %%rdx\n"
4277         "movq    0(%%rsi), %%rax\n"
4278         "addq    0(%%rdx), %%rax\n"
4279         "movq    %%rax, 0(%%rdi)\n"
4280         "movq    8(%%rsi), %%rax\n"
4281         "adcq    8(%%rdx), %%rax\n"
4282         "movq    %%rax, 8(%%rdi)\n"
4283         "movq    16(%%rsi), %%rax\n"
4284         "adcq    16(%%rdx), %%rax\n"
4285         "movq    %%rax, 16(%%rdi)\n"
4286         "movq    24(%%rsi), %%rax\n"
4287         "adcq    24(%%rdx), %%rax\n"
4288         "movq    %%rax, 24(%%rdi)\n"
4289         "movq    32(%%rsi), %%rax\n"
4290         "adcq    32(%%rdx), %%rax\n"
4291         "movq    %%rax, 32(%%rdi)\n"
4292         "movq    40(%%rsi), %%rax\n"
4293         "adcq    40(%%rdx), %%rax\n"
4294         "movq    %%rax, 40(%%rdi)\n"
4295         "movq    48(%%rsi), %%rax\n"
4296         "adcq    48(%%rdx), %%rax\n"
4297         "movq    %%rax, 48(%%rdi)\n"
4298         "movq    56(%%rsi), %%rax\n"
4299         "adcq    56(%%rdx), %%rax\n"
4300         "movq    %%rax, 56(%%rdi)\n"
4301     :
4302     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
4303     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
4304 }
4305 
4306 /* x, y, and z have 8 words. Result in z. Borrow bit is lost. */
4307 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
4308 static inline
mpfq_fixmp_8_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)4309 void mpfq_fixmp_8_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
4310 {
4311     __asm__ __volatile__(
4312         "movq    %[z], %%rdi\n"
4313         "movq    %[x], %%rsi\n"
4314         "movq    %[y], %%rdx\n"
4315         "movq    0(%%rsi), %%rax\n"
4316         "subq    0(%%rdx), %%rax\n"
4317         "movq    %%rax, 0(%%rdi)\n"
4318         "movq    8(%%rsi), %%rax\n"
4319         "sbbq    8(%%rdx), %%rax\n"
4320         "movq    %%rax, 8(%%rdi)\n"
4321         "movq    16(%%rsi), %%rax\n"
4322         "sbbq    16(%%rdx), %%rax\n"
4323         "movq    %%rax, 16(%%rdi)\n"
4324         "movq    24(%%rsi), %%rax\n"
4325         "sbbq    24(%%rdx), %%rax\n"
4326         "movq    %%rax, 24(%%rdi)\n"
4327         "movq    32(%%rsi), %%rax\n"
4328         "sbbq    32(%%rdx), %%rax\n"
4329         "movq    %%rax, 32(%%rdi)\n"
4330         "movq    40(%%rsi), %%rax\n"
4331         "sbbq    40(%%rdx), %%rax\n"
4332         "movq    %%rax, 40(%%rdi)\n"
4333         "movq    48(%%rsi), %%rax\n"
4334         "sbbq    48(%%rdx), %%rax\n"
4335         "movq    %%rax, 48(%%rdi)\n"
4336         "movq    56(%%rsi), %%rax\n"
4337         "sbbq    56(%%rdx), %%rax\n"
4338         "movq    %%rax, 56(%%rdi)\n"
4339     :
4340     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
4341     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
4342 }
4343 
4344 /* x has 8 words, z has 10.
4345  * Put (z+x*c) in z. Return carry bit. */
4346 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
4347 static inline
mpfq_fixmp_8_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)4348 mp_limb_t mpfq_fixmp_8_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
4349 {
4350     mp_limb_t carry;
4351     __asm__ __volatile__(
4352         "movq    %[z], %%rdi\n"
4353         "movq    %[x], %%rsi\n"
4354         "movq    0(%%rsi), %%rax\n"
4355         "mulq    %[mult]\n"
4356         "addq    %%rax, 0(%%rdi)\n"
4357         "movq    8(%%rsi), %%rax\n"
4358         "adcq    $0, %%rdx\n"
4359         "movq    %%rdx, %%rcx\n"
4360         "mulq    %[mult]\n"
4361         "addq    %%rax, %%rcx\n"
4362         "adcq    $0, %%rdx\n"
4363         "movq    16(%%rsi), %%rax\n"
4364         "addq    %%rcx, 8(%%rdi)\n"
4365         "adcq    $0, %%rdx\n"
4366         "movq    %%rdx, %%rcx\n"
4367         "mulq    %[mult]\n"
4368         "addq    %%rax, %%rcx\n"
4369         "adcq    $0, %%rdx\n"
4370         "movq    24(%%rsi), %%rax\n"
4371         "addq    %%rcx, 16(%%rdi)\n"
4372         "adcq    $0, %%rdx\n"
4373         "movq    %%rdx, %%rcx\n"
4374         "mulq    %[mult]\n"
4375         "addq    %%rax, %%rcx\n"
4376         "adcq    $0, %%rdx\n"
4377         "movq    32(%%rsi), %%rax\n"
4378         "addq    %%rcx, 24(%%rdi)\n"
4379         "adcq    $0, %%rdx\n"
4380         "movq    %%rdx, %%rcx\n"
4381         "mulq    %[mult]\n"
4382         "addq    %%rax, %%rcx\n"
4383         "adcq    $0, %%rdx\n"
4384         "movq    40(%%rsi), %%rax\n"
4385         "addq    %%rcx, 32(%%rdi)\n"
4386         "adcq    $0, %%rdx\n"
4387         "movq    %%rdx, %%rcx\n"
4388         "mulq    %[mult]\n"
4389         "addq    %%rax, %%rcx\n"
4390         "adcq    $0, %%rdx\n"
4391         "movq    48(%%rsi), %%rax\n"
4392         "addq    %%rcx, 40(%%rdi)\n"
4393         "adcq    $0, %%rdx\n"
4394         "movq    %%rdx, %%rcx\n"
4395         "mulq    %[mult]\n"
4396         "addq    %%rax, %%rcx\n"
4397         "adcq    $0, %%rdx\n"
4398         "movq    56(%%rsi), %%rax\n"
4399         "addq    %%rcx, 48(%%rdi)\n"
4400         "adcq    $0, %%rdx\n"
4401         "movq    %%rdx, %%rcx\n"
4402         "mulq    %[mult]\n"
4403         "addq    %%rax, %%rcx\n"
4404         "adcq    $0, %%rdx\n"
4405         "addq    %%rcx, 56(%%rdi)\n"
4406         "adcq    $0, %%rdx\n"
4407         "xorq    %%rcx, %%rcx\n"
4408         "addq    %%rdx, 64(%%rdi)\n"
4409         "adcq    $0, %%rcx\n"
4410         "movq    %%rcx, %[carry]\n"
4411     : [carry]"=g"(carry), [z] "+m" (z)
4412     : [mult] "r" (c), [x] "m" (x)
4413     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
4414     return carry;
4415 }
4416 
4417 /* x has 8 words, z has 10.
4418  * Put (z+x*c) in z. Carry bit is lost. */
4419 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
4420 static inline
mpfq_fixmp_8_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)4421 void mpfq_fixmp_8_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
4422 {
4423     __asm__ __volatile__(
4424         "movq    %[z], %%rdi\n"
4425         "movq    %[x], %%rsi\n"
4426         "movq    0(%%rsi), %%rax\n"
4427         "mulq    %[mult]\n"
4428         "addq    %%rax, 0(%%rdi)\n"
4429         "movq    8(%%rsi), %%rax\n"
4430         "adcq    $0, %%rdx\n"
4431         "movq    %%rdx, %%rcx\n"
4432         "mulq    %[mult]\n"
4433         "addq    %%rax, %%rcx\n"
4434         "adcq    $0, %%rdx\n"
4435         "movq    16(%%rsi), %%rax\n"
4436         "addq    %%rcx, 8(%%rdi)\n"
4437         "adcq    $0, %%rdx\n"
4438         "movq    %%rdx, %%rcx\n"
4439         "mulq    %[mult]\n"
4440         "addq    %%rax, %%rcx\n"
4441         "adcq    $0, %%rdx\n"
4442         "movq    24(%%rsi), %%rax\n"
4443         "addq    %%rcx, 16(%%rdi)\n"
4444         "adcq    $0, %%rdx\n"
4445         "movq    %%rdx, %%rcx\n"
4446         "mulq    %[mult]\n"
4447         "addq    %%rax, %%rcx\n"
4448         "adcq    $0, %%rdx\n"
4449         "movq    32(%%rsi), %%rax\n"
4450         "addq    %%rcx, 24(%%rdi)\n"
4451         "adcq    $0, %%rdx\n"
4452         "movq    %%rdx, %%rcx\n"
4453         "mulq    %[mult]\n"
4454         "addq    %%rax, %%rcx\n"
4455         "adcq    $0, %%rdx\n"
4456         "movq    40(%%rsi), %%rax\n"
4457         "addq    %%rcx, 32(%%rdi)\n"
4458         "adcq    $0, %%rdx\n"
4459         "movq    %%rdx, %%rcx\n"
4460         "mulq    %[mult]\n"
4461         "addq    %%rax, %%rcx\n"
4462         "adcq    $0, %%rdx\n"
4463         "movq    48(%%rsi), %%rax\n"
4464         "addq    %%rcx, 40(%%rdi)\n"
4465         "adcq    $0, %%rdx\n"
4466         "movq    %%rdx, %%rcx\n"
4467         "mulq    %[mult]\n"
4468         "addq    %%rax, %%rcx\n"
4469         "adcq    $0, %%rdx\n"
4470         "movq    56(%%rsi), %%rax\n"
4471         "addq    %%rcx, 48(%%rdi)\n"
4472         "adcq    $0, %%rdx\n"
4473         "movq    %%rdx, %%rcx\n"
4474         "mulq    %[mult]\n"
4475         "addq    %%rax, %%rcx\n"
4476         "adcq    $0, %%rdx\n"
4477         "addq    %%rcx, 56(%%rdi)\n"
4478         "adcq    $0, %%rdx\n"
4479         "addq    %%rdx, 64(%%rdi)\n"
4480     : [z] "+m" (z)
4481     : [mult] "r" (c), [x] "m" (x)
4482     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
4483 }
4484 
4485 /* x has 8 words, z has 9.
4486  * Put (z+x*c) in z. Return carry word. */
4487 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
4488 static inline
mpfq_fixmp_8_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)4489 mp_limb_t mpfq_fixmp_8_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
4490 {
4491     mp_limb_t carry;
4492     __asm__ __volatile__(
4493         "movq    %[z], %%rdi\n"
4494         "movq    %[x], %%rsi\n"
4495         "movq    0(%%rsi), %%rax\n"
4496         "mulq    %[mult]\n"
4497         "addq    %%rax, 0(%%rdi)\n"
4498         "movq    8(%%rsi), %%rax\n"
4499         "adcq    $0, %%rdx\n"
4500         "movq    %%rdx, %%rcx\n"
4501         "mulq    %[mult]\n"
4502         "addq    %%rax, %%rcx\n"
4503         "adcq    $0, %%rdx\n"
4504         "movq    16(%%rsi), %%rax\n"
4505         "addq    %%rcx, 8(%%rdi)\n"
4506         "adcq    $0, %%rdx\n"
4507         "movq    %%rdx, %%rcx\n"
4508         "mulq    %[mult]\n"
4509         "addq    %%rax, %%rcx\n"
4510         "adcq    $0, %%rdx\n"
4511         "movq    24(%%rsi), %%rax\n"
4512         "addq    %%rcx, 16(%%rdi)\n"
4513         "adcq    $0, %%rdx\n"
4514         "movq    %%rdx, %%rcx\n"
4515         "mulq    %[mult]\n"
4516         "addq    %%rax, %%rcx\n"
4517         "adcq    $0, %%rdx\n"
4518         "movq    32(%%rsi), %%rax\n"
4519         "addq    %%rcx, 24(%%rdi)\n"
4520         "adcq    $0, %%rdx\n"
4521         "movq    %%rdx, %%rcx\n"
4522         "mulq    %[mult]\n"
4523         "addq    %%rax, %%rcx\n"
4524         "adcq    $0, %%rdx\n"
4525         "movq    40(%%rsi), %%rax\n"
4526         "addq    %%rcx, 32(%%rdi)\n"
4527         "adcq    $0, %%rdx\n"
4528         "movq    %%rdx, %%rcx\n"
4529         "mulq    %[mult]\n"
4530         "addq    %%rax, %%rcx\n"
4531         "adcq    $0, %%rdx\n"
4532         "movq    48(%%rsi), %%rax\n"
4533         "addq    %%rcx, 40(%%rdi)\n"
4534         "adcq    $0, %%rdx\n"
4535         "movq    %%rdx, %%rcx\n"
4536         "mulq    %[mult]\n"
4537         "addq    %%rax, %%rcx\n"
4538         "adcq    $0, %%rdx\n"
4539         "movq    56(%%rsi), %%rax\n"
4540         "addq    %%rcx, 48(%%rdi)\n"
4541         "adcq    $0, %%rdx\n"
4542         "movq    %%rdx, %%rcx\n"
4543         "mulq    %[mult]\n"
4544         "addq    %%rax, %%rcx\n"
4545         "adcq    $0, %%rdx\n"
4546         "addq    %%rcx, 56(%%rdi)\n"
4547         "adcq    $0, %%rdx\n"
4548         "movq    %%rdx, %[carry]\n"
4549     : [carry]"=g"(carry), [z] "+m" (z)
4550     : [mult] "r" (c), [x] "m" (x)
4551     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
4552     return carry;
4553 }
4554 
4555 /* x and y have 8 words, z has 18. Put x*y in z. */
4556 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
4557 static inline
mpfq_fixmp_8_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)4558 void mpfq_fixmp_8_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
4559 {
4560     __asm__ __volatile__(
4561         "### x*y[0]\n"
4562         "movq    %2, %%r8\n"
4563         "movq    %0, %%rdi\n"
4564         "movq    0(%%r8), %%r9\n"
4565         "movq    %1, %%rsi\n"
4566         "movq    0(%%rsi), %%rax\n"
4567         "mulq    %%r9\n"
4568         "movq    %%rax, 0(%%rdi)\n"
4569         "movq    8(%%rsi), %%rax\n"
4570         "movq    %%rdx, %%rcx\n"
4571         "mulq    %%r9\n"
4572         "addq    %%rax, %%rcx\n"
4573         "adcq    $0, %%rdx\n"
4574         "movq    16(%%rsi), %%rax\n"
4575         "movq    %%rcx, 8(%%rdi)\n"
4576         "movq    %%rdx, %%rcx\n"
4577         "mulq    %%r9\n"
4578         "addq    %%rax, %%rcx\n"
4579         "adcq    $0, %%rdx\n"
4580         "movq    24(%%rsi), %%rax\n"
4581         "movq    %%rcx, 16(%%rdi)\n"
4582         "movq    %%rdx, %%rcx\n"
4583         "mulq    %%r9\n"
4584         "addq    %%rax, %%rcx\n"
4585         "adcq    $0, %%rdx\n"
4586         "movq    32(%%rsi), %%rax\n"
4587         "movq    %%rcx, 24(%%rdi)\n"
4588         "movq    %%rdx, %%rcx\n"
4589         "mulq    %%r9\n"
4590         "addq    %%rax, %%rcx\n"
4591         "adcq    $0, %%rdx\n"
4592         "movq    40(%%rsi), %%rax\n"
4593         "movq    %%rcx, 32(%%rdi)\n"
4594         "movq    %%rdx, %%rcx\n"
4595         "mulq    %%r9\n"
4596         "addq    %%rax, %%rcx\n"
4597         "adcq    $0, %%rdx\n"
4598         "movq    48(%%rsi), %%rax\n"
4599         "movq    %%rcx, 40(%%rdi)\n"
4600         "movq    %%rdx, %%rcx\n"
4601         "mulq    %%r9\n"
4602         "addq    %%rax, %%rcx\n"
4603         "adcq    $0, %%rdx\n"
4604         "movq    56(%%rsi), %%rax\n"
4605         "movq    %%rcx, 48(%%rdi)\n"
4606         "movq    %%rdx, %%rcx\n"
4607         "mulq    %%r9\n"
4608         "addq    %%rax, %%rcx\n"
4609         "adcq    $0, %%rdx\n"
4610         "movq    %%rcx, 56(%%rdi)\n"
4611         "movq    %%rdx, 64(%%rdi)\n"
4612         "movq    $0, 72(%%rdi)\n"
4613         "movq    $0, 80(%%rdi)\n"
4614         "movq    $0, 88(%%rdi)\n"
4615         "movq    $0, 96(%%rdi)\n"
4616         "movq    $0, 104(%%rdi)\n"
4617         "movq    $0, 112(%%rdi)\n"
4618         "movq    $0, 120(%%rdi)\n"
4619         "### x*y[1]\n"
4620         "movq    8(%%r8), %%r9\n"
4621         "movq    0(%%rsi), %%rax\n"
4622         "mulq    %%r9\n"
4623         "addq    %%rax, 8(%%rdi)\n"
4624         "movq    8(%%rsi), %%rax\n"
4625         "adcq    $0, %%rdx\n"
4626         "movq    %%rdx, %%rcx\n"
4627         "mulq    %%r9\n"
4628         "addq    %%rax, %%rcx\n"
4629         "adcq    $0, %%rdx\n"
4630         "movq    16(%%rsi), %%rax\n"
4631         "addq    %%rcx, 16(%%rdi)\n"
4632         "adcq    $0, %%rdx\n"
4633         "movq    %%rdx, %%rcx\n"
4634         "mulq    %%r9\n"
4635         "addq    %%rax, %%rcx\n"
4636         "adcq    $0, %%rdx\n"
4637         "movq    24(%%rsi), %%rax\n"
4638         "addq    %%rcx, 24(%%rdi)\n"
4639         "adcq    $0, %%rdx\n"
4640         "movq    %%rdx, %%rcx\n"
4641         "mulq    %%r9\n"
4642         "addq    %%rax, %%rcx\n"
4643         "adcq    $0, %%rdx\n"
4644         "movq    32(%%rsi), %%rax\n"
4645         "addq    %%rcx, 32(%%rdi)\n"
4646         "adcq    $0, %%rdx\n"
4647         "movq    %%rdx, %%rcx\n"
4648         "mulq    %%r9\n"
4649         "addq    %%rax, %%rcx\n"
4650         "adcq    $0, %%rdx\n"
4651         "movq    40(%%rsi), %%rax\n"
4652         "addq    %%rcx, 40(%%rdi)\n"
4653         "adcq    $0, %%rdx\n"
4654         "movq    %%rdx, %%rcx\n"
4655         "mulq    %%r9\n"
4656         "addq    %%rax, %%rcx\n"
4657         "adcq    $0, %%rdx\n"
4658         "movq    48(%%rsi), %%rax\n"
4659         "addq    %%rcx, 48(%%rdi)\n"
4660         "adcq    $0, %%rdx\n"
4661         "movq    %%rdx, %%rcx\n"
4662         "mulq    %%r9\n"
4663         "addq    %%rax, %%rcx\n"
4664         "adcq    $0, %%rdx\n"
4665         "movq    56(%%rsi), %%rax\n"
4666         "addq    %%rcx, 56(%%rdi)\n"
4667         "adcq    $0, %%rdx\n"
4668         "movq    %%rdx, %%rcx\n"
4669         "mulq    %%r9\n"
4670         "addq    %%rax, %%rcx\n"
4671         "adcq    $0, %%rdx\n"
4672         "addq    %%rcx, 64(%%rdi)\n"
4673         "adcq    $0, %%rdx\n"
4674         "movq    %%rdx, 72(%%rdi)\n"
4675         "### x*y[2]\n"
4676         "movq    16(%%r8), %%r9\n"
4677         "movq    0(%%rsi), %%rax\n"
4678         "mulq    %%r9\n"
4679         "addq    %%rax, 16(%%rdi)\n"
4680         "movq    8(%%rsi), %%rax\n"
4681         "adcq    $0, %%rdx\n"
4682         "movq    %%rdx, %%rcx\n"
4683         "mulq    %%r9\n"
4684         "addq    %%rax, %%rcx\n"
4685         "adcq    $0, %%rdx\n"
4686         "movq    16(%%rsi), %%rax\n"
4687         "addq    %%rcx, 24(%%rdi)\n"
4688         "adcq    $0, %%rdx\n"
4689         "movq    %%rdx, %%rcx\n"
4690         "mulq    %%r9\n"
4691         "addq    %%rax, %%rcx\n"
4692         "adcq    $0, %%rdx\n"
4693         "movq    24(%%rsi), %%rax\n"
4694         "addq    %%rcx, 32(%%rdi)\n"
4695         "adcq    $0, %%rdx\n"
4696         "movq    %%rdx, %%rcx\n"
4697         "mulq    %%r9\n"
4698         "addq    %%rax, %%rcx\n"
4699         "adcq    $0, %%rdx\n"
4700         "movq    32(%%rsi), %%rax\n"
4701         "addq    %%rcx, 40(%%rdi)\n"
4702         "adcq    $0, %%rdx\n"
4703         "movq    %%rdx, %%rcx\n"
4704         "mulq    %%r9\n"
4705         "addq    %%rax, %%rcx\n"
4706         "adcq    $0, %%rdx\n"
4707         "movq    40(%%rsi), %%rax\n"
4708         "addq    %%rcx, 48(%%rdi)\n"
4709         "adcq    $0, %%rdx\n"
4710         "movq    %%rdx, %%rcx\n"
4711         "mulq    %%r9\n"
4712         "addq    %%rax, %%rcx\n"
4713         "adcq    $0, %%rdx\n"
4714         "movq    48(%%rsi), %%rax\n"
4715         "addq    %%rcx, 56(%%rdi)\n"
4716         "adcq    $0, %%rdx\n"
4717         "movq    %%rdx, %%rcx\n"
4718         "mulq    %%r9\n"
4719         "addq    %%rax, %%rcx\n"
4720         "adcq    $0, %%rdx\n"
4721         "movq    56(%%rsi), %%rax\n"
4722         "addq    %%rcx, 64(%%rdi)\n"
4723         "adcq    $0, %%rdx\n"
4724         "movq    %%rdx, %%rcx\n"
4725         "mulq    %%r9\n"
4726         "addq    %%rax, %%rcx\n"
4727         "adcq    $0, %%rdx\n"
4728         "addq    %%rcx, 72(%%rdi)\n"
4729         "adcq    $0, %%rdx\n"
4730         "movq    %%rdx, 80(%%rdi)\n"
4731         "### x*y[3]\n"
4732         "movq    24(%%r8), %%r9\n"
4733         "movq    0(%%rsi), %%rax\n"
4734         "mulq    %%r9\n"
4735         "addq    %%rax, 24(%%rdi)\n"
4736         "movq    8(%%rsi), %%rax\n"
4737         "adcq    $0, %%rdx\n"
4738         "movq    %%rdx, %%rcx\n"
4739         "mulq    %%r9\n"
4740         "addq    %%rax, %%rcx\n"
4741         "adcq    $0, %%rdx\n"
4742         "movq    16(%%rsi), %%rax\n"
4743         "addq    %%rcx, 32(%%rdi)\n"
4744         "adcq    $0, %%rdx\n"
4745         "movq    %%rdx, %%rcx\n"
4746         "mulq    %%r9\n"
4747         "addq    %%rax, %%rcx\n"
4748         "adcq    $0, %%rdx\n"
4749         "movq    24(%%rsi), %%rax\n"
4750         "addq    %%rcx, 40(%%rdi)\n"
4751         "adcq    $0, %%rdx\n"
4752         "movq    %%rdx, %%rcx\n"
4753         "mulq    %%r9\n"
4754         "addq    %%rax, %%rcx\n"
4755         "adcq    $0, %%rdx\n"
4756         "movq    32(%%rsi), %%rax\n"
4757         "addq    %%rcx, 48(%%rdi)\n"
4758         "adcq    $0, %%rdx\n"
4759         "movq    %%rdx, %%rcx\n"
4760         "mulq    %%r9\n"
4761         "addq    %%rax, %%rcx\n"
4762         "adcq    $0, %%rdx\n"
4763         "movq    40(%%rsi), %%rax\n"
4764         "addq    %%rcx, 56(%%rdi)\n"
4765         "adcq    $0, %%rdx\n"
4766         "movq    %%rdx, %%rcx\n"
4767         "mulq    %%r9\n"
4768         "addq    %%rax, %%rcx\n"
4769         "adcq    $0, %%rdx\n"
4770         "movq    48(%%rsi), %%rax\n"
4771         "addq    %%rcx, 64(%%rdi)\n"
4772         "adcq    $0, %%rdx\n"
4773         "movq    %%rdx, %%rcx\n"
4774         "mulq    %%r9\n"
4775         "addq    %%rax, %%rcx\n"
4776         "adcq    $0, %%rdx\n"
4777         "movq    56(%%rsi), %%rax\n"
4778         "addq    %%rcx, 72(%%rdi)\n"
4779         "adcq    $0, %%rdx\n"
4780         "movq    %%rdx, %%rcx\n"
4781         "mulq    %%r9\n"
4782         "addq    %%rax, %%rcx\n"
4783         "adcq    $0, %%rdx\n"
4784         "addq    %%rcx, 80(%%rdi)\n"
4785         "adcq    $0, %%rdx\n"
4786         "movq    %%rdx, 88(%%rdi)\n"
4787         "### x*y[4]\n"
4788         "movq    32(%%r8), %%r9\n"
4789         "movq    0(%%rsi), %%rax\n"
4790         "mulq    %%r9\n"
4791         "addq    %%rax, 32(%%rdi)\n"
4792         "movq    8(%%rsi), %%rax\n"
4793         "adcq    $0, %%rdx\n"
4794         "movq    %%rdx, %%rcx\n"
4795         "mulq    %%r9\n"
4796         "addq    %%rax, %%rcx\n"
4797         "adcq    $0, %%rdx\n"
4798         "movq    16(%%rsi), %%rax\n"
4799         "addq    %%rcx, 40(%%rdi)\n"
4800         "adcq    $0, %%rdx\n"
4801         "movq    %%rdx, %%rcx\n"
4802         "mulq    %%r9\n"
4803         "addq    %%rax, %%rcx\n"
4804         "adcq    $0, %%rdx\n"
4805         "movq    24(%%rsi), %%rax\n"
4806         "addq    %%rcx, 48(%%rdi)\n"
4807         "adcq    $0, %%rdx\n"
4808         "movq    %%rdx, %%rcx\n"
4809         "mulq    %%r9\n"
4810         "addq    %%rax, %%rcx\n"
4811         "adcq    $0, %%rdx\n"
4812         "movq    32(%%rsi), %%rax\n"
4813         "addq    %%rcx, 56(%%rdi)\n"
4814         "adcq    $0, %%rdx\n"
4815         "movq    %%rdx, %%rcx\n"
4816         "mulq    %%r9\n"
4817         "addq    %%rax, %%rcx\n"
4818         "adcq    $0, %%rdx\n"
4819         "movq    40(%%rsi), %%rax\n"
4820         "addq    %%rcx, 64(%%rdi)\n"
4821         "adcq    $0, %%rdx\n"
4822         "movq    %%rdx, %%rcx\n"
4823         "mulq    %%r9\n"
4824         "addq    %%rax, %%rcx\n"
4825         "adcq    $0, %%rdx\n"
4826         "movq    48(%%rsi), %%rax\n"
4827         "addq    %%rcx, 72(%%rdi)\n"
4828         "adcq    $0, %%rdx\n"
4829         "movq    %%rdx, %%rcx\n"
4830         "mulq    %%r9\n"
4831         "addq    %%rax, %%rcx\n"
4832         "adcq    $0, %%rdx\n"
4833         "movq    56(%%rsi), %%rax\n"
4834         "addq    %%rcx, 80(%%rdi)\n"
4835         "adcq    $0, %%rdx\n"
4836         "movq    %%rdx, %%rcx\n"
4837         "mulq    %%r9\n"
4838         "addq    %%rax, %%rcx\n"
4839         "adcq    $0, %%rdx\n"
4840         "addq    %%rcx, 88(%%rdi)\n"
4841         "adcq    $0, %%rdx\n"
4842         "movq    %%rdx, 96(%%rdi)\n"
4843         "### x*y[5]\n"
4844         "movq    40(%%r8), %%r9\n"
4845         "movq    0(%%rsi), %%rax\n"
4846         "mulq    %%r9\n"
4847         "addq    %%rax, 40(%%rdi)\n"
4848         "movq    8(%%rsi), %%rax\n"
4849         "adcq    $0, %%rdx\n"
4850         "movq    %%rdx, %%rcx\n"
4851         "mulq    %%r9\n"
4852         "addq    %%rax, %%rcx\n"
4853         "adcq    $0, %%rdx\n"
4854         "movq    16(%%rsi), %%rax\n"
4855         "addq    %%rcx, 48(%%rdi)\n"
4856         "adcq    $0, %%rdx\n"
4857         "movq    %%rdx, %%rcx\n"
4858         "mulq    %%r9\n"
4859         "addq    %%rax, %%rcx\n"
4860         "adcq    $0, %%rdx\n"
4861         "movq    24(%%rsi), %%rax\n"
4862         "addq    %%rcx, 56(%%rdi)\n"
4863         "adcq    $0, %%rdx\n"
4864         "movq    %%rdx, %%rcx\n"
4865         "mulq    %%r9\n"
4866         "addq    %%rax, %%rcx\n"
4867         "adcq    $0, %%rdx\n"
4868         "movq    32(%%rsi), %%rax\n"
4869         "addq    %%rcx, 64(%%rdi)\n"
4870         "adcq    $0, %%rdx\n"
4871         "movq    %%rdx, %%rcx\n"
4872         "mulq    %%r9\n"
4873         "addq    %%rax, %%rcx\n"
4874         "adcq    $0, %%rdx\n"
4875         "movq    40(%%rsi), %%rax\n"
4876         "addq    %%rcx, 72(%%rdi)\n"
4877         "adcq    $0, %%rdx\n"
4878         "movq    %%rdx, %%rcx\n"
4879         "mulq    %%r9\n"
4880         "addq    %%rax, %%rcx\n"
4881         "adcq    $0, %%rdx\n"
4882         "movq    48(%%rsi), %%rax\n"
4883         "addq    %%rcx, 80(%%rdi)\n"
4884         "adcq    $0, %%rdx\n"
4885         "movq    %%rdx, %%rcx\n"
4886         "mulq    %%r9\n"
4887         "addq    %%rax, %%rcx\n"
4888         "adcq    $0, %%rdx\n"
4889         "movq    56(%%rsi), %%rax\n"
4890         "addq    %%rcx, 88(%%rdi)\n"
4891         "adcq    $0, %%rdx\n"
4892         "movq    %%rdx, %%rcx\n"
4893         "mulq    %%r9\n"
4894         "addq    %%rax, %%rcx\n"
4895         "adcq    $0, %%rdx\n"
4896         "addq    %%rcx, 96(%%rdi)\n"
4897         "adcq    $0, %%rdx\n"
4898         "movq    %%rdx, 104(%%rdi)\n"
4899         "### x*y[6]\n"
4900         "movq    48(%%r8), %%r9\n"
4901         "movq    0(%%rsi), %%rax\n"
4902         "mulq    %%r9\n"
4903         "addq    %%rax, 48(%%rdi)\n"
4904         "movq    8(%%rsi), %%rax\n"
4905         "adcq    $0, %%rdx\n"
4906         "movq    %%rdx, %%rcx\n"
4907         "mulq    %%r9\n"
4908         "addq    %%rax, %%rcx\n"
4909         "adcq    $0, %%rdx\n"
4910         "movq    16(%%rsi), %%rax\n"
4911         "addq    %%rcx, 56(%%rdi)\n"
4912         "adcq    $0, %%rdx\n"
4913         "movq    %%rdx, %%rcx\n"
4914         "mulq    %%r9\n"
4915         "addq    %%rax, %%rcx\n"
4916         "adcq    $0, %%rdx\n"
4917         "movq    24(%%rsi), %%rax\n"
4918         "addq    %%rcx, 64(%%rdi)\n"
4919         "adcq    $0, %%rdx\n"
4920         "movq    %%rdx, %%rcx\n"
4921         "mulq    %%r9\n"
4922         "addq    %%rax, %%rcx\n"
4923         "adcq    $0, %%rdx\n"
4924         "movq    32(%%rsi), %%rax\n"
4925         "addq    %%rcx, 72(%%rdi)\n"
4926         "adcq    $0, %%rdx\n"
4927         "movq    %%rdx, %%rcx\n"
4928         "mulq    %%r9\n"
4929         "addq    %%rax, %%rcx\n"
4930         "adcq    $0, %%rdx\n"
4931         "movq    40(%%rsi), %%rax\n"
4932         "addq    %%rcx, 80(%%rdi)\n"
4933         "adcq    $0, %%rdx\n"
4934         "movq    %%rdx, %%rcx\n"
4935         "mulq    %%r9\n"
4936         "addq    %%rax, %%rcx\n"
4937         "adcq    $0, %%rdx\n"
4938         "movq    48(%%rsi), %%rax\n"
4939         "addq    %%rcx, 88(%%rdi)\n"
4940         "adcq    $0, %%rdx\n"
4941         "movq    %%rdx, %%rcx\n"
4942         "mulq    %%r9\n"
4943         "addq    %%rax, %%rcx\n"
4944         "adcq    $0, %%rdx\n"
4945         "movq    56(%%rsi), %%rax\n"
4946         "addq    %%rcx, 96(%%rdi)\n"
4947         "adcq    $0, %%rdx\n"
4948         "movq    %%rdx, %%rcx\n"
4949         "mulq    %%r9\n"
4950         "addq    %%rax, %%rcx\n"
4951         "adcq    $0, %%rdx\n"
4952         "addq    %%rcx, 104(%%rdi)\n"
4953         "adcq    $0, %%rdx\n"
4954         "movq    %%rdx, 112(%%rdi)\n"
4955         "### x*y[7]\n"
4956         "movq    56(%%r8), %%r9\n"
4957         "movq    0(%%rsi), %%rax\n"
4958         "mulq    %%r9\n"
4959         "addq    %%rax, 56(%%rdi)\n"
4960         "movq    8(%%rsi), %%rax\n"
4961         "adcq    $0, %%rdx\n"
4962         "movq    %%rdx, %%rcx\n"
4963         "mulq    %%r9\n"
4964         "addq    %%rax, %%rcx\n"
4965         "adcq    $0, %%rdx\n"
4966         "movq    16(%%rsi), %%rax\n"
4967         "addq    %%rcx, 64(%%rdi)\n"
4968         "adcq    $0, %%rdx\n"
4969         "movq    %%rdx, %%rcx\n"
4970         "mulq    %%r9\n"
4971         "addq    %%rax, %%rcx\n"
4972         "adcq    $0, %%rdx\n"
4973         "movq    24(%%rsi), %%rax\n"
4974         "addq    %%rcx, 72(%%rdi)\n"
4975         "adcq    $0, %%rdx\n"
4976         "movq    %%rdx, %%rcx\n"
4977         "mulq    %%r9\n"
4978         "addq    %%rax, %%rcx\n"
4979         "adcq    $0, %%rdx\n"
4980         "movq    32(%%rsi), %%rax\n"
4981         "addq    %%rcx, 80(%%rdi)\n"
4982         "adcq    $0, %%rdx\n"
4983         "movq    %%rdx, %%rcx\n"
4984         "mulq    %%r9\n"
4985         "addq    %%rax, %%rcx\n"
4986         "adcq    $0, %%rdx\n"
4987         "movq    40(%%rsi), %%rax\n"
4988         "addq    %%rcx, 88(%%rdi)\n"
4989         "adcq    $0, %%rdx\n"
4990         "movq    %%rdx, %%rcx\n"
4991         "mulq    %%r9\n"
4992         "addq    %%rax, %%rcx\n"
4993         "adcq    $0, %%rdx\n"
4994         "movq    48(%%rsi), %%rax\n"
4995         "addq    %%rcx, 96(%%rdi)\n"
4996         "adcq    $0, %%rdx\n"
4997         "movq    %%rdx, %%rcx\n"
4998         "mulq    %%r9\n"
4999         "addq    %%rax, %%rcx\n"
5000         "adcq    $0, %%rdx\n"
5001         "movq    56(%%rsi), %%rax\n"
5002         "addq    %%rcx, 104(%%rdi)\n"
5003         "adcq    $0, %%rdx\n"
5004         "movq    %%rdx, %%rcx\n"
5005         "mulq    %%r9\n"
5006         "addq    %%rax, %%rcx\n"
5007         "adcq    $0, %%rdx\n"
5008         "addq    %%rcx, 112(%%rdi)\n"
5009         "adcq    $0, %%rdx\n"
5010         "movq    %%rdx, 120(%%rdi)\n"
5011       : "+m" (z)
5012       : "m" (x), "m" (y)
5013       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
5014 }
5015 
5016 /* x has 8 words, z has 18. Put x*y in z. */
5017 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
5018 static inline
mpfq_fixmp_8_sqr(mp_limb_t * z,const mp_limb_t * x)5019 void mpfq_fixmp_8_sqr(mp_limb_t * z, const mp_limb_t * x)
5020 {
5021     mpfq_fixmp_8_mul(z, x, x);
5022 }
5023 
5024 /* x has 8 words, z has 10. Put x*y in z. */
5025 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
5026 static inline
mpfq_fixmp_8_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)5027 void mpfq_fixmp_8_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
5028 {
5029     __asm__ __volatile__(
5030         "movq    %[z], %%rdi\n"
5031         "movq    %[x], %%rsi\n"
5032         "movq    0(%%rsi), %%rax\n"
5033         "mulq    %[mult]\n"
5034         "movq    %%rax, 0(%%rdi)\n"
5035         "movq    8(%%rsi), %%rax\n"
5036         "movq    %%rdx, %%rcx\n"
5037         "mulq    %[mult]\n"
5038         "addq    %%rax, %%rcx\n"
5039         "adcq    $0, %%rdx\n"
5040         "movq    16(%%rsi), %%rax\n"
5041         "movq    %%rcx, 8(%%rdi)\n"
5042         "movq    %%rdx, %%rcx\n"
5043         "mulq    %[mult]\n"
5044         "addq    %%rax, %%rcx\n"
5045         "adcq    $0, %%rdx\n"
5046         "movq    24(%%rsi), %%rax\n"
5047         "movq    %%rcx, 16(%%rdi)\n"
5048         "movq    %%rdx, %%rcx\n"
5049         "mulq    %[mult]\n"
5050         "addq    %%rax, %%rcx\n"
5051         "adcq    $0, %%rdx\n"
5052         "movq    32(%%rsi), %%rax\n"
5053         "movq    %%rcx, 24(%%rdi)\n"
5054         "movq    %%rdx, %%rcx\n"
5055         "mulq    %[mult]\n"
5056         "addq    %%rax, %%rcx\n"
5057         "adcq    $0, %%rdx\n"
5058         "movq    40(%%rsi), %%rax\n"
5059         "movq    %%rcx, 32(%%rdi)\n"
5060         "movq    %%rdx, %%rcx\n"
5061         "mulq    %[mult]\n"
5062         "addq    %%rax, %%rcx\n"
5063         "adcq    $0, %%rdx\n"
5064         "movq    48(%%rsi), %%rax\n"
5065         "movq    %%rcx, 40(%%rdi)\n"
5066         "movq    %%rdx, %%rcx\n"
5067         "mulq    %[mult]\n"
5068         "addq    %%rax, %%rcx\n"
5069         "adcq    $0, %%rdx\n"
5070         "movq    56(%%rsi), %%rax\n"
5071         "movq    %%rcx, 48(%%rdi)\n"
5072         "movq    %%rdx, %%rcx\n"
5073         "mulq    %[mult]\n"
5074         "addq    %%rax, %%rcx\n"
5075         "adcq    $0, %%rdx\n"
5076         "movq    %%rcx, 56(%%rdi)\n"
5077         "movq    %%rdx, 64(%%rdi)\n"
5078     :
5079     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
5080     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
5081 }
5082 
5083 /* x, y, and z have 9 words. Result in z. Return carry bit */
5084 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
5085 static inline
mpfq_fixmp_9_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)5086 mp_limb_t mpfq_fixmp_9_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
5087 {
5088     mp_limb_t carry;
5089     __asm__ __volatile__(
5090         "movq    %[z], %%rdi\n"
5091         "movq    %[x], %%rsi\n"
5092         "movq    %[y], %%rdx\n"
5093         "movq    0(%%rsi), %%rax\n"
5094         "addq    0(%%rdx), %%rax\n"
5095         "movq    %%rax, 0(%%rdi)\n"
5096         "movq    8(%%rsi), %%rax\n"
5097         "adcq    8(%%rdx), %%rax\n"
5098         "movq    %%rax, 8(%%rdi)\n"
5099         "movq    16(%%rsi), %%rax\n"
5100         "adcq    16(%%rdx), %%rax\n"
5101         "movq    %%rax, 16(%%rdi)\n"
5102         "movq    24(%%rsi), %%rax\n"
5103         "adcq    24(%%rdx), %%rax\n"
5104         "movq    %%rax, 24(%%rdi)\n"
5105         "movq    32(%%rsi), %%rax\n"
5106         "adcq    32(%%rdx), %%rax\n"
5107         "movq    %%rax, 32(%%rdi)\n"
5108         "movq    40(%%rsi), %%rax\n"
5109         "adcq    40(%%rdx), %%rax\n"
5110         "movq    %%rax, 40(%%rdi)\n"
5111         "movq    48(%%rsi), %%rax\n"
5112         "adcq    48(%%rdx), %%rax\n"
5113         "movq    %%rax, 48(%%rdi)\n"
5114         "movq    56(%%rsi), %%rax\n"
5115         "adcq    56(%%rdx), %%rax\n"
5116         "movq    %%rax, 56(%%rdi)\n"
5117         "movq    64(%%rsi), %%rax\n"
5118         "adcq    64(%%rdx), %%rax\n"
5119         "movq    %%rax, 64(%%rdi)\n"
5120         "movq $0, %%rax\n"
5121         "adcq $0, %%rax\n"
5122     : "=&a"(carry)
5123     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
5124     : "%rdx", "%rsi", "%rdi", "memory");
5125     return carry;
5126 }
5127 
5128 /* x, y, and z have 9 words. Result in z. Return borrow bit */
5129 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
5130 static inline
mpfq_fixmp_9_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)5131 mp_limb_t mpfq_fixmp_9_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
5132 {
5133     mp_limb_t carry;
5134     __asm__ __volatile__(
5135         "movq    %[z], %%rdi\n"
5136         "movq    %[x], %%rsi\n"
5137         "movq    %[y], %%rdx\n"
5138         "movq    0(%%rsi), %%rax\n"
5139         "subq    0(%%rdx), %%rax\n"
5140         "movq    %%rax, 0(%%rdi)\n"
5141         "movq    8(%%rsi), %%rax\n"
5142         "sbbq    8(%%rdx), %%rax\n"
5143         "movq    %%rax, 8(%%rdi)\n"
5144         "movq    16(%%rsi), %%rax\n"
5145         "sbbq    16(%%rdx), %%rax\n"
5146         "movq    %%rax, 16(%%rdi)\n"
5147         "movq    24(%%rsi), %%rax\n"
5148         "sbbq    24(%%rdx), %%rax\n"
5149         "movq    %%rax, 24(%%rdi)\n"
5150         "movq    32(%%rsi), %%rax\n"
5151         "sbbq    32(%%rdx), %%rax\n"
5152         "movq    %%rax, 32(%%rdi)\n"
5153         "movq    40(%%rsi), %%rax\n"
5154         "sbbq    40(%%rdx), %%rax\n"
5155         "movq    %%rax, 40(%%rdi)\n"
5156         "movq    48(%%rsi), %%rax\n"
5157         "sbbq    48(%%rdx), %%rax\n"
5158         "movq    %%rax, 48(%%rdi)\n"
5159         "movq    56(%%rsi), %%rax\n"
5160         "sbbq    56(%%rdx), %%rax\n"
5161         "movq    %%rax, 56(%%rdi)\n"
5162         "movq    64(%%rsi), %%rax\n"
5163         "sbbq    64(%%rdx), %%rax\n"
5164         "movq    %%rax, 64(%%rdi)\n"
5165         "movq $0, %%rax\n"
5166         "adcq $0, %%rax\n"
5167     : "=&a"(carry)
5168     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
5169     : "%rdx", "%rsi", "%rdi", "memory");
5170     return carry;
5171 }
5172 
5173 /* x, y, and z have 9 words. Result in z. Carry bit is lost. */
5174 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
5175 static inline
mpfq_fixmp_9_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)5176 void mpfq_fixmp_9_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
5177 {
5178     __asm__ __volatile__(
5179         "movq    %[z], %%rdi\n"
5180         "movq    %[x], %%rsi\n"
5181         "movq    %[y], %%rdx\n"
5182         "movq    0(%%rsi), %%rax\n"
5183         "addq    0(%%rdx), %%rax\n"
5184         "movq    %%rax, 0(%%rdi)\n"
5185         "movq    8(%%rsi), %%rax\n"
5186         "adcq    8(%%rdx), %%rax\n"
5187         "movq    %%rax, 8(%%rdi)\n"
5188         "movq    16(%%rsi), %%rax\n"
5189         "adcq    16(%%rdx), %%rax\n"
5190         "movq    %%rax, 16(%%rdi)\n"
5191         "movq    24(%%rsi), %%rax\n"
5192         "adcq    24(%%rdx), %%rax\n"
5193         "movq    %%rax, 24(%%rdi)\n"
5194         "movq    32(%%rsi), %%rax\n"
5195         "adcq    32(%%rdx), %%rax\n"
5196         "movq    %%rax, 32(%%rdi)\n"
5197         "movq    40(%%rsi), %%rax\n"
5198         "adcq    40(%%rdx), %%rax\n"
5199         "movq    %%rax, 40(%%rdi)\n"
5200         "movq    48(%%rsi), %%rax\n"
5201         "adcq    48(%%rdx), %%rax\n"
5202         "movq    %%rax, 48(%%rdi)\n"
5203         "movq    56(%%rsi), %%rax\n"
5204         "adcq    56(%%rdx), %%rax\n"
5205         "movq    %%rax, 56(%%rdi)\n"
5206         "movq    64(%%rsi), %%rax\n"
5207         "adcq    64(%%rdx), %%rax\n"
5208         "movq    %%rax, 64(%%rdi)\n"
5209     :
5210     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
5211     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
5212 }
5213 
5214 /* x, y, and z have 9 words. Result in z. Borrow bit is lost. */
5215 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
5216 static inline
mpfq_fixmp_9_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)5217 void mpfq_fixmp_9_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
5218 {
5219     __asm__ __volatile__(
5220         "movq    %[z], %%rdi\n"
5221         "movq    %[x], %%rsi\n"
5222         "movq    %[y], %%rdx\n"
5223         "movq    0(%%rsi), %%rax\n"
5224         "subq    0(%%rdx), %%rax\n"
5225         "movq    %%rax, 0(%%rdi)\n"
5226         "movq    8(%%rsi), %%rax\n"
5227         "sbbq    8(%%rdx), %%rax\n"
5228         "movq    %%rax, 8(%%rdi)\n"
5229         "movq    16(%%rsi), %%rax\n"
5230         "sbbq    16(%%rdx), %%rax\n"
5231         "movq    %%rax, 16(%%rdi)\n"
5232         "movq    24(%%rsi), %%rax\n"
5233         "sbbq    24(%%rdx), %%rax\n"
5234         "movq    %%rax, 24(%%rdi)\n"
5235         "movq    32(%%rsi), %%rax\n"
5236         "sbbq    32(%%rdx), %%rax\n"
5237         "movq    %%rax, 32(%%rdi)\n"
5238         "movq    40(%%rsi), %%rax\n"
5239         "sbbq    40(%%rdx), %%rax\n"
5240         "movq    %%rax, 40(%%rdi)\n"
5241         "movq    48(%%rsi), %%rax\n"
5242         "sbbq    48(%%rdx), %%rax\n"
5243         "movq    %%rax, 48(%%rdi)\n"
5244         "movq    56(%%rsi), %%rax\n"
5245         "sbbq    56(%%rdx), %%rax\n"
5246         "movq    %%rax, 56(%%rdi)\n"
5247         "movq    64(%%rsi), %%rax\n"
5248         "sbbq    64(%%rdx), %%rax\n"
5249         "movq    %%rax, 64(%%rdi)\n"
5250     :
5251     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
5252     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
5253 }
5254 
5255 /* x has 9 words, z has 11.
5256  * Put (z+x*c) in z. Return carry bit. */
5257 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
5258 static inline
mpfq_fixmp_9_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)5259 mp_limb_t mpfq_fixmp_9_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
5260 {
5261     mp_limb_t carry;
5262     __asm__ __volatile__(
5263         "movq    %[z], %%rdi\n"
5264         "movq    %[x], %%rsi\n"
5265         "movq    0(%%rsi), %%rax\n"
5266         "mulq    %[mult]\n"
5267         "addq    %%rax, 0(%%rdi)\n"
5268         "movq    8(%%rsi), %%rax\n"
5269         "adcq    $0, %%rdx\n"
5270         "movq    %%rdx, %%rcx\n"
5271         "mulq    %[mult]\n"
5272         "addq    %%rax, %%rcx\n"
5273         "adcq    $0, %%rdx\n"
5274         "movq    16(%%rsi), %%rax\n"
5275         "addq    %%rcx, 8(%%rdi)\n"
5276         "adcq    $0, %%rdx\n"
5277         "movq    %%rdx, %%rcx\n"
5278         "mulq    %[mult]\n"
5279         "addq    %%rax, %%rcx\n"
5280         "adcq    $0, %%rdx\n"
5281         "movq    24(%%rsi), %%rax\n"
5282         "addq    %%rcx, 16(%%rdi)\n"
5283         "adcq    $0, %%rdx\n"
5284         "movq    %%rdx, %%rcx\n"
5285         "mulq    %[mult]\n"
5286         "addq    %%rax, %%rcx\n"
5287         "adcq    $0, %%rdx\n"
5288         "movq    32(%%rsi), %%rax\n"
5289         "addq    %%rcx, 24(%%rdi)\n"
5290         "adcq    $0, %%rdx\n"
5291         "movq    %%rdx, %%rcx\n"
5292         "mulq    %[mult]\n"
5293         "addq    %%rax, %%rcx\n"
5294         "adcq    $0, %%rdx\n"
5295         "movq    40(%%rsi), %%rax\n"
5296         "addq    %%rcx, 32(%%rdi)\n"
5297         "adcq    $0, %%rdx\n"
5298         "movq    %%rdx, %%rcx\n"
5299         "mulq    %[mult]\n"
5300         "addq    %%rax, %%rcx\n"
5301         "adcq    $0, %%rdx\n"
5302         "movq    48(%%rsi), %%rax\n"
5303         "addq    %%rcx, 40(%%rdi)\n"
5304         "adcq    $0, %%rdx\n"
5305         "movq    %%rdx, %%rcx\n"
5306         "mulq    %[mult]\n"
5307         "addq    %%rax, %%rcx\n"
5308         "adcq    $0, %%rdx\n"
5309         "movq    56(%%rsi), %%rax\n"
5310         "addq    %%rcx, 48(%%rdi)\n"
5311         "adcq    $0, %%rdx\n"
5312         "movq    %%rdx, %%rcx\n"
5313         "mulq    %[mult]\n"
5314         "addq    %%rax, %%rcx\n"
5315         "adcq    $0, %%rdx\n"
5316         "movq    64(%%rsi), %%rax\n"
5317         "addq    %%rcx, 56(%%rdi)\n"
5318         "adcq    $0, %%rdx\n"
5319         "movq    %%rdx, %%rcx\n"
5320         "mulq    %[mult]\n"
5321         "addq    %%rax, %%rcx\n"
5322         "adcq    $0, %%rdx\n"
5323         "addq    %%rcx, 64(%%rdi)\n"
5324         "adcq    $0, %%rdx\n"
5325         "xorq    %%rcx, %%rcx\n"
5326         "addq    %%rdx, 72(%%rdi)\n"
5327         "adcq    $0, %%rcx\n"
5328         "movq    %%rcx, %[carry]\n"
5329     : [carry]"=g"(carry), [z] "+m" (z)
5330     : [mult] "r" (c), [x] "m" (x)
5331     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
5332     return carry;
5333 }
5334 
5335 /* x has 9 words, z has 11.
5336  * Put (z+x*c) in z. Carry bit is lost. */
5337 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
5338 static inline
mpfq_fixmp_9_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)5339 void mpfq_fixmp_9_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
5340 {
5341     __asm__ __volatile__(
5342         "movq    %[z], %%rdi\n"
5343         "movq    %[x], %%rsi\n"
5344         "movq    0(%%rsi), %%rax\n"
5345         "mulq    %[mult]\n"
5346         "addq    %%rax, 0(%%rdi)\n"
5347         "movq    8(%%rsi), %%rax\n"
5348         "adcq    $0, %%rdx\n"
5349         "movq    %%rdx, %%rcx\n"
5350         "mulq    %[mult]\n"
5351         "addq    %%rax, %%rcx\n"
5352         "adcq    $0, %%rdx\n"
5353         "movq    16(%%rsi), %%rax\n"
5354         "addq    %%rcx, 8(%%rdi)\n"
5355         "adcq    $0, %%rdx\n"
5356         "movq    %%rdx, %%rcx\n"
5357         "mulq    %[mult]\n"
5358         "addq    %%rax, %%rcx\n"
5359         "adcq    $0, %%rdx\n"
5360         "movq    24(%%rsi), %%rax\n"
5361         "addq    %%rcx, 16(%%rdi)\n"
5362         "adcq    $0, %%rdx\n"
5363         "movq    %%rdx, %%rcx\n"
5364         "mulq    %[mult]\n"
5365         "addq    %%rax, %%rcx\n"
5366         "adcq    $0, %%rdx\n"
5367         "movq    32(%%rsi), %%rax\n"
5368         "addq    %%rcx, 24(%%rdi)\n"
5369         "adcq    $0, %%rdx\n"
5370         "movq    %%rdx, %%rcx\n"
5371         "mulq    %[mult]\n"
5372         "addq    %%rax, %%rcx\n"
5373         "adcq    $0, %%rdx\n"
5374         "movq    40(%%rsi), %%rax\n"
5375         "addq    %%rcx, 32(%%rdi)\n"
5376         "adcq    $0, %%rdx\n"
5377         "movq    %%rdx, %%rcx\n"
5378         "mulq    %[mult]\n"
5379         "addq    %%rax, %%rcx\n"
5380         "adcq    $0, %%rdx\n"
5381         "movq    48(%%rsi), %%rax\n"
5382         "addq    %%rcx, 40(%%rdi)\n"
5383         "adcq    $0, %%rdx\n"
5384         "movq    %%rdx, %%rcx\n"
5385         "mulq    %[mult]\n"
5386         "addq    %%rax, %%rcx\n"
5387         "adcq    $0, %%rdx\n"
5388         "movq    56(%%rsi), %%rax\n"
5389         "addq    %%rcx, 48(%%rdi)\n"
5390         "adcq    $0, %%rdx\n"
5391         "movq    %%rdx, %%rcx\n"
5392         "mulq    %[mult]\n"
5393         "addq    %%rax, %%rcx\n"
5394         "adcq    $0, %%rdx\n"
5395         "movq    64(%%rsi), %%rax\n"
5396         "addq    %%rcx, 56(%%rdi)\n"
5397         "adcq    $0, %%rdx\n"
5398         "movq    %%rdx, %%rcx\n"
5399         "mulq    %[mult]\n"
5400         "addq    %%rax, %%rcx\n"
5401         "adcq    $0, %%rdx\n"
5402         "addq    %%rcx, 64(%%rdi)\n"
5403         "adcq    $0, %%rdx\n"
5404         "addq    %%rdx, 72(%%rdi)\n"
5405     : [z] "+m" (z)
5406     : [mult] "r" (c), [x] "m" (x)
5407     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
5408 }
5409 
5410 /* x has 9 words, z has 10.
5411  * Put (z+x*c) in z. Return carry word. */
5412 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
5413 static inline
mpfq_fixmp_9_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)5414 mp_limb_t mpfq_fixmp_9_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
5415 {
5416     mp_limb_t carry;
5417     __asm__ __volatile__(
5418         "movq    %[z], %%rdi\n"
5419         "movq    %[x], %%rsi\n"
5420         "movq    0(%%rsi), %%rax\n"
5421         "mulq    %[mult]\n"
5422         "addq    %%rax, 0(%%rdi)\n"
5423         "movq    8(%%rsi), %%rax\n"
5424         "adcq    $0, %%rdx\n"
5425         "movq    %%rdx, %%rcx\n"
5426         "mulq    %[mult]\n"
5427         "addq    %%rax, %%rcx\n"
5428         "adcq    $0, %%rdx\n"
5429         "movq    16(%%rsi), %%rax\n"
5430         "addq    %%rcx, 8(%%rdi)\n"
5431         "adcq    $0, %%rdx\n"
5432         "movq    %%rdx, %%rcx\n"
5433         "mulq    %[mult]\n"
5434         "addq    %%rax, %%rcx\n"
5435         "adcq    $0, %%rdx\n"
5436         "movq    24(%%rsi), %%rax\n"
5437         "addq    %%rcx, 16(%%rdi)\n"
5438         "adcq    $0, %%rdx\n"
5439         "movq    %%rdx, %%rcx\n"
5440         "mulq    %[mult]\n"
5441         "addq    %%rax, %%rcx\n"
5442         "adcq    $0, %%rdx\n"
5443         "movq    32(%%rsi), %%rax\n"
5444         "addq    %%rcx, 24(%%rdi)\n"
5445         "adcq    $0, %%rdx\n"
5446         "movq    %%rdx, %%rcx\n"
5447         "mulq    %[mult]\n"
5448         "addq    %%rax, %%rcx\n"
5449         "adcq    $0, %%rdx\n"
5450         "movq    40(%%rsi), %%rax\n"
5451         "addq    %%rcx, 32(%%rdi)\n"
5452         "adcq    $0, %%rdx\n"
5453         "movq    %%rdx, %%rcx\n"
5454         "mulq    %[mult]\n"
5455         "addq    %%rax, %%rcx\n"
5456         "adcq    $0, %%rdx\n"
5457         "movq    48(%%rsi), %%rax\n"
5458         "addq    %%rcx, 40(%%rdi)\n"
5459         "adcq    $0, %%rdx\n"
5460         "movq    %%rdx, %%rcx\n"
5461         "mulq    %[mult]\n"
5462         "addq    %%rax, %%rcx\n"
5463         "adcq    $0, %%rdx\n"
5464         "movq    56(%%rsi), %%rax\n"
5465         "addq    %%rcx, 48(%%rdi)\n"
5466         "adcq    $0, %%rdx\n"
5467         "movq    %%rdx, %%rcx\n"
5468         "mulq    %[mult]\n"
5469         "addq    %%rax, %%rcx\n"
5470         "adcq    $0, %%rdx\n"
5471         "movq    64(%%rsi), %%rax\n"
5472         "addq    %%rcx, 56(%%rdi)\n"
5473         "adcq    $0, %%rdx\n"
5474         "movq    %%rdx, %%rcx\n"
5475         "mulq    %[mult]\n"
5476         "addq    %%rax, %%rcx\n"
5477         "adcq    $0, %%rdx\n"
5478         "addq    %%rcx, 64(%%rdi)\n"
5479         "adcq    $0, %%rdx\n"
5480         "movq    %%rdx, %[carry]\n"
5481     : [carry]"=g"(carry), [z] "+m" (z)
5482     : [mult] "r" (c), [x] "m" (x)
5483     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
5484     return carry;
5485 }
5486 
5487 /* x and y have 9 words, z has 20. Put x*y in z. */
5488 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
5489 static inline
mpfq_fixmp_9_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)5490 void mpfq_fixmp_9_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
5491 {
5492     __asm__ __volatile__(
5493         "### x*y[0]\n"
5494         "movq    %2, %%r8\n"
5495         "movq    %0, %%rdi\n"
5496         "movq    0(%%r8), %%r9\n"
5497         "movq    %1, %%rsi\n"
5498         "movq    0(%%rsi), %%rax\n"
5499         "mulq    %%r9\n"
5500         "movq    %%rax, 0(%%rdi)\n"
5501         "movq    8(%%rsi), %%rax\n"
5502         "movq    %%rdx, %%rcx\n"
5503         "mulq    %%r9\n"
5504         "addq    %%rax, %%rcx\n"
5505         "adcq    $0, %%rdx\n"
5506         "movq    16(%%rsi), %%rax\n"
5507         "movq    %%rcx, 8(%%rdi)\n"
5508         "movq    %%rdx, %%rcx\n"
5509         "mulq    %%r9\n"
5510         "addq    %%rax, %%rcx\n"
5511         "adcq    $0, %%rdx\n"
5512         "movq    24(%%rsi), %%rax\n"
5513         "movq    %%rcx, 16(%%rdi)\n"
5514         "movq    %%rdx, %%rcx\n"
5515         "mulq    %%r9\n"
5516         "addq    %%rax, %%rcx\n"
5517         "adcq    $0, %%rdx\n"
5518         "movq    32(%%rsi), %%rax\n"
5519         "movq    %%rcx, 24(%%rdi)\n"
5520         "movq    %%rdx, %%rcx\n"
5521         "mulq    %%r9\n"
5522         "addq    %%rax, %%rcx\n"
5523         "adcq    $0, %%rdx\n"
5524         "movq    40(%%rsi), %%rax\n"
5525         "movq    %%rcx, 32(%%rdi)\n"
5526         "movq    %%rdx, %%rcx\n"
5527         "mulq    %%r9\n"
5528         "addq    %%rax, %%rcx\n"
5529         "adcq    $0, %%rdx\n"
5530         "movq    48(%%rsi), %%rax\n"
5531         "movq    %%rcx, 40(%%rdi)\n"
5532         "movq    %%rdx, %%rcx\n"
5533         "mulq    %%r9\n"
5534         "addq    %%rax, %%rcx\n"
5535         "adcq    $0, %%rdx\n"
5536         "movq    56(%%rsi), %%rax\n"
5537         "movq    %%rcx, 48(%%rdi)\n"
5538         "movq    %%rdx, %%rcx\n"
5539         "mulq    %%r9\n"
5540         "addq    %%rax, %%rcx\n"
5541         "adcq    $0, %%rdx\n"
5542         "movq    64(%%rsi), %%rax\n"
5543         "movq    %%rcx, 56(%%rdi)\n"
5544         "movq    %%rdx, %%rcx\n"
5545         "mulq    %%r9\n"
5546         "addq    %%rax, %%rcx\n"
5547         "adcq    $0, %%rdx\n"
5548         "movq    %%rcx, 64(%%rdi)\n"
5549         "movq    %%rdx, 72(%%rdi)\n"
5550         "movq    $0, 80(%%rdi)\n"
5551         "movq    $0, 88(%%rdi)\n"
5552         "movq    $0, 96(%%rdi)\n"
5553         "movq    $0, 104(%%rdi)\n"
5554         "movq    $0, 112(%%rdi)\n"
5555         "movq    $0, 120(%%rdi)\n"
5556         "movq    $0, 128(%%rdi)\n"
5557         "movq    $0, 136(%%rdi)\n"
5558         "### x*y[1]\n"
5559         "movq    8(%%r8), %%r9\n"
5560         "movq    0(%%rsi), %%rax\n"
5561         "mulq    %%r9\n"
5562         "addq    %%rax, 8(%%rdi)\n"
5563         "movq    8(%%rsi), %%rax\n"
5564         "adcq    $0, %%rdx\n"
5565         "movq    %%rdx, %%rcx\n"
5566         "mulq    %%r9\n"
5567         "addq    %%rax, %%rcx\n"
5568         "adcq    $0, %%rdx\n"
5569         "movq    16(%%rsi), %%rax\n"
5570         "addq    %%rcx, 16(%%rdi)\n"
5571         "adcq    $0, %%rdx\n"
5572         "movq    %%rdx, %%rcx\n"
5573         "mulq    %%r9\n"
5574         "addq    %%rax, %%rcx\n"
5575         "adcq    $0, %%rdx\n"
5576         "movq    24(%%rsi), %%rax\n"
5577         "addq    %%rcx, 24(%%rdi)\n"
5578         "adcq    $0, %%rdx\n"
5579         "movq    %%rdx, %%rcx\n"
5580         "mulq    %%r9\n"
5581         "addq    %%rax, %%rcx\n"
5582         "adcq    $0, %%rdx\n"
5583         "movq    32(%%rsi), %%rax\n"
5584         "addq    %%rcx, 32(%%rdi)\n"
5585         "adcq    $0, %%rdx\n"
5586         "movq    %%rdx, %%rcx\n"
5587         "mulq    %%r9\n"
5588         "addq    %%rax, %%rcx\n"
5589         "adcq    $0, %%rdx\n"
5590         "movq    40(%%rsi), %%rax\n"
5591         "addq    %%rcx, 40(%%rdi)\n"
5592         "adcq    $0, %%rdx\n"
5593         "movq    %%rdx, %%rcx\n"
5594         "mulq    %%r9\n"
5595         "addq    %%rax, %%rcx\n"
5596         "adcq    $0, %%rdx\n"
5597         "movq    48(%%rsi), %%rax\n"
5598         "addq    %%rcx, 48(%%rdi)\n"
5599         "adcq    $0, %%rdx\n"
5600         "movq    %%rdx, %%rcx\n"
5601         "mulq    %%r9\n"
5602         "addq    %%rax, %%rcx\n"
5603         "adcq    $0, %%rdx\n"
5604         "movq    56(%%rsi), %%rax\n"
5605         "addq    %%rcx, 56(%%rdi)\n"
5606         "adcq    $0, %%rdx\n"
5607         "movq    %%rdx, %%rcx\n"
5608         "mulq    %%r9\n"
5609         "addq    %%rax, %%rcx\n"
5610         "adcq    $0, %%rdx\n"
5611         "movq    64(%%rsi), %%rax\n"
5612         "addq    %%rcx, 64(%%rdi)\n"
5613         "adcq    $0, %%rdx\n"
5614         "movq    %%rdx, %%rcx\n"
5615         "mulq    %%r9\n"
5616         "addq    %%rax, %%rcx\n"
5617         "adcq    $0, %%rdx\n"
5618         "addq    %%rcx, 72(%%rdi)\n"
5619         "adcq    $0, %%rdx\n"
5620         "movq    %%rdx, 80(%%rdi)\n"
5621         "### x*y[2]\n"
5622         "movq    16(%%r8), %%r9\n"
5623         "movq    0(%%rsi), %%rax\n"
5624         "mulq    %%r9\n"
5625         "addq    %%rax, 16(%%rdi)\n"
5626         "movq    8(%%rsi), %%rax\n"
5627         "adcq    $0, %%rdx\n"
5628         "movq    %%rdx, %%rcx\n"
5629         "mulq    %%r9\n"
5630         "addq    %%rax, %%rcx\n"
5631         "adcq    $0, %%rdx\n"
5632         "movq    16(%%rsi), %%rax\n"
5633         "addq    %%rcx, 24(%%rdi)\n"
5634         "adcq    $0, %%rdx\n"
5635         "movq    %%rdx, %%rcx\n"
5636         "mulq    %%r9\n"
5637         "addq    %%rax, %%rcx\n"
5638         "adcq    $0, %%rdx\n"
5639         "movq    24(%%rsi), %%rax\n"
5640         "addq    %%rcx, 32(%%rdi)\n"
5641         "adcq    $0, %%rdx\n"
5642         "movq    %%rdx, %%rcx\n"
5643         "mulq    %%r9\n"
5644         "addq    %%rax, %%rcx\n"
5645         "adcq    $0, %%rdx\n"
5646         "movq    32(%%rsi), %%rax\n"
5647         "addq    %%rcx, 40(%%rdi)\n"
5648         "adcq    $0, %%rdx\n"
5649         "movq    %%rdx, %%rcx\n"
5650         "mulq    %%r9\n"
5651         "addq    %%rax, %%rcx\n"
5652         "adcq    $0, %%rdx\n"
5653         "movq    40(%%rsi), %%rax\n"
5654         "addq    %%rcx, 48(%%rdi)\n"
5655         "adcq    $0, %%rdx\n"
5656         "movq    %%rdx, %%rcx\n"
5657         "mulq    %%r9\n"
5658         "addq    %%rax, %%rcx\n"
5659         "adcq    $0, %%rdx\n"
5660         "movq    48(%%rsi), %%rax\n"
5661         "addq    %%rcx, 56(%%rdi)\n"
5662         "adcq    $0, %%rdx\n"
5663         "movq    %%rdx, %%rcx\n"
5664         "mulq    %%r9\n"
5665         "addq    %%rax, %%rcx\n"
5666         "adcq    $0, %%rdx\n"
5667         "movq    56(%%rsi), %%rax\n"
5668         "addq    %%rcx, 64(%%rdi)\n"
5669         "adcq    $0, %%rdx\n"
5670         "movq    %%rdx, %%rcx\n"
5671         "mulq    %%r9\n"
5672         "addq    %%rax, %%rcx\n"
5673         "adcq    $0, %%rdx\n"
5674         "movq    64(%%rsi), %%rax\n"
5675         "addq    %%rcx, 72(%%rdi)\n"
5676         "adcq    $0, %%rdx\n"
5677         "movq    %%rdx, %%rcx\n"
5678         "mulq    %%r9\n"
5679         "addq    %%rax, %%rcx\n"
5680         "adcq    $0, %%rdx\n"
5681         "addq    %%rcx, 80(%%rdi)\n"
5682         "adcq    $0, %%rdx\n"
5683         "movq    %%rdx, 88(%%rdi)\n"
5684         "### x*y[3]\n"
5685         "movq    24(%%r8), %%r9\n"
5686         "movq    0(%%rsi), %%rax\n"
5687         "mulq    %%r9\n"
5688         "addq    %%rax, 24(%%rdi)\n"
5689         "movq    8(%%rsi), %%rax\n"
5690         "adcq    $0, %%rdx\n"
5691         "movq    %%rdx, %%rcx\n"
5692         "mulq    %%r9\n"
5693         "addq    %%rax, %%rcx\n"
5694         "adcq    $0, %%rdx\n"
5695         "movq    16(%%rsi), %%rax\n"
5696         "addq    %%rcx, 32(%%rdi)\n"
5697         "adcq    $0, %%rdx\n"
5698         "movq    %%rdx, %%rcx\n"
5699         "mulq    %%r9\n"
5700         "addq    %%rax, %%rcx\n"
5701         "adcq    $0, %%rdx\n"
5702         "movq    24(%%rsi), %%rax\n"
5703         "addq    %%rcx, 40(%%rdi)\n"
5704         "adcq    $0, %%rdx\n"
5705         "movq    %%rdx, %%rcx\n"
5706         "mulq    %%r9\n"
5707         "addq    %%rax, %%rcx\n"
5708         "adcq    $0, %%rdx\n"
5709         "movq    32(%%rsi), %%rax\n"
5710         "addq    %%rcx, 48(%%rdi)\n"
5711         "adcq    $0, %%rdx\n"
5712         "movq    %%rdx, %%rcx\n"
5713         "mulq    %%r9\n"
5714         "addq    %%rax, %%rcx\n"
5715         "adcq    $0, %%rdx\n"
5716         "movq    40(%%rsi), %%rax\n"
5717         "addq    %%rcx, 56(%%rdi)\n"
5718         "adcq    $0, %%rdx\n"
5719         "movq    %%rdx, %%rcx\n"
5720         "mulq    %%r9\n"
5721         "addq    %%rax, %%rcx\n"
5722         "adcq    $0, %%rdx\n"
5723         "movq    48(%%rsi), %%rax\n"
5724         "addq    %%rcx, 64(%%rdi)\n"
5725         "adcq    $0, %%rdx\n"
5726         "movq    %%rdx, %%rcx\n"
5727         "mulq    %%r9\n"
5728         "addq    %%rax, %%rcx\n"
5729         "adcq    $0, %%rdx\n"
5730         "movq    56(%%rsi), %%rax\n"
5731         "addq    %%rcx, 72(%%rdi)\n"
5732         "adcq    $0, %%rdx\n"
5733         "movq    %%rdx, %%rcx\n"
5734         "mulq    %%r9\n"
5735         "addq    %%rax, %%rcx\n"
5736         "adcq    $0, %%rdx\n"
5737         "movq    64(%%rsi), %%rax\n"
5738         "addq    %%rcx, 80(%%rdi)\n"
5739         "adcq    $0, %%rdx\n"
5740         "movq    %%rdx, %%rcx\n"
5741         "mulq    %%r9\n"
5742         "addq    %%rax, %%rcx\n"
5743         "adcq    $0, %%rdx\n"
5744         "addq    %%rcx, 88(%%rdi)\n"
5745         "adcq    $0, %%rdx\n"
5746         "movq    %%rdx, 96(%%rdi)\n"
5747         "### x*y[4]\n"
5748         "movq    32(%%r8), %%r9\n"
5749         "movq    0(%%rsi), %%rax\n"
5750         "mulq    %%r9\n"
5751         "addq    %%rax, 32(%%rdi)\n"
5752         "movq    8(%%rsi), %%rax\n"
5753         "adcq    $0, %%rdx\n"
5754         "movq    %%rdx, %%rcx\n"
5755         "mulq    %%r9\n"
5756         "addq    %%rax, %%rcx\n"
5757         "adcq    $0, %%rdx\n"
5758         "movq    16(%%rsi), %%rax\n"
5759         "addq    %%rcx, 40(%%rdi)\n"
5760         "adcq    $0, %%rdx\n"
5761         "movq    %%rdx, %%rcx\n"
5762         "mulq    %%r9\n"
5763         "addq    %%rax, %%rcx\n"
5764         "adcq    $0, %%rdx\n"
5765         "movq    24(%%rsi), %%rax\n"
5766         "addq    %%rcx, 48(%%rdi)\n"
5767         "adcq    $0, %%rdx\n"
5768         "movq    %%rdx, %%rcx\n"
5769         "mulq    %%r9\n"
5770         "addq    %%rax, %%rcx\n"
5771         "adcq    $0, %%rdx\n"
5772         "movq    32(%%rsi), %%rax\n"
5773         "addq    %%rcx, 56(%%rdi)\n"
5774         "adcq    $0, %%rdx\n"
5775         "movq    %%rdx, %%rcx\n"
5776         "mulq    %%r9\n"
5777         "addq    %%rax, %%rcx\n"
5778         "adcq    $0, %%rdx\n"
5779         "movq    40(%%rsi), %%rax\n"
5780         "addq    %%rcx, 64(%%rdi)\n"
5781         "adcq    $0, %%rdx\n"
5782         "movq    %%rdx, %%rcx\n"
5783         "mulq    %%r9\n"
5784         "addq    %%rax, %%rcx\n"
5785         "adcq    $0, %%rdx\n"
5786         "movq    48(%%rsi), %%rax\n"
5787         "addq    %%rcx, 72(%%rdi)\n"
5788         "adcq    $0, %%rdx\n"
5789         "movq    %%rdx, %%rcx\n"
5790         "mulq    %%r9\n"
5791         "addq    %%rax, %%rcx\n"
5792         "adcq    $0, %%rdx\n"
5793         "movq    56(%%rsi), %%rax\n"
5794         "addq    %%rcx, 80(%%rdi)\n"
5795         "adcq    $0, %%rdx\n"
5796         "movq    %%rdx, %%rcx\n"
5797         "mulq    %%r9\n"
5798         "addq    %%rax, %%rcx\n"
5799         "adcq    $0, %%rdx\n"
5800         "movq    64(%%rsi), %%rax\n"
5801         "addq    %%rcx, 88(%%rdi)\n"
5802         "adcq    $0, %%rdx\n"
5803         "movq    %%rdx, %%rcx\n"
5804         "mulq    %%r9\n"
5805         "addq    %%rax, %%rcx\n"
5806         "adcq    $0, %%rdx\n"
5807         "addq    %%rcx, 96(%%rdi)\n"
5808         "adcq    $0, %%rdx\n"
5809         "movq    %%rdx, 104(%%rdi)\n"
5810         "### x*y[5]\n"
5811         "movq    40(%%r8), %%r9\n"
5812         "movq    0(%%rsi), %%rax\n"
5813         "mulq    %%r9\n"
5814         "addq    %%rax, 40(%%rdi)\n"
5815         "movq    8(%%rsi), %%rax\n"
5816         "adcq    $0, %%rdx\n"
5817         "movq    %%rdx, %%rcx\n"
5818         "mulq    %%r9\n"
5819         "addq    %%rax, %%rcx\n"
5820         "adcq    $0, %%rdx\n"
5821         "movq    16(%%rsi), %%rax\n"
5822         "addq    %%rcx, 48(%%rdi)\n"
5823         "adcq    $0, %%rdx\n"
5824         "movq    %%rdx, %%rcx\n"
5825         "mulq    %%r9\n"
5826         "addq    %%rax, %%rcx\n"
5827         "adcq    $0, %%rdx\n"
5828         "movq    24(%%rsi), %%rax\n"
5829         "addq    %%rcx, 56(%%rdi)\n"
5830         "adcq    $0, %%rdx\n"
5831         "movq    %%rdx, %%rcx\n"
5832         "mulq    %%r9\n"
5833         "addq    %%rax, %%rcx\n"
5834         "adcq    $0, %%rdx\n"
5835         "movq    32(%%rsi), %%rax\n"
5836         "addq    %%rcx, 64(%%rdi)\n"
5837         "adcq    $0, %%rdx\n"
5838         "movq    %%rdx, %%rcx\n"
5839         "mulq    %%r9\n"
5840         "addq    %%rax, %%rcx\n"
5841         "adcq    $0, %%rdx\n"
5842         "movq    40(%%rsi), %%rax\n"
5843         "addq    %%rcx, 72(%%rdi)\n"
5844         "adcq    $0, %%rdx\n"
5845         "movq    %%rdx, %%rcx\n"
5846         "mulq    %%r9\n"
5847         "addq    %%rax, %%rcx\n"
5848         "adcq    $0, %%rdx\n"
5849         "movq    48(%%rsi), %%rax\n"
5850         "addq    %%rcx, 80(%%rdi)\n"
5851         "adcq    $0, %%rdx\n"
5852         "movq    %%rdx, %%rcx\n"
5853         "mulq    %%r9\n"
5854         "addq    %%rax, %%rcx\n"
5855         "adcq    $0, %%rdx\n"
5856         "movq    56(%%rsi), %%rax\n"
5857         "addq    %%rcx, 88(%%rdi)\n"
5858         "adcq    $0, %%rdx\n"
5859         "movq    %%rdx, %%rcx\n"
5860         "mulq    %%r9\n"
5861         "addq    %%rax, %%rcx\n"
5862         "adcq    $0, %%rdx\n"
5863         "movq    64(%%rsi), %%rax\n"
5864         "addq    %%rcx, 96(%%rdi)\n"
5865         "adcq    $0, %%rdx\n"
5866         "movq    %%rdx, %%rcx\n"
5867         "mulq    %%r9\n"
5868         "addq    %%rax, %%rcx\n"
5869         "adcq    $0, %%rdx\n"
5870         "addq    %%rcx, 104(%%rdi)\n"
5871         "adcq    $0, %%rdx\n"
5872         "movq    %%rdx, 112(%%rdi)\n"
5873         "### x*y[6]\n"
5874         "movq    48(%%r8), %%r9\n"
5875         "movq    0(%%rsi), %%rax\n"
5876         "mulq    %%r9\n"
5877         "addq    %%rax, 48(%%rdi)\n"
5878         "movq    8(%%rsi), %%rax\n"
5879         "adcq    $0, %%rdx\n"
5880         "movq    %%rdx, %%rcx\n"
5881         "mulq    %%r9\n"
5882         "addq    %%rax, %%rcx\n"
5883         "adcq    $0, %%rdx\n"
5884         "movq    16(%%rsi), %%rax\n"
5885         "addq    %%rcx, 56(%%rdi)\n"
5886         "adcq    $0, %%rdx\n"
5887         "movq    %%rdx, %%rcx\n"
5888         "mulq    %%r9\n"
5889         "addq    %%rax, %%rcx\n"
5890         "adcq    $0, %%rdx\n"
5891         "movq    24(%%rsi), %%rax\n"
5892         "addq    %%rcx, 64(%%rdi)\n"
5893         "adcq    $0, %%rdx\n"
5894         "movq    %%rdx, %%rcx\n"
5895         "mulq    %%r9\n"
5896         "addq    %%rax, %%rcx\n"
5897         "adcq    $0, %%rdx\n"
5898         "movq    32(%%rsi), %%rax\n"
5899         "addq    %%rcx, 72(%%rdi)\n"
5900         "adcq    $0, %%rdx\n"
5901         "movq    %%rdx, %%rcx\n"
5902         "mulq    %%r9\n"
5903         "addq    %%rax, %%rcx\n"
5904         "adcq    $0, %%rdx\n"
5905         "movq    40(%%rsi), %%rax\n"
5906         "addq    %%rcx, 80(%%rdi)\n"
5907         "adcq    $0, %%rdx\n"
5908         "movq    %%rdx, %%rcx\n"
5909         "mulq    %%r9\n"
5910         "addq    %%rax, %%rcx\n"
5911         "adcq    $0, %%rdx\n"
5912         "movq    48(%%rsi), %%rax\n"
5913         "addq    %%rcx, 88(%%rdi)\n"
5914         "adcq    $0, %%rdx\n"
5915         "movq    %%rdx, %%rcx\n"
5916         "mulq    %%r9\n"
5917         "addq    %%rax, %%rcx\n"
5918         "adcq    $0, %%rdx\n"
5919         "movq    56(%%rsi), %%rax\n"
5920         "addq    %%rcx, 96(%%rdi)\n"
5921         "adcq    $0, %%rdx\n"
5922         "movq    %%rdx, %%rcx\n"
5923         "mulq    %%r9\n"
5924         "addq    %%rax, %%rcx\n"
5925         "adcq    $0, %%rdx\n"
5926         "movq    64(%%rsi), %%rax\n"
5927         "addq    %%rcx, 104(%%rdi)\n"
5928         "adcq    $0, %%rdx\n"
5929         "movq    %%rdx, %%rcx\n"
5930         "mulq    %%r9\n"
5931         "addq    %%rax, %%rcx\n"
5932         "adcq    $0, %%rdx\n"
5933         "addq    %%rcx, 112(%%rdi)\n"
5934         "adcq    $0, %%rdx\n"
5935         "movq    %%rdx, 120(%%rdi)\n"
5936         "### x*y[7]\n"
5937         "movq    56(%%r8), %%r9\n"
5938         "movq    0(%%rsi), %%rax\n"
5939         "mulq    %%r9\n"
5940         "addq    %%rax, 56(%%rdi)\n"
5941         "movq    8(%%rsi), %%rax\n"
5942         "adcq    $0, %%rdx\n"
5943         "movq    %%rdx, %%rcx\n"
5944         "mulq    %%r9\n"
5945         "addq    %%rax, %%rcx\n"
5946         "adcq    $0, %%rdx\n"
5947         "movq    16(%%rsi), %%rax\n"
5948         "addq    %%rcx, 64(%%rdi)\n"
5949         "adcq    $0, %%rdx\n"
5950         "movq    %%rdx, %%rcx\n"
5951         "mulq    %%r9\n"
5952         "addq    %%rax, %%rcx\n"
5953         "adcq    $0, %%rdx\n"
5954         "movq    24(%%rsi), %%rax\n"
5955         "addq    %%rcx, 72(%%rdi)\n"
5956         "adcq    $0, %%rdx\n"
5957         "movq    %%rdx, %%rcx\n"
5958         "mulq    %%r9\n"
5959         "addq    %%rax, %%rcx\n"
5960         "adcq    $0, %%rdx\n"
5961         "movq    32(%%rsi), %%rax\n"
5962         "addq    %%rcx, 80(%%rdi)\n"
5963         "adcq    $0, %%rdx\n"
5964         "movq    %%rdx, %%rcx\n"
5965         "mulq    %%r9\n"
5966         "addq    %%rax, %%rcx\n"
5967         "adcq    $0, %%rdx\n"
5968         "movq    40(%%rsi), %%rax\n"
5969         "addq    %%rcx, 88(%%rdi)\n"
5970         "adcq    $0, %%rdx\n"
5971         "movq    %%rdx, %%rcx\n"
5972         "mulq    %%r9\n"
5973         "addq    %%rax, %%rcx\n"
5974         "adcq    $0, %%rdx\n"
5975         "movq    48(%%rsi), %%rax\n"
5976         "addq    %%rcx, 96(%%rdi)\n"
5977         "adcq    $0, %%rdx\n"
5978         "movq    %%rdx, %%rcx\n"
5979         "mulq    %%r9\n"
5980         "addq    %%rax, %%rcx\n"
5981         "adcq    $0, %%rdx\n"
5982         "movq    56(%%rsi), %%rax\n"
5983         "addq    %%rcx, 104(%%rdi)\n"
5984         "adcq    $0, %%rdx\n"
5985         "movq    %%rdx, %%rcx\n"
5986         "mulq    %%r9\n"
5987         "addq    %%rax, %%rcx\n"
5988         "adcq    $0, %%rdx\n"
5989         "movq    64(%%rsi), %%rax\n"
5990         "addq    %%rcx, 112(%%rdi)\n"
5991         "adcq    $0, %%rdx\n"
5992         "movq    %%rdx, %%rcx\n"
5993         "mulq    %%r9\n"
5994         "addq    %%rax, %%rcx\n"
5995         "adcq    $0, %%rdx\n"
5996         "addq    %%rcx, 120(%%rdi)\n"
5997         "adcq    $0, %%rdx\n"
5998         "movq    %%rdx, 128(%%rdi)\n"
5999         "### x*y[8]\n"
6000         "movq    64(%%r8), %%r9\n"
6001         "movq    0(%%rsi), %%rax\n"
6002         "mulq    %%r9\n"
6003         "addq    %%rax, 64(%%rdi)\n"
6004         "movq    8(%%rsi), %%rax\n"
6005         "adcq    $0, %%rdx\n"
6006         "movq    %%rdx, %%rcx\n"
6007         "mulq    %%r9\n"
6008         "addq    %%rax, %%rcx\n"
6009         "adcq    $0, %%rdx\n"
6010         "movq    16(%%rsi), %%rax\n"
6011         "addq    %%rcx, 72(%%rdi)\n"
6012         "adcq    $0, %%rdx\n"
6013         "movq    %%rdx, %%rcx\n"
6014         "mulq    %%r9\n"
6015         "addq    %%rax, %%rcx\n"
6016         "adcq    $0, %%rdx\n"
6017         "movq    24(%%rsi), %%rax\n"
6018         "addq    %%rcx, 80(%%rdi)\n"
6019         "adcq    $0, %%rdx\n"
6020         "movq    %%rdx, %%rcx\n"
6021         "mulq    %%r9\n"
6022         "addq    %%rax, %%rcx\n"
6023         "adcq    $0, %%rdx\n"
6024         "movq    32(%%rsi), %%rax\n"
6025         "addq    %%rcx, 88(%%rdi)\n"
6026         "adcq    $0, %%rdx\n"
6027         "movq    %%rdx, %%rcx\n"
6028         "mulq    %%r9\n"
6029         "addq    %%rax, %%rcx\n"
6030         "adcq    $0, %%rdx\n"
6031         "movq    40(%%rsi), %%rax\n"
6032         "addq    %%rcx, 96(%%rdi)\n"
6033         "adcq    $0, %%rdx\n"
6034         "movq    %%rdx, %%rcx\n"
6035         "mulq    %%r9\n"
6036         "addq    %%rax, %%rcx\n"
6037         "adcq    $0, %%rdx\n"
6038         "movq    48(%%rsi), %%rax\n"
6039         "addq    %%rcx, 104(%%rdi)\n"
6040         "adcq    $0, %%rdx\n"
6041         "movq    %%rdx, %%rcx\n"
6042         "mulq    %%r9\n"
6043         "addq    %%rax, %%rcx\n"
6044         "adcq    $0, %%rdx\n"
6045         "movq    56(%%rsi), %%rax\n"
6046         "addq    %%rcx, 112(%%rdi)\n"
6047         "adcq    $0, %%rdx\n"
6048         "movq    %%rdx, %%rcx\n"
6049         "mulq    %%r9\n"
6050         "addq    %%rax, %%rcx\n"
6051         "adcq    $0, %%rdx\n"
6052         "movq    64(%%rsi), %%rax\n"
6053         "addq    %%rcx, 120(%%rdi)\n"
6054         "adcq    $0, %%rdx\n"
6055         "movq    %%rdx, %%rcx\n"
6056         "mulq    %%r9\n"
6057         "addq    %%rax, %%rcx\n"
6058         "adcq    $0, %%rdx\n"
6059         "addq    %%rcx, 128(%%rdi)\n"
6060         "adcq    $0, %%rdx\n"
6061         "movq    %%rdx, 136(%%rdi)\n"
6062       : "+m" (z)
6063       : "m" (x), "m" (y)
6064       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
6065 }
6066 
6067 /* x has 9 words, z has 20. Put x*y in z. */
6068 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
6069 static inline
mpfq_fixmp_9_sqr(mp_limb_t * z,const mp_limb_t * x)6070 void mpfq_fixmp_9_sqr(mp_limb_t * z, const mp_limb_t * x)
6071 {
6072     mpfq_fixmp_9_mul(z, x, x);
6073 }
6074 
6075 /* x has 9 words, z has 11. Put x*y in z. */
6076 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
6077 static inline
mpfq_fixmp_9_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)6078 void mpfq_fixmp_9_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
6079 {
6080     __asm__ __volatile__(
6081         "movq    %[z], %%rdi\n"
6082         "movq    %[x], %%rsi\n"
6083         "movq    0(%%rsi), %%rax\n"
6084         "mulq    %[mult]\n"
6085         "movq    %%rax, 0(%%rdi)\n"
6086         "movq    8(%%rsi), %%rax\n"
6087         "movq    %%rdx, %%rcx\n"
6088         "mulq    %[mult]\n"
6089         "addq    %%rax, %%rcx\n"
6090         "adcq    $0, %%rdx\n"
6091         "movq    16(%%rsi), %%rax\n"
6092         "movq    %%rcx, 8(%%rdi)\n"
6093         "movq    %%rdx, %%rcx\n"
6094         "mulq    %[mult]\n"
6095         "addq    %%rax, %%rcx\n"
6096         "adcq    $0, %%rdx\n"
6097         "movq    24(%%rsi), %%rax\n"
6098         "movq    %%rcx, 16(%%rdi)\n"
6099         "movq    %%rdx, %%rcx\n"
6100         "mulq    %[mult]\n"
6101         "addq    %%rax, %%rcx\n"
6102         "adcq    $0, %%rdx\n"
6103         "movq    32(%%rsi), %%rax\n"
6104         "movq    %%rcx, 24(%%rdi)\n"
6105         "movq    %%rdx, %%rcx\n"
6106         "mulq    %[mult]\n"
6107         "addq    %%rax, %%rcx\n"
6108         "adcq    $0, %%rdx\n"
6109         "movq    40(%%rsi), %%rax\n"
6110         "movq    %%rcx, 32(%%rdi)\n"
6111         "movq    %%rdx, %%rcx\n"
6112         "mulq    %[mult]\n"
6113         "addq    %%rax, %%rcx\n"
6114         "adcq    $0, %%rdx\n"
6115         "movq    48(%%rsi), %%rax\n"
6116         "movq    %%rcx, 40(%%rdi)\n"
6117         "movq    %%rdx, %%rcx\n"
6118         "mulq    %[mult]\n"
6119         "addq    %%rax, %%rcx\n"
6120         "adcq    $0, %%rdx\n"
6121         "movq    56(%%rsi), %%rax\n"
6122         "movq    %%rcx, 48(%%rdi)\n"
6123         "movq    %%rdx, %%rcx\n"
6124         "mulq    %[mult]\n"
6125         "addq    %%rax, %%rcx\n"
6126         "adcq    $0, %%rdx\n"
6127         "movq    64(%%rsi), %%rax\n"
6128         "movq    %%rcx, 56(%%rdi)\n"
6129         "movq    %%rdx, %%rcx\n"
6130         "mulq    %[mult]\n"
6131         "addq    %%rax, %%rcx\n"
6132         "adcq    $0, %%rdx\n"
6133         "movq    %%rcx, 64(%%rdi)\n"
6134         "movq    %%rdx, 72(%%rdi)\n"
6135     :
6136     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
6137     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
6138 }
6139 
6140 /* x, y, and z have 10 words. Result in z. Return carry bit */
6141 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
6142 static inline
mpfq_fixmp_10_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)6143 mp_limb_t mpfq_fixmp_10_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
6144 {
6145     mp_limb_t carry;
6146     __asm__ __volatile__(
6147         "movq    %[z], %%rdi\n"
6148         "movq    %[x], %%rsi\n"
6149         "movq    %[y], %%rdx\n"
6150         "movq    0(%%rsi), %%rax\n"
6151         "addq    0(%%rdx), %%rax\n"
6152         "movq    %%rax, 0(%%rdi)\n"
6153         "movq    8(%%rsi), %%rax\n"
6154         "adcq    8(%%rdx), %%rax\n"
6155         "movq    %%rax, 8(%%rdi)\n"
6156         "movq    16(%%rsi), %%rax\n"
6157         "adcq    16(%%rdx), %%rax\n"
6158         "movq    %%rax, 16(%%rdi)\n"
6159         "movq    24(%%rsi), %%rax\n"
6160         "adcq    24(%%rdx), %%rax\n"
6161         "movq    %%rax, 24(%%rdi)\n"
6162         "movq    32(%%rsi), %%rax\n"
6163         "adcq    32(%%rdx), %%rax\n"
6164         "movq    %%rax, 32(%%rdi)\n"
6165         "movq    40(%%rsi), %%rax\n"
6166         "adcq    40(%%rdx), %%rax\n"
6167         "movq    %%rax, 40(%%rdi)\n"
6168         "movq    48(%%rsi), %%rax\n"
6169         "adcq    48(%%rdx), %%rax\n"
6170         "movq    %%rax, 48(%%rdi)\n"
6171         "movq    56(%%rsi), %%rax\n"
6172         "adcq    56(%%rdx), %%rax\n"
6173         "movq    %%rax, 56(%%rdi)\n"
6174         "movq    64(%%rsi), %%rax\n"
6175         "adcq    64(%%rdx), %%rax\n"
6176         "movq    %%rax, 64(%%rdi)\n"
6177         "movq    72(%%rsi), %%rax\n"
6178         "adcq    72(%%rdx), %%rax\n"
6179         "movq    %%rax, 72(%%rdi)\n"
6180         "movq $0, %%rax\n"
6181         "adcq $0, %%rax\n"
6182     : "=&a"(carry)
6183     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
6184     : "%rdx", "%rsi", "%rdi", "memory");
6185     return carry;
6186 }
6187 
6188 /* x, y, and z have 10 words. Result in z. Return borrow bit */
6189 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
6190 static inline
mpfq_fixmp_10_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)6191 mp_limb_t mpfq_fixmp_10_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
6192 {
6193     mp_limb_t carry;
6194     __asm__ __volatile__(
6195         "movq    %[z], %%rdi\n"
6196         "movq    %[x], %%rsi\n"
6197         "movq    %[y], %%rdx\n"
6198         "movq    0(%%rsi), %%rax\n"
6199         "subq    0(%%rdx), %%rax\n"
6200         "movq    %%rax, 0(%%rdi)\n"
6201         "movq    8(%%rsi), %%rax\n"
6202         "sbbq    8(%%rdx), %%rax\n"
6203         "movq    %%rax, 8(%%rdi)\n"
6204         "movq    16(%%rsi), %%rax\n"
6205         "sbbq    16(%%rdx), %%rax\n"
6206         "movq    %%rax, 16(%%rdi)\n"
6207         "movq    24(%%rsi), %%rax\n"
6208         "sbbq    24(%%rdx), %%rax\n"
6209         "movq    %%rax, 24(%%rdi)\n"
6210         "movq    32(%%rsi), %%rax\n"
6211         "sbbq    32(%%rdx), %%rax\n"
6212         "movq    %%rax, 32(%%rdi)\n"
6213         "movq    40(%%rsi), %%rax\n"
6214         "sbbq    40(%%rdx), %%rax\n"
6215         "movq    %%rax, 40(%%rdi)\n"
6216         "movq    48(%%rsi), %%rax\n"
6217         "sbbq    48(%%rdx), %%rax\n"
6218         "movq    %%rax, 48(%%rdi)\n"
6219         "movq    56(%%rsi), %%rax\n"
6220         "sbbq    56(%%rdx), %%rax\n"
6221         "movq    %%rax, 56(%%rdi)\n"
6222         "movq    64(%%rsi), %%rax\n"
6223         "sbbq    64(%%rdx), %%rax\n"
6224         "movq    %%rax, 64(%%rdi)\n"
6225         "movq    72(%%rsi), %%rax\n"
6226         "sbbq    72(%%rdx), %%rax\n"
6227         "movq    %%rax, 72(%%rdi)\n"
6228         "movq $0, %%rax\n"
6229         "adcq $0, %%rax\n"
6230     : "=&a"(carry)
6231     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
6232     : "%rdx", "%rsi", "%rdi", "memory");
6233     return carry;
6234 }
6235 
6236 /* x, y, and z have 10 words. Result in z. Carry bit is lost. */
6237 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
6238 static inline
mpfq_fixmp_10_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)6239 void mpfq_fixmp_10_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
6240 {
6241     __asm__ __volatile__(
6242         "movq    %[z], %%rdi\n"
6243         "movq    %[x], %%rsi\n"
6244         "movq    %[y], %%rdx\n"
6245         "movq    0(%%rsi), %%rax\n"
6246         "addq    0(%%rdx), %%rax\n"
6247         "movq    %%rax, 0(%%rdi)\n"
6248         "movq    8(%%rsi), %%rax\n"
6249         "adcq    8(%%rdx), %%rax\n"
6250         "movq    %%rax, 8(%%rdi)\n"
6251         "movq    16(%%rsi), %%rax\n"
6252         "adcq    16(%%rdx), %%rax\n"
6253         "movq    %%rax, 16(%%rdi)\n"
6254         "movq    24(%%rsi), %%rax\n"
6255         "adcq    24(%%rdx), %%rax\n"
6256         "movq    %%rax, 24(%%rdi)\n"
6257         "movq    32(%%rsi), %%rax\n"
6258         "adcq    32(%%rdx), %%rax\n"
6259         "movq    %%rax, 32(%%rdi)\n"
6260         "movq    40(%%rsi), %%rax\n"
6261         "adcq    40(%%rdx), %%rax\n"
6262         "movq    %%rax, 40(%%rdi)\n"
6263         "movq    48(%%rsi), %%rax\n"
6264         "adcq    48(%%rdx), %%rax\n"
6265         "movq    %%rax, 48(%%rdi)\n"
6266         "movq    56(%%rsi), %%rax\n"
6267         "adcq    56(%%rdx), %%rax\n"
6268         "movq    %%rax, 56(%%rdi)\n"
6269         "movq    64(%%rsi), %%rax\n"
6270         "adcq    64(%%rdx), %%rax\n"
6271         "movq    %%rax, 64(%%rdi)\n"
6272         "movq    72(%%rsi), %%rax\n"
6273         "adcq    72(%%rdx), %%rax\n"
6274         "movq    %%rax, 72(%%rdi)\n"
6275     :
6276     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
6277     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
6278 }
6279 
6280 /* x, y, and z have 10 words. Result in z. Borrow bit is lost. */
6281 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
6282 static inline
mpfq_fixmp_10_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)6283 void mpfq_fixmp_10_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
6284 {
6285     __asm__ __volatile__(
6286         "movq    %[z], %%rdi\n"
6287         "movq    %[x], %%rsi\n"
6288         "movq    %[y], %%rdx\n"
6289         "movq    0(%%rsi), %%rax\n"
6290         "subq    0(%%rdx), %%rax\n"
6291         "movq    %%rax, 0(%%rdi)\n"
6292         "movq    8(%%rsi), %%rax\n"
6293         "sbbq    8(%%rdx), %%rax\n"
6294         "movq    %%rax, 8(%%rdi)\n"
6295         "movq    16(%%rsi), %%rax\n"
6296         "sbbq    16(%%rdx), %%rax\n"
6297         "movq    %%rax, 16(%%rdi)\n"
6298         "movq    24(%%rsi), %%rax\n"
6299         "sbbq    24(%%rdx), %%rax\n"
6300         "movq    %%rax, 24(%%rdi)\n"
6301         "movq    32(%%rsi), %%rax\n"
6302         "sbbq    32(%%rdx), %%rax\n"
6303         "movq    %%rax, 32(%%rdi)\n"
6304         "movq    40(%%rsi), %%rax\n"
6305         "sbbq    40(%%rdx), %%rax\n"
6306         "movq    %%rax, 40(%%rdi)\n"
6307         "movq    48(%%rsi), %%rax\n"
6308         "sbbq    48(%%rdx), %%rax\n"
6309         "movq    %%rax, 48(%%rdi)\n"
6310         "movq    56(%%rsi), %%rax\n"
6311         "sbbq    56(%%rdx), %%rax\n"
6312         "movq    %%rax, 56(%%rdi)\n"
6313         "movq    64(%%rsi), %%rax\n"
6314         "sbbq    64(%%rdx), %%rax\n"
6315         "movq    %%rax, 64(%%rdi)\n"
6316         "movq    72(%%rsi), %%rax\n"
6317         "sbbq    72(%%rdx), %%rax\n"
6318         "movq    %%rax, 72(%%rdi)\n"
6319     :
6320     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
6321     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
6322 }
6323 
6324 /* x has 10 words, z has 12.
6325  * Put (z+x*c) in z. Return carry bit. */
6326 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
6327 static inline
mpfq_fixmp_10_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)6328 mp_limb_t mpfq_fixmp_10_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
6329 {
6330     mp_limb_t carry;
6331     __asm__ __volatile__(
6332         "movq    %[z], %%rdi\n"
6333         "movq    %[x], %%rsi\n"
6334         "movq    0(%%rsi), %%rax\n"
6335         "mulq    %[mult]\n"
6336         "addq    %%rax, 0(%%rdi)\n"
6337         "movq    8(%%rsi), %%rax\n"
6338         "adcq    $0, %%rdx\n"
6339         "movq    %%rdx, %%rcx\n"
6340         "mulq    %[mult]\n"
6341         "addq    %%rax, %%rcx\n"
6342         "adcq    $0, %%rdx\n"
6343         "movq    16(%%rsi), %%rax\n"
6344         "addq    %%rcx, 8(%%rdi)\n"
6345         "adcq    $0, %%rdx\n"
6346         "movq    %%rdx, %%rcx\n"
6347         "mulq    %[mult]\n"
6348         "addq    %%rax, %%rcx\n"
6349         "adcq    $0, %%rdx\n"
6350         "movq    24(%%rsi), %%rax\n"
6351         "addq    %%rcx, 16(%%rdi)\n"
6352         "adcq    $0, %%rdx\n"
6353         "movq    %%rdx, %%rcx\n"
6354         "mulq    %[mult]\n"
6355         "addq    %%rax, %%rcx\n"
6356         "adcq    $0, %%rdx\n"
6357         "movq    32(%%rsi), %%rax\n"
6358         "addq    %%rcx, 24(%%rdi)\n"
6359         "adcq    $0, %%rdx\n"
6360         "movq    %%rdx, %%rcx\n"
6361         "mulq    %[mult]\n"
6362         "addq    %%rax, %%rcx\n"
6363         "adcq    $0, %%rdx\n"
6364         "movq    40(%%rsi), %%rax\n"
6365         "addq    %%rcx, 32(%%rdi)\n"
6366         "adcq    $0, %%rdx\n"
6367         "movq    %%rdx, %%rcx\n"
6368         "mulq    %[mult]\n"
6369         "addq    %%rax, %%rcx\n"
6370         "adcq    $0, %%rdx\n"
6371         "movq    48(%%rsi), %%rax\n"
6372         "addq    %%rcx, 40(%%rdi)\n"
6373         "adcq    $0, %%rdx\n"
6374         "movq    %%rdx, %%rcx\n"
6375         "mulq    %[mult]\n"
6376         "addq    %%rax, %%rcx\n"
6377         "adcq    $0, %%rdx\n"
6378         "movq    56(%%rsi), %%rax\n"
6379         "addq    %%rcx, 48(%%rdi)\n"
6380         "adcq    $0, %%rdx\n"
6381         "movq    %%rdx, %%rcx\n"
6382         "mulq    %[mult]\n"
6383         "addq    %%rax, %%rcx\n"
6384         "adcq    $0, %%rdx\n"
6385         "movq    64(%%rsi), %%rax\n"
6386         "addq    %%rcx, 56(%%rdi)\n"
6387         "adcq    $0, %%rdx\n"
6388         "movq    %%rdx, %%rcx\n"
6389         "mulq    %[mult]\n"
6390         "addq    %%rax, %%rcx\n"
6391         "adcq    $0, %%rdx\n"
6392         "movq    72(%%rsi), %%rax\n"
6393         "addq    %%rcx, 64(%%rdi)\n"
6394         "adcq    $0, %%rdx\n"
6395         "movq    %%rdx, %%rcx\n"
6396         "mulq    %[mult]\n"
6397         "addq    %%rax, %%rcx\n"
6398         "adcq    $0, %%rdx\n"
6399         "addq    %%rcx, 72(%%rdi)\n"
6400         "adcq    $0, %%rdx\n"
6401         "xorq    %%rcx, %%rcx\n"
6402         "addq    %%rdx, 80(%%rdi)\n"
6403         "adcq    $0, %%rcx\n"
6404         "movq    %%rcx, %[carry]\n"
6405     : [carry]"=g"(carry), [z] "+m" (z)
6406     : [mult] "r" (c), [x] "m" (x)
6407     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
6408     return carry;
6409 }
6410 
6411 /* x has 10 words, z has 12.
6412  * Put (z+x*c) in z. Carry bit is lost. */
6413 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
6414 static inline
mpfq_fixmp_10_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)6415 void mpfq_fixmp_10_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
6416 {
6417     __asm__ __volatile__(
6418         "movq    %[z], %%rdi\n"
6419         "movq    %[x], %%rsi\n"
6420         "movq    0(%%rsi), %%rax\n"
6421         "mulq    %[mult]\n"
6422         "addq    %%rax, 0(%%rdi)\n"
6423         "movq    8(%%rsi), %%rax\n"
6424         "adcq    $0, %%rdx\n"
6425         "movq    %%rdx, %%rcx\n"
6426         "mulq    %[mult]\n"
6427         "addq    %%rax, %%rcx\n"
6428         "adcq    $0, %%rdx\n"
6429         "movq    16(%%rsi), %%rax\n"
6430         "addq    %%rcx, 8(%%rdi)\n"
6431         "adcq    $0, %%rdx\n"
6432         "movq    %%rdx, %%rcx\n"
6433         "mulq    %[mult]\n"
6434         "addq    %%rax, %%rcx\n"
6435         "adcq    $0, %%rdx\n"
6436         "movq    24(%%rsi), %%rax\n"
6437         "addq    %%rcx, 16(%%rdi)\n"
6438         "adcq    $0, %%rdx\n"
6439         "movq    %%rdx, %%rcx\n"
6440         "mulq    %[mult]\n"
6441         "addq    %%rax, %%rcx\n"
6442         "adcq    $0, %%rdx\n"
6443         "movq    32(%%rsi), %%rax\n"
6444         "addq    %%rcx, 24(%%rdi)\n"
6445         "adcq    $0, %%rdx\n"
6446         "movq    %%rdx, %%rcx\n"
6447         "mulq    %[mult]\n"
6448         "addq    %%rax, %%rcx\n"
6449         "adcq    $0, %%rdx\n"
6450         "movq    40(%%rsi), %%rax\n"
6451         "addq    %%rcx, 32(%%rdi)\n"
6452         "adcq    $0, %%rdx\n"
6453         "movq    %%rdx, %%rcx\n"
6454         "mulq    %[mult]\n"
6455         "addq    %%rax, %%rcx\n"
6456         "adcq    $0, %%rdx\n"
6457         "movq    48(%%rsi), %%rax\n"
6458         "addq    %%rcx, 40(%%rdi)\n"
6459         "adcq    $0, %%rdx\n"
6460         "movq    %%rdx, %%rcx\n"
6461         "mulq    %[mult]\n"
6462         "addq    %%rax, %%rcx\n"
6463         "adcq    $0, %%rdx\n"
6464         "movq    56(%%rsi), %%rax\n"
6465         "addq    %%rcx, 48(%%rdi)\n"
6466         "adcq    $0, %%rdx\n"
6467         "movq    %%rdx, %%rcx\n"
6468         "mulq    %[mult]\n"
6469         "addq    %%rax, %%rcx\n"
6470         "adcq    $0, %%rdx\n"
6471         "movq    64(%%rsi), %%rax\n"
6472         "addq    %%rcx, 56(%%rdi)\n"
6473         "adcq    $0, %%rdx\n"
6474         "movq    %%rdx, %%rcx\n"
6475         "mulq    %[mult]\n"
6476         "addq    %%rax, %%rcx\n"
6477         "adcq    $0, %%rdx\n"
6478         "movq    72(%%rsi), %%rax\n"
6479         "addq    %%rcx, 64(%%rdi)\n"
6480         "adcq    $0, %%rdx\n"
6481         "movq    %%rdx, %%rcx\n"
6482         "mulq    %[mult]\n"
6483         "addq    %%rax, %%rcx\n"
6484         "adcq    $0, %%rdx\n"
6485         "addq    %%rcx, 72(%%rdi)\n"
6486         "adcq    $0, %%rdx\n"
6487         "addq    %%rdx, 80(%%rdi)\n"
6488     : [z] "+m" (z)
6489     : [mult] "r" (c), [x] "m" (x)
6490     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
6491 }
6492 
6493 /* x has 10 words, z has 11.
6494  * Put (z+x*c) in z. Return carry word. */
6495 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
6496 static inline
mpfq_fixmp_10_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)6497 mp_limb_t mpfq_fixmp_10_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
6498 {
6499     mp_limb_t carry;
6500     __asm__ __volatile__(
6501         "movq    %[z], %%rdi\n"
6502         "movq    %[x], %%rsi\n"
6503         "movq    0(%%rsi), %%rax\n"
6504         "mulq    %[mult]\n"
6505         "addq    %%rax, 0(%%rdi)\n"
6506         "movq    8(%%rsi), %%rax\n"
6507         "adcq    $0, %%rdx\n"
6508         "movq    %%rdx, %%rcx\n"
6509         "mulq    %[mult]\n"
6510         "addq    %%rax, %%rcx\n"
6511         "adcq    $0, %%rdx\n"
6512         "movq    16(%%rsi), %%rax\n"
6513         "addq    %%rcx, 8(%%rdi)\n"
6514         "adcq    $0, %%rdx\n"
6515         "movq    %%rdx, %%rcx\n"
6516         "mulq    %[mult]\n"
6517         "addq    %%rax, %%rcx\n"
6518         "adcq    $0, %%rdx\n"
6519         "movq    24(%%rsi), %%rax\n"
6520         "addq    %%rcx, 16(%%rdi)\n"
6521         "adcq    $0, %%rdx\n"
6522         "movq    %%rdx, %%rcx\n"
6523         "mulq    %[mult]\n"
6524         "addq    %%rax, %%rcx\n"
6525         "adcq    $0, %%rdx\n"
6526         "movq    32(%%rsi), %%rax\n"
6527         "addq    %%rcx, 24(%%rdi)\n"
6528         "adcq    $0, %%rdx\n"
6529         "movq    %%rdx, %%rcx\n"
6530         "mulq    %[mult]\n"
6531         "addq    %%rax, %%rcx\n"
6532         "adcq    $0, %%rdx\n"
6533         "movq    40(%%rsi), %%rax\n"
6534         "addq    %%rcx, 32(%%rdi)\n"
6535         "adcq    $0, %%rdx\n"
6536         "movq    %%rdx, %%rcx\n"
6537         "mulq    %[mult]\n"
6538         "addq    %%rax, %%rcx\n"
6539         "adcq    $0, %%rdx\n"
6540         "movq    48(%%rsi), %%rax\n"
6541         "addq    %%rcx, 40(%%rdi)\n"
6542         "adcq    $0, %%rdx\n"
6543         "movq    %%rdx, %%rcx\n"
6544         "mulq    %[mult]\n"
6545         "addq    %%rax, %%rcx\n"
6546         "adcq    $0, %%rdx\n"
6547         "movq    56(%%rsi), %%rax\n"
6548         "addq    %%rcx, 48(%%rdi)\n"
6549         "adcq    $0, %%rdx\n"
6550         "movq    %%rdx, %%rcx\n"
6551         "mulq    %[mult]\n"
6552         "addq    %%rax, %%rcx\n"
6553         "adcq    $0, %%rdx\n"
6554         "movq    64(%%rsi), %%rax\n"
6555         "addq    %%rcx, 56(%%rdi)\n"
6556         "adcq    $0, %%rdx\n"
6557         "movq    %%rdx, %%rcx\n"
6558         "mulq    %[mult]\n"
6559         "addq    %%rax, %%rcx\n"
6560         "adcq    $0, %%rdx\n"
6561         "movq    72(%%rsi), %%rax\n"
6562         "addq    %%rcx, 64(%%rdi)\n"
6563         "adcq    $0, %%rdx\n"
6564         "movq    %%rdx, %%rcx\n"
6565         "mulq    %[mult]\n"
6566         "addq    %%rax, %%rcx\n"
6567         "adcq    $0, %%rdx\n"
6568         "addq    %%rcx, 72(%%rdi)\n"
6569         "adcq    $0, %%rdx\n"
6570         "movq    %%rdx, %[carry]\n"
6571     : [carry]"=g"(carry), [z] "+m" (z)
6572     : [mult] "r" (c), [x] "m" (x)
6573     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
6574     return carry;
6575 }
6576 
6577 /* x and y have 10 words, z has 22. Put x*y in z. */
6578 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
6579 static inline
mpfq_fixmp_10_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)6580 void mpfq_fixmp_10_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
6581 {
6582     __asm__ __volatile__(
6583         "### x*y[0]\n"
6584         "movq    %2, %%r8\n"
6585         "movq    %0, %%rdi\n"
6586         "movq    0(%%r8), %%r9\n"
6587         "movq    %1, %%rsi\n"
6588         "movq    0(%%rsi), %%rax\n"
6589         "mulq    %%r9\n"
6590         "movq    %%rax, 0(%%rdi)\n"
6591         "movq    8(%%rsi), %%rax\n"
6592         "movq    %%rdx, %%rcx\n"
6593         "mulq    %%r9\n"
6594         "addq    %%rax, %%rcx\n"
6595         "adcq    $0, %%rdx\n"
6596         "movq    16(%%rsi), %%rax\n"
6597         "movq    %%rcx, 8(%%rdi)\n"
6598         "movq    %%rdx, %%rcx\n"
6599         "mulq    %%r9\n"
6600         "addq    %%rax, %%rcx\n"
6601         "adcq    $0, %%rdx\n"
6602         "movq    24(%%rsi), %%rax\n"
6603         "movq    %%rcx, 16(%%rdi)\n"
6604         "movq    %%rdx, %%rcx\n"
6605         "mulq    %%r9\n"
6606         "addq    %%rax, %%rcx\n"
6607         "adcq    $0, %%rdx\n"
6608         "movq    32(%%rsi), %%rax\n"
6609         "movq    %%rcx, 24(%%rdi)\n"
6610         "movq    %%rdx, %%rcx\n"
6611         "mulq    %%r9\n"
6612         "addq    %%rax, %%rcx\n"
6613         "adcq    $0, %%rdx\n"
6614         "movq    40(%%rsi), %%rax\n"
6615         "movq    %%rcx, 32(%%rdi)\n"
6616         "movq    %%rdx, %%rcx\n"
6617         "mulq    %%r9\n"
6618         "addq    %%rax, %%rcx\n"
6619         "adcq    $0, %%rdx\n"
6620         "movq    48(%%rsi), %%rax\n"
6621         "movq    %%rcx, 40(%%rdi)\n"
6622         "movq    %%rdx, %%rcx\n"
6623         "mulq    %%r9\n"
6624         "addq    %%rax, %%rcx\n"
6625         "adcq    $0, %%rdx\n"
6626         "movq    56(%%rsi), %%rax\n"
6627         "movq    %%rcx, 48(%%rdi)\n"
6628         "movq    %%rdx, %%rcx\n"
6629         "mulq    %%r9\n"
6630         "addq    %%rax, %%rcx\n"
6631         "adcq    $0, %%rdx\n"
6632         "movq    64(%%rsi), %%rax\n"
6633         "movq    %%rcx, 56(%%rdi)\n"
6634         "movq    %%rdx, %%rcx\n"
6635         "mulq    %%r9\n"
6636         "addq    %%rax, %%rcx\n"
6637         "adcq    $0, %%rdx\n"
6638         "movq    72(%%rsi), %%rax\n"
6639         "movq    %%rcx, 64(%%rdi)\n"
6640         "movq    %%rdx, %%rcx\n"
6641         "mulq    %%r9\n"
6642         "addq    %%rax, %%rcx\n"
6643         "adcq    $0, %%rdx\n"
6644         "movq    %%rcx, 72(%%rdi)\n"
6645         "movq    %%rdx, 80(%%rdi)\n"
6646         "movq    $0, 88(%%rdi)\n"
6647         "movq    $0, 96(%%rdi)\n"
6648         "movq    $0, 104(%%rdi)\n"
6649         "movq    $0, 112(%%rdi)\n"
6650         "movq    $0, 120(%%rdi)\n"
6651         "movq    $0, 128(%%rdi)\n"
6652         "movq    $0, 136(%%rdi)\n"
6653         "movq    $0, 144(%%rdi)\n"
6654         "movq    $0, 152(%%rdi)\n"
6655         "### x*y[1]\n"
6656         "movq    8(%%r8), %%r9\n"
6657         "movq    0(%%rsi), %%rax\n"
6658         "mulq    %%r9\n"
6659         "addq    %%rax, 8(%%rdi)\n"
6660         "movq    8(%%rsi), %%rax\n"
6661         "adcq    $0, %%rdx\n"
6662         "movq    %%rdx, %%rcx\n"
6663         "mulq    %%r9\n"
6664         "addq    %%rax, %%rcx\n"
6665         "adcq    $0, %%rdx\n"
6666         "movq    16(%%rsi), %%rax\n"
6667         "addq    %%rcx, 16(%%rdi)\n"
6668         "adcq    $0, %%rdx\n"
6669         "movq    %%rdx, %%rcx\n"
6670         "mulq    %%r9\n"
6671         "addq    %%rax, %%rcx\n"
6672         "adcq    $0, %%rdx\n"
6673         "movq    24(%%rsi), %%rax\n"
6674         "addq    %%rcx, 24(%%rdi)\n"
6675         "adcq    $0, %%rdx\n"
6676         "movq    %%rdx, %%rcx\n"
6677         "mulq    %%r9\n"
6678         "addq    %%rax, %%rcx\n"
6679         "adcq    $0, %%rdx\n"
6680         "movq    32(%%rsi), %%rax\n"
6681         "addq    %%rcx, 32(%%rdi)\n"
6682         "adcq    $0, %%rdx\n"
6683         "movq    %%rdx, %%rcx\n"
6684         "mulq    %%r9\n"
6685         "addq    %%rax, %%rcx\n"
6686         "adcq    $0, %%rdx\n"
6687         "movq    40(%%rsi), %%rax\n"
6688         "addq    %%rcx, 40(%%rdi)\n"
6689         "adcq    $0, %%rdx\n"
6690         "movq    %%rdx, %%rcx\n"
6691         "mulq    %%r9\n"
6692         "addq    %%rax, %%rcx\n"
6693         "adcq    $0, %%rdx\n"
6694         "movq    48(%%rsi), %%rax\n"
6695         "addq    %%rcx, 48(%%rdi)\n"
6696         "adcq    $0, %%rdx\n"
6697         "movq    %%rdx, %%rcx\n"
6698         "mulq    %%r9\n"
6699         "addq    %%rax, %%rcx\n"
6700         "adcq    $0, %%rdx\n"
6701         "movq    56(%%rsi), %%rax\n"
6702         "addq    %%rcx, 56(%%rdi)\n"
6703         "adcq    $0, %%rdx\n"
6704         "movq    %%rdx, %%rcx\n"
6705         "mulq    %%r9\n"
6706         "addq    %%rax, %%rcx\n"
6707         "adcq    $0, %%rdx\n"
6708         "movq    64(%%rsi), %%rax\n"
6709         "addq    %%rcx, 64(%%rdi)\n"
6710         "adcq    $0, %%rdx\n"
6711         "movq    %%rdx, %%rcx\n"
6712         "mulq    %%r9\n"
6713         "addq    %%rax, %%rcx\n"
6714         "adcq    $0, %%rdx\n"
6715         "movq    72(%%rsi), %%rax\n"
6716         "addq    %%rcx, 72(%%rdi)\n"
6717         "adcq    $0, %%rdx\n"
6718         "movq    %%rdx, %%rcx\n"
6719         "mulq    %%r9\n"
6720         "addq    %%rax, %%rcx\n"
6721         "adcq    $0, %%rdx\n"
6722         "addq    %%rcx, 80(%%rdi)\n"
6723         "adcq    $0, %%rdx\n"
6724         "movq    %%rdx, 88(%%rdi)\n"
6725         "### x*y[2]\n"
6726         "movq    16(%%r8), %%r9\n"
6727         "movq    0(%%rsi), %%rax\n"
6728         "mulq    %%r9\n"
6729         "addq    %%rax, 16(%%rdi)\n"
6730         "movq    8(%%rsi), %%rax\n"
6731         "adcq    $0, %%rdx\n"
6732         "movq    %%rdx, %%rcx\n"
6733         "mulq    %%r9\n"
6734         "addq    %%rax, %%rcx\n"
6735         "adcq    $0, %%rdx\n"
6736         "movq    16(%%rsi), %%rax\n"
6737         "addq    %%rcx, 24(%%rdi)\n"
6738         "adcq    $0, %%rdx\n"
6739         "movq    %%rdx, %%rcx\n"
6740         "mulq    %%r9\n"
6741         "addq    %%rax, %%rcx\n"
6742         "adcq    $0, %%rdx\n"
6743         "movq    24(%%rsi), %%rax\n"
6744         "addq    %%rcx, 32(%%rdi)\n"
6745         "adcq    $0, %%rdx\n"
6746         "movq    %%rdx, %%rcx\n"
6747         "mulq    %%r9\n"
6748         "addq    %%rax, %%rcx\n"
6749         "adcq    $0, %%rdx\n"
6750         "movq    32(%%rsi), %%rax\n"
6751         "addq    %%rcx, 40(%%rdi)\n"
6752         "adcq    $0, %%rdx\n"
6753         "movq    %%rdx, %%rcx\n"
6754         "mulq    %%r9\n"
6755         "addq    %%rax, %%rcx\n"
6756         "adcq    $0, %%rdx\n"
6757         "movq    40(%%rsi), %%rax\n"
6758         "addq    %%rcx, 48(%%rdi)\n"
6759         "adcq    $0, %%rdx\n"
6760         "movq    %%rdx, %%rcx\n"
6761         "mulq    %%r9\n"
6762         "addq    %%rax, %%rcx\n"
6763         "adcq    $0, %%rdx\n"
6764         "movq    48(%%rsi), %%rax\n"
6765         "addq    %%rcx, 56(%%rdi)\n"
6766         "adcq    $0, %%rdx\n"
6767         "movq    %%rdx, %%rcx\n"
6768         "mulq    %%r9\n"
6769         "addq    %%rax, %%rcx\n"
6770         "adcq    $0, %%rdx\n"
6771         "movq    56(%%rsi), %%rax\n"
6772         "addq    %%rcx, 64(%%rdi)\n"
6773         "adcq    $0, %%rdx\n"
6774         "movq    %%rdx, %%rcx\n"
6775         "mulq    %%r9\n"
6776         "addq    %%rax, %%rcx\n"
6777         "adcq    $0, %%rdx\n"
6778         "movq    64(%%rsi), %%rax\n"
6779         "addq    %%rcx, 72(%%rdi)\n"
6780         "adcq    $0, %%rdx\n"
6781         "movq    %%rdx, %%rcx\n"
6782         "mulq    %%r9\n"
6783         "addq    %%rax, %%rcx\n"
6784         "adcq    $0, %%rdx\n"
6785         "movq    72(%%rsi), %%rax\n"
6786         "addq    %%rcx, 80(%%rdi)\n"
6787         "adcq    $0, %%rdx\n"
6788         "movq    %%rdx, %%rcx\n"
6789         "mulq    %%r9\n"
6790         "addq    %%rax, %%rcx\n"
6791         "adcq    $0, %%rdx\n"
6792         "addq    %%rcx, 88(%%rdi)\n"
6793         "adcq    $0, %%rdx\n"
6794         "movq    %%rdx, 96(%%rdi)\n"
6795         "### x*y[3]\n"
6796         "movq    24(%%r8), %%r9\n"
6797         "movq    0(%%rsi), %%rax\n"
6798         "mulq    %%r9\n"
6799         "addq    %%rax, 24(%%rdi)\n"
6800         "movq    8(%%rsi), %%rax\n"
6801         "adcq    $0, %%rdx\n"
6802         "movq    %%rdx, %%rcx\n"
6803         "mulq    %%r9\n"
6804         "addq    %%rax, %%rcx\n"
6805         "adcq    $0, %%rdx\n"
6806         "movq    16(%%rsi), %%rax\n"
6807         "addq    %%rcx, 32(%%rdi)\n"
6808         "adcq    $0, %%rdx\n"
6809         "movq    %%rdx, %%rcx\n"
6810         "mulq    %%r9\n"
6811         "addq    %%rax, %%rcx\n"
6812         "adcq    $0, %%rdx\n"
6813         "movq    24(%%rsi), %%rax\n"
6814         "addq    %%rcx, 40(%%rdi)\n"
6815         "adcq    $0, %%rdx\n"
6816         "movq    %%rdx, %%rcx\n"
6817         "mulq    %%r9\n"
6818         "addq    %%rax, %%rcx\n"
6819         "adcq    $0, %%rdx\n"
6820         "movq    32(%%rsi), %%rax\n"
6821         "addq    %%rcx, 48(%%rdi)\n"
6822         "adcq    $0, %%rdx\n"
6823         "movq    %%rdx, %%rcx\n"
6824         "mulq    %%r9\n"
6825         "addq    %%rax, %%rcx\n"
6826         "adcq    $0, %%rdx\n"
6827         "movq    40(%%rsi), %%rax\n"
6828         "addq    %%rcx, 56(%%rdi)\n"
6829         "adcq    $0, %%rdx\n"
6830         "movq    %%rdx, %%rcx\n"
6831         "mulq    %%r9\n"
6832         "addq    %%rax, %%rcx\n"
6833         "adcq    $0, %%rdx\n"
6834         "movq    48(%%rsi), %%rax\n"
6835         "addq    %%rcx, 64(%%rdi)\n"
6836         "adcq    $0, %%rdx\n"
6837         "movq    %%rdx, %%rcx\n"
6838         "mulq    %%r9\n"
6839         "addq    %%rax, %%rcx\n"
6840         "adcq    $0, %%rdx\n"
6841         "movq    56(%%rsi), %%rax\n"
6842         "addq    %%rcx, 72(%%rdi)\n"
6843         "adcq    $0, %%rdx\n"
6844         "movq    %%rdx, %%rcx\n"
6845         "mulq    %%r9\n"
6846         "addq    %%rax, %%rcx\n"
6847         "adcq    $0, %%rdx\n"
6848         "movq    64(%%rsi), %%rax\n"
6849         "addq    %%rcx, 80(%%rdi)\n"
6850         "adcq    $0, %%rdx\n"
6851         "movq    %%rdx, %%rcx\n"
6852         "mulq    %%r9\n"
6853         "addq    %%rax, %%rcx\n"
6854         "adcq    $0, %%rdx\n"
6855         "movq    72(%%rsi), %%rax\n"
6856         "addq    %%rcx, 88(%%rdi)\n"
6857         "adcq    $0, %%rdx\n"
6858         "movq    %%rdx, %%rcx\n"
6859         "mulq    %%r9\n"
6860         "addq    %%rax, %%rcx\n"
6861         "adcq    $0, %%rdx\n"
6862         "addq    %%rcx, 96(%%rdi)\n"
6863         "adcq    $0, %%rdx\n"
6864         "movq    %%rdx, 104(%%rdi)\n"
6865         "### x*y[4]\n"
6866         "movq    32(%%r8), %%r9\n"
6867         "movq    0(%%rsi), %%rax\n"
6868         "mulq    %%r9\n"
6869         "addq    %%rax, 32(%%rdi)\n"
6870         "movq    8(%%rsi), %%rax\n"
6871         "adcq    $0, %%rdx\n"
6872         "movq    %%rdx, %%rcx\n"
6873         "mulq    %%r9\n"
6874         "addq    %%rax, %%rcx\n"
6875         "adcq    $0, %%rdx\n"
6876         "movq    16(%%rsi), %%rax\n"
6877         "addq    %%rcx, 40(%%rdi)\n"
6878         "adcq    $0, %%rdx\n"
6879         "movq    %%rdx, %%rcx\n"
6880         "mulq    %%r9\n"
6881         "addq    %%rax, %%rcx\n"
6882         "adcq    $0, %%rdx\n"
6883         "movq    24(%%rsi), %%rax\n"
6884         "addq    %%rcx, 48(%%rdi)\n"
6885         "adcq    $0, %%rdx\n"
6886         "movq    %%rdx, %%rcx\n"
6887         "mulq    %%r9\n"
6888         "addq    %%rax, %%rcx\n"
6889         "adcq    $0, %%rdx\n"
6890         "movq    32(%%rsi), %%rax\n"
6891         "addq    %%rcx, 56(%%rdi)\n"
6892         "adcq    $0, %%rdx\n"
6893         "movq    %%rdx, %%rcx\n"
6894         "mulq    %%r9\n"
6895         "addq    %%rax, %%rcx\n"
6896         "adcq    $0, %%rdx\n"
6897         "movq    40(%%rsi), %%rax\n"
6898         "addq    %%rcx, 64(%%rdi)\n"
6899         "adcq    $0, %%rdx\n"
6900         "movq    %%rdx, %%rcx\n"
6901         "mulq    %%r9\n"
6902         "addq    %%rax, %%rcx\n"
6903         "adcq    $0, %%rdx\n"
6904         "movq    48(%%rsi), %%rax\n"
6905         "addq    %%rcx, 72(%%rdi)\n"
6906         "adcq    $0, %%rdx\n"
6907         "movq    %%rdx, %%rcx\n"
6908         "mulq    %%r9\n"
6909         "addq    %%rax, %%rcx\n"
6910         "adcq    $0, %%rdx\n"
6911         "movq    56(%%rsi), %%rax\n"
6912         "addq    %%rcx, 80(%%rdi)\n"
6913         "adcq    $0, %%rdx\n"
6914         "movq    %%rdx, %%rcx\n"
6915         "mulq    %%r9\n"
6916         "addq    %%rax, %%rcx\n"
6917         "adcq    $0, %%rdx\n"
6918         "movq    64(%%rsi), %%rax\n"
6919         "addq    %%rcx, 88(%%rdi)\n"
6920         "adcq    $0, %%rdx\n"
6921         "movq    %%rdx, %%rcx\n"
6922         "mulq    %%r9\n"
6923         "addq    %%rax, %%rcx\n"
6924         "adcq    $0, %%rdx\n"
6925         "movq    72(%%rsi), %%rax\n"
6926         "addq    %%rcx, 96(%%rdi)\n"
6927         "adcq    $0, %%rdx\n"
6928         "movq    %%rdx, %%rcx\n"
6929         "mulq    %%r9\n"
6930         "addq    %%rax, %%rcx\n"
6931         "adcq    $0, %%rdx\n"
6932         "addq    %%rcx, 104(%%rdi)\n"
6933         "adcq    $0, %%rdx\n"
6934         "movq    %%rdx, 112(%%rdi)\n"
6935         "### x*y[5]\n"
6936         "movq    40(%%r8), %%r9\n"
6937         "movq    0(%%rsi), %%rax\n"
6938         "mulq    %%r9\n"
6939         "addq    %%rax, 40(%%rdi)\n"
6940         "movq    8(%%rsi), %%rax\n"
6941         "adcq    $0, %%rdx\n"
6942         "movq    %%rdx, %%rcx\n"
6943         "mulq    %%r9\n"
6944         "addq    %%rax, %%rcx\n"
6945         "adcq    $0, %%rdx\n"
6946         "movq    16(%%rsi), %%rax\n"
6947         "addq    %%rcx, 48(%%rdi)\n"
6948         "adcq    $0, %%rdx\n"
6949         "movq    %%rdx, %%rcx\n"
6950         "mulq    %%r9\n"
6951         "addq    %%rax, %%rcx\n"
6952         "adcq    $0, %%rdx\n"
6953         "movq    24(%%rsi), %%rax\n"
6954         "addq    %%rcx, 56(%%rdi)\n"
6955         "adcq    $0, %%rdx\n"
6956         "movq    %%rdx, %%rcx\n"
6957         "mulq    %%r9\n"
6958         "addq    %%rax, %%rcx\n"
6959         "adcq    $0, %%rdx\n"
6960         "movq    32(%%rsi), %%rax\n"
6961         "addq    %%rcx, 64(%%rdi)\n"
6962         "adcq    $0, %%rdx\n"
6963         "movq    %%rdx, %%rcx\n"
6964         "mulq    %%r9\n"
6965         "addq    %%rax, %%rcx\n"
6966         "adcq    $0, %%rdx\n"
6967         "movq    40(%%rsi), %%rax\n"
6968         "addq    %%rcx, 72(%%rdi)\n"
6969         "adcq    $0, %%rdx\n"
6970         "movq    %%rdx, %%rcx\n"
6971         "mulq    %%r9\n"
6972         "addq    %%rax, %%rcx\n"
6973         "adcq    $0, %%rdx\n"
6974         "movq    48(%%rsi), %%rax\n"
6975         "addq    %%rcx, 80(%%rdi)\n"
6976         "adcq    $0, %%rdx\n"
6977         "movq    %%rdx, %%rcx\n"
6978         "mulq    %%r9\n"
6979         "addq    %%rax, %%rcx\n"
6980         "adcq    $0, %%rdx\n"
6981         "movq    56(%%rsi), %%rax\n"
6982         "addq    %%rcx, 88(%%rdi)\n"
6983         "adcq    $0, %%rdx\n"
6984         "movq    %%rdx, %%rcx\n"
6985         "mulq    %%r9\n"
6986         "addq    %%rax, %%rcx\n"
6987         "adcq    $0, %%rdx\n"
6988         "movq    64(%%rsi), %%rax\n"
6989         "addq    %%rcx, 96(%%rdi)\n"
6990         "adcq    $0, %%rdx\n"
6991         "movq    %%rdx, %%rcx\n"
6992         "mulq    %%r9\n"
6993         "addq    %%rax, %%rcx\n"
6994         "adcq    $0, %%rdx\n"
6995         "movq    72(%%rsi), %%rax\n"
6996         "addq    %%rcx, 104(%%rdi)\n"
6997         "adcq    $0, %%rdx\n"
6998         "movq    %%rdx, %%rcx\n"
6999         "mulq    %%r9\n"
7000         "addq    %%rax, %%rcx\n"
7001         "adcq    $0, %%rdx\n"
7002         "addq    %%rcx, 112(%%rdi)\n"
7003         "adcq    $0, %%rdx\n"
7004         "movq    %%rdx, 120(%%rdi)\n"
7005         "### x*y[6]\n"
7006         "movq    48(%%r8), %%r9\n"
7007         "movq    0(%%rsi), %%rax\n"
7008         "mulq    %%r9\n"
7009         "addq    %%rax, 48(%%rdi)\n"
7010         "movq    8(%%rsi), %%rax\n"
7011         "adcq    $0, %%rdx\n"
7012         "movq    %%rdx, %%rcx\n"
7013         "mulq    %%r9\n"
7014         "addq    %%rax, %%rcx\n"
7015         "adcq    $0, %%rdx\n"
7016         "movq    16(%%rsi), %%rax\n"
7017         "addq    %%rcx, 56(%%rdi)\n"
7018         "adcq    $0, %%rdx\n"
7019         "movq    %%rdx, %%rcx\n"
7020         "mulq    %%r9\n"
7021         "addq    %%rax, %%rcx\n"
7022         "adcq    $0, %%rdx\n"
7023         "movq    24(%%rsi), %%rax\n"
7024         "addq    %%rcx, 64(%%rdi)\n"
7025         "adcq    $0, %%rdx\n"
7026         "movq    %%rdx, %%rcx\n"
7027         "mulq    %%r9\n"
7028         "addq    %%rax, %%rcx\n"
7029         "adcq    $0, %%rdx\n"
7030         "movq    32(%%rsi), %%rax\n"
7031         "addq    %%rcx, 72(%%rdi)\n"
7032         "adcq    $0, %%rdx\n"
7033         "movq    %%rdx, %%rcx\n"
7034         "mulq    %%r9\n"
7035         "addq    %%rax, %%rcx\n"
7036         "adcq    $0, %%rdx\n"
7037         "movq    40(%%rsi), %%rax\n"
7038         "addq    %%rcx, 80(%%rdi)\n"
7039         "adcq    $0, %%rdx\n"
7040         "movq    %%rdx, %%rcx\n"
7041         "mulq    %%r9\n"
7042         "addq    %%rax, %%rcx\n"
7043         "adcq    $0, %%rdx\n"
7044         "movq    48(%%rsi), %%rax\n"
7045         "addq    %%rcx, 88(%%rdi)\n"
7046         "adcq    $0, %%rdx\n"
7047         "movq    %%rdx, %%rcx\n"
7048         "mulq    %%r9\n"
7049         "addq    %%rax, %%rcx\n"
7050         "adcq    $0, %%rdx\n"
7051         "movq    56(%%rsi), %%rax\n"
7052         "addq    %%rcx, 96(%%rdi)\n"
7053         "adcq    $0, %%rdx\n"
7054         "movq    %%rdx, %%rcx\n"
7055         "mulq    %%r9\n"
7056         "addq    %%rax, %%rcx\n"
7057         "adcq    $0, %%rdx\n"
7058         "movq    64(%%rsi), %%rax\n"
7059         "addq    %%rcx, 104(%%rdi)\n"
7060         "adcq    $0, %%rdx\n"
7061         "movq    %%rdx, %%rcx\n"
7062         "mulq    %%r9\n"
7063         "addq    %%rax, %%rcx\n"
7064         "adcq    $0, %%rdx\n"
7065         "movq    72(%%rsi), %%rax\n"
7066         "addq    %%rcx, 112(%%rdi)\n"
7067         "adcq    $0, %%rdx\n"
7068         "movq    %%rdx, %%rcx\n"
7069         "mulq    %%r9\n"
7070         "addq    %%rax, %%rcx\n"
7071         "adcq    $0, %%rdx\n"
7072         "addq    %%rcx, 120(%%rdi)\n"
7073         "adcq    $0, %%rdx\n"
7074         "movq    %%rdx, 128(%%rdi)\n"
7075         "### x*y[7]\n"
7076         "movq    56(%%r8), %%r9\n"
7077         "movq    0(%%rsi), %%rax\n"
7078         "mulq    %%r9\n"
7079         "addq    %%rax, 56(%%rdi)\n"
7080         "movq    8(%%rsi), %%rax\n"
7081         "adcq    $0, %%rdx\n"
7082         "movq    %%rdx, %%rcx\n"
7083         "mulq    %%r9\n"
7084         "addq    %%rax, %%rcx\n"
7085         "adcq    $0, %%rdx\n"
7086         "movq    16(%%rsi), %%rax\n"
7087         "addq    %%rcx, 64(%%rdi)\n"
7088         "adcq    $0, %%rdx\n"
7089         "movq    %%rdx, %%rcx\n"
7090         "mulq    %%r9\n"
7091         "addq    %%rax, %%rcx\n"
7092         "adcq    $0, %%rdx\n"
7093         "movq    24(%%rsi), %%rax\n"
7094         "addq    %%rcx, 72(%%rdi)\n"
7095         "adcq    $0, %%rdx\n"
7096         "movq    %%rdx, %%rcx\n"
7097         "mulq    %%r9\n"
7098         "addq    %%rax, %%rcx\n"
7099         "adcq    $0, %%rdx\n"
7100         "movq    32(%%rsi), %%rax\n"
7101         "addq    %%rcx, 80(%%rdi)\n"
7102         "adcq    $0, %%rdx\n"
7103         "movq    %%rdx, %%rcx\n"
7104         "mulq    %%r9\n"
7105         "addq    %%rax, %%rcx\n"
7106         "adcq    $0, %%rdx\n"
7107         "movq    40(%%rsi), %%rax\n"
7108         "addq    %%rcx, 88(%%rdi)\n"
7109         "adcq    $0, %%rdx\n"
7110         "movq    %%rdx, %%rcx\n"
7111         "mulq    %%r9\n"
7112         "addq    %%rax, %%rcx\n"
7113         "adcq    $0, %%rdx\n"
7114         "movq    48(%%rsi), %%rax\n"
7115         "addq    %%rcx, 96(%%rdi)\n"
7116         "adcq    $0, %%rdx\n"
7117         "movq    %%rdx, %%rcx\n"
7118         "mulq    %%r9\n"
7119         "addq    %%rax, %%rcx\n"
7120         "adcq    $0, %%rdx\n"
7121         "movq    56(%%rsi), %%rax\n"
7122         "addq    %%rcx, 104(%%rdi)\n"
7123         "adcq    $0, %%rdx\n"
7124         "movq    %%rdx, %%rcx\n"
7125         "mulq    %%r9\n"
7126         "addq    %%rax, %%rcx\n"
7127         "adcq    $0, %%rdx\n"
7128         "movq    64(%%rsi), %%rax\n"
7129         "addq    %%rcx, 112(%%rdi)\n"
7130         "adcq    $0, %%rdx\n"
7131         "movq    %%rdx, %%rcx\n"
7132         "mulq    %%r9\n"
7133         "addq    %%rax, %%rcx\n"
7134         "adcq    $0, %%rdx\n"
7135         "movq    72(%%rsi), %%rax\n"
7136         "addq    %%rcx, 120(%%rdi)\n"
7137         "adcq    $0, %%rdx\n"
7138         "movq    %%rdx, %%rcx\n"
7139         "mulq    %%r9\n"
7140         "addq    %%rax, %%rcx\n"
7141         "adcq    $0, %%rdx\n"
7142         "addq    %%rcx, 128(%%rdi)\n"
7143         "adcq    $0, %%rdx\n"
7144         "movq    %%rdx, 136(%%rdi)\n"
7145         "### x*y[8]\n"
7146         "movq    64(%%r8), %%r9\n"
7147         "movq    0(%%rsi), %%rax\n"
7148         "mulq    %%r9\n"
7149         "addq    %%rax, 64(%%rdi)\n"
7150         "movq    8(%%rsi), %%rax\n"
7151         "adcq    $0, %%rdx\n"
7152         "movq    %%rdx, %%rcx\n"
7153         "mulq    %%r9\n"
7154         "addq    %%rax, %%rcx\n"
7155         "adcq    $0, %%rdx\n"
7156         "movq    16(%%rsi), %%rax\n"
7157         "addq    %%rcx, 72(%%rdi)\n"
7158         "adcq    $0, %%rdx\n"
7159         "movq    %%rdx, %%rcx\n"
7160         "mulq    %%r9\n"
7161         "addq    %%rax, %%rcx\n"
7162         "adcq    $0, %%rdx\n"
7163         "movq    24(%%rsi), %%rax\n"
7164         "addq    %%rcx, 80(%%rdi)\n"
7165         "adcq    $0, %%rdx\n"
7166         "movq    %%rdx, %%rcx\n"
7167         "mulq    %%r9\n"
7168         "addq    %%rax, %%rcx\n"
7169         "adcq    $0, %%rdx\n"
7170         "movq    32(%%rsi), %%rax\n"
7171         "addq    %%rcx, 88(%%rdi)\n"
7172         "adcq    $0, %%rdx\n"
7173         "movq    %%rdx, %%rcx\n"
7174         "mulq    %%r9\n"
7175         "addq    %%rax, %%rcx\n"
7176         "adcq    $0, %%rdx\n"
7177         "movq    40(%%rsi), %%rax\n"
7178         "addq    %%rcx, 96(%%rdi)\n"
7179         "adcq    $0, %%rdx\n"
7180         "movq    %%rdx, %%rcx\n"
7181         "mulq    %%r9\n"
7182         "addq    %%rax, %%rcx\n"
7183         "adcq    $0, %%rdx\n"
7184         "movq    48(%%rsi), %%rax\n"
7185         "addq    %%rcx, 104(%%rdi)\n"
7186         "adcq    $0, %%rdx\n"
7187         "movq    %%rdx, %%rcx\n"
7188         "mulq    %%r9\n"
7189         "addq    %%rax, %%rcx\n"
7190         "adcq    $0, %%rdx\n"
7191         "movq    56(%%rsi), %%rax\n"
7192         "addq    %%rcx, 112(%%rdi)\n"
7193         "adcq    $0, %%rdx\n"
7194         "movq    %%rdx, %%rcx\n"
7195         "mulq    %%r9\n"
7196         "addq    %%rax, %%rcx\n"
7197         "adcq    $0, %%rdx\n"
7198         "movq    64(%%rsi), %%rax\n"
7199         "addq    %%rcx, 120(%%rdi)\n"
7200         "adcq    $0, %%rdx\n"
7201         "movq    %%rdx, %%rcx\n"
7202         "mulq    %%r9\n"
7203         "addq    %%rax, %%rcx\n"
7204         "adcq    $0, %%rdx\n"
7205         "movq    72(%%rsi), %%rax\n"
7206         "addq    %%rcx, 128(%%rdi)\n"
7207         "adcq    $0, %%rdx\n"
7208         "movq    %%rdx, %%rcx\n"
7209         "mulq    %%r9\n"
7210         "addq    %%rax, %%rcx\n"
7211         "adcq    $0, %%rdx\n"
7212         "addq    %%rcx, 136(%%rdi)\n"
7213         "adcq    $0, %%rdx\n"
7214         "movq    %%rdx, 144(%%rdi)\n"
7215         "### x*y[9]\n"
7216         "movq    72(%%r8), %%r9\n"
7217         "movq    0(%%rsi), %%rax\n"
7218         "mulq    %%r9\n"
7219         "addq    %%rax, 72(%%rdi)\n"
7220         "movq    8(%%rsi), %%rax\n"
7221         "adcq    $0, %%rdx\n"
7222         "movq    %%rdx, %%rcx\n"
7223         "mulq    %%r9\n"
7224         "addq    %%rax, %%rcx\n"
7225         "adcq    $0, %%rdx\n"
7226         "movq    16(%%rsi), %%rax\n"
7227         "addq    %%rcx, 80(%%rdi)\n"
7228         "adcq    $0, %%rdx\n"
7229         "movq    %%rdx, %%rcx\n"
7230         "mulq    %%r9\n"
7231         "addq    %%rax, %%rcx\n"
7232         "adcq    $0, %%rdx\n"
7233         "movq    24(%%rsi), %%rax\n"
7234         "addq    %%rcx, 88(%%rdi)\n"
7235         "adcq    $0, %%rdx\n"
7236         "movq    %%rdx, %%rcx\n"
7237         "mulq    %%r9\n"
7238         "addq    %%rax, %%rcx\n"
7239         "adcq    $0, %%rdx\n"
7240         "movq    32(%%rsi), %%rax\n"
7241         "addq    %%rcx, 96(%%rdi)\n"
7242         "adcq    $0, %%rdx\n"
7243         "movq    %%rdx, %%rcx\n"
7244         "mulq    %%r9\n"
7245         "addq    %%rax, %%rcx\n"
7246         "adcq    $0, %%rdx\n"
7247         "movq    40(%%rsi), %%rax\n"
7248         "addq    %%rcx, 104(%%rdi)\n"
7249         "adcq    $0, %%rdx\n"
7250         "movq    %%rdx, %%rcx\n"
7251         "mulq    %%r9\n"
7252         "addq    %%rax, %%rcx\n"
7253         "adcq    $0, %%rdx\n"
7254         "movq    48(%%rsi), %%rax\n"
7255         "addq    %%rcx, 112(%%rdi)\n"
7256         "adcq    $0, %%rdx\n"
7257         "movq    %%rdx, %%rcx\n"
7258         "mulq    %%r9\n"
7259         "addq    %%rax, %%rcx\n"
7260         "adcq    $0, %%rdx\n"
7261         "movq    56(%%rsi), %%rax\n"
7262         "addq    %%rcx, 120(%%rdi)\n"
7263         "adcq    $0, %%rdx\n"
7264         "movq    %%rdx, %%rcx\n"
7265         "mulq    %%r9\n"
7266         "addq    %%rax, %%rcx\n"
7267         "adcq    $0, %%rdx\n"
7268         "movq    64(%%rsi), %%rax\n"
7269         "addq    %%rcx, 128(%%rdi)\n"
7270         "adcq    $0, %%rdx\n"
7271         "movq    %%rdx, %%rcx\n"
7272         "mulq    %%r9\n"
7273         "addq    %%rax, %%rcx\n"
7274         "adcq    $0, %%rdx\n"
7275         "movq    72(%%rsi), %%rax\n"
7276         "addq    %%rcx, 136(%%rdi)\n"
7277         "adcq    $0, %%rdx\n"
7278         "movq    %%rdx, %%rcx\n"
7279         "mulq    %%r9\n"
7280         "addq    %%rax, %%rcx\n"
7281         "adcq    $0, %%rdx\n"
7282         "addq    %%rcx, 144(%%rdi)\n"
7283         "adcq    $0, %%rdx\n"
7284         "movq    %%rdx, 152(%%rdi)\n"
7285       : "+m" (z)
7286       : "m" (x), "m" (y)
7287       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
7288 }
7289 
7290 /* x has 10 words, z has 22. Put x*y in z. */
7291 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
7292 static inline
mpfq_fixmp_10_sqr(mp_limb_t * z,const mp_limb_t * x)7293 void mpfq_fixmp_10_sqr(mp_limb_t * z, const mp_limb_t * x)
7294 {
7295     mpfq_fixmp_10_mul(z, x, x);
7296 }
7297 
7298 /* x has 10 words, z has 12. Put x*y in z. */
7299 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
7300 static inline
mpfq_fixmp_10_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)7301 void mpfq_fixmp_10_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
7302 {
7303     __asm__ __volatile__(
7304         "movq    %[z], %%rdi\n"
7305         "movq    %[x], %%rsi\n"
7306         "movq    0(%%rsi), %%rax\n"
7307         "mulq    %[mult]\n"
7308         "movq    %%rax, 0(%%rdi)\n"
7309         "movq    8(%%rsi), %%rax\n"
7310         "movq    %%rdx, %%rcx\n"
7311         "mulq    %[mult]\n"
7312         "addq    %%rax, %%rcx\n"
7313         "adcq    $0, %%rdx\n"
7314         "movq    16(%%rsi), %%rax\n"
7315         "movq    %%rcx, 8(%%rdi)\n"
7316         "movq    %%rdx, %%rcx\n"
7317         "mulq    %[mult]\n"
7318         "addq    %%rax, %%rcx\n"
7319         "adcq    $0, %%rdx\n"
7320         "movq    24(%%rsi), %%rax\n"
7321         "movq    %%rcx, 16(%%rdi)\n"
7322         "movq    %%rdx, %%rcx\n"
7323         "mulq    %[mult]\n"
7324         "addq    %%rax, %%rcx\n"
7325         "adcq    $0, %%rdx\n"
7326         "movq    32(%%rsi), %%rax\n"
7327         "movq    %%rcx, 24(%%rdi)\n"
7328         "movq    %%rdx, %%rcx\n"
7329         "mulq    %[mult]\n"
7330         "addq    %%rax, %%rcx\n"
7331         "adcq    $0, %%rdx\n"
7332         "movq    40(%%rsi), %%rax\n"
7333         "movq    %%rcx, 32(%%rdi)\n"
7334         "movq    %%rdx, %%rcx\n"
7335         "mulq    %[mult]\n"
7336         "addq    %%rax, %%rcx\n"
7337         "adcq    $0, %%rdx\n"
7338         "movq    48(%%rsi), %%rax\n"
7339         "movq    %%rcx, 40(%%rdi)\n"
7340         "movq    %%rdx, %%rcx\n"
7341         "mulq    %[mult]\n"
7342         "addq    %%rax, %%rcx\n"
7343         "adcq    $0, %%rdx\n"
7344         "movq    56(%%rsi), %%rax\n"
7345         "movq    %%rcx, 48(%%rdi)\n"
7346         "movq    %%rdx, %%rcx\n"
7347         "mulq    %[mult]\n"
7348         "addq    %%rax, %%rcx\n"
7349         "adcq    $0, %%rdx\n"
7350         "movq    64(%%rsi), %%rax\n"
7351         "movq    %%rcx, 56(%%rdi)\n"
7352         "movq    %%rdx, %%rcx\n"
7353         "mulq    %[mult]\n"
7354         "addq    %%rax, %%rcx\n"
7355         "adcq    $0, %%rdx\n"
7356         "movq    72(%%rsi), %%rax\n"
7357         "movq    %%rcx, 64(%%rdi)\n"
7358         "movq    %%rdx, %%rcx\n"
7359         "mulq    %[mult]\n"
7360         "addq    %%rax, %%rcx\n"
7361         "adcq    $0, %%rdx\n"
7362         "movq    %%rcx, 72(%%rdi)\n"
7363         "movq    %%rdx, 80(%%rdi)\n"
7364     :
7365     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
7366     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
7367 }
7368 
7369 /* x, y, and z have 11 words. Result in z. Return carry bit */
7370 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
7371 static inline
mpfq_fixmp_11_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)7372 mp_limb_t mpfq_fixmp_11_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
7373 {
7374     mp_limb_t carry;
7375     __asm__ __volatile__(
7376         "movq    %[z], %%rdi\n"
7377         "movq    %[x], %%rsi\n"
7378         "movq    %[y], %%rdx\n"
7379         "movq    0(%%rsi), %%rax\n"
7380         "addq    0(%%rdx), %%rax\n"
7381         "movq    %%rax, 0(%%rdi)\n"
7382         "movq    8(%%rsi), %%rax\n"
7383         "adcq    8(%%rdx), %%rax\n"
7384         "movq    %%rax, 8(%%rdi)\n"
7385         "movq    16(%%rsi), %%rax\n"
7386         "adcq    16(%%rdx), %%rax\n"
7387         "movq    %%rax, 16(%%rdi)\n"
7388         "movq    24(%%rsi), %%rax\n"
7389         "adcq    24(%%rdx), %%rax\n"
7390         "movq    %%rax, 24(%%rdi)\n"
7391         "movq    32(%%rsi), %%rax\n"
7392         "adcq    32(%%rdx), %%rax\n"
7393         "movq    %%rax, 32(%%rdi)\n"
7394         "movq    40(%%rsi), %%rax\n"
7395         "adcq    40(%%rdx), %%rax\n"
7396         "movq    %%rax, 40(%%rdi)\n"
7397         "movq    48(%%rsi), %%rax\n"
7398         "adcq    48(%%rdx), %%rax\n"
7399         "movq    %%rax, 48(%%rdi)\n"
7400         "movq    56(%%rsi), %%rax\n"
7401         "adcq    56(%%rdx), %%rax\n"
7402         "movq    %%rax, 56(%%rdi)\n"
7403         "movq    64(%%rsi), %%rax\n"
7404         "adcq    64(%%rdx), %%rax\n"
7405         "movq    %%rax, 64(%%rdi)\n"
7406         "movq    72(%%rsi), %%rax\n"
7407         "adcq    72(%%rdx), %%rax\n"
7408         "movq    %%rax, 72(%%rdi)\n"
7409         "movq    80(%%rsi), %%rax\n"
7410         "adcq    80(%%rdx), %%rax\n"
7411         "movq    %%rax, 80(%%rdi)\n"
7412         "movq $0, %%rax\n"
7413         "adcq $0, %%rax\n"
7414     : "=&a"(carry)
7415     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
7416     : "%rdx", "%rsi", "%rdi", "memory");
7417     return carry;
7418 }
7419 
7420 /* x, y, and z have 11 words. Result in z. Return borrow bit */
7421 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
7422 static inline
mpfq_fixmp_11_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)7423 mp_limb_t mpfq_fixmp_11_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
7424 {
7425     mp_limb_t carry;
7426     __asm__ __volatile__(
7427         "movq    %[z], %%rdi\n"
7428         "movq    %[x], %%rsi\n"
7429         "movq    %[y], %%rdx\n"
7430         "movq    0(%%rsi), %%rax\n"
7431         "subq    0(%%rdx), %%rax\n"
7432         "movq    %%rax, 0(%%rdi)\n"
7433         "movq    8(%%rsi), %%rax\n"
7434         "sbbq    8(%%rdx), %%rax\n"
7435         "movq    %%rax, 8(%%rdi)\n"
7436         "movq    16(%%rsi), %%rax\n"
7437         "sbbq    16(%%rdx), %%rax\n"
7438         "movq    %%rax, 16(%%rdi)\n"
7439         "movq    24(%%rsi), %%rax\n"
7440         "sbbq    24(%%rdx), %%rax\n"
7441         "movq    %%rax, 24(%%rdi)\n"
7442         "movq    32(%%rsi), %%rax\n"
7443         "sbbq    32(%%rdx), %%rax\n"
7444         "movq    %%rax, 32(%%rdi)\n"
7445         "movq    40(%%rsi), %%rax\n"
7446         "sbbq    40(%%rdx), %%rax\n"
7447         "movq    %%rax, 40(%%rdi)\n"
7448         "movq    48(%%rsi), %%rax\n"
7449         "sbbq    48(%%rdx), %%rax\n"
7450         "movq    %%rax, 48(%%rdi)\n"
7451         "movq    56(%%rsi), %%rax\n"
7452         "sbbq    56(%%rdx), %%rax\n"
7453         "movq    %%rax, 56(%%rdi)\n"
7454         "movq    64(%%rsi), %%rax\n"
7455         "sbbq    64(%%rdx), %%rax\n"
7456         "movq    %%rax, 64(%%rdi)\n"
7457         "movq    72(%%rsi), %%rax\n"
7458         "sbbq    72(%%rdx), %%rax\n"
7459         "movq    %%rax, 72(%%rdi)\n"
7460         "movq    80(%%rsi), %%rax\n"
7461         "sbbq    80(%%rdx), %%rax\n"
7462         "movq    %%rax, 80(%%rdi)\n"
7463         "movq $0, %%rax\n"
7464         "adcq $0, %%rax\n"
7465     : "=&a"(carry)
7466     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
7467     : "%rdx", "%rsi", "%rdi", "memory");
7468     return carry;
7469 }
7470 
7471 /* x, y, and z have 11 words. Result in z. Carry bit is lost. */
7472 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
7473 static inline
mpfq_fixmp_11_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)7474 void mpfq_fixmp_11_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
7475 {
7476     __asm__ __volatile__(
7477         "movq    %[z], %%rdi\n"
7478         "movq    %[x], %%rsi\n"
7479         "movq    %[y], %%rdx\n"
7480         "movq    0(%%rsi), %%rax\n"
7481         "addq    0(%%rdx), %%rax\n"
7482         "movq    %%rax, 0(%%rdi)\n"
7483         "movq    8(%%rsi), %%rax\n"
7484         "adcq    8(%%rdx), %%rax\n"
7485         "movq    %%rax, 8(%%rdi)\n"
7486         "movq    16(%%rsi), %%rax\n"
7487         "adcq    16(%%rdx), %%rax\n"
7488         "movq    %%rax, 16(%%rdi)\n"
7489         "movq    24(%%rsi), %%rax\n"
7490         "adcq    24(%%rdx), %%rax\n"
7491         "movq    %%rax, 24(%%rdi)\n"
7492         "movq    32(%%rsi), %%rax\n"
7493         "adcq    32(%%rdx), %%rax\n"
7494         "movq    %%rax, 32(%%rdi)\n"
7495         "movq    40(%%rsi), %%rax\n"
7496         "adcq    40(%%rdx), %%rax\n"
7497         "movq    %%rax, 40(%%rdi)\n"
7498         "movq    48(%%rsi), %%rax\n"
7499         "adcq    48(%%rdx), %%rax\n"
7500         "movq    %%rax, 48(%%rdi)\n"
7501         "movq    56(%%rsi), %%rax\n"
7502         "adcq    56(%%rdx), %%rax\n"
7503         "movq    %%rax, 56(%%rdi)\n"
7504         "movq    64(%%rsi), %%rax\n"
7505         "adcq    64(%%rdx), %%rax\n"
7506         "movq    %%rax, 64(%%rdi)\n"
7507         "movq    72(%%rsi), %%rax\n"
7508         "adcq    72(%%rdx), %%rax\n"
7509         "movq    %%rax, 72(%%rdi)\n"
7510         "movq    80(%%rsi), %%rax\n"
7511         "adcq    80(%%rdx), %%rax\n"
7512         "movq    %%rax, 80(%%rdi)\n"
7513     :
7514     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
7515     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
7516 }
7517 
7518 /* x, y, and z have 11 words. Result in z. Borrow bit is lost. */
7519 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
7520 static inline
mpfq_fixmp_11_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)7521 void mpfq_fixmp_11_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
7522 {
7523     __asm__ __volatile__(
7524         "movq    %[z], %%rdi\n"
7525         "movq    %[x], %%rsi\n"
7526         "movq    %[y], %%rdx\n"
7527         "movq    0(%%rsi), %%rax\n"
7528         "subq    0(%%rdx), %%rax\n"
7529         "movq    %%rax, 0(%%rdi)\n"
7530         "movq    8(%%rsi), %%rax\n"
7531         "sbbq    8(%%rdx), %%rax\n"
7532         "movq    %%rax, 8(%%rdi)\n"
7533         "movq    16(%%rsi), %%rax\n"
7534         "sbbq    16(%%rdx), %%rax\n"
7535         "movq    %%rax, 16(%%rdi)\n"
7536         "movq    24(%%rsi), %%rax\n"
7537         "sbbq    24(%%rdx), %%rax\n"
7538         "movq    %%rax, 24(%%rdi)\n"
7539         "movq    32(%%rsi), %%rax\n"
7540         "sbbq    32(%%rdx), %%rax\n"
7541         "movq    %%rax, 32(%%rdi)\n"
7542         "movq    40(%%rsi), %%rax\n"
7543         "sbbq    40(%%rdx), %%rax\n"
7544         "movq    %%rax, 40(%%rdi)\n"
7545         "movq    48(%%rsi), %%rax\n"
7546         "sbbq    48(%%rdx), %%rax\n"
7547         "movq    %%rax, 48(%%rdi)\n"
7548         "movq    56(%%rsi), %%rax\n"
7549         "sbbq    56(%%rdx), %%rax\n"
7550         "movq    %%rax, 56(%%rdi)\n"
7551         "movq    64(%%rsi), %%rax\n"
7552         "sbbq    64(%%rdx), %%rax\n"
7553         "movq    %%rax, 64(%%rdi)\n"
7554         "movq    72(%%rsi), %%rax\n"
7555         "sbbq    72(%%rdx), %%rax\n"
7556         "movq    %%rax, 72(%%rdi)\n"
7557         "movq    80(%%rsi), %%rax\n"
7558         "sbbq    80(%%rdx), %%rax\n"
7559         "movq    %%rax, 80(%%rdi)\n"
7560     :
7561     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
7562     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
7563 }
7564 
7565 /* x has 11 words, z has 13.
7566  * Put (z+x*c) in z. Return carry bit. */
7567 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
7568 static inline
mpfq_fixmp_11_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)7569 mp_limb_t mpfq_fixmp_11_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
7570 {
7571     mp_limb_t carry;
7572     __asm__ __volatile__(
7573         "movq    %[z], %%rdi\n"
7574         "movq    %[x], %%rsi\n"
7575         "movq    0(%%rsi), %%rax\n"
7576         "mulq    %[mult]\n"
7577         "addq    %%rax, 0(%%rdi)\n"
7578         "movq    8(%%rsi), %%rax\n"
7579         "adcq    $0, %%rdx\n"
7580         "movq    %%rdx, %%rcx\n"
7581         "mulq    %[mult]\n"
7582         "addq    %%rax, %%rcx\n"
7583         "adcq    $0, %%rdx\n"
7584         "movq    16(%%rsi), %%rax\n"
7585         "addq    %%rcx, 8(%%rdi)\n"
7586         "adcq    $0, %%rdx\n"
7587         "movq    %%rdx, %%rcx\n"
7588         "mulq    %[mult]\n"
7589         "addq    %%rax, %%rcx\n"
7590         "adcq    $0, %%rdx\n"
7591         "movq    24(%%rsi), %%rax\n"
7592         "addq    %%rcx, 16(%%rdi)\n"
7593         "adcq    $0, %%rdx\n"
7594         "movq    %%rdx, %%rcx\n"
7595         "mulq    %[mult]\n"
7596         "addq    %%rax, %%rcx\n"
7597         "adcq    $0, %%rdx\n"
7598         "movq    32(%%rsi), %%rax\n"
7599         "addq    %%rcx, 24(%%rdi)\n"
7600         "adcq    $0, %%rdx\n"
7601         "movq    %%rdx, %%rcx\n"
7602         "mulq    %[mult]\n"
7603         "addq    %%rax, %%rcx\n"
7604         "adcq    $0, %%rdx\n"
7605         "movq    40(%%rsi), %%rax\n"
7606         "addq    %%rcx, 32(%%rdi)\n"
7607         "adcq    $0, %%rdx\n"
7608         "movq    %%rdx, %%rcx\n"
7609         "mulq    %[mult]\n"
7610         "addq    %%rax, %%rcx\n"
7611         "adcq    $0, %%rdx\n"
7612         "movq    48(%%rsi), %%rax\n"
7613         "addq    %%rcx, 40(%%rdi)\n"
7614         "adcq    $0, %%rdx\n"
7615         "movq    %%rdx, %%rcx\n"
7616         "mulq    %[mult]\n"
7617         "addq    %%rax, %%rcx\n"
7618         "adcq    $0, %%rdx\n"
7619         "movq    56(%%rsi), %%rax\n"
7620         "addq    %%rcx, 48(%%rdi)\n"
7621         "adcq    $0, %%rdx\n"
7622         "movq    %%rdx, %%rcx\n"
7623         "mulq    %[mult]\n"
7624         "addq    %%rax, %%rcx\n"
7625         "adcq    $0, %%rdx\n"
7626         "movq    64(%%rsi), %%rax\n"
7627         "addq    %%rcx, 56(%%rdi)\n"
7628         "adcq    $0, %%rdx\n"
7629         "movq    %%rdx, %%rcx\n"
7630         "mulq    %[mult]\n"
7631         "addq    %%rax, %%rcx\n"
7632         "adcq    $0, %%rdx\n"
7633         "movq    72(%%rsi), %%rax\n"
7634         "addq    %%rcx, 64(%%rdi)\n"
7635         "adcq    $0, %%rdx\n"
7636         "movq    %%rdx, %%rcx\n"
7637         "mulq    %[mult]\n"
7638         "addq    %%rax, %%rcx\n"
7639         "adcq    $0, %%rdx\n"
7640         "movq    80(%%rsi), %%rax\n"
7641         "addq    %%rcx, 72(%%rdi)\n"
7642         "adcq    $0, %%rdx\n"
7643         "movq    %%rdx, %%rcx\n"
7644         "mulq    %[mult]\n"
7645         "addq    %%rax, %%rcx\n"
7646         "adcq    $0, %%rdx\n"
7647         "addq    %%rcx, 80(%%rdi)\n"
7648         "adcq    $0, %%rdx\n"
7649         "xorq    %%rcx, %%rcx\n"
7650         "addq    %%rdx, 88(%%rdi)\n"
7651         "adcq    $0, %%rcx\n"
7652         "movq    %%rcx, %[carry]\n"
7653     : [carry]"=g"(carry), [z] "+m" (z)
7654     : [mult] "r" (c), [x] "m" (x)
7655     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
7656     return carry;
7657 }
7658 
7659 /* x has 11 words, z has 13.
7660  * Put (z+x*c) in z. Carry bit is lost. */
7661 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
7662 static inline
mpfq_fixmp_11_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)7663 void mpfq_fixmp_11_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
7664 {
7665     __asm__ __volatile__(
7666         "movq    %[z], %%rdi\n"
7667         "movq    %[x], %%rsi\n"
7668         "movq    0(%%rsi), %%rax\n"
7669         "mulq    %[mult]\n"
7670         "addq    %%rax, 0(%%rdi)\n"
7671         "movq    8(%%rsi), %%rax\n"
7672         "adcq    $0, %%rdx\n"
7673         "movq    %%rdx, %%rcx\n"
7674         "mulq    %[mult]\n"
7675         "addq    %%rax, %%rcx\n"
7676         "adcq    $0, %%rdx\n"
7677         "movq    16(%%rsi), %%rax\n"
7678         "addq    %%rcx, 8(%%rdi)\n"
7679         "adcq    $0, %%rdx\n"
7680         "movq    %%rdx, %%rcx\n"
7681         "mulq    %[mult]\n"
7682         "addq    %%rax, %%rcx\n"
7683         "adcq    $0, %%rdx\n"
7684         "movq    24(%%rsi), %%rax\n"
7685         "addq    %%rcx, 16(%%rdi)\n"
7686         "adcq    $0, %%rdx\n"
7687         "movq    %%rdx, %%rcx\n"
7688         "mulq    %[mult]\n"
7689         "addq    %%rax, %%rcx\n"
7690         "adcq    $0, %%rdx\n"
7691         "movq    32(%%rsi), %%rax\n"
7692         "addq    %%rcx, 24(%%rdi)\n"
7693         "adcq    $0, %%rdx\n"
7694         "movq    %%rdx, %%rcx\n"
7695         "mulq    %[mult]\n"
7696         "addq    %%rax, %%rcx\n"
7697         "adcq    $0, %%rdx\n"
7698         "movq    40(%%rsi), %%rax\n"
7699         "addq    %%rcx, 32(%%rdi)\n"
7700         "adcq    $0, %%rdx\n"
7701         "movq    %%rdx, %%rcx\n"
7702         "mulq    %[mult]\n"
7703         "addq    %%rax, %%rcx\n"
7704         "adcq    $0, %%rdx\n"
7705         "movq    48(%%rsi), %%rax\n"
7706         "addq    %%rcx, 40(%%rdi)\n"
7707         "adcq    $0, %%rdx\n"
7708         "movq    %%rdx, %%rcx\n"
7709         "mulq    %[mult]\n"
7710         "addq    %%rax, %%rcx\n"
7711         "adcq    $0, %%rdx\n"
7712         "movq    56(%%rsi), %%rax\n"
7713         "addq    %%rcx, 48(%%rdi)\n"
7714         "adcq    $0, %%rdx\n"
7715         "movq    %%rdx, %%rcx\n"
7716         "mulq    %[mult]\n"
7717         "addq    %%rax, %%rcx\n"
7718         "adcq    $0, %%rdx\n"
7719         "movq    64(%%rsi), %%rax\n"
7720         "addq    %%rcx, 56(%%rdi)\n"
7721         "adcq    $0, %%rdx\n"
7722         "movq    %%rdx, %%rcx\n"
7723         "mulq    %[mult]\n"
7724         "addq    %%rax, %%rcx\n"
7725         "adcq    $0, %%rdx\n"
7726         "movq    72(%%rsi), %%rax\n"
7727         "addq    %%rcx, 64(%%rdi)\n"
7728         "adcq    $0, %%rdx\n"
7729         "movq    %%rdx, %%rcx\n"
7730         "mulq    %[mult]\n"
7731         "addq    %%rax, %%rcx\n"
7732         "adcq    $0, %%rdx\n"
7733         "movq    80(%%rsi), %%rax\n"
7734         "addq    %%rcx, 72(%%rdi)\n"
7735         "adcq    $0, %%rdx\n"
7736         "movq    %%rdx, %%rcx\n"
7737         "mulq    %[mult]\n"
7738         "addq    %%rax, %%rcx\n"
7739         "adcq    $0, %%rdx\n"
7740         "addq    %%rcx, 80(%%rdi)\n"
7741         "adcq    $0, %%rdx\n"
7742         "addq    %%rdx, 88(%%rdi)\n"
7743     : [z] "+m" (z)
7744     : [mult] "r" (c), [x] "m" (x)
7745     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
7746 }
7747 
7748 /* x has 11 words, z has 12.
7749  * Put (z+x*c) in z. Return carry word. */
7750 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
7751 static inline
mpfq_fixmp_11_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)7752 mp_limb_t mpfq_fixmp_11_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
7753 {
7754     mp_limb_t carry;
7755     __asm__ __volatile__(
7756         "movq    %[z], %%rdi\n"
7757         "movq    %[x], %%rsi\n"
7758         "movq    0(%%rsi), %%rax\n"
7759         "mulq    %[mult]\n"
7760         "addq    %%rax, 0(%%rdi)\n"
7761         "movq    8(%%rsi), %%rax\n"
7762         "adcq    $0, %%rdx\n"
7763         "movq    %%rdx, %%rcx\n"
7764         "mulq    %[mult]\n"
7765         "addq    %%rax, %%rcx\n"
7766         "adcq    $0, %%rdx\n"
7767         "movq    16(%%rsi), %%rax\n"
7768         "addq    %%rcx, 8(%%rdi)\n"
7769         "adcq    $0, %%rdx\n"
7770         "movq    %%rdx, %%rcx\n"
7771         "mulq    %[mult]\n"
7772         "addq    %%rax, %%rcx\n"
7773         "adcq    $0, %%rdx\n"
7774         "movq    24(%%rsi), %%rax\n"
7775         "addq    %%rcx, 16(%%rdi)\n"
7776         "adcq    $0, %%rdx\n"
7777         "movq    %%rdx, %%rcx\n"
7778         "mulq    %[mult]\n"
7779         "addq    %%rax, %%rcx\n"
7780         "adcq    $0, %%rdx\n"
7781         "movq    32(%%rsi), %%rax\n"
7782         "addq    %%rcx, 24(%%rdi)\n"
7783         "adcq    $0, %%rdx\n"
7784         "movq    %%rdx, %%rcx\n"
7785         "mulq    %[mult]\n"
7786         "addq    %%rax, %%rcx\n"
7787         "adcq    $0, %%rdx\n"
7788         "movq    40(%%rsi), %%rax\n"
7789         "addq    %%rcx, 32(%%rdi)\n"
7790         "adcq    $0, %%rdx\n"
7791         "movq    %%rdx, %%rcx\n"
7792         "mulq    %[mult]\n"
7793         "addq    %%rax, %%rcx\n"
7794         "adcq    $0, %%rdx\n"
7795         "movq    48(%%rsi), %%rax\n"
7796         "addq    %%rcx, 40(%%rdi)\n"
7797         "adcq    $0, %%rdx\n"
7798         "movq    %%rdx, %%rcx\n"
7799         "mulq    %[mult]\n"
7800         "addq    %%rax, %%rcx\n"
7801         "adcq    $0, %%rdx\n"
7802         "movq    56(%%rsi), %%rax\n"
7803         "addq    %%rcx, 48(%%rdi)\n"
7804         "adcq    $0, %%rdx\n"
7805         "movq    %%rdx, %%rcx\n"
7806         "mulq    %[mult]\n"
7807         "addq    %%rax, %%rcx\n"
7808         "adcq    $0, %%rdx\n"
7809         "movq    64(%%rsi), %%rax\n"
7810         "addq    %%rcx, 56(%%rdi)\n"
7811         "adcq    $0, %%rdx\n"
7812         "movq    %%rdx, %%rcx\n"
7813         "mulq    %[mult]\n"
7814         "addq    %%rax, %%rcx\n"
7815         "adcq    $0, %%rdx\n"
7816         "movq    72(%%rsi), %%rax\n"
7817         "addq    %%rcx, 64(%%rdi)\n"
7818         "adcq    $0, %%rdx\n"
7819         "movq    %%rdx, %%rcx\n"
7820         "mulq    %[mult]\n"
7821         "addq    %%rax, %%rcx\n"
7822         "adcq    $0, %%rdx\n"
7823         "movq    80(%%rsi), %%rax\n"
7824         "addq    %%rcx, 72(%%rdi)\n"
7825         "adcq    $0, %%rdx\n"
7826         "movq    %%rdx, %%rcx\n"
7827         "mulq    %[mult]\n"
7828         "addq    %%rax, %%rcx\n"
7829         "adcq    $0, %%rdx\n"
7830         "addq    %%rcx, 80(%%rdi)\n"
7831         "adcq    $0, %%rdx\n"
7832         "movq    %%rdx, %[carry]\n"
7833     : [carry]"=g"(carry), [z] "+m" (z)
7834     : [mult] "r" (c), [x] "m" (x)
7835     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
7836     return carry;
7837 }
7838 
7839 /* x and y have 11 words, z has 24. Put x*y in z. */
7840 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
7841 static inline
mpfq_fixmp_11_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)7842 void mpfq_fixmp_11_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
7843 {
7844     __asm__ __volatile__(
7845         "### x*y[0]\n"
7846         "movq    %2, %%r8\n"
7847         "movq    %0, %%rdi\n"
7848         "movq    0(%%r8), %%r9\n"
7849         "movq    %1, %%rsi\n"
7850         "movq    0(%%rsi), %%rax\n"
7851         "mulq    %%r9\n"
7852         "movq    %%rax, 0(%%rdi)\n"
7853         "movq    8(%%rsi), %%rax\n"
7854         "movq    %%rdx, %%rcx\n"
7855         "mulq    %%r9\n"
7856         "addq    %%rax, %%rcx\n"
7857         "adcq    $0, %%rdx\n"
7858         "movq    16(%%rsi), %%rax\n"
7859         "movq    %%rcx, 8(%%rdi)\n"
7860         "movq    %%rdx, %%rcx\n"
7861         "mulq    %%r9\n"
7862         "addq    %%rax, %%rcx\n"
7863         "adcq    $0, %%rdx\n"
7864         "movq    24(%%rsi), %%rax\n"
7865         "movq    %%rcx, 16(%%rdi)\n"
7866         "movq    %%rdx, %%rcx\n"
7867         "mulq    %%r9\n"
7868         "addq    %%rax, %%rcx\n"
7869         "adcq    $0, %%rdx\n"
7870         "movq    32(%%rsi), %%rax\n"
7871         "movq    %%rcx, 24(%%rdi)\n"
7872         "movq    %%rdx, %%rcx\n"
7873         "mulq    %%r9\n"
7874         "addq    %%rax, %%rcx\n"
7875         "adcq    $0, %%rdx\n"
7876         "movq    40(%%rsi), %%rax\n"
7877         "movq    %%rcx, 32(%%rdi)\n"
7878         "movq    %%rdx, %%rcx\n"
7879         "mulq    %%r9\n"
7880         "addq    %%rax, %%rcx\n"
7881         "adcq    $0, %%rdx\n"
7882         "movq    48(%%rsi), %%rax\n"
7883         "movq    %%rcx, 40(%%rdi)\n"
7884         "movq    %%rdx, %%rcx\n"
7885         "mulq    %%r9\n"
7886         "addq    %%rax, %%rcx\n"
7887         "adcq    $0, %%rdx\n"
7888         "movq    56(%%rsi), %%rax\n"
7889         "movq    %%rcx, 48(%%rdi)\n"
7890         "movq    %%rdx, %%rcx\n"
7891         "mulq    %%r9\n"
7892         "addq    %%rax, %%rcx\n"
7893         "adcq    $0, %%rdx\n"
7894         "movq    64(%%rsi), %%rax\n"
7895         "movq    %%rcx, 56(%%rdi)\n"
7896         "movq    %%rdx, %%rcx\n"
7897         "mulq    %%r9\n"
7898         "addq    %%rax, %%rcx\n"
7899         "adcq    $0, %%rdx\n"
7900         "movq    72(%%rsi), %%rax\n"
7901         "movq    %%rcx, 64(%%rdi)\n"
7902         "movq    %%rdx, %%rcx\n"
7903         "mulq    %%r9\n"
7904         "addq    %%rax, %%rcx\n"
7905         "adcq    $0, %%rdx\n"
7906         "movq    80(%%rsi), %%rax\n"
7907         "movq    %%rcx, 72(%%rdi)\n"
7908         "movq    %%rdx, %%rcx\n"
7909         "mulq    %%r9\n"
7910         "addq    %%rax, %%rcx\n"
7911         "adcq    $0, %%rdx\n"
7912         "movq    %%rcx, 80(%%rdi)\n"
7913         "movq    %%rdx, 88(%%rdi)\n"
7914         "movq    $0, 96(%%rdi)\n"
7915         "movq    $0, 104(%%rdi)\n"
7916         "movq    $0, 112(%%rdi)\n"
7917         "movq    $0, 120(%%rdi)\n"
7918         "movq    $0, 128(%%rdi)\n"
7919         "movq    $0, 136(%%rdi)\n"
7920         "movq    $0, 144(%%rdi)\n"
7921         "movq    $0, 152(%%rdi)\n"
7922         "movq    $0, 160(%%rdi)\n"
7923         "movq    $0, 168(%%rdi)\n"
7924         "### x*y[1]\n"
7925         "movq    8(%%r8), %%r9\n"
7926         "movq    0(%%rsi), %%rax\n"
7927         "mulq    %%r9\n"
7928         "addq    %%rax, 8(%%rdi)\n"
7929         "movq    8(%%rsi), %%rax\n"
7930         "adcq    $0, %%rdx\n"
7931         "movq    %%rdx, %%rcx\n"
7932         "mulq    %%r9\n"
7933         "addq    %%rax, %%rcx\n"
7934         "adcq    $0, %%rdx\n"
7935         "movq    16(%%rsi), %%rax\n"
7936         "addq    %%rcx, 16(%%rdi)\n"
7937         "adcq    $0, %%rdx\n"
7938         "movq    %%rdx, %%rcx\n"
7939         "mulq    %%r9\n"
7940         "addq    %%rax, %%rcx\n"
7941         "adcq    $0, %%rdx\n"
7942         "movq    24(%%rsi), %%rax\n"
7943         "addq    %%rcx, 24(%%rdi)\n"
7944         "adcq    $0, %%rdx\n"
7945         "movq    %%rdx, %%rcx\n"
7946         "mulq    %%r9\n"
7947         "addq    %%rax, %%rcx\n"
7948         "adcq    $0, %%rdx\n"
7949         "movq    32(%%rsi), %%rax\n"
7950         "addq    %%rcx, 32(%%rdi)\n"
7951         "adcq    $0, %%rdx\n"
7952         "movq    %%rdx, %%rcx\n"
7953         "mulq    %%r9\n"
7954         "addq    %%rax, %%rcx\n"
7955         "adcq    $0, %%rdx\n"
7956         "movq    40(%%rsi), %%rax\n"
7957         "addq    %%rcx, 40(%%rdi)\n"
7958         "adcq    $0, %%rdx\n"
7959         "movq    %%rdx, %%rcx\n"
7960         "mulq    %%r9\n"
7961         "addq    %%rax, %%rcx\n"
7962         "adcq    $0, %%rdx\n"
7963         "movq    48(%%rsi), %%rax\n"
7964         "addq    %%rcx, 48(%%rdi)\n"
7965         "adcq    $0, %%rdx\n"
7966         "movq    %%rdx, %%rcx\n"
7967         "mulq    %%r9\n"
7968         "addq    %%rax, %%rcx\n"
7969         "adcq    $0, %%rdx\n"
7970         "movq    56(%%rsi), %%rax\n"
7971         "addq    %%rcx, 56(%%rdi)\n"
7972         "adcq    $0, %%rdx\n"
7973         "movq    %%rdx, %%rcx\n"
7974         "mulq    %%r9\n"
7975         "addq    %%rax, %%rcx\n"
7976         "adcq    $0, %%rdx\n"
7977         "movq    64(%%rsi), %%rax\n"
7978         "addq    %%rcx, 64(%%rdi)\n"
7979         "adcq    $0, %%rdx\n"
7980         "movq    %%rdx, %%rcx\n"
7981         "mulq    %%r9\n"
7982         "addq    %%rax, %%rcx\n"
7983         "adcq    $0, %%rdx\n"
7984         "movq    72(%%rsi), %%rax\n"
7985         "addq    %%rcx, 72(%%rdi)\n"
7986         "adcq    $0, %%rdx\n"
7987         "movq    %%rdx, %%rcx\n"
7988         "mulq    %%r9\n"
7989         "addq    %%rax, %%rcx\n"
7990         "adcq    $0, %%rdx\n"
7991         "movq    80(%%rsi), %%rax\n"
7992         "addq    %%rcx, 80(%%rdi)\n"
7993         "adcq    $0, %%rdx\n"
7994         "movq    %%rdx, %%rcx\n"
7995         "mulq    %%r9\n"
7996         "addq    %%rax, %%rcx\n"
7997         "adcq    $0, %%rdx\n"
7998         "addq    %%rcx, 88(%%rdi)\n"
7999         "adcq    $0, %%rdx\n"
8000         "movq    %%rdx, 96(%%rdi)\n"
8001         "### x*y[2]\n"
8002         "movq    16(%%r8), %%r9\n"
8003         "movq    0(%%rsi), %%rax\n"
8004         "mulq    %%r9\n"
8005         "addq    %%rax, 16(%%rdi)\n"
8006         "movq    8(%%rsi), %%rax\n"
8007         "adcq    $0, %%rdx\n"
8008         "movq    %%rdx, %%rcx\n"
8009         "mulq    %%r9\n"
8010         "addq    %%rax, %%rcx\n"
8011         "adcq    $0, %%rdx\n"
8012         "movq    16(%%rsi), %%rax\n"
8013         "addq    %%rcx, 24(%%rdi)\n"
8014         "adcq    $0, %%rdx\n"
8015         "movq    %%rdx, %%rcx\n"
8016         "mulq    %%r9\n"
8017         "addq    %%rax, %%rcx\n"
8018         "adcq    $0, %%rdx\n"
8019         "movq    24(%%rsi), %%rax\n"
8020         "addq    %%rcx, 32(%%rdi)\n"
8021         "adcq    $0, %%rdx\n"
8022         "movq    %%rdx, %%rcx\n"
8023         "mulq    %%r9\n"
8024         "addq    %%rax, %%rcx\n"
8025         "adcq    $0, %%rdx\n"
8026         "movq    32(%%rsi), %%rax\n"
8027         "addq    %%rcx, 40(%%rdi)\n"
8028         "adcq    $0, %%rdx\n"
8029         "movq    %%rdx, %%rcx\n"
8030         "mulq    %%r9\n"
8031         "addq    %%rax, %%rcx\n"
8032         "adcq    $0, %%rdx\n"
8033         "movq    40(%%rsi), %%rax\n"
8034         "addq    %%rcx, 48(%%rdi)\n"
8035         "adcq    $0, %%rdx\n"
8036         "movq    %%rdx, %%rcx\n"
8037         "mulq    %%r9\n"
8038         "addq    %%rax, %%rcx\n"
8039         "adcq    $0, %%rdx\n"
8040         "movq    48(%%rsi), %%rax\n"
8041         "addq    %%rcx, 56(%%rdi)\n"
8042         "adcq    $0, %%rdx\n"
8043         "movq    %%rdx, %%rcx\n"
8044         "mulq    %%r9\n"
8045         "addq    %%rax, %%rcx\n"
8046         "adcq    $0, %%rdx\n"
8047         "movq    56(%%rsi), %%rax\n"
8048         "addq    %%rcx, 64(%%rdi)\n"
8049         "adcq    $0, %%rdx\n"
8050         "movq    %%rdx, %%rcx\n"
8051         "mulq    %%r9\n"
8052         "addq    %%rax, %%rcx\n"
8053         "adcq    $0, %%rdx\n"
8054         "movq    64(%%rsi), %%rax\n"
8055         "addq    %%rcx, 72(%%rdi)\n"
8056         "adcq    $0, %%rdx\n"
8057         "movq    %%rdx, %%rcx\n"
8058         "mulq    %%r9\n"
8059         "addq    %%rax, %%rcx\n"
8060         "adcq    $0, %%rdx\n"
8061         "movq    72(%%rsi), %%rax\n"
8062         "addq    %%rcx, 80(%%rdi)\n"
8063         "adcq    $0, %%rdx\n"
8064         "movq    %%rdx, %%rcx\n"
8065         "mulq    %%r9\n"
8066         "addq    %%rax, %%rcx\n"
8067         "adcq    $0, %%rdx\n"
8068         "movq    80(%%rsi), %%rax\n"
8069         "addq    %%rcx, 88(%%rdi)\n"
8070         "adcq    $0, %%rdx\n"
8071         "movq    %%rdx, %%rcx\n"
8072         "mulq    %%r9\n"
8073         "addq    %%rax, %%rcx\n"
8074         "adcq    $0, %%rdx\n"
8075         "addq    %%rcx, 96(%%rdi)\n"
8076         "adcq    $0, %%rdx\n"
8077         "movq    %%rdx, 104(%%rdi)\n"
8078         "### x*y[3]\n"
8079         "movq    24(%%r8), %%r9\n"
8080         "movq    0(%%rsi), %%rax\n"
8081         "mulq    %%r9\n"
8082         "addq    %%rax, 24(%%rdi)\n"
8083         "movq    8(%%rsi), %%rax\n"
8084         "adcq    $0, %%rdx\n"
8085         "movq    %%rdx, %%rcx\n"
8086         "mulq    %%r9\n"
8087         "addq    %%rax, %%rcx\n"
8088         "adcq    $0, %%rdx\n"
8089         "movq    16(%%rsi), %%rax\n"
8090         "addq    %%rcx, 32(%%rdi)\n"
8091         "adcq    $0, %%rdx\n"
8092         "movq    %%rdx, %%rcx\n"
8093         "mulq    %%r9\n"
8094         "addq    %%rax, %%rcx\n"
8095         "adcq    $0, %%rdx\n"
8096         "movq    24(%%rsi), %%rax\n"
8097         "addq    %%rcx, 40(%%rdi)\n"
8098         "adcq    $0, %%rdx\n"
8099         "movq    %%rdx, %%rcx\n"
8100         "mulq    %%r9\n"
8101         "addq    %%rax, %%rcx\n"
8102         "adcq    $0, %%rdx\n"
8103         "movq    32(%%rsi), %%rax\n"
8104         "addq    %%rcx, 48(%%rdi)\n"
8105         "adcq    $0, %%rdx\n"
8106         "movq    %%rdx, %%rcx\n"
8107         "mulq    %%r9\n"
8108         "addq    %%rax, %%rcx\n"
8109         "adcq    $0, %%rdx\n"
8110         "movq    40(%%rsi), %%rax\n"
8111         "addq    %%rcx, 56(%%rdi)\n"
8112         "adcq    $0, %%rdx\n"
8113         "movq    %%rdx, %%rcx\n"
8114         "mulq    %%r9\n"
8115         "addq    %%rax, %%rcx\n"
8116         "adcq    $0, %%rdx\n"
8117         "movq    48(%%rsi), %%rax\n"
8118         "addq    %%rcx, 64(%%rdi)\n"
8119         "adcq    $0, %%rdx\n"
8120         "movq    %%rdx, %%rcx\n"
8121         "mulq    %%r9\n"
8122         "addq    %%rax, %%rcx\n"
8123         "adcq    $0, %%rdx\n"
8124         "movq    56(%%rsi), %%rax\n"
8125         "addq    %%rcx, 72(%%rdi)\n"
8126         "adcq    $0, %%rdx\n"
8127         "movq    %%rdx, %%rcx\n"
8128         "mulq    %%r9\n"
8129         "addq    %%rax, %%rcx\n"
8130         "adcq    $0, %%rdx\n"
8131         "movq    64(%%rsi), %%rax\n"
8132         "addq    %%rcx, 80(%%rdi)\n"
8133         "adcq    $0, %%rdx\n"
8134         "movq    %%rdx, %%rcx\n"
8135         "mulq    %%r9\n"
8136         "addq    %%rax, %%rcx\n"
8137         "adcq    $0, %%rdx\n"
8138         "movq    72(%%rsi), %%rax\n"
8139         "addq    %%rcx, 88(%%rdi)\n"
8140         "adcq    $0, %%rdx\n"
8141         "movq    %%rdx, %%rcx\n"
8142         "mulq    %%r9\n"
8143         "addq    %%rax, %%rcx\n"
8144         "adcq    $0, %%rdx\n"
8145         "movq    80(%%rsi), %%rax\n"
8146         "addq    %%rcx, 96(%%rdi)\n"
8147         "adcq    $0, %%rdx\n"
8148         "movq    %%rdx, %%rcx\n"
8149         "mulq    %%r9\n"
8150         "addq    %%rax, %%rcx\n"
8151         "adcq    $0, %%rdx\n"
8152         "addq    %%rcx, 104(%%rdi)\n"
8153         "adcq    $0, %%rdx\n"
8154         "movq    %%rdx, 112(%%rdi)\n"
8155         "### x*y[4]\n"
8156         "movq    32(%%r8), %%r9\n"
8157         "movq    0(%%rsi), %%rax\n"
8158         "mulq    %%r9\n"
8159         "addq    %%rax, 32(%%rdi)\n"
8160         "movq    8(%%rsi), %%rax\n"
8161         "adcq    $0, %%rdx\n"
8162         "movq    %%rdx, %%rcx\n"
8163         "mulq    %%r9\n"
8164         "addq    %%rax, %%rcx\n"
8165         "adcq    $0, %%rdx\n"
8166         "movq    16(%%rsi), %%rax\n"
8167         "addq    %%rcx, 40(%%rdi)\n"
8168         "adcq    $0, %%rdx\n"
8169         "movq    %%rdx, %%rcx\n"
8170         "mulq    %%r9\n"
8171         "addq    %%rax, %%rcx\n"
8172         "adcq    $0, %%rdx\n"
8173         "movq    24(%%rsi), %%rax\n"
8174         "addq    %%rcx, 48(%%rdi)\n"
8175         "adcq    $0, %%rdx\n"
8176         "movq    %%rdx, %%rcx\n"
8177         "mulq    %%r9\n"
8178         "addq    %%rax, %%rcx\n"
8179         "adcq    $0, %%rdx\n"
8180         "movq    32(%%rsi), %%rax\n"
8181         "addq    %%rcx, 56(%%rdi)\n"
8182         "adcq    $0, %%rdx\n"
8183         "movq    %%rdx, %%rcx\n"
8184         "mulq    %%r9\n"
8185         "addq    %%rax, %%rcx\n"
8186         "adcq    $0, %%rdx\n"
8187         "movq    40(%%rsi), %%rax\n"
8188         "addq    %%rcx, 64(%%rdi)\n"
8189         "adcq    $0, %%rdx\n"
8190         "movq    %%rdx, %%rcx\n"
8191         "mulq    %%r9\n"
8192         "addq    %%rax, %%rcx\n"
8193         "adcq    $0, %%rdx\n"
8194         "movq    48(%%rsi), %%rax\n"
8195         "addq    %%rcx, 72(%%rdi)\n"
8196         "adcq    $0, %%rdx\n"
8197         "movq    %%rdx, %%rcx\n"
8198         "mulq    %%r9\n"
8199         "addq    %%rax, %%rcx\n"
8200         "adcq    $0, %%rdx\n"
8201         "movq    56(%%rsi), %%rax\n"
8202         "addq    %%rcx, 80(%%rdi)\n"
8203         "adcq    $0, %%rdx\n"
8204         "movq    %%rdx, %%rcx\n"
8205         "mulq    %%r9\n"
8206         "addq    %%rax, %%rcx\n"
8207         "adcq    $0, %%rdx\n"
8208         "movq    64(%%rsi), %%rax\n"
8209         "addq    %%rcx, 88(%%rdi)\n"
8210         "adcq    $0, %%rdx\n"
8211         "movq    %%rdx, %%rcx\n"
8212         "mulq    %%r9\n"
8213         "addq    %%rax, %%rcx\n"
8214         "adcq    $0, %%rdx\n"
8215         "movq    72(%%rsi), %%rax\n"
8216         "addq    %%rcx, 96(%%rdi)\n"
8217         "adcq    $0, %%rdx\n"
8218         "movq    %%rdx, %%rcx\n"
8219         "mulq    %%r9\n"
8220         "addq    %%rax, %%rcx\n"
8221         "adcq    $0, %%rdx\n"
8222         "movq    80(%%rsi), %%rax\n"
8223         "addq    %%rcx, 104(%%rdi)\n"
8224         "adcq    $0, %%rdx\n"
8225         "movq    %%rdx, %%rcx\n"
8226         "mulq    %%r9\n"
8227         "addq    %%rax, %%rcx\n"
8228         "adcq    $0, %%rdx\n"
8229         "addq    %%rcx, 112(%%rdi)\n"
8230         "adcq    $0, %%rdx\n"
8231         "movq    %%rdx, 120(%%rdi)\n"
8232         "### x*y[5]\n"
8233         "movq    40(%%r8), %%r9\n"
8234         "movq    0(%%rsi), %%rax\n"
8235         "mulq    %%r9\n"
8236         "addq    %%rax, 40(%%rdi)\n"
8237         "movq    8(%%rsi), %%rax\n"
8238         "adcq    $0, %%rdx\n"
8239         "movq    %%rdx, %%rcx\n"
8240         "mulq    %%r9\n"
8241         "addq    %%rax, %%rcx\n"
8242         "adcq    $0, %%rdx\n"
8243         "movq    16(%%rsi), %%rax\n"
8244         "addq    %%rcx, 48(%%rdi)\n"
8245         "adcq    $0, %%rdx\n"
8246         "movq    %%rdx, %%rcx\n"
8247         "mulq    %%r9\n"
8248         "addq    %%rax, %%rcx\n"
8249         "adcq    $0, %%rdx\n"
8250         "movq    24(%%rsi), %%rax\n"
8251         "addq    %%rcx, 56(%%rdi)\n"
8252         "adcq    $0, %%rdx\n"
8253         "movq    %%rdx, %%rcx\n"
8254         "mulq    %%r9\n"
8255         "addq    %%rax, %%rcx\n"
8256         "adcq    $0, %%rdx\n"
8257         "movq    32(%%rsi), %%rax\n"
8258         "addq    %%rcx, 64(%%rdi)\n"
8259         "adcq    $0, %%rdx\n"
8260         "movq    %%rdx, %%rcx\n"
8261         "mulq    %%r9\n"
8262         "addq    %%rax, %%rcx\n"
8263         "adcq    $0, %%rdx\n"
8264         "movq    40(%%rsi), %%rax\n"
8265         "addq    %%rcx, 72(%%rdi)\n"
8266         "adcq    $0, %%rdx\n"
8267         "movq    %%rdx, %%rcx\n"
8268         "mulq    %%r9\n"
8269         "addq    %%rax, %%rcx\n"
8270         "adcq    $0, %%rdx\n"
8271         "movq    48(%%rsi), %%rax\n"
8272         "addq    %%rcx, 80(%%rdi)\n"
8273         "adcq    $0, %%rdx\n"
8274         "movq    %%rdx, %%rcx\n"
8275         "mulq    %%r9\n"
8276         "addq    %%rax, %%rcx\n"
8277         "adcq    $0, %%rdx\n"
8278         "movq    56(%%rsi), %%rax\n"
8279         "addq    %%rcx, 88(%%rdi)\n"
8280         "adcq    $0, %%rdx\n"
8281         "movq    %%rdx, %%rcx\n"
8282         "mulq    %%r9\n"
8283         "addq    %%rax, %%rcx\n"
8284         "adcq    $0, %%rdx\n"
8285         "movq    64(%%rsi), %%rax\n"
8286         "addq    %%rcx, 96(%%rdi)\n"
8287         "adcq    $0, %%rdx\n"
8288         "movq    %%rdx, %%rcx\n"
8289         "mulq    %%r9\n"
8290         "addq    %%rax, %%rcx\n"
8291         "adcq    $0, %%rdx\n"
8292         "movq    72(%%rsi), %%rax\n"
8293         "addq    %%rcx, 104(%%rdi)\n"
8294         "adcq    $0, %%rdx\n"
8295         "movq    %%rdx, %%rcx\n"
8296         "mulq    %%r9\n"
8297         "addq    %%rax, %%rcx\n"
8298         "adcq    $0, %%rdx\n"
8299         "movq    80(%%rsi), %%rax\n"
8300         "addq    %%rcx, 112(%%rdi)\n"
8301         "adcq    $0, %%rdx\n"
8302         "movq    %%rdx, %%rcx\n"
8303         "mulq    %%r9\n"
8304         "addq    %%rax, %%rcx\n"
8305         "adcq    $0, %%rdx\n"
8306         "addq    %%rcx, 120(%%rdi)\n"
8307         "adcq    $0, %%rdx\n"
8308         "movq    %%rdx, 128(%%rdi)\n"
8309         "### x*y[6]\n"
8310         "movq    48(%%r8), %%r9\n"
8311         "movq    0(%%rsi), %%rax\n"
8312         "mulq    %%r9\n"
8313         "addq    %%rax, 48(%%rdi)\n"
8314         "movq    8(%%rsi), %%rax\n"
8315         "adcq    $0, %%rdx\n"
8316         "movq    %%rdx, %%rcx\n"
8317         "mulq    %%r9\n"
8318         "addq    %%rax, %%rcx\n"
8319         "adcq    $0, %%rdx\n"
8320         "movq    16(%%rsi), %%rax\n"
8321         "addq    %%rcx, 56(%%rdi)\n"
8322         "adcq    $0, %%rdx\n"
8323         "movq    %%rdx, %%rcx\n"
8324         "mulq    %%r9\n"
8325         "addq    %%rax, %%rcx\n"
8326         "adcq    $0, %%rdx\n"
8327         "movq    24(%%rsi), %%rax\n"
8328         "addq    %%rcx, 64(%%rdi)\n"
8329         "adcq    $0, %%rdx\n"
8330         "movq    %%rdx, %%rcx\n"
8331         "mulq    %%r9\n"
8332         "addq    %%rax, %%rcx\n"
8333         "adcq    $0, %%rdx\n"
8334         "movq    32(%%rsi), %%rax\n"
8335         "addq    %%rcx, 72(%%rdi)\n"
8336         "adcq    $0, %%rdx\n"
8337         "movq    %%rdx, %%rcx\n"
8338         "mulq    %%r9\n"
8339         "addq    %%rax, %%rcx\n"
8340         "adcq    $0, %%rdx\n"
8341         "movq    40(%%rsi), %%rax\n"
8342         "addq    %%rcx, 80(%%rdi)\n"
8343         "adcq    $0, %%rdx\n"
8344         "movq    %%rdx, %%rcx\n"
8345         "mulq    %%r9\n"
8346         "addq    %%rax, %%rcx\n"
8347         "adcq    $0, %%rdx\n"
8348         "movq    48(%%rsi), %%rax\n"
8349         "addq    %%rcx, 88(%%rdi)\n"
8350         "adcq    $0, %%rdx\n"
8351         "movq    %%rdx, %%rcx\n"
8352         "mulq    %%r9\n"
8353         "addq    %%rax, %%rcx\n"
8354         "adcq    $0, %%rdx\n"
8355         "movq    56(%%rsi), %%rax\n"
8356         "addq    %%rcx, 96(%%rdi)\n"
8357         "adcq    $0, %%rdx\n"
8358         "movq    %%rdx, %%rcx\n"
8359         "mulq    %%r9\n"
8360         "addq    %%rax, %%rcx\n"
8361         "adcq    $0, %%rdx\n"
8362         "movq    64(%%rsi), %%rax\n"
8363         "addq    %%rcx, 104(%%rdi)\n"
8364         "adcq    $0, %%rdx\n"
8365         "movq    %%rdx, %%rcx\n"
8366         "mulq    %%r9\n"
8367         "addq    %%rax, %%rcx\n"
8368         "adcq    $0, %%rdx\n"
8369         "movq    72(%%rsi), %%rax\n"
8370         "addq    %%rcx, 112(%%rdi)\n"
8371         "adcq    $0, %%rdx\n"
8372         "movq    %%rdx, %%rcx\n"
8373         "mulq    %%r9\n"
8374         "addq    %%rax, %%rcx\n"
8375         "adcq    $0, %%rdx\n"
8376         "movq    80(%%rsi), %%rax\n"
8377         "addq    %%rcx, 120(%%rdi)\n"
8378         "adcq    $0, %%rdx\n"
8379         "movq    %%rdx, %%rcx\n"
8380         "mulq    %%r9\n"
8381         "addq    %%rax, %%rcx\n"
8382         "adcq    $0, %%rdx\n"
8383         "addq    %%rcx, 128(%%rdi)\n"
8384         "adcq    $0, %%rdx\n"
8385         "movq    %%rdx, 136(%%rdi)\n"
8386         "### x*y[7]\n"
8387         "movq    56(%%r8), %%r9\n"
8388         "movq    0(%%rsi), %%rax\n"
8389         "mulq    %%r9\n"
8390         "addq    %%rax, 56(%%rdi)\n"
8391         "movq    8(%%rsi), %%rax\n"
8392         "adcq    $0, %%rdx\n"
8393         "movq    %%rdx, %%rcx\n"
8394         "mulq    %%r9\n"
8395         "addq    %%rax, %%rcx\n"
8396         "adcq    $0, %%rdx\n"
8397         "movq    16(%%rsi), %%rax\n"
8398         "addq    %%rcx, 64(%%rdi)\n"
8399         "adcq    $0, %%rdx\n"
8400         "movq    %%rdx, %%rcx\n"
8401         "mulq    %%r9\n"
8402         "addq    %%rax, %%rcx\n"
8403         "adcq    $0, %%rdx\n"
8404         "movq    24(%%rsi), %%rax\n"
8405         "addq    %%rcx, 72(%%rdi)\n"
8406         "adcq    $0, %%rdx\n"
8407         "movq    %%rdx, %%rcx\n"
8408         "mulq    %%r9\n"
8409         "addq    %%rax, %%rcx\n"
8410         "adcq    $0, %%rdx\n"
8411         "movq    32(%%rsi), %%rax\n"
8412         "addq    %%rcx, 80(%%rdi)\n"
8413         "adcq    $0, %%rdx\n"
8414         "movq    %%rdx, %%rcx\n"
8415         "mulq    %%r9\n"
8416         "addq    %%rax, %%rcx\n"
8417         "adcq    $0, %%rdx\n"
8418         "movq    40(%%rsi), %%rax\n"
8419         "addq    %%rcx, 88(%%rdi)\n"
8420         "adcq    $0, %%rdx\n"
8421         "movq    %%rdx, %%rcx\n"
8422         "mulq    %%r9\n"
8423         "addq    %%rax, %%rcx\n"
8424         "adcq    $0, %%rdx\n"
8425         "movq    48(%%rsi), %%rax\n"
8426         "addq    %%rcx, 96(%%rdi)\n"
8427         "adcq    $0, %%rdx\n"
8428         "movq    %%rdx, %%rcx\n"
8429         "mulq    %%r9\n"
8430         "addq    %%rax, %%rcx\n"
8431         "adcq    $0, %%rdx\n"
8432         "movq    56(%%rsi), %%rax\n"
8433         "addq    %%rcx, 104(%%rdi)\n"
8434         "adcq    $0, %%rdx\n"
8435         "movq    %%rdx, %%rcx\n"
8436         "mulq    %%r9\n"
8437         "addq    %%rax, %%rcx\n"
8438         "adcq    $0, %%rdx\n"
8439         "movq    64(%%rsi), %%rax\n"
8440         "addq    %%rcx, 112(%%rdi)\n"
8441         "adcq    $0, %%rdx\n"
8442         "movq    %%rdx, %%rcx\n"
8443         "mulq    %%r9\n"
8444         "addq    %%rax, %%rcx\n"
8445         "adcq    $0, %%rdx\n"
8446         "movq    72(%%rsi), %%rax\n"
8447         "addq    %%rcx, 120(%%rdi)\n"
8448         "adcq    $0, %%rdx\n"
8449         "movq    %%rdx, %%rcx\n"
8450         "mulq    %%r9\n"
8451         "addq    %%rax, %%rcx\n"
8452         "adcq    $0, %%rdx\n"
8453         "movq    80(%%rsi), %%rax\n"
8454         "addq    %%rcx, 128(%%rdi)\n"
8455         "adcq    $0, %%rdx\n"
8456         "movq    %%rdx, %%rcx\n"
8457         "mulq    %%r9\n"
8458         "addq    %%rax, %%rcx\n"
8459         "adcq    $0, %%rdx\n"
8460         "addq    %%rcx, 136(%%rdi)\n"
8461         "adcq    $0, %%rdx\n"
8462         "movq    %%rdx, 144(%%rdi)\n"
8463         "### x*y[8]\n"
8464         "movq    64(%%r8), %%r9\n"
8465         "movq    0(%%rsi), %%rax\n"
8466         "mulq    %%r9\n"
8467         "addq    %%rax, 64(%%rdi)\n"
8468         "movq    8(%%rsi), %%rax\n"
8469         "adcq    $0, %%rdx\n"
8470         "movq    %%rdx, %%rcx\n"
8471         "mulq    %%r9\n"
8472         "addq    %%rax, %%rcx\n"
8473         "adcq    $0, %%rdx\n"
8474         "movq    16(%%rsi), %%rax\n"
8475         "addq    %%rcx, 72(%%rdi)\n"
8476         "adcq    $0, %%rdx\n"
8477         "movq    %%rdx, %%rcx\n"
8478         "mulq    %%r9\n"
8479         "addq    %%rax, %%rcx\n"
8480         "adcq    $0, %%rdx\n"
8481         "movq    24(%%rsi), %%rax\n"
8482         "addq    %%rcx, 80(%%rdi)\n"
8483         "adcq    $0, %%rdx\n"
8484         "movq    %%rdx, %%rcx\n"
8485         "mulq    %%r9\n"
8486         "addq    %%rax, %%rcx\n"
8487         "adcq    $0, %%rdx\n"
8488         "movq    32(%%rsi), %%rax\n"
8489         "addq    %%rcx, 88(%%rdi)\n"
8490         "adcq    $0, %%rdx\n"
8491         "movq    %%rdx, %%rcx\n"
8492         "mulq    %%r9\n"
8493         "addq    %%rax, %%rcx\n"
8494         "adcq    $0, %%rdx\n"
8495         "movq    40(%%rsi), %%rax\n"
8496         "addq    %%rcx, 96(%%rdi)\n"
8497         "adcq    $0, %%rdx\n"
8498         "movq    %%rdx, %%rcx\n"
8499         "mulq    %%r9\n"
8500         "addq    %%rax, %%rcx\n"
8501         "adcq    $0, %%rdx\n"
8502         "movq    48(%%rsi), %%rax\n"
8503         "addq    %%rcx, 104(%%rdi)\n"
8504         "adcq    $0, %%rdx\n"
8505         "movq    %%rdx, %%rcx\n"
8506         "mulq    %%r9\n"
8507         "addq    %%rax, %%rcx\n"
8508         "adcq    $0, %%rdx\n"
8509         "movq    56(%%rsi), %%rax\n"
8510         "addq    %%rcx, 112(%%rdi)\n"
8511         "adcq    $0, %%rdx\n"
8512         "movq    %%rdx, %%rcx\n"
8513         "mulq    %%r9\n"
8514         "addq    %%rax, %%rcx\n"
8515         "adcq    $0, %%rdx\n"
8516         "movq    64(%%rsi), %%rax\n"
8517         "addq    %%rcx, 120(%%rdi)\n"
8518         "adcq    $0, %%rdx\n"
8519         "movq    %%rdx, %%rcx\n"
8520         "mulq    %%r9\n"
8521         "addq    %%rax, %%rcx\n"
8522         "adcq    $0, %%rdx\n"
8523         "movq    72(%%rsi), %%rax\n"
8524         "addq    %%rcx, 128(%%rdi)\n"
8525         "adcq    $0, %%rdx\n"
8526         "movq    %%rdx, %%rcx\n"
8527         "mulq    %%r9\n"
8528         "addq    %%rax, %%rcx\n"
8529         "adcq    $0, %%rdx\n"
8530         "movq    80(%%rsi), %%rax\n"
8531         "addq    %%rcx, 136(%%rdi)\n"
8532         "adcq    $0, %%rdx\n"
8533         "movq    %%rdx, %%rcx\n"
8534         "mulq    %%r9\n"
8535         "addq    %%rax, %%rcx\n"
8536         "adcq    $0, %%rdx\n"
8537         "addq    %%rcx, 144(%%rdi)\n"
8538         "adcq    $0, %%rdx\n"
8539         "movq    %%rdx, 152(%%rdi)\n"
8540         "### x*y[9]\n"
8541         "movq    72(%%r8), %%r9\n"
8542         "movq    0(%%rsi), %%rax\n"
8543         "mulq    %%r9\n"
8544         "addq    %%rax, 72(%%rdi)\n"
8545         "movq    8(%%rsi), %%rax\n"
8546         "adcq    $0, %%rdx\n"
8547         "movq    %%rdx, %%rcx\n"
8548         "mulq    %%r9\n"
8549         "addq    %%rax, %%rcx\n"
8550         "adcq    $0, %%rdx\n"
8551         "movq    16(%%rsi), %%rax\n"
8552         "addq    %%rcx, 80(%%rdi)\n"
8553         "adcq    $0, %%rdx\n"
8554         "movq    %%rdx, %%rcx\n"
8555         "mulq    %%r9\n"
8556         "addq    %%rax, %%rcx\n"
8557         "adcq    $0, %%rdx\n"
8558         "movq    24(%%rsi), %%rax\n"
8559         "addq    %%rcx, 88(%%rdi)\n"
8560         "adcq    $0, %%rdx\n"
8561         "movq    %%rdx, %%rcx\n"
8562         "mulq    %%r9\n"
8563         "addq    %%rax, %%rcx\n"
8564         "adcq    $0, %%rdx\n"
8565         "movq    32(%%rsi), %%rax\n"
8566         "addq    %%rcx, 96(%%rdi)\n"
8567         "adcq    $0, %%rdx\n"
8568         "movq    %%rdx, %%rcx\n"
8569         "mulq    %%r9\n"
8570         "addq    %%rax, %%rcx\n"
8571         "adcq    $0, %%rdx\n"
8572         "movq    40(%%rsi), %%rax\n"
8573         "addq    %%rcx, 104(%%rdi)\n"
8574         "adcq    $0, %%rdx\n"
8575         "movq    %%rdx, %%rcx\n"
8576         "mulq    %%r9\n"
8577         "addq    %%rax, %%rcx\n"
8578         "adcq    $0, %%rdx\n"
8579         "movq    48(%%rsi), %%rax\n"
8580         "addq    %%rcx, 112(%%rdi)\n"
8581         "adcq    $0, %%rdx\n"
8582         "movq    %%rdx, %%rcx\n"
8583         "mulq    %%r9\n"
8584         "addq    %%rax, %%rcx\n"
8585         "adcq    $0, %%rdx\n"
8586         "movq    56(%%rsi), %%rax\n"
8587         "addq    %%rcx, 120(%%rdi)\n"
8588         "adcq    $0, %%rdx\n"
8589         "movq    %%rdx, %%rcx\n"
8590         "mulq    %%r9\n"
8591         "addq    %%rax, %%rcx\n"
8592         "adcq    $0, %%rdx\n"
8593         "movq    64(%%rsi), %%rax\n"
8594         "addq    %%rcx, 128(%%rdi)\n"
8595         "adcq    $0, %%rdx\n"
8596         "movq    %%rdx, %%rcx\n"
8597         "mulq    %%r9\n"
8598         "addq    %%rax, %%rcx\n"
8599         "adcq    $0, %%rdx\n"
8600         "movq    72(%%rsi), %%rax\n"
8601         "addq    %%rcx, 136(%%rdi)\n"
8602         "adcq    $0, %%rdx\n"
8603         "movq    %%rdx, %%rcx\n"
8604         "mulq    %%r9\n"
8605         "addq    %%rax, %%rcx\n"
8606         "adcq    $0, %%rdx\n"
8607         "movq    80(%%rsi), %%rax\n"
8608         "addq    %%rcx, 144(%%rdi)\n"
8609         "adcq    $0, %%rdx\n"
8610         "movq    %%rdx, %%rcx\n"
8611         "mulq    %%r9\n"
8612         "addq    %%rax, %%rcx\n"
8613         "adcq    $0, %%rdx\n"
8614         "addq    %%rcx, 152(%%rdi)\n"
8615         "adcq    $0, %%rdx\n"
8616         "movq    %%rdx, 160(%%rdi)\n"
8617         "### x*y[10]\n"
8618         "movq    80(%%r8), %%r9\n"
8619         "movq    0(%%rsi), %%rax\n"
8620         "mulq    %%r9\n"
8621         "addq    %%rax, 80(%%rdi)\n"
8622         "movq    8(%%rsi), %%rax\n"
8623         "adcq    $0, %%rdx\n"
8624         "movq    %%rdx, %%rcx\n"
8625         "mulq    %%r9\n"
8626         "addq    %%rax, %%rcx\n"
8627         "adcq    $0, %%rdx\n"
8628         "movq    16(%%rsi), %%rax\n"
8629         "addq    %%rcx, 88(%%rdi)\n"
8630         "adcq    $0, %%rdx\n"
8631         "movq    %%rdx, %%rcx\n"
8632         "mulq    %%r9\n"
8633         "addq    %%rax, %%rcx\n"
8634         "adcq    $0, %%rdx\n"
8635         "movq    24(%%rsi), %%rax\n"
8636         "addq    %%rcx, 96(%%rdi)\n"
8637         "adcq    $0, %%rdx\n"
8638         "movq    %%rdx, %%rcx\n"
8639         "mulq    %%r9\n"
8640         "addq    %%rax, %%rcx\n"
8641         "adcq    $0, %%rdx\n"
8642         "movq    32(%%rsi), %%rax\n"
8643         "addq    %%rcx, 104(%%rdi)\n"
8644         "adcq    $0, %%rdx\n"
8645         "movq    %%rdx, %%rcx\n"
8646         "mulq    %%r9\n"
8647         "addq    %%rax, %%rcx\n"
8648         "adcq    $0, %%rdx\n"
8649         "movq    40(%%rsi), %%rax\n"
8650         "addq    %%rcx, 112(%%rdi)\n"
8651         "adcq    $0, %%rdx\n"
8652         "movq    %%rdx, %%rcx\n"
8653         "mulq    %%r9\n"
8654         "addq    %%rax, %%rcx\n"
8655         "adcq    $0, %%rdx\n"
8656         "movq    48(%%rsi), %%rax\n"
8657         "addq    %%rcx, 120(%%rdi)\n"
8658         "adcq    $0, %%rdx\n"
8659         "movq    %%rdx, %%rcx\n"
8660         "mulq    %%r9\n"
8661         "addq    %%rax, %%rcx\n"
8662         "adcq    $0, %%rdx\n"
8663         "movq    56(%%rsi), %%rax\n"
8664         "addq    %%rcx, 128(%%rdi)\n"
8665         "adcq    $0, %%rdx\n"
8666         "movq    %%rdx, %%rcx\n"
8667         "mulq    %%r9\n"
8668         "addq    %%rax, %%rcx\n"
8669         "adcq    $0, %%rdx\n"
8670         "movq    64(%%rsi), %%rax\n"
8671         "addq    %%rcx, 136(%%rdi)\n"
8672         "adcq    $0, %%rdx\n"
8673         "movq    %%rdx, %%rcx\n"
8674         "mulq    %%r9\n"
8675         "addq    %%rax, %%rcx\n"
8676         "adcq    $0, %%rdx\n"
8677         "movq    72(%%rsi), %%rax\n"
8678         "addq    %%rcx, 144(%%rdi)\n"
8679         "adcq    $0, %%rdx\n"
8680         "movq    %%rdx, %%rcx\n"
8681         "mulq    %%r9\n"
8682         "addq    %%rax, %%rcx\n"
8683         "adcq    $0, %%rdx\n"
8684         "movq    80(%%rsi), %%rax\n"
8685         "addq    %%rcx, 152(%%rdi)\n"
8686         "adcq    $0, %%rdx\n"
8687         "movq    %%rdx, %%rcx\n"
8688         "mulq    %%r9\n"
8689         "addq    %%rax, %%rcx\n"
8690         "adcq    $0, %%rdx\n"
8691         "addq    %%rcx, 160(%%rdi)\n"
8692         "adcq    $0, %%rdx\n"
8693         "movq    %%rdx, 168(%%rdi)\n"
8694       : "+m" (z)
8695       : "m" (x), "m" (y)
8696       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
8697 }
8698 
8699 /* x has 11 words, z has 24. Put x*y in z. */
8700 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
8701 static inline
mpfq_fixmp_11_sqr(mp_limb_t * z,const mp_limb_t * x)8702 void mpfq_fixmp_11_sqr(mp_limb_t * z, const mp_limb_t * x)
8703 {
8704     mpfq_fixmp_11_mul(z, x, x);
8705 }
8706 
8707 /* x has 11 words, z has 13. Put x*y in z. */
8708 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
8709 static inline
mpfq_fixmp_11_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)8710 void mpfq_fixmp_11_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
8711 {
8712     __asm__ __volatile__(
8713         "movq    %[z], %%rdi\n"
8714         "movq    %[x], %%rsi\n"
8715         "movq    0(%%rsi), %%rax\n"
8716         "mulq    %[mult]\n"
8717         "movq    %%rax, 0(%%rdi)\n"
8718         "movq    8(%%rsi), %%rax\n"
8719         "movq    %%rdx, %%rcx\n"
8720         "mulq    %[mult]\n"
8721         "addq    %%rax, %%rcx\n"
8722         "adcq    $0, %%rdx\n"
8723         "movq    16(%%rsi), %%rax\n"
8724         "movq    %%rcx, 8(%%rdi)\n"
8725         "movq    %%rdx, %%rcx\n"
8726         "mulq    %[mult]\n"
8727         "addq    %%rax, %%rcx\n"
8728         "adcq    $0, %%rdx\n"
8729         "movq    24(%%rsi), %%rax\n"
8730         "movq    %%rcx, 16(%%rdi)\n"
8731         "movq    %%rdx, %%rcx\n"
8732         "mulq    %[mult]\n"
8733         "addq    %%rax, %%rcx\n"
8734         "adcq    $0, %%rdx\n"
8735         "movq    32(%%rsi), %%rax\n"
8736         "movq    %%rcx, 24(%%rdi)\n"
8737         "movq    %%rdx, %%rcx\n"
8738         "mulq    %[mult]\n"
8739         "addq    %%rax, %%rcx\n"
8740         "adcq    $0, %%rdx\n"
8741         "movq    40(%%rsi), %%rax\n"
8742         "movq    %%rcx, 32(%%rdi)\n"
8743         "movq    %%rdx, %%rcx\n"
8744         "mulq    %[mult]\n"
8745         "addq    %%rax, %%rcx\n"
8746         "adcq    $0, %%rdx\n"
8747         "movq    48(%%rsi), %%rax\n"
8748         "movq    %%rcx, 40(%%rdi)\n"
8749         "movq    %%rdx, %%rcx\n"
8750         "mulq    %[mult]\n"
8751         "addq    %%rax, %%rcx\n"
8752         "adcq    $0, %%rdx\n"
8753         "movq    56(%%rsi), %%rax\n"
8754         "movq    %%rcx, 48(%%rdi)\n"
8755         "movq    %%rdx, %%rcx\n"
8756         "mulq    %[mult]\n"
8757         "addq    %%rax, %%rcx\n"
8758         "adcq    $0, %%rdx\n"
8759         "movq    64(%%rsi), %%rax\n"
8760         "movq    %%rcx, 56(%%rdi)\n"
8761         "movq    %%rdx, %%rcx\n"
8762         "mulq    %[mult]\n"
8763         "addq    %%rax, %%rcx\n"
8764         "adcq    $0, %%rdx\n"
8765         "movq    72(%%rsi), %%rax\n"
8766         "movq    %%rcx, 64(%%rdi)\n"
8767         "movq    %%rdx, %%rcx\n"
8768         "mulq    %[mult]\n"
8769         "addq    %%rax, %%rcx\n"
8770         "adcq    $0, %%rdx\n"
8771         "movq    80(%%rsi), %%rax\n"
8772         "movq    %%rcx, 72(%%rdi)\n"
8773         "movq    %%rdx, %%rcx\n"
8774         "mulq    %[mult]\n"
8775         "addq    %%rax, %%rcx\n"
8776         "adcq    $0, %%rdx\n"
8777         "movq    %%rcx, 80(%%rdi)\n"
8778         "movq    %%rdx, 88(%%rdi)\n"
8779     :
8780     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
8781     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
8782 }
8783 
8784 /* x, y, and z have 12 words. Result in z. Return carry bit */
8785 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
8786 static inline
mpfq_fixmp_12_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)8787 mp_limb_t mpfq_fixmp_12_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
8788 {
8789     mp_limb_t carry;
8790     __asm__ __volatile__(
8791         "movq    %[z], %%rdi\n"
8792         "movq    %[x], %%rsi\n"
8793         "movq    %[y], %%rdx\n"
8794         "movq    0(%%rsi), %%rax\n"
8795         "addq    0(%%rdx), %%rax\n"
8796         "movq    %%rax, 0(%%rdi)\n"
8797         "movq    8(%%rsi), %%rax\n"
8798         "adcq    8(%%rdx), %%rax\n"
8799         "movq    %%rax, 8(%%rdi)\n"
8800         "movq    16(%%rsi), %%rax\n"
8801         "adcq    16(%%rdx), %%rax\n"
8802         "movq    %%rax, 16(%%rdi)\n"
8803         "movq    24(%%rsi), %%rax\n"
8804         "adcq    24(%%rdx), %%rax\n"
8805         "movq    %%rax, 24(%%rdi)\n"
8806         "movq    32(%%rsi), %%rax\n"
8807         "adcq    32(%%rdx), %%rax\n"
8808         "movq    %%rax, 32(%%rdi)\n"
8809         "movq    40(%%rsi), %%rax\n"
8810         "adcq    40(%%rdx), %%rax\n"
8811         "movq    %%rax, 40(%%rdi)\n"
8812         "movq    48(%%rsi), %%rax\n"
8813         "adcq    48(%%rdx), %%rax\n"
8814         "movq    %%rax, 48(%%rdi)\n"
8815         "movq    56(%%rsi), %%rax\n"
8816         "adcq    56(%%rdx), %%rax\n"
8817         "movq    %%rax, 56(%%rdi)\n"
8818         "movq    64(%%rsi), %%rax\n"
8819         "adcq    64(%%rdx), %%rax\n"
8820         "movq    %%rax, 64(%%rdi)\n"
8821         "movq    72(%%rsi), %%rax\n"
8822         "adcq    72(%%rdx), %%rax\n"
8823         "movq    %%rax, 72(%%rdi)\n"
8824         "movq    80(%%rsi), %%rax\n"
8825         "adcq    80(%%rdx), %%rax\n"
8826         "movq    %%rax, 80(%%rdi)\n"
8827         "movq    88(%%rsi), %%rax\n"
8828         "adcq    88(%%rdx), %%rax\n"
8829         "movq    %%rax, 88(%%rdi)\n"
8830         "movq $0, %%rax\n"
8831         "adcq $0, %%rax\n"
8832     : "=&a"(carry)
8833     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
8834     : "%rdx", "%rsi", "%rdi", "memory");
8835     return carry;
8836 }
8837 
8838 /* x, y, and z have 12 words. Result in z. Return borrow bit */
8839 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
8840 static inline
mpfq_fixmp_12_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)8841 mp_limb_t mpfq_fixmp_12_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
8842 {
8843     mp_limb_t carry;
8844     __asm__ __volatile__(
8845         "movq    %[z], %%rdi\n"
8846         "movq    %[x], %%rsi\n"
8847         "movq    %[y], %%rdx\n"
8848         "movq    0(%%rsi), %%rax\n"
8849         "subq    0(%%rdx), %%rax\n"
8850         "movq    %%rax, 0(%%rdi)\n"
8851         "movq    8(%%rsi), %%rax\n"
8852         "sbbq    8(%%rdx), %%rax\n"
8853         "movq    %%rax, 8(%%rdi)\n"
8854         "movq    16(%%rsi), %%rax\n"
8855         "sbbq    16(%%rdx), %%rax\n"
8856         "movq    %%rax, 16(%%rdi)\n"
8857         "movq    24(%%rsi), %%rax\n"
8858         "sbbq    24(%%rdx), %%rax\n"
8859         "movq    %%rax, 24(%%rdi)\n"
8860         "movq    32(%%rsi), %%rax\n"
8861         "sbbq    32(%%rdx), %%rax\n"
8862         "movq    %%rax, 32(%%rdi)\n"
8863         "movq    40(%%rsi), %%rax\n"
8864         "sbbq    40(%%rdx), %%rax\n"
8865         "movq    %%rax, 40(%%rdi)\n"
8866         "movq    48(%%rsi), %%rax\n"
8867         "sbbq    48(%%rdx), %%rax\n"
8868         "movq    %%rax, 48(%%rdi)\n"
8869         "movq    56(%%rsi), %%rax\n"
8870         "sbbq    56(%%rdx), %%rax\n"
8871         "movq    %%rax, 56(%%rdi)\n"
8872         "movq    64(%%rsi), %%rax\n"
8873         "sbbq    64(%%rdx), %%rax\n"
8874         "movq    %%rax, 64(%%rdi)\n"
8875         "movq    72(%%rsi), %%rax\n"
8876         "sbbq    72(%%rdx), %%rax\n"
8877         "movq    %%rax, 72(%%rdi)\n"
8878         "movq    80(%%rsi), %%rax\n"
8879         "sbbq    80(%%rdx), %%rax\n"
8880         "movq    %%rax, 80(%%rdi)\n"
8881         "movq    88(%%rsi), %%rax\n"
8882         "sbbq    88(%%rdx), %%rax\n"
8883         "movq    %%rax, 88(%%rdi)\n"
8884         "movq $0, %%rax\n"
8885         "adcq $0, %%rax\n"
8886     : "=&a"(carry)
8887     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
8888     : "%rdx", "%rsi", "%rdi", "memory");
8889     return carry;
8890 }
8891 
8892 /* x, y, and z have 12 words. Result in z. Carry bit is lost. */
8893 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
8894 static inline
mpfq_fixmp_12_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)8895 void mpfq_fixmp_12_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
8896 {
8897     __asm__ __volatile__(
8898         "movq    %[z], %%rdi\n"
8899         "movq    %[x], %%rsi\n"
8900         "movq    %[y], %%rdx\n"
8901         "movq    0(%%rsi), %%rax\n"
8902         "addq    0(%%rdx), %%rax\n"
8903         "movq    %%rax, 0(%%rdi)\n"
8904         "movq    8(%%rsi), %%rax\n"
8905         "adcq    8(%%rdx), %%rax\n"
8906         "movq    %%rax, 8(%%rdi)\n"
8907         "movq    16(%%rsi), %%rax\n"
8908         "adcq    16(%%rdx), %%rax\n"
8909         "movq    %%rax, 16(%%rdi)\n"
8910         "movq    24(%%rsi), %%rax\n"
8911         "adcq    24(%%rdx), %%rax\n"
8912         "movq    %%rax, 24(%%rdi)\n"
8913         "movq    32(%%rsi), %%rax\n"
8914         "adcq    32(%%rdx), %%rax\n"
8915         "movq    %%rax, 32(%%rdi)\n"
8916         "movq    40(%%rsi), %%rax\n"
8917         "adcq    40(%%rdx), %%rax\n"
8918         "movq    %%rax, 40(%%rdi)\n"
8919         "movq    48(%%rsi), %%rax\n"
8920         "adcq    48(%%rdx), %%rax\n"
8921         "movq    %%rax, 48(%%rdi)\n"
8922         "movq    56(%%rsi), %%rax\n"
8923         "adcq    56(%%rdx), %%rax\n"
8924         "movq    %%rax, 56(%%rdi)\n"
8925         "movq    64(%%rsi), %%rax\n"
8926         "adcq    64(%%rdx), %%rax\n"
8927         "movq    %%rax, 64(%%rdi)\n"
8928         "movq    72(%%rsi), %%rax\n"
8929         "adcq    72(%%rdx), %%rax\n"
8930         "movq    %%rax, 72(%%rdi)\n"
8931         "movq    80(%%rsi), %%rax\n"
8932         "adcq    80(%%rdx), %%rax\n"
8933         "movq    %%rax, 80(%%rdi)\n"
8934         "movq    88(%%rsi), %%rax\n"
8935         "adcq    88(%%rdx), %%rax\n"
8936         "movq    %%rax, 88(%%rdi)\n"
8937     :
8938     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
8939     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
8940 }
8941 
8942 /* x, y, and z have 12 words. Result in z. Borrow bit is lost. */
8943 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
8944 static inline
mpfq_fixmp_12_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)8945 void mpfq_fixmp_12_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
8946 {
8947     __asm__ __volatile__(
8948         "movq    %[z], %%rdi\n"
8949         "movq    %[x], %%rsi\n"
8950         "movq    %[y], %%rdx\n"
8951         "movq    0(%%rsi), %%rax\n"
8952         "subq    0(%%rdx), %%rax\n"
8953         "movq    %%rax, 0(%%rdi)\n"
8954         "movq    8(%%rsi), %%rax\n"
8955         "sbbq    8(%%rdx), %%rax\n"
8956         "movq    %%rax, 8(%%rdi)\n"
8957         "movq    16(%%rsi), %%rax\n"
8958         "sbbq    16(%%rdx), %%rax\n"
8959         "movq    %%rax, 16(%%rdi)\n"
8960         "movq    24(%%rsi), %%rax\n"
8961         "sbbq    24(%%rdx), %%rax\n"
8962         "movq    %%rax, 24(%%rdi)\n"
8963         "movq    32(%%rsi), %%rax\n"
8964         "sbbq    32(%%rdx), %%rax\n"
8965         "movq    %%rax, 32(%%rdi)\n"
8966         "movq    40(%%rsi), %%rax\n"
8967         "sbbq    40(%%rdx), %%rax\n"
8968         "movq    %%rax, 40(%%rdi)\n"
8969         "movq    48(%%rsi), %%rax\n"
8970         "sbbq    48(%%rdx), %%rax\n"
8971         "movq    %%rax, 48(%%rdi)\n"
8972         "movq    56(%%rsi), %%rax\n"
8973         "sbbq    56(%%rdx), %%rax\n"
8974         "movq    %%rax, 56(%%rdi)\n"
8975         "movq    64(%%rsi), %%rax\n"
8976         "sbbq    64(%%rdx), %%rax\n"
8977         "movq    %%rax, 64(%%rdi)\n"
8978         "movq    72(%%rsi), %%rax\n"
8979         "sbbq    72(%%rdx), %%rax\n"
8980         "movq    %%rax, 72(%%rdi)\n"
8981         "movq    80(%%rsi), %%rax\n"
8982         "sbbq    80(%%rdx), %%rax\n"
8983         "movq    %%rax, 80(%%rdi)\n"
8984         "movq    88(%%rsi), %%rax\n"
8985         "sbbq    88(%%rdx), %%rax\n"
8986         "movq    %%rax, 88(%%rdi)\n"
8987     :
8988     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
8989     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
8990 }
8991 
8992 /* x has 12 words, z has 14.
8993  * Put (z+x*c) in z. Return carry bit. */
8994 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
8995 static inline
mpfq_fixmp_12_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)8996 mp_limb_t mpfq_fixmp_12_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
8997 {
8998     mp_limb_t carry;
8999     __asm__ __volatile__(
9000         "movq    %[z], %%rdi\n"
9001         "movq    %[x], %%rsi\n"
9002         "movq    0(%%rsi), %%rax\n"
9003         "mulq    %[mult]\n"
9004         "addq    %%rax, 0(%%rdi)\n"
9005         "movq    8(%%rsi), %%rax\n"
9006         "adcq    $0, %%rdx\n"
9007         "movq    %%rdx, %%rcx\n"
9008         "mulq    %[mult]\n"
9009         "addq    %%rax, %%rcx\n"
9010         "adcq    $0, %%rdx\n"
9011         "movq    16(%%rsi), %%rax\n"
9012         "addq    %%rcx, 8(%%rdi)\n"
9013         "adcq    $0, %%rdx\n"
9014         "movq    %%rdx, %%rcx\n"
9015         "mulq    %[mult]\n"
9016         "addq    %%rax, %%rcx\n"
9017         "adcq    $0, %%rdx\n"
9018         "movq    24(%%rsi), %%rax\n"
9019         "addq    %%rcx, 16(%%rdi)\n"
9020         "adcq    $0, %%rdx\n"
9021         "movq    %%rdx, %%rcx\n"
9022         "mulq    %[mult]\n"
9023         "addq    %%rax, %%rcx\n"
9024         "adcq    $0, %%rdx\n"
9025         "movq    32(%%rsi), %%rax\n"
9026         "addq    %%rcx, 24(%%rdi)\n"
9027         "adcq    $0, %%rdx\n"
9028         "movq    %%rdx, %%rcx\n"
9029         "mulq    %[mult]\n"
9030         "addq    %%rax, %%rcx\n"
9031         "adcq    $0, %%rdx\n"
9032         "movq    40(%%rsi), %%rax\n"
9033         "addq    %%rcx, 32(%%rdi)\n"
9034         "adcq    $0, %%rdx\n"
9035         "movq    %%rdx, %%rcx\n"
9036         "mulq    %[mult]\n"
9037         "addq    %%rax, %%rcx\n"
9038         "adcq    $0, %%rdx\n"
9039         "movq    48(%%rsi), %%rax\n"
9040         "addq    %%rcx, 40(%%rdi)\n"
9041         "adcq    $0, %%rdx\n"
9042         "movq    %%rdx, %%rcx\n"
9043         "mulq    %[mult]\n"
9044         "addq    %%rax, %%rcx\n"
9045         "adcq    $0, %%rdx\n"
9046         "movq    56(%%rsi), %%rax\n"
9047         "addq    %%rcx, 48(%%rdi)\n"
9048         "adcq    $0, %%rdx\n"
9049         "movq    %%rdx, %%rcx\n"
9050         "mulq    %[mult]\n"
9051         "addq    %%rax, %%rcx\n"
9052         "adcq    $0, %%rdx\n"
9053         "movq    64(%%rsi), %%rax\n"
9054         "addq    %%rcx, 56(%%rdi)\n"
9055         "adcq    $0, %%rdx\n"
9056         "movq    %%rdx, %%rcx\n"
9057         "mulq    %[mult]\n"
9058         "addq    %%rax, %%rcx\n"
9059         "adcq    $0, %%rdx\n"
9060         "movq    72(%%rsi), %%rax\n"
9061         "addq    %%rcx, 64(%%rdi)\n"
9062         "adcq    $0, %%rdx\n"
9063         "movq    %%rdx, %%rcx\n"
9064         "mulq    %[mult]\n"
9065         "addq    %%rax, %%rcx\n"
9066         "adcq    $0, %%rdx\n"
9067         "movq    80(%%rsi), %%rax\n"
9068         "addq    %%rcx, 72(%%rdi)\n"
9069         "adcq    $0, %%rdx\n"
9070         "movq    %%rdx, %%rcx\n"
9071         "mulq    %[mult]\n"
9072         "addq    %%rax, %%rcx\n"
9073         "adcq    $0, %%rdx\n"
9074         "movq    88(%%rsi), %%rax\n"
9075         "addq    %%rcx, 80(%%rdi)\n"
9076         "adcq    $0, %%rdx\n"
9077         "movq    %%rdx, %%rcx\n"
9078         "mulq    %[mult]\n"
9079         "addq    %%rax, %%rcx\n"
9080         "adcq    $0, %%rdx\n"
9081         "addq    %%rcx, 88(%%rdi)\n"
9082         "adcq    $0, %%rdx\n"
9083         "xorq    %%rcx, %%rcx\n"
9084         "addq    %%rdx, 96(%%rdi)\n"
9085         "adcq    $0, %%rcx\n"
9086         "movq    %%rcx, %[carry]\n"
9087     : [carry]"=g"(carry), [z] "+m" (z)
9088     : [mult] "r" (c), [x] "m" (x)
9089     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
9090     return carry;
9091 }
9092 
9093 /* x has 12 words, z has 14.
9094  * Put (z+x*c) in z. Carry bit is lost. */
9095 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
9096 static inline
mpfq_fixmp_12_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)9097 void mpfq_fixmp_12_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
9098 {
9099     __asm__ __volatile__(
9100         "movq    %[z], %%rdi\n"
9101         "movq    %[x], %%rsi\n"
9102         "movq    0(%%rsi), %%rax\n"
9103         "mulq    %[mult]\n"
9104         "addq    %%rax, 0(%%rdi)\n"
9105         "movq    8(%%rsi), %%rax\n"
9106         "adcq    $0, %%rdx\n"
9107         "movq    %%rdx, %%rcx\n"
9108         "mulq    %[mult]\n"
9109         "addq    %%rax, %%rcx\n"
9110         "adcq    $0, %%rdx\n"
9111         "movq    16(%%rsi), %%rax\n"
9112         "addq    %%rcx, 8(%%rdi)\n"
9113         "adcq    $0, %%rdx\n"
9114         "movq    %%rdx, %%rcx\n"
9115         "mulq    %[mult]\n"
9116         "addq    %%rax, %%rcx\n"
9117         "adcq    $0, %%rdx\n"
9118         "movq    24(%%rsi), %%rax\n"
9119         "addq    %%rcx, 16(%%rdi)\n"
9120         "adcq    $0, %%rdx\n"
9121         "movq    %%rdx, %%rcx\n"
9122         "mulq    %[mult]\n"
9123         "addq    %%rax, %%rcx\n"
9124         "adcq    $0, %%rdx\n"
9125         "movq    32(%%rsi), %%rax\n"
9126         "addq    %%rcx, 24(%%rdi)\n"
9127         "adcq    $0, %%rdx\n"
9128         "movq    %%rdx, %%rcx\n"
9129         "mulq    %[mult]\n"
9130         "addq    %%rax, %%rcx\n"
9131         "adcq    $0, %%rdx\n"
9132         "movq    40(%%rsi), %%rax\n"
9133         "addq    %%rcx, 32(%%rdi)\n"
9134         "adcq    $0, %%rdx\n"
9135         "movq    %%rdx, %%rcx\n"
9136         "mulq    %[mult]\n"
9137         "addq    %%rax, %%rcx\n"
9138         "adcq    $0, %%rdx\n"
9139         "movq    48(%%rsi), %%rax\n"
9140         "addq    %%rcx, 40(%%rdi)\n"
9141         "adcq    $0, %%rdx\n"
9142         "movq    %%rdx, %%rcx\n"
9143         "mulq    %[mult]\n"
9144         "addq    %%rax, %%rcx\n"
9145         "adcq    $0, %%rdx\n"
9146         "movq    56(%%rsi), %%rax\n"
9147         "addq    %%rcx, 48(%%rdi)\n"
9148         "adcq    $0, %%rdx\n"
9149         "movq    %%rdx, %%rcx\n"
9150         "mulq    %[mult]\n"
9151         "addq    %%rax, %%rcx\n"
9152         "adcq    $0, %%rdx\n"
9153         "movq    64(%%rsi), %%rax\n"
9154         "addq    %%rcx, 56(%%rdi)\n"
9155         "adcq    $0, %%rdx\n"
9156         "movq    %%rdx, %%rcx\n"
9157         "mulq    %[mult]\n"
9158         "addq    %%rax, %%rcx\n"
9159         "adcq    $0, %%rdx\n"
9160         "movq    72(%%rsi), %%rax\n"
9161         "addq    %%rcx, 64(%%rdi)\n"
9162         "adcq    $0, %%rdx\n"
9163         "movq    %%rdx, %%rcx\n"
9164         "mulq    %[mult]\n"
9165         "addq    %%rax, %%rcx\n"
9166         "adcq    $0, %%rdx\n"
9167         "movq    80(%%rsi), %%rax\n"
9168         "addq    %%rcx, 72(%%rdi)\n"
9169         "adcq    $0, %%rdx\n"
9170         "movq    %%rdx, %%rcx\n"
9171         "mulq    %[mult]\n"
9172         "addq    %%rax, %%rcx\n"
9173         "adcq    $0, %%rdx\n"
9174         "movq    88(%%rsi), %%rax\n"
9175         "addq    %%rcx, 80(%%rdi)\n"
9176         "adcq    $0, %%rdx\n"
9177         "movq    %%rdx, %%rcx\n"
9178         "mulq    %[mult]\n"
9179         "addq    %%rax, %%rcx\n"
9180         "adcq    $0, %%rdx\n"
9181         "addq    %%rcx, 88(%%rdi)\n"
9182         "adcq    $0, %%rdx\n"
9183         "addq    %%rdx, 96(%%rdi)\n"
9184     : [z] "+m" (z)
9185     : [mult] "r" (c), [x] "m" (x)
9186     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
9187 }
9188 
9189 /* x has 12 words, z has 13.
9190  * Put (z+x*c) in z. Return carry word. */
9191 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
9192 static inline
mpfq_fixmp_12_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)9193 mp_limb_t mpfq_fixmp_12_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
9194 {
9195     mp_limb_t carry;
9196     __asm__ __volatile__(
9197         "movq    %[z], %%rdi\n"
9198         "movq    %[x], %%rsi\n"
9199         "movq    0(%%rsi), %%rax\n"
9200         "mulq    %[mult]\n"
9201         "addq    %%rax, 0(%%rdi)\n"
9202         "movq    8(%%rsi), %%rax\n"
9203         "adcq    $0, %%rdx\n"
9204         "movq    %%rdx, %%rcx\n"
9205         "mulq    %[mult]\n"
9206         "addq    %%rax, %%rcx\n"
9207         "adcq    $0, %%rdx\n"
9208         "movq    16(%%rsi), %%rax\n"
9209         "addq    %%rcx, 8(%%rdi)\n"
9210         "adcq    $0, %%rdx\n"
9211         "movq    %%rdx, %%rcx\n"
9212         "mulq    %[mult]\n"
9213         "addq    %%rax, %%rcx\n"
9214         "adcq    $0, %%rdx\n"
9215         "movq    24(%%rsi), %%rax\n"
9216         "addq    %%rcx, 16(%%rdi)\n"
9217         "adcq    $0, %%rdx\n"
9218         "movq    %%rdx, %%rcx\n"
9219         "mulq    %[mult]\n"
9220         "addq    %%rax, %%rcx\n"
9221         "adcq    $0, %%rdx\n"
9222         "movq    32(%%rsi), %%rax\n"
9223         "addq    %%rcx, 24(%%rdi)\n"
9224         "adcq    $0, %%rdx\n"
9225         "movq    %%rdx, %%rcx\n"
9226         "mulq    %[mult]\n"
9227         "addq    %%rax, %%rcx\n"
9228         "adcq    $0, %%rdx\n"
9229         "movq    40(%%rsi), %%rax\n"
9230         "addq    %%rcx, 32(%%rdi)\n"
9231         "adcq    $0, %%rdx\n"
9232         "movq    %%rdx, %%rcx\n"
9233         "mulq    %[mult]\n"
9234         "addq    %%rax, %%rcx\n"
9235         "adcq    $0, %%rdx\n"
9236         "movq    48(%%rsi), %%rax\n"
9237         "addq    %%rcx, 40(%%rdi)\n"
9238         "adcq    $0, %%rdx\n"
9239         "movq    %%rdx, %%rcx\n"
9240         "mulq    %[mult]\n"
9241         "addq    %%rax, %%rcx\n"
9242         "adcq    $0, %%rdx\n"
9243         "movq    56(%%rsi), %%rax\n"
9244         "addq    %%rcx, 48(%%rdi)\n"
9245         "adcq    $0, %%rdx\n"
9246         "movq    %%rdx, %%rcx\n"
9247         "mulq    %[mult]\n"
9248         "addq    %%rax, %%rcx\n"
9249         "adcq    $0, %%rdx\n"
9250         "movq    64(%%rsi), %%rax\n"
9251         "addq    %%rcx, 56(%%rdi)\n"
9252         "adcq    $0, %%rdx\n"
9253         "movq    %%rdx, %%rcx\n"
9254         "mulq    %[mult]\n"
9255         "addq    %%rax, %%rcx\n"
9256         "adcq    $0, %%rdx\n"
9257         "movq    72(%%rsi), %%rax\n"
9258         "addq    %%rcx, 64(%%rdi)\n"
9259         "adcq    $0, %%rdx\n"
9260         "movq    %%rdx, %%rcx\n"
9261         "mulq    %[mult]\n"
9262         "addq    %%rax, %%rcx\n"
9263         "adcq    $0, %%rdx\n"
9264         "movq    80(%%rsi), %%rax\n"
9265         "addq    %%rcx, 72(%%rdi)\n"
9266         "adcq    $0, %%rdx\n"
9267         "movq    %%rdx, %%rcx\n"
9268         "mulq    %[mult]\n"
9269         "addq    %%rax, %%rcx\n"
9270         "adcq    $0, %%rdx\n"
9271         "movq    88(%%rsi), %%rax\n"
9272         "addq    %%rcx, 80(%%rdi)\n"
9273         "adcq    $0, %%rdx\n"
9274         "movq    %%rdx, %%rcx\n"
9275         "mulq    %[mult]\n"
9276         "addq    %%rax, %%rcx\n"
9277         "adcq    $0, %%rdx\n"
9278         "addq    %%rcx, 88(%%rdi)\n"
9279         "adcq    $0, %%rdx\n"
9280         "movq    %%rdx, %[carry]\n"
9281     : [carry]"=g"(carry), [z] "+m" (z)
9282     : [mult] "r" (c), [x] "m" (x)
9283     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
9284     return carry;
9285 }
9286 
9287 /* x and y have 12 words, z has 26. Put x*y in z. */
9288 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
9289 static inline
mpfq_fixmp_12_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)9290 void mpfq_fixmp_12_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
9291 {
9292     __asm__ __volatile__(
9293         "### x*y[0]\n"
9294         "movq    %2, %%r8\n"
9295         "movq    %0, %%rdi\n"
9296         "movq    0(%%r8), %%r9\n"
9297         "movq    %1, %%rsi\n"
9298         "movq    0(%%rsi), %%rax\n"
9299         "mulq    %%r9\n"
9300         "movq    %%rax, 0(%%rdi)\n"
9301         "movq    8(%%rsi), %%rax\n"
9302         "movq    %%rdx, %%rcx\n"
9303         "mulq    %%r9\n"
9304         "addq    %%rax, %%rcx\n"
9305         "adcq    $0, %%rdx\n"
9306         "movq    16(%%rsi), %%rax\n"
9307         "movq    %%rcx, 8(%%rdi)\n"
9308         "movq    %%rdx, %%rcx\n"
9309         "mulq    %%r9\n"
9310         "addq    %%rax, %%rcx\n"
9311         "adcq    $0, %%rdx\n"
9312         "movq    24(%%rsi), %%rax\n"
9313         "movq    %%rcx, 16(%%rdi)\n"
9314         "movq    %%rdx, %%rcx\n"
9315         "mulq    %%r9\n"
9316         "addq    %%rax, %%rcx\n"
9317         "adcq    $0, %%rdx\n"
9318         "movq    32(%%rsi), %%rax\n"
9319         "movq    %%rcx, 24(%%rdi)\n"
9320         "movq    %%rdx, %%rcx\n"
9321         "mulq    %%r9\n"
9322         "addq    %%rax, %%rcx\n"
9323         "adcq    $0, %%rdx\n"
9324         "movq    40(%%rsi), %%rax\n"
9325         "movq    %%rcx, 32(%%rdi)\n"
9326         "movq    %%rdx, %%rcx\n"
9327         "mulq    %%r9\n"
9328         "addq    %%rax, %%rcx\n"
9329         "adcq    $0, %%rdx\n"
9330         "movq    48(%%rsi), %%rax\n"
9331         "movq    %%rcx, 40(%%rdi)\n"
9332         "movq    %%rdx, %%rcx\n"
9333         "mulq    %%r9\n"
9334         "addq    %%rax, %%rcx\n"
9335         "adcq    $0, %%rdx\n"
9336         "movq    56(%%rsi), %%rax\n"
9337         "movq    %%rcx, 48(%%rdi)\n"
9338         "movq    %%rdx, %%rcx\n"
9339         "mulq    %%r9\n"
9340         "addq    %%rax, %%rcx\n"
9341         "adcq    $0, %%rdx\n"
9342         "movq    64(%%rsi), %%rax\n"
9343         "movq    %%rcx, 56(%%rdi)\n"
9344         "movq    %%rdx, %%rcx\n"
9345         "mulq    %%r9\n"
9346         "addq    %%rax, %%rcx\n"
9347         "adcq    $0, %%rdx\n"
9348         "movq    72(%%rsi), %%rax\n"
9349         "movq    %%rcx, 64(%%rdi)\n"
9350         "movq    %%rdx, %%rcx\n"
9351         "mulq    %%r9\n"
9352         "addq    %%rax, %%rcx\n"
9353         "adcq    $0, %%rdx\n"
9354         "movq    80(%%rsi), %%rax\n"
9355         "movq    %%rcx, 72(%%rdi)\n"
9356         "movq    %%rdx, %%rcx\n"
9357         "mulq    %%r9\n"
9358         "addq    %%rax, %%rcx\n"
9359         "adcq    $0, %%rdx\n"
9360         "movq    88(%%rsi), %%rax\n"
9361         "movq    %%rcx, 80(%%rdi)\n"
9362         "movq    %%rdx, %%rcx\n"
9363         "mulq    %%r9\n"
9364         "addq    %%rax, %%rcx\n"
9365         "adcq    $0, %%rdx\n"
9366         "movq    %%rcx, 88(%%rdi)\n"
9367         "movq    %%rdx, 96(%%rdi)\n"
9368         "movq    $0, 104(%%rdi)\n"
9369         "movq    $0, 112(%%rdi)\n"
9370         "movq    $0, 120(%%rdi)\n"
9371         "movq    $0, 128(%%rdi)\n"
9372         "movq    $0, 136(%%rdi)\n"
9373         "movq    $0, 144(%%rdi)\n"
9374         "movq    $0, 152(%%rdi)\n"
9375         "movq    $0, 160(%%rdi)\n"
9376         "movq    $0, 168(%%rdi)\n"
9377         "movq    $0, 176(%%rdi)\n"
9378         "movq    $0, 184(%%rdi)\n"
9379         "### x*y[1]\n"
9380         "movq    8(%%r8), %%r9\n"
9381         "movq    0(%%rsi), %%rax\n"
9382         "mulq    %%r9\n"
9383         "addq    %%rax, 8(%%rdi)\n"
9384         "movq    8(%%rsi), %%rax\n"
9385         "adcq    $0, %%rdx\n"
9386         "movq    %%rdx, %%rcx\n"
9387         "mulq    %%r9\n"
9388         "addq    %%rax, %%rcx\n"
9389         "adcq    $0, %%rdx\n"
9390         "movq    16(%%rsi), %%rax\n"
9391         "addq    %%rcx, 16(%%rdi)\n"
9392         "adcq    $0, %%rdx\n"
9393         "movq    %%rdx, %%rcx\n"
9394         "mulq    %%r9\n"
9395         "addq    %%rax, %%rcx\n"
9396         "adcq    $0, %%rdx\n"
9397         "movq    24(%%rsi), %%rax\n"
9398         "addq    %%rcx, 24(%%rdi)\n"
9399         "adcq    $0, %%rdx\n"
9400         "movq    %%rdx, %%rcx\n"
9401         "mulq    %%r9\n"
9402         "addq    %%rax, %%rcx\n"
9403         "adcq    $0, %%rdx\n"
9404         "movq    32(%%rsi), %%rax\n"
9405         "addq    %%rcx, 32(%%rdi)\n"
9406         "adcq    $0, %%rdx\n"
9407         "movq    %%rdx, %%rcx\n"
9408         "mulq    %%r9\n"
9409         "addq    %%rax, %%rcx\n"
9410         "adcq    $0, %%rdx\n"
9411         "movq    40(%%rsi), %%rax\n"
9412         "addq    %%rcx, 40(%%rdi)\n"
9413         "adcq    $0, %%rdx\n"
9414         "movq    %%rdx, %%rcx\n"
9415         "mulq    %%r9\n"
9416         "addq    %%rax, %%rcx\n"
9417         "adcq    $0, %%rdx\n"
9418         "movq    48(%%rsi), %%rax\n"
9419         "addq    %%rcx, 48(%%rdi)\n"
9420         "adcq    $0, %%rdx\n"
9421         "movq    %%rdx, %%rcx\n"
9422         "mulq    %%r9\n"
9423         "addq    %%rax, %%rcx\n"
9424         "adcq    $0, %%rdx\n"
9425         "movq    56(%%rsi), %%rax\n"
9426         "addq    %%rcx, 56(%%rdi)\n"
9427         "adcq    $0, %%rdx\n"
9428         "movq    %%rdx, %%rcx\n"
9429         "mulq    %%r9\n"
9430         "addq    %%rax, %%rcx\n"
9431         "adcq    $0, %%rdx\n"
9432         "movq    64(%%rsi), %%rax\n"
9433         "addq    %%rcx, 64(%%rdi)\n"
9434         "adcq    $0, %%rdx\n"
9435         "movq    %%rdx, %%rcx\n"
9436         "mulq    %%r9\n"
9437         "addq    %%rax, %%rcx\n"
9438         "adcq    $0, %%rdx\n"
9439         "movq    72(%%rsi), %%rax\n"
9440         "addq    %%rcx, 72(%%rdi)\n"
9441         "adcq    $0, %%rdx\n"
9442         "movq    %%rdx, %%rcx\n"
9443         "mulq    %%r9\n"
9444         "addq    %%rax, %%rcx\n"
9445         "adcq    $0, %%rdx\n"
9446         "movq    80(%%rsi), %%rax\n"
9447         "addq    %%rcx, 80(%%rdi)\n"
9448         "adcq    $0, %%rdx\n"
9449         "movq    %%rdx, %%rcx\n"
9450         "mulq    %%r9\n"
9451         "addq    %%rax, %%rcx\n"
9452         "adcq    $0, %%rdx\n"
9453         "movq    88(%%rsi), %%rax\n"
9454         "addq    %%rcx, 88(%%rdi)\n"
9455         "adcq    $0, %%rdx\n"
9456         "movq    %%rdx, %%rcx\n"
9457         "mulq    %%r9\n"
9458         "addq    %%rax, %%rcx\n"
9459         "adcq    $0, %%rdx\n"
9460         "addq    %%rcx, 96(%%rdi)\n"
9461         "adcq    $0, %%rdx\n"
9462         "movq    %%rdx, 104(%%rdi)\n"
9463         "### x*y[2]\n"
9464         "movq    16(%%r8), %%r9\n"
9465         "movq    0(%%rsi), %%rax\n"
9466         "mulq    %%r9\n"
9467         "addq    %%rax, 16(%%rdi)\n"
9468         "movq    8(%%rsi), %%rax\n"
9469         "adcq    $0, %%rdx\n"
9470         "movq    %%rdx, %%rcx\n"
9471         "mulq    %%r9\n"
9472         "addq    %%rax, %%rcx\n"
9473         "adcq    $0, %%rdx\n"
9474         "movq    16(%%rsi), %%rax\n"
9475         "addq    %%rcx, 24(%%rdi)\n"
9476         "adcq    $0, %%rdx\n"
9477         "movq    %%rdx, %%rcx\n"
9478         "mulq    %%r9\n"
9479         "addq    %%rax, %%rcx\n"
9480         "adcq    $0, %%rdx\n"
9481         "movq    24(%%rsi), %%rax\n"
9482         "addq    %%rcx, 32(%%rdi)\n"
9483         "adcq    $0, %%rdx\n"
9484         "movq    %%rdx, %%rcx\n"
9485         "mulq    %%r9\n"
9486         "addq    %%rax, %%rcx\n"
9487         "adcq    $0, %%rdx\n"
9488         "movq    32(%%rsi), %%rax\n"
9489         "addq    %%rcx, 40(%%rdi)\n"
9490         "adcq    $0, %%rdx\n"
9491         "movq    %%rdx, %%rcx\n"
9492         "mulq    %%r9\n"
9493         "addq    %%rax, %%rcx\n"
9494         "adcq    $0, %%rdx\n"
9495         "movq    40(%%rsi), %%rax\n"
9496         "addq    %%rcx, 48(%%rdi)\n"
9497         "adcq    $0, %%rdx\n"
9498         "movq    %%rdx, %%rcx\n"
9499         "mulq    %%r9\n"
9500         "addq    %%rax, %%rcx\n"
9501         "adcq    $0, %%rdx\n"
9502         "movq    48(%%rsi), %%rax\n"
9503         "addq    %%rcx, 56(%%rdi)\n"
9504         "adcq    $0, %%rdx\n"
9505         "movq    %%rdx, %%rcx\n"
9506         "mulq    %%r9\n"
9507         "addq    %%rax, %%rcx\n"
9508         "adcq    $0, %%rdx\n"
9509         "movq    56(%%rsi), %%rax\n"
9510         "addq    %%rcx, 64(%%rdi)\n"
9511         "adcq    $0, %%rdx\n"
9512         "movq    %%rdx, %%rcx\n"
9513         "mulq    %%r9\n"
9514         "addq    %%rax, %%rcx\n"
9515         "adcq    $0, %%rdx\n"
9516         "movq    64(%%rsi), %%rax\n"
9517         "addq    %%rcx, 72(%%rdi)\n"
9518         "adcq    $0, %%rdx\n"
9519         "movq    %%rdx, %%rcx\n"
9520         "mulq    %%r9\n"
9521         "addq    %%rax, %%rcx\n"
9522         "adcq    $0, %%rdx\n"
9523         "movq    72(%%rsi), %%rax\n"
9524         "addq    %%rcx, 80(%%rdi)\n"
9525         "adcq    $0, %%rdx\n"
9526         "movq    %%rdx, %%rcx\n"
9527         "mulq    %%r9\n"
9528         "addq    %%rax, %%rcx\n"
9529         "adcq    $0, %%rdx\n"
9530         "movq    80(%%rsi), %%rax\n"
9531         "addq    %%rcx, 88(%%rdi)\n"
9532         "adcq    $0, %%rdx\n"
9533         "movq    %%rdx, %%rcx\n"
9534         "mulq    %%r9\n"
9535         "addq    %%rax, %%rcx\n"
9536         "adcq    $0, %%rdx\n"
9537         "movq    88(%%rsi), %%rax\n"
9538         "addq    %%rcx, 96(%%rdi)\n"
9539         "adcq    $0, %%rdx\n"
9540         "movq    %%rdx, %%rcx\n"
9541         "mulq    %%r9\n"
9542         "addq    %%rax, %%rcx\n"
9543         "adcq    $0, %%rdx\n"
9544         "addq    %%rcx, 104(%%rdi)\n"
9545         "adcq    $0, %%rdx\n"
9546         "movq    %%rdx, 112(%%rdi)\n"
9547         "### x*y[3]\n"
9548         "movq    24(%%r8), %%r9\n"
9549         "movq    0(%%rsi), %%rax\n"
9550         "mulq    %%r9\n"
9551         "addq    %%rax, 24(%%rdi)\n"
9552         "movq    8(%%rsi), %%rax\n"
9553         "adcq    $0, %%rdx\n"
9554         "movq    %%rdx, %%rcx\n"
9555         "mulq    %%r9\n"
9556         "addq    %%rax, %%rcx\n"
9557         "adcq    $0, %%rdx\n"
9558         "movq    16(%%rsi), %%rax\n"
9559         "addq    %%rcx, 32(%%rdi)\n"
9560         "adcq    $0, %%rdx\n"
9561         "movq    %%rdx, %%rcx\n"
9562         "mulq    %%r9\n"
9563         "addq    %%rax, %%rcx\n"
9564         "adcq    $0, %%rdx\n"
9565         "movq    24(%%rsi), %%rax\n"
9566         "addq    %%rcx, 40(%%rdi)\n"
9567         "adcq    $0, %%rdx\n"
9568         "movq    %%rdx, %%rcx\n"
9569         "mulq    %%r9\n"
9570         "addq    %%rax, %%rcx\n"
9571         "adcq    $0, %%rdx\n"
9572         "movq    32(%%rsi), %%rax\n"
9573         "addq    %%rcx, 48(%%rdi)\n"
9574         "adcq    $0, %%rdx\n"
9575         "movq    %%rdx, %%rcx\n"
9576         "mulq    %%r9\n"
9577         "addq    %%rax, %%rcx\n"
9578         "adcq    $0, %%rdx\n"
9579         "movq    40(%%rsi), %%rax\n"
9580         "addq    %%rcx, 56(%%rdi)\n"
9581         "adcq    $0, %%rdx\n"
9582         "movq    %%rdx, %%rcx\n"
9583         "mulq    %%r9\n"
9584         "addq    %%rax, %%rcx\n"
9585         "adcq    $0, %%rdx\n"
9586         "movq    48(%%rsi), %%rax\n"
9587         "addq    %%rcx, 64(%%rdi)\n"
9588         "adcq    $0, %%rdx\n"
9589         "movq    %%rdx, %%rcx\n"
9590         "mulq    %%r9\n"
9591         "addq    %%rax, %%rcx\n"
9592         "adcq    $0, %%rdx\n"
9593         "movq    56(%%rsi), %%rax\n"
9594         "addq    %%rcx, 72(%%rdi)\n"
9595         "adcq    $0, %%rdx\n"
9596         "movq    %%rdx, %%rcx\n"
9597         "mulq    %%r9\n"
9598         "addq    %%rax, %%rcx\n"
9599         "adcq    $0, %%rdx\n"
9600         "movq    64(%%rsi), %%rax\n"
9601         "addq    %%rcx, 80(%%rdi)\n"
9602         "adcq    $0, %%rdx\n"
9603         "movq    %%rdx, %%rcx\n"
9604         "mulq    %%r9\n"
9605         "addq    %%rax, %%rcx\n"
9606         "adcq    $0, %%rdx\n"
9607         "movq    72(%%rsi), %%rax\n"
9608         "addq    %%rcx, 88(%%rdi)\n"
9609         "adcq    $0, %%rdx\n"
9610         "movq    %%rdx, %%rcx\n"
9611         "mulq    %%r9\n"
9612         "addq    %%rax, %%rcx\n"
9613         "adcq    $0, %%rdx\n"
9614         "movq    80(%%rsi), %%rax\n"
9615         "addq    %%rcx, 96(%%rdi)\n"
9616         "adcq    $0, %%rdx\n"
9617         "movq    %%rdx, %%rcx\n"
9618         "mulq    %%r9\n"
9619         "addq    %%rax, %%rcx\n"
9620         "adcq    $0, %%rdx\n"
9621         "movq    88(%%rsi), %%rax\n"
9622         "addq    %%rcx, 104(%%rdi)\n"
9623         "adcq    $0, %%rdx\n"
9624         "movq    %%rdx, %%rcx\n"
9625         "mulq    %%r9\n"
9626         "addq    %%rax, %%rcx\n"
9627         "adcq    $0, %%rdx\n"
9628         "addq    %%rcx, 112(%%rdi)\n"
9629         "adcq    $0, %%rdx\n"
9630         "movq    %%rdx, 120(%%rdi)\n"
9631         "### x*y[4]\n"
9632         "movq    32(%%r8), %%r9\n"
9633         "movq    0(%%rsi), %%rax\n"
9634         "mulq    %%r9\n"
9635         "addq    %%rax, 32(%%rdi)\n"
9636         "movq    8(%%rsi), %%rax\n"
9637         "adcq    $0, %%rdx\n"
9638         "movq    %%rdx, %%rcx\n"
9639         "mulq    %%r9\n"
9640         "addq    %%rax, %%rcx\n"
9641         "adcq    $0, %%rdx\n"
9642         "movq    16(%%rsi), %%rax\n"
9643         "addq    %%rcx, 40(%%rdi)\n"
9644         "adcq    $0, %%rdx\n"
9645         "movq    %%rdx, %%rcx\n"
9646         "mulq    %%r9\n"
9647         "addq    %%rax, %%rcx\n"
9648         "adcq    $0, %%rdx\n"
9649         "movq    24(%%rsi), %%rax\n"
9650         "addq    %%rcx, 48(%%rdi)\n"
9651         "adcq    $0, %%rdx\n"
9652         "movq    %%rdx, %%rcx\n"
9653         "mulq    %%r9\n"
9654         "addq    %%rax, %%rcx\n"
9655         "adcq    $0, %%rdx\n"
9656         "movq    32(%%rsi), %%rax\n"
9657         "addq    %%rcx, 56(%%rdi)\n"
9658         "adcq    $0, %%rdx\n"
9659         "movq    %%rdx, %%rcx\n"
9660         "mulq    %%r9\n"
9661         "addq    %%rax, %%rcx\n"
9662         "adcq    $0, %%rdx\n"
9663         "movq    40(%%rsi), %%rax\n"
9664         "addq    %%rcx, 64(%%rdi)\n"
9665         "adcq    $0, %%rdx\n"
9666         "movq    %%rdx, %%rcx\n"
9667         "mulq    %%r9\n"
9668         "addq    %%rax, %%rcx\n"
9669         "adcq    $0, %%rdx\n"
9670         "movq    48(%%rsi), %%rax\n"
9671         "addq    %%rcx, 72(%%rdi)\n"
9672         "adcq    $0, %%rdx\n"
9673         "movq    %%rdx, %%rcx\n"
9674         "mulq    %%r9\n"
9675         "addq    %%rax, %%rcx\n"
9676         "adcq    $0, %%rdx\n"
9677         "movq    56(%%rsi), %%rax\n"
9678         "addq    %%rcx, 80(%%rdi)\n"
9679         "adcq    $0, %%rdx\n"
9680         "movq    %%rdx, %%rcx\n"
9681         "mulq    %%r9\n"
9682         "addq    %%rax, %%rcx\n"
9683         "adcq    $0, %%rdx\n"
9684         "movq    64(%%rsi), %%rax\n"
9685         "addq    %%rcx, 88(%%rdi)\n"
9686         "adcq    $0, %%rdx\n"
9687         "movq    %%rdx, %%rcx\n"
9688         "mulq    %%r9\n"
9689         "addq    %%rax, %%rcx\n"
9690         "adcq    $0, %%rdx\n"
9691         "movq    72(%%rsi), %%rax\n"
9692         "addq    %%rcx, 96(%%rdi)\n"
9693         "adcq    $0, %%rdx\n"
9694         "movq    %%rdx, %%rcx\n"
9695         "mulq    %%r9\n"
9696         "addq    %%rax, %%rcx\n"
9697         "adcq    $0, %%rdx\n"
9698         "movq    80(%%rsi), %%rax\n"
9699         "addq    %%rcx, 104(%%rdi)\n"
9700         "adcq    $0, %%rdx\n"
9701         "movq    %%rdx, %%rcx\n"
9702         "mulq    %%r9\n"
9703         "addq    %%rax, %%rcx\n"
9704         "adcq    $0, %%rdx\n"
9705         "movq    88(%%rsi), %%rax\n"
9706         "addq    %%rcx, 112(%%rdi)\n"
9707         "adcq    $0, %%rdx\n"
9708         "movq    %%rdx, %%rcx\n"
9709         "mulq    %%r9\n"
9710         "addq    %%rax, %%rcx\n"
9711         "adcq    $0, %%rdx\n"
9712         "addq    %%rcx, 120(%%rdi)\n"
9713         "adcq    $0, %%rdx\n"
9714         "movq    %%rdx, 128(%%rdi)\n"
9715         "### x*y[5]\n"
9716         "movq    40(%%r8), %%r9\n"
9717         "movq    0(%%rsi), %%rax\n"
9718         "mulq    %%r9\n"
9719         "addq    %%rax, 40(%%rdi)\n"
9720         "movq    8(%%rsi), %%rax\n"
9721         "adcq    $0, %%rdx\n"
9722         "movq    %%rdx, %%rcx\n"
9723         "mulq    %%r9\n"
9724         "addq    %%rax, %%rcx\n"
9725         "adcq    $0, %%rdx\n"
9726         "movq    16(%%rsi), %%rax\n"
9727         "addq    %%rcx, 48(%%rdi)\n"
9728         "adcq    $0, %%rdx\n"
9729         "movq    %%rdx, %%rcx\n"
9730         "mulq    %%r9\n"
9731         "addq    %%rax, %%rcx\n"
9732         "adcq    $0, %%rdx\n"
9733         "movq    24(%%rsi), %%rax\n"
9734         "addq    %%rcx, 56(%%rdi)\n"
9735         "adcq    $0, %%rdx\n"
9736         "movq    %%rdx, %%rcx\n"
9737         "mulq    %%r9\n"
9738         "addq    %%rax, %%rcx\n"
9739         "adcq    $0, %%rdx\n"
9740         "movq    32(%%rsi), %%rax\n"
9741         "addq    %%rcx, 64(%%rdi)\n"
9742         "adcq    $0, %%rdx\n"
9743         "movq    %%rdx, %%rcx\n"
9744         "mulq    %%r9\n"
9745         "addq    %%rax, %%rcx\n"
9746         "adcq    $0, %%rdx\n"
9747         "movq    40(%%rsi), %%rax\n"
9748         "addq    %%rcx, 72(%%rdi)\n"
9749         "adcq    $0, %%rdx\n"
9750         "movq    %%rdx, %%rcx\n"
9751         "mulq    %%r9\n"
9752         "addq    %%rax, %%rcx\n"
9753         "adcq    $0, %%rdx\n"
9754         "movq    48(%%rsi), %%rax\n"
9755         "addq    %%rcx, 80(%%rdi)\n"
9756         "adcq    $0, %%rdx\n"
9757         "movq    %%rdx, %%rcx\n"
9758         "mulq    %%r9\n"
9759         "addq    %%rax, %%rcx\n"
9760         "adcq    $0, %%rdx\n"
9761         "movq    56(%%rsi), %%rax\n"
9762         "addq    %%rcx, 88(%%rdi)\n"
9763         "adcq    $0, %%rdx\n"
9764         "movq    %%rdx, %%rcx\n"
9765         "mulq    %%r9\n"
9766         "addq    %%rax, %%rcx\n"
9767         "adcq    $0, %%rdx\n"
9768         "movq    64(%%rsi), %%rax\n"
9769         "addq    %%rcx, 96(%%rdi)\n"
9770         "adcq    $0, %%rdx\n"
9771         "movq    %%rdx, %%rcx\n"
9772         "mulq    %%r9\n"
9773         "addq    %%rax, %%rcx\n"
9774         "adcq    $0, %%rdx\n"
9775         "movq    72(%%rsi), %%rax\n"
9776         "addq    %%rcx, 104(%%rdi)\n"
9777         "adcq    $0, %%rdx\n"
9778         "movq    %%rdx, %%rcx\n"
9779         "mulq    %%r9\n"
9780         "addq    %%rax, %%rcx\n"
9781         "adcq    $0, %%rdx\n"
9782         "movq    80(%%rsi), %%rax\n"
9783         "addq    %%rcx, 112(%%rdi)\n"
9784         "adcq    $0, %%rdx\n"
9785         "movq    %%rdx, %%rcx\n"
9786         "mulq    %%r9\n"
9787         "addq    %%rax, %%rcx\n"
9788         "adcq    $0, %%rdx\n"
9789         "movq    88(%%rsi), %%rax\n"
9790         "addq    %%rcx, 120(%%rdi)\n"
9791         "adcq    $0, %%rdx\n"
9792         "movq    %%rdx, %%rcx\n"
9793         "mulq    %%r9\n"
9794         "addq    %%rax, %%rcx\n"
9795         "adcq    $0, %%rdx\n"
9796         "addq    %%rcx, 128(%%rdi)\n"
9797         "adcq    $0, %%rdx\n"
9798         "movq    %%rdx, 136(%%rdi)\n"
9799         "### x*y[6]\n"
9800         "movq    48(%%r8), %%r9\n"
9801         "movq    0(%%rsi), %%rax\n"
9802         "mulq    %%r9\n"
9803         "addq    %%rax, 48(%%rdi)\n"
9804         "movq    8(%%rsi), %%rax\n"
9805         "adcq    $0, %%rdx\n"
9806         "movq    %%rdx, %%rcx\n"
9807         "mulq    %%r9\n"
9808         "addq    %%rax, %%rcx\n"
9809         "adcq    $0, %%rdx\n"
9810         "movq    16(%%rsi), %%rax\n"
9811         "addq    %%rcx, 56(%%rdi)\n"
9812         "adcq    $0, %%rdx\n"
9813         "movq    %%rdx, %%rcx\n"
9814         "mulq    %%r9\n"
9815         "addq    %%rax, %%rcx\n"
9816         "adcq    $0, %%rdx\n"
9817         "movq    24(%%rsi), %%rax\n"
9818         "addq    %%rcx, 64(%%rdi)\n"
9819         "adcq    $0, %%rdx\n"
9820         "movq    %%rdx, %%rcx\n"
9821         "mulq    %%r9\n"
9822         "addq    %%rax, %%rcx\n"
9823         "adcq    $0, %%rdx\n"
9824         "movq    32(%%rsi), %%rax\n"
9825         "addq    %%rcx, 72(%%rdi)\n"
9826         "adcq    $0, %%rdx\n"
9827         "movq    %%rdx, %%rcx\n"
9828         "mulq    %%r9\n"
9829         "addq    %%rax, %%rcx\n"
9830         "adcq    $0, %%rdx\n"
9831         "movq    40(%%rsi), %%rax\n"
9832         "addq    %%rcx, 80(%%rdi)\n"
9833         "adcq    $0, %%rdx\n"
9834         "movq    %%rdx, %%rcx\n"
9835         "mulq    %%r9\n"
9836         "addq    %%rax, %%rcx\n"
9837         "adcq    $0, %%rdx\n"
9838         "movq    48(%%rsi), %%rax\n"
9839         "addq    %%rcx, 88(%%rdi)\n"
9840         "adcq    $0, %%rdx\n"
9841         "movq    %%rdx, %%rcx\n"
9842         "mulq    %%r9\n"
9843         "addq    %%rax, %%rcx\n"
9844         "adcq    $0, %%rdx\n"
9845         "movq    56(%%rsi), %%rax\n"
9846         "addq    %%rcx, 96(%%rdi)\n"
9847         "adcq    $0, %%rdx\n"
9848         "movq    %%rdx, %%rcx\n"
9849         "mulq    %%r9\n"
9850         "addq    %%rax, %%rcx\n"
9851         "adcq    $0, %%rdx\n"
9852         "movq    64(%%rsi), %%rax\n"
9853         "addq    %%rcx, 104(%%rdi)\n"
9854         "adcq    $0, %%rdx\n"
9855         "movq    %%rdx, %%rcx\n"
9856         "mulq    %%r9\n"
9857         "addq    %%rax, %%rcx\n"
9858         "adcq    $0, %%rdx\n"
9859         "movq    72(%%rsi), %%rax\n"
9860         "addq    %%rcx, 112(%%rdi)\n"
9861         "adcq    $0, %%rdx\n"
9862         "movq    %%rdx, %%rcx\n"
9863         "mulq    %%r9\n"
9864         "addq    %%rax, %%rcx\n"
9865         "adcq    $0, %%rdx\n"
9866         "movq    80(%%rsi), %%rax\n"
9867         "addq    %%rcx, 120(%%rdi)\n"
9868         "adcq    $0, %%rdx\n"
9869         "movq    %%rdx, %%rcx\n"
9870         "mulq    %%r9\n"
9871         "addq    %%rax, %%rcx\n"
9872         "adcq    $0, %%rdx\n"
9873         "movq    88(%%rsi), %%rax\n"
9874         "addq    %%rcx, 128(%%rdi)\n"
9875         "adcq    $0, %%rdx\n"
9876         "movq    %%rdx, %%rcx\n"
9877         "mulq    %%r9\n"
9878         "addq    %%rax, %%rcx\n"
9879         "adcq    $0, %%rdx\n"
9880         "addq    %%rcx, 136(%%rdi)\n"
9881         "adcq    $0, %%rdx\n"
9882         "movq    %%rdx, 144(%%rdi)\n"
9883         "### x*y[7]\n"
9884         "movq    56(%%r8), %%r9\n"
9885         "movq    0(%%rsi), %%rax\n"
9886         "mulq    %%r9\n"
9887         "addq    %%rax, 56(%%rdi)\n"
9888         "movq    8(%%rsi), %%rax\n"
9889         "adcq    $0, %%rdx\n"
9890         "movq    %%rdx, %%rcx\n"
9891         "mulq    %%r9\n"
9892         "addq    %%rax, %%rcx\n"
9893         "adcq    $0, %%rdx\n"
9894         "movq    16(%%rsi), %%rax\n"
9895         "addq    %%rcx, 64(%%rdi)\n"
9896         "adcq    $0, %%rdx\n"
9897         "movq    %%rdx, %%rcx\n"
9898         "mulq    %%r9\n"
9899         "addq    %%rax, %%rcx\n"
9900         "adcq    $0, %%rdx\n"
9901         "movq    24(%%rsi), %%rax\n"
9902         "addq    %%rcx, 72(%%rdi)\n"
9903         "adcq    $0, %%rdx\n"
9904         "movq    %%rdx, %%rcx\n"
9905         "mulq    %%r9\n"
9906         "addq    %%rax, %%rcx\n"
9907         "adcq    $0, %%rdx\n"
9908         "movq    32(%%rsi), %%rax\n"
9909         "addq    %%rcx, 80(%%rdi)\n"
9910         "adcq    $0, %%rdx\n"
9911         "movq    %%rdx, %%rcx\n"
9912         "mulq    %%r9\n"
9913         "addq    %%rax, %%rcx\n"
9914         "adcq    $0, %%rdx\n"
9915         "movq    40(%%rsi), %%rax\n"
9916         "addq    %%rcx, 88(%%rdi)\n"
9917         "adcq    $0, %%rdx\n"
9918         "movq    %%rdx, %%rcx\n"
9919         "mulq    %%r9\n"
9920         "addq    %%rax, %%rcx\n"
9921         "adcq    $0, %%rdx\n"
9922         "movq    48(%%rsi), %%rax\n"
9923         "addq    %%rcx, 96(%%rdi)\n"
9924         "adcq    $0, %%rdx\n"
9925         "movq    %%rdx, %%rcx\n"
9926         "mulq    %%r9\n"
9927         "addq    %%rax, %%rcx\n"
9928         "adcq    $0, %%rdx\n"
9929         "movq    56(%%rsi), %%rax\n"
9930         "addq    %%rcx, 104(%%rdi)\n"
9931         "adcq    $0, %%rdx\n"
9932         "movq    %%rdx, %%rcx\n"
9933         "mulq    %%r9\n"
9934         "addq    %%rax, %%rcx\n"
9935         "adcq    $0, %%rdx\n"
9936         "movq    64(%%rsi), %%rax\n"
9937         "addq    %%rcx, 112(%%rdi)\n"
9938         "adcq    $0, %%rdx\n"
9939         "movq    %%rdx, %%rcx\n"
9940         "mulq    %%r9\n"
9941         "addq    %%rax, %%rcx\n"
9942         "adcq    $0, %%rdx\n"
9943         "movq    72(%%rsi), %%rax\n"
9944         "addq    %%rcx, 120(%%rdi)\n"
9945         "adcq    $0, %%rdx\n"
9946         "movq    %%rdx, %%rcx\n"
9947         "mulq    %%r9\n"
9948         "addq    %%rax, %%rcx\n"
9949         "adcq    $0, %%rdx\n"
9950         "movq    80(%%rsi), %%rax\n"
9951         "addq    %%rcx, 128(%%rdi)\n"
9952         "adcq    $0, %%rdx\n"
9953         "movq    %%rdx, %%rcx\n"
9954         "mulq    %%r9\n"
9955         "addq    %%rax, %%rcx\n"
9956         "adcq    $0, %%rdx\n"
9957         "movq    88(%%rsi), %%rax\n"
9958         "addq    %%rcx, 136(%%rdi)\n"
9959         "adcq    $0, %%rdx\n"
9960         "movq    %%rdx, %%rcx\n"
9961         "mulq    %%r9\n"
9962         "addq    %%rax, %%rcx\n"
9963         "adcq    $0, %%rdx\n"
9964         "addq    %%rcx, 144(%%rdi)\n"
9965         "adcq    $0, %%rdx\n"
9966         "movq    %%rdx, 152(%%rdi)\n"
9967         "### x*y[8]\n"
9968         "movq    64(%%r8), %%r9\n"
9969         "movq    0(%%rsi), %%rax\n"
9970         "mulq    %%r9\n"
9971         "addq    %%rax, 64(%%rdi)\n"
9972         "movq    8(%%rsi), %%rax\n"
9973         "adcq    $0, %%rdx\n"
9974         "movq    %%rdx, %%rcx\n"
9975         "mulq    %%r9\n"
9976         "addq    %%rax, %%rcx\n"
9977         "adcq    $0, %%rdx\n"
9978         "movq    16(%%rsi), %%rax\n"
9979         "addq    %%rcx, 72(%%rdi)\n"
9980         "adcq    $0, %%rdx\n"
9981         "movq    %%rdx, %%rcx\n"
9982         "mulq    %%r9\n"
9983         "addq    %%rax, %%rcx\n"
9984         "adcq    $0, %%rdx\n"
9985         "movq    24(%%rsi), %%rax\n"
9986         "addq    %%rcx, 80(%%rdi)\n"
9987         "adcq    $0, %%rdx\n"
9988         "movq    %%rdx, %%rcx\n"
9989         "mulq    %%r9\n"
9990         "addq    %%rax, %%rcx\n"
9991         "adcq    $0, %%rdx\n"
9992         "movq    32(%%rsi), %%rax\n"
9993         "addq    %%rcx, 88(%%rdi)\n"
9994         "adcq    $0, %%rdx\n"
9995         "movq    %%rdx, %%rcx\n"
9996         "mulq    %%r9\n"
9997         "addq    %%rax, %%rcx\n"
9998         "adcq    $0, %%rdx\n"
9999         "movq    40(%%rsi), %%rax\n"
10000         "addq    %%rcx, 96(%%rdi)\n"
10001         "adcq    $0, %%rdx\n"
10002         "movq    %%rdx, %%rcx\n"
10003         "mulq    %%r9\n"
10004         "addq    %%rax, %%rcx\n"
10005         "adcq    $0, %%rdx\n"
10006         "movq    48(%%rsi), %%rax\n"
10007         "addq    %%rcx, 104(%%rdi)\n"
10008         "adcq    $0, %%rdx\n"
10009         "movq    %%rdx, %%rcx\n"
10010         "mulq    %%r9\n"
10011         "addq    %%rax, %%rcx\n"
10012         "adcq    $0, %%rdx\n"
10013         "movq    56(%%rsi), %%rax\n"
10014         "addq    %%rcx, 112(%%rdi)\n"
10015         "adcq    $0, %%rdx\n"
10016         "movq    %%rdx, %%rcx\n"
10017         "mulq    %%r9\n"
10018         "addq    %%rax, %%rcx\n"
10019         "adcq    $0, %%rdx\n"
10020         "movq    64(%%rsi), %%rax\n"
10021         "addq    %%rcx, 120(%%rdi)\n"
10022         "adcq    $0, %%rdx\n"
10023         "movq    %%rdx, %%rcx\n"
10024         "mulq    %%r9\n"
10025         "addq    %%rax, %%rcx\n"
10026         "adcq    $0, %%rdx\n"
10027         "movq    72(%%rsi), %%rax\n"
10028         "addq    %%rcx, 128(%%rdi)\n"
10029         "adcq    $0, %%rdx\n"
10030         "movq    %%rdx, %%rcx\n"
10031         "mulq    %%r9\n"
10032         "addq    %%rax, %%rcx\n"
10033         "adcq    $0, %%rdx\n"
10034         "movq    80(%%rsi), %%rax\n"
10035         "addq    %%rcx, 136(%%rdi)\n"
10036         "adcq    $0, %%rdx\n"
10037         "movq    %%rdx, %%rcx\n"
10038         "mulq    %%r9\n"
10039         "addq    %%rax, %%rcx\n"
10040         "adcq    $0, %%rdx\n"
10041         "movq    88(%%rsi), %%rax\n"
10042         "addq    %%rcx, 144(%%rdi)\n"
10043         "adcq    $0, %%rdx\n"
10044         "movq    %%rdx, %%rcx\n"
10045         "mulq    %%r9\n"
10046         "addq    %%rax, %%rcx\n"
10047         "adcq    $0, %%rdx\n"
10048         "addq    %%rcx, 152(%%rdi)\n"
10049         "adcq    $0, %%rdx\n"
10050         "movq    %%rdx, 160(%%rdi)\n"
10051         "### x*y[9]\n"
10052         "movq    72(%%r8), %%r9\n"
10053         "movq    0(%%rsi), %%rax\n"
10054         "mulq    %%r9\n"
10055         "addq    %%rax, 72(%%rdi)\n"
10056         "movq    8(%%rsi), %%rax\n"
10057         "adcq    $0, %%rdx\n"
10058         "movq    %%rdx, %%rcx\n"
10059         "mulq    %%r9\n"
10060         "addq    %%rax, %%rcx\n"
10061         "adcq    $0, %%rdx\n"
10062         "movq    16(%%rsi), %%rax\n"
10063         "addq    %%rcx, 80(%%rdi)\n"
10064         "adcq    $0, %%rdx\n"
10065         "movq    %%rdx, %%rcx\n"
10066         "mulq    %%r9\n"
10067         "addq    %%rax, %%rcx\n"
10068         "adcq    $0, %%rdx\n"
10069         "movq    24(%%rsi), %%rax\n"
10070         "addq    %%rcx, 88(%%rdi)\n"
10071         "adcq    $0, %%rdx\n"
10072         "movq    %%rdx, %%rcx\n"
10073         "mulq    %%r9\n"
10074         "addq    %%rax, %%rcx\n"
10075         "adcq    $0, %%rdx\n"
10076         "movq    32(%%rsi), %%rax\n"
10077         "addq    %%rcx, 96(%%rdi)\n"
10078         "adcq    $0, %%rdx\n"
10079         "movq    %%rdx, %%rcx\n"
10080         "mulq    %%r9\n"
10081         "addq    %%rax, %%rcx\n"
10082         "adcq    $0, %%rdx\n"
10083         "movq    40(%%rsi), %%rax\n"
10084         "addq    %%rcx, 104(%%rdi)\n"
10085         "adcq    $0, %%rdx\n"
10086         "movq    %%rdx, %%rcx\n"
10087         "mulq    %%r9\n"
10088         "addq    %%rax, %%rcx\n"
10089         "adcq    $0, %%rdx\n"
10090         "movq    48(%%rsi), %%rax\n"
10091         "addq    %%rcx, 112(%%rdi)\n"
10092         "adcq    $0, %%rdx\n"
10093         "movq    %%rdx, %%rcx\n"
10094         "mulq    %%r9\n"
10095         "addq    %%rax, %%rcx\n"
10096         "adcq    $0, %%rdx\n"
10097         "movq    56(%%rsi), %%rax\n"
10098         "addq    %%rcx, 120(%%rdi)\n"
10099         "adcq    $0, %%rdx\n"
10100         "movq    %%rdx, %%rcx\n"
10101         "mulq    %%r9\n"
10102         "addq    %%rax, %%rcx\n"
10103         "adcq    $0, %%rdx\n"
10104         "movq    64(%%rsi), %%rax\n"
10105         "addq    %%rcx, 128(%%rdi)\n"
10106         "adcq    $0, %%rdx\n"
10107         "movq    %%rdx, %%rcx\n"
10108         "mulq    %%r9\n"
10109         "addq    %%rax, %%rcx\n"
10110         "adcq    $0, %%rdx\n"
10111         "movq    72(%%rsi), %%rax\n"
10112         "addq    %%rcx, 136(%%rdi)\n"
10113         "adcq    $0, %%rdx\n"
10114         "movq    %%rdx, %%rcx\n"
10115         "mulq    %%r9\n"
10116         "addq    %%rax, %%rcx\n"
10117         "adcq    $0, %%rdx\n"
10118         "movq    80(%%rsi), %%rax\n"
10119         "addq    %%rcx, 144(%%rdi)\n"
10120         "adcq    $0, %%rdx\n"
10121         "movq    %%rdx, %%rcx\n"
10122         "mulq    %%r9\n"
10123         "addq    %%rax, %%rcx\n"
10124         "adcq    $0, %%rdx\n"
10125         "movq    88(%%rsi), %%rax\n"
10126         "addq    %%rcx, 152(%%rdi)\n"
10127         "adcq    $0, %%rdx\n"
10128         "movq    %%rdx, %%rcx\n"
10129         "mulq    %%r9\n"
10130         "addq    %%rax, %%rcx\n"
10131         "adcq    $0, %%rdx\n"
10132         "addq    %%rcx, 160(%%rdi)\n"
10133         "adcq    $0, %%rdx\n"
10134         "movq    %%rdx, 168(%%rdi)\n"
10135         "### x*y[10]\n"
10136         "movq    80(%%r8), %%r9\n"
10137         "movq    0(%%rsi), %%rax\n"
10138         "mulq    %%r9\n"
10139         "addq    %%rax, 80(%%rdi)\n"
10140         "movq    8(%%rsi), %%rax\n"
10141         "adcq    $0, %%rdx\n"
10142         "movq    %%rdx, %%rcx\n"
10143         "mulq    %%r9\n"
10144         "addq    %%rax, %%rcx\n"
10145         "adcq    $0, %%rdx\n"
10146         "movq    16(%%rsi), %%rax\n"
10147         "addq    %%rcx, 88(%%rdi)\n"
10148         "adcq    $0, %%rdx\n"
10149         "movq    %%rdx, %%rcx\n"
10150         "mulq    %%r9\n"
10151         "addq    %%rax, %%rcx\n"
10152         "adcq    $0, %%rdx\n"
10153         "movq    24(%%rsi), %%rax\n"
10154         "addq    %%rcx, 96(%%rdi)\n"
10155         "adcq    $0, %%rdx\n"
10156         "movq    %%rdx, %%rcx\n"
10157         "mulq    %%r9\n"
10158         "addq    %%rax, %%rcx\n"
10159         "adcq    $0, %%rdx\n"
10160         "movq    32(%%rsi), %%rax\n"
10161         "addq    %%rcx, 104(%%rdi)\n"
10162         "adcq    $0, %%rdx\n"
10163         "movq    %%rdx, %%rcx\n"
10164         "mulq    %%r9\n"
10165         "addq    %%rax, %%rcx\n"
10166         "adcq    $0, %%rdx\n"
10167         "movq    40(%%rsi), %%rax\n"
10168         "addq    %%rcx, 112(%%rdi)\n"
10169         "adcq    $0, %%rdx\n"
10170         "movq    %%rdx, %%rcx\n"
10171         "mulq    %%r9\n"
10172         "addq    %%rax, %%rcx\n"
10173         "adcq    $0, %%rdx\n"
10174         "movq    48(%%rsi), %%rax\n"
10175         "addq    %%rcx, 120(%%rdi)\n"
10176         "adcq    $0, %%rdx\n"
10177         "movq    %%rdx, %%rcx\n"
10178         "mulq    %%r9\n"
10179         "addq    %%rax, %%rcx\n"
10180         "adcq    $0, %%rdx\n"
10181         "movq    56(%%rsi), %%rax\n"
10182         "addq    %%rcx, 128(%%rdi)\n"
10183         "adcq    $0, %%rdx\n"
10184         "movq    %%rdx, %%rcx\n"
10185         "mulq    %%r9\n"
10186         "addq    %%rax, %%rcx\n"
10187         "adcq    $0, %%rdx\n"
10188         "movq    64(%%rsi), %%rax\n"
10189         "addq    %%rcx, 136(%%rdi)\n"
10190         "adcq    $0, %%rdx\n"
10191         "movq    %%rdx, %%rcx\n"
10192         "mulq    %%r9\n"
10193         "addq    %%rax, %%rcx\n"
10194         "adcq    $0, %%rdx\n"
10195         "movq    72(%%rsi), %%rax\n"
10196         "addq    %%rcx, 144(%%rdi)\n"
10197         "adcq    $0, %%rdx\n"
10198         "movq    %%rdx, %%rcx\n"
10199         "mulq    %%r9\n"
10200         "addq    %%rax, %%rcx\n"
10201         "adcq    $0, %%rdx\n"
10202         "movq    80(%%rsi), %%rax\n"
10203         "addq    %%rcx, 152(%%rdi)\n"
10204         "adcq    $0, %%rdx\n"
10205         "movq    %%rdx, %%rcx\n"
10206         "mulq    %%r9\n"
10207         "addq    %%rax, %%rcx\n"
10208         "adcq    $0, %%rdx\n"
10209         "movq    88(%%rsi), %%rax\n"
10210         "addq    %%rcx, 160(%%rdi)\n"
10211         "adcq    $0, %%rdx\n"
10212         "movq    %%rdx, %%rcx\n"
10213         "mulq    %%r9\n"
10214         "addq    %%rax, %%rcx\n"
10215         "adcq    $0, %%rdx\n"
10216         "addq    %%rcx, 168(%%rdi)\n"
10217         "adcq    $0, %%rdx\n"
10218         "movq    %%rdx, 176(%%rdi)\n"
10219         "### x*y[11]\n"
10220         "movq    88(%%r8), %%r9\n"
10221         "movq    0(%%rsi), %%rax\n"
10222         "mulq    %%r9\n"
10223         "addq    %%rax, 88(%%rdi)\n"
10224         "movq    8(%%rsi), %%rax\n"
10225         "adcq    $0, %%rdx\n"
10226         "movq    %%rdx, %%rcx\n"
10227         "mulq    %%r9\n"
10228         "addq    %%rax, %%rcx\n"
10229         "adcq    $0, %%rdx\n"
10230         "movq    16(%%rsi), %%rax\n"
10231         "addq    %%rcx, 96(%%rdi)\n"
10232         "adcq    $0, %%rdx\n"
10233         "movq    %%rdx, %%rcx\n"
10234         "mulq    %%r9\n"
10235         "addq    %%rax, %%rcx\n"
10236         "adcq    $0, %%rdx\n"
10237         "movq    24(%%rsi), %%rax\n"
10238         "addq    %%rcx, 104(%%rdi)\n"
10239         "adcq    $0, %%rdx\n"
10240         "movq    %%rdx, %%rcx\n"
10241         "mulq    %%r9\n"
10242         "addq    %%rax, %%rcx\n"
10243         "adcq    $0, %%rdx\n"
10244         "movq    32(%%rsi), %%rax\n"
10245         "addq    %%rcx, 112(%%rdi)\n"
10246         "adcq    $0, %%rdx\n"
10247         "movq    %%rdx, %%rcx\n"
10248         "mulq    %%r9\n"
10249         "addq    %%rax, %%rcx\n"
10250         "adcq    $0, %%rdx\n"
10251         "movq    40(%%rsi), %%rax\n"
10252         "addq    %%rcx, 120(%%rdi)\n"
10253         "adcq    $0, %%rdx\n"
10254         "movq    %%rdx, %%rcx\n"
10255         "mulq    %%r9\n"
10256         "addq    %%rax, %%rcx\n"
10257         "adcq    $0, %%rdx\n"
10258         "movq    48(%%rsi), %%rax\n"
10259         "addq    %%rcx, 128(%%rdi)\n"
10260         "adcq    $0, %%rdx\n"
10261         "movq    %%rdx, %%rcx\n"
10262         "mulq    %%r9\n"
10263         "addq    %%rax, %%rcx\n"
10264         "adcq    $0, %%rdx\n"
10265         "movq    56(%%rsi), %%rax\n"
10266         "addq    %%rcx, 136(%%rdi)\n"
10267         "adcq    $0, %%rdx\n"
10268         "movq    %%rdx, %%rcx\n"
10269         "mulq    %%r9\n"
10270         "addq    %%rax, %%rcx\n"
10271         "adcq    $0, %%rdx\n"
10272         "movq    64(%%rsi), %%rax\n"
10273         "addq    %%rcx, 144(%%rdi)\n"
10274         "adcq    $0, %%rdx\n"
10275         "movq    %%rdx, %%rcx\n"
10276         "mulq    %%r9\n"
10277         "addq    %%rax, %%rcx\n"
10278         "adcq    $0, %%rdx\n"
10279         "movq    72(%%rsi), %%rax\n"
10280         "addq    %%rcx, 152(%%rdi)\n"
10281         "adcq    $0, %%rdx\n"
10282         "movq    %%rdx, %%rcx\n"
10283         "mulq    %%r9\n"
10284         "addq    %%rax, %%rcx\n"
10285         "adcq    $0, %%rdx\n"
10286         "movq    80(%%rsi), %%rax\n"
10287         "addq    %%rcx, 160(%%rdi)\n"
10288         "adcq    $0, %%rdx\n"
10289         "movq    %%rdx, %%rcx\n"
10290         "mulq    %%r9\n"
10291         "addq    %%rax, %%rcx\n"
10292         "adcq    $0, %%rdx\n"
10293         "movq    88(%%rsi), %%rax\n"
10294         "addq    %%rcx, 168(%%rdi)\n"
10295         "adcq    $0, %%rdx\n"
10296         "movq    %%rdx, %%rcx\n"
10297         "mulq    %%r9\n"
10298         "addq    %%rax, %%rcx\n"
10299         "adcq    $0, %%rdx\n"
10300         "addq    %%rcx, 176(%%rdi)\n"
10301         "adcq    $0, %%rdx\n"
10302         "movq    %%rdx, 184(%%rdi)\n"
10303       : "+m" (z)
10304       : "m" (x), "m" (y)
10305       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
10306 }
10307 
10308 /* x has 12 words, z has 26. Put x*y in z. */
10309 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
10310 static inline
mpfq_fixmp_12_sqr(mp_limb_t * z,const mp_limb_t * x)10311 void mpfq_fixmp_12_sqr(mp_limb_t * z, const mp_limb_t * x)
10312 {
10313     mpfq_fixmp_12_mul(z, x, x);
10314 }
10315 
10316 /* x has 12 words, z has 14. Put x*y in z. */
10317 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
10318 static inline
mpfq_fixmp_12_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)10319 void mpfq_fixmp_12_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
10320 {
10321     __asm__ __volatile__(
10322         "movq    %[z], %%rdi\n"
10323         "movq    %[x], %%rsi\n"
10324         "movq    0(%%rsi), %%rax\n"
10325         "mulq    %[mult]\n"
10326         "movq    %%rax, 0(%%rdi)\n"
10327         "movq    8(%%rsi), %%rax\n"
10328         "movq    %%rdx, %%rcx\n"
10329         "mulq    %[mult]\n"
10330         "addq    %%rax, %%rcx\n"
10331         "adcq    $0, %%rdx\n"
10332         "movq    16(%%rsi), %%rax\n"
10333         "movq    %%rcx, 8(%%rdi)\n"
10334         "movq    %%rdx, %%rcx\n"
10335         "mulq    %[mult]\n"
10336         "addq    %%rax, %%rcx\n"
10337         "adcq    $0, %%rdx\n"
10338         "movq    24(%%rsi), %%rax\n"
10339         "movq    %%rcx, 16(%%rdi)\n"
10340         "movq    %%rdx, %%rcx\n"
10341         "mulq    %[mult]\n"
10342         "addq    %%rax, %%rcx\n"
10343         "adcq    $0, %%rdx\n"
10344         "movq    32(%%rsi), %%rax\n"
10345         "movq    %%rcx, 24(%%rdi)\n"
10346         "movq    %%rdx, %%rcx\n"
10347         "mulq    %[mult]\n"
10348         "addq    %%rax, %%rcx\n"
10349         "adcq    $0, %%rdx\n"
10350         "movq    40(%%rsi), %%rax\n"
10351         "movq    %%rcx, 32(%%rdi)\n"
10352         "movq    %%rdx, %%rcx\n"
10353         "mulq    %[mult]\n"
10354         "addq    %%rax, %%rcx\n"
10355         "adcq    $0, %%rdx\n"
10356         "movq    48(%%rsi), %%rax\n"
10357         "movq    %%rcx, 40(%%rdi)\n"
10358         "movq    %%rdx, %%rcx\n"
10359         "mulq    %[mult]\n"
10360         "addq    %%rax, %%rcx\n"
10361         "adcq    $0, %%rdx\n"
10362         "movq    56(%%rsi), %%rax\n"
10363         "movq    %%rcx, 48(%%rdi)\n"
10364         "movq    %%rdx, %%rcx\n"
10365         "mulq    %[mult]\n"
10366         "addq    %%rax, %%rcx\n"
10367         "adcq    $0, %%rdx\n"
10368         "movq    64(%%rsi), %%rax\n"
10369         "movq    %%rcx, 56(%%rdi)\n"
10370         "movq    %%rdx, %%rcx\n"
10371         "mulq    %[mult]\n"
10372         "addq    %%rax, %%rcx\n"
10373         "adcq    $0, %%rdx\n"
10374         "movq    72(%%rsi), %%rax\n"
10375         "movq    %%rcx, 64(%%rdi)\n"
10376         "movq    %%rdx, %%rcx\n"
10377         "mulq    %[mult]\n"
10378         "addq    %%rax, %%rcx\n"
10379         "adcq    $0, %%rdx\n"
10380         "movq    80(%%rsi), %%rax\n"
10381         "movq    %%rcx, 72(%%rdi)\n"
10382         "movq    %%rdx, %%rcx\n"
10383         "mulq    %[mult]\n"
10384         "addq    %%rax, %%rcx\n"
10385         "adcq    $0, %%rdx\n"
10386         "movq    88(%%rsi), %%rax\n"
10387         "movq    %%rcx, 80(%%rdi)\n"
10388         "movq    %%rdx, %%rcx\n"
10389         "mulq    %[mult]\n"
10390         "addq    %%rax, %%rcx\n"
10391         "adcq    $0, %%rdx\n"
10392         "movq    %%rcx, 88(%%rdi)\n"
10393         "movq    %%rdx, 96(%%rdi)\n"
10394     :
10395     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
10396     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
10397 }
10398 
10399 /* x, y, and z have 13 words. Result in z. Return carry bit */
10400 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
10401 static inline
mpfq_fixmp_13_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)10402 mp_limb_t mpfq_fixmp_13_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
10403 {
10404     mp_limb_t carry;
10405     __asm__ __volatile__(
10406         "movq    %[z], %%rdi\n"
10407         "movq    %[x], %%rsi\n"
10408         "movq    %[y], %%rdx\n"
10409         "movq    0(%%rsi), %%rax\n"
10410         "addq    0(%%rdx), %%rax\n"
10411         "movq    %%rax, 0(%%rdi)\n"
10412         "movq    8(%%rsi), %%rax\n"
10413         "adcq    8(%%rdx), %%rax\n"
10414         "movq    %%rax, 8(%%rdi)\n"
10415         "movq    16(%%rsi), %%rax\n"
10416         "adcq    16(%%rdx), %%rax\n"
10417         "movq    %%rax, 16(%%rdi)\n"
10418         "movq    24(%%rsi), %%rax\n"
10419         "adcq    24(%%rdx), %%rax\n"
10420         "movq    %%rax, 24(%%rdi)\n"
10421         "movq    32(%%rsi), %%rax\n"
10422         "adcq    32(%%rdx), %%rax\n"
10423         "movq    %%rax, 32(%%rdi)\n"
10424         "movq    40(%%rsi), %%rax\n"
10425         "adcq    40(%%rdx), %%rax\n"
10426         "movq    %%rax, 40(%%rdi)\n"
10427         "movq    48(%%rsi), %%rax\n"
10428         "adcq    48(%%rdx), %%rax\n"
10429         "movq    %%rax, 48(%%rdi)\n"
10430         "movq    56(%%rsi), %%rax\n"
10431         "adcq    56(%%rdx), %%rax\n"
10432         "movq    %%rax, 56(%%rdi)\n"
10433         "movq    64(%%rsi), %%rax\n"
10434         "adcq    64(%%rdx), %%rax\n"
10435         "movq    %%rax, 64(%%rdi)\n"
10436         "movq    72(%%rsi), %%rax\n"
10437         "adcq    72(%%rdx), %%rax\n"
10438         "movq    %%rax, 72(%%rdi)\n"
10439         "movq    80(%%rsi), %%rax\n"
10440         "adcq    80(%%rdx), %%rax\n"
10441         "movq    %%rax, 80(%%rdi)\n"
10442         "movq    88(%%rsi), %%rax\n"
10443         "adcq    88(%%rdx), %%rax\n"
10444         "movq    %%rax, 88(%%rdi)\n"
10445         "movq    96(%%rsi), %%rax\n"
10446         "adcq    96(%%rdx), %%rax\n"
10447         "movq    %%rax, 96(%%rdi)\n"
10448         "movq $0, %%rax\n"
10449         "adcq $0, %%rax\n"
10450     : "=&a"(carry)
10451     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
10452     : "%rdx", "%rsi", "%rdi", "memory");
10453     return carry;
10454 }
10455 
10456 /* x, y, and z have 13 words. Result in z. Return borrow bit */
10457 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
10458 static inline
mpfq_fixmp_13_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)10459 mp_limb_t mpfq_fixmp_13_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
10460 {
10461     mp_limb_t carry;
10462     __asm__ __volatile__(
10463         "movq    %[z], %%rdi\n"
10464         "movq    %[x], %%rsi\n"
10465         "movq    %[y], %%rdx\n"
10466         "movq    0(%%rsi), %%rax\n"
10467         "subq    0(%%rdx), %%rax\n"
10468         "movq    %%rax, 0(%%rdi)\n"
10469         "movq    8(%%rsi), %%rax\n"
10470         "sbbq    8(%%rdx), %%rax\n"
10471         "movq    %%rax, 8(%%rdi)\n"
10472         "movq    16(%%rsi), %%rax\n"
10473         "sbbq    16(%%rdx), %%rax\n"
10474         "movq    %%rax, 16(%%rdi)\n"
10475         "movq    24(%%rsi), %%rax\n"
10476         "sbbq    24(%%rdx), %%rax\n"
10477         "movq    %%rax, 24(%%rdi)\n"
10478         "movq    32(%%rsi), %%rax\n"
10479         "sbbq    32(%%rdx), %%rax\n"
10480         "movq    %%rax, 32(%%rdi)\n"
10481         "movq    40(%%rsi), %%rax\n"
10482         "sbbq    40(%%rdx), %%rax\n"
10483         "movq    %%rax, 40(%%rdi)\n"
10484         "movq    48(%%rsi), %%rax\n"
10485         "sbbq    48(%%rdx), %%rax\n"
10486         "movq    %%rax, 48(%%rdi)\n"
10487         "movq    56(%%rsi), %%rax\n"
10488         "sbbq    56(%%rdx), %%rax\n"
10489         "movq    %%rax, 56(%%rdi)\n"
10490         "movq    64(%%rsi), %%rax\n"
10491         "sbbq    64(%%rdx), %%rax\n"
10492         "movq    %%rax, 64(%%rdi)\n"
10493         "movq    72(%%rsi), %%rax\n"
10494         "sbbq    72(%%rdx), %%rax\n"
10495         "movq    %%rax, 72(%%rdi)\n"
10496         "movq    80(%%rsi), %%rax\n"
10497         "sbbq    80(%%rdx), %%rax\n"
10498         "movq    %%rax, 80(%%rdi)\n"
10499         "movq    88(%%rsi), %%rax\n"
10500         "sbbq    88(%%rdx), %%rax\n"
10501         "movq    %%rax, 88(%%rdi)\n"
10502         "movq    96(%%rsi), %%rax\n"
10503         "sbbq    96(%%rdx), %%rax\n"
10504         "movq    %%rax, 96(%%rdi)\n"
10505         "movq $0, %%rax\n"
10506         "adcq $0, %%rax\n"
10507     : "=&a"(carry)
10508     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
10509     : "%rdx", "%rsi", "%rdi", "memory");
10510     return carry;
10511 }
10512 
10513 /* x, y, and z have 13 words. Result in z. Carry bit is lost. */
10514 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
10515 static inline
mpfq_fixmp_13_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)10516 void mpfq_fixmp_13_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
10517 {
10518     __asm__ __volatile__(
10519         "movq    %[z], %%rdi\n"
10520         "movq    %[x], %%rsi\n"
10521         "movq    %[y], %%rdx\n"
10522         "movq    0(%%rsi), %%rax\n"
10523         "addq    0(%%rdx), %%rax\n"
10524         "movq    %%rax, 0(%%rdi)\n"
10525         "movq    8(%%rsi), %%rax\n"
10526         "adcq    8(%%rdx), %%rax\n"
10527         "movq    %%rax, 8(%%rdi)\n"
10528         "movq    16(%%rsi), %%rax\n"
10529         "adcq    16(%%rdx), %%rax\n"
10530         "movq    %%rax, 16(%%rdi)\n"
10531         "movq    24(%%rsi), %%rax\n"
10532         "adcq    24(%%rdx), %%rax\n"
10533         "movq    %%rax, 24(%%rdi)\n"
10534         "movq    32(%%rsi), %%rax\n"
10535         "adcq    32(%%rdx), %%rax\n"
10536         "movq    %%rax, 32(%%rdi)\n"
10537         "movq    40(%%rsi), %%rax\n"
10538         "adcq    40(%%rdx), %%rax\n"
10539         "movq    %%rax, 40(%%rdi)\n"
10540         "movq    48(%%rsi), %%rax\n"
10541         "adcq    48(%%rdx), %%rax\n"
10542         "movq    %%rax, 48(%%rdi)\n"
10543         "movq    56(%%rsi), %%rax\n"
10544         "adcq    56(%%rdx), %%rax\n"
10545         "movq    %%rax, 56(%%rdi)\n"
10546         "movq    64(%%rsi), %%rax\n"
10547         "adcq    64(%%rdx), %%rax\n"
10548         "movq    %%rax, 64(%%rdi)\n"
10549         "movq    72(%%rsi), %%rax\n"
10550         "adcq    72(%%rdx), %%rax\n"
10551         "movq    %%rax, 72(%%rdi)\n"
10552         "movq    80(%%rsi), %%rax\n"
10553         "adcq    80(%%rdx), %%rax\n"
10554         "movq    %%rax, 80(%%rdi)\n"
10555         "movq    88(%%rsi), %%rax\n"
10556         "adcq    88(%%rdx), %%rax\n"
10557         "movq    %%rax, 88(%%rdi)\n"
10558         "movq    96(%%rsi), %%rax\n"
10559         "adcq    96(%%rdx), %%rax\n"
10560         "movq    %%rax, 96(%%rdi)\n"
10561     :
10562     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
10563     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
10564 }
10565 
10566 /* x, y, and z have 13 words. Result in z. Borrow bit is lost. */
10567 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
10568 static inline
mpfq_fixmp_13_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)10569 void mpfq_fixmp_13_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
10570 {
10571     __asm__ __volatile__(
10572         "movq    %[z], %%rdi\n"
10573         "movq    %[x], %%rsi\n"
10574         "movq    %[y], %%rdx\n"
10575         "movq    0(%%rsi), %%rax\n"
10576         "subq    0(%%rdx), %%rax\n"
10577         "movq    %%rax, 0(%%rdi)\n"
10578         "movq    8(%%rsi), %%rax\n"
10579         "sbbq    8(%%rdx), %%rax\n"
10580         "movq    %%rax, 8(%%rdi)\n"
10581         "movq    16(%%rsi), %%rax\n"
10582         "sbbq    16(%%rdx), %%rax\n"
10583         "movq    %%rax, 16(%%rdi)\n"
10584         "movq    24(%%rsi), %%rax\n"
10585         "sbbq    24(%%rdx), %%rax\n"
10586         "movq    %%rax, 24(%%rdi)\n"
10587         "movq    32(%%rsi), %%rax\n"
10588         "sbbq    32(%%rdx), %%rax\n"
10589         "movq    %%rax, 32(%%rdi)\n"
10590         "movq    40(%%rsi), %%rax\n"
10591         "sbbq    40(%%rdx), %%rax\n"
10592         "movq    %%rax, 40(%%rdi)\n"
10593         "movq    48(%%rsi), %%rax\n"
10594         "sbbq    48(%%rdx), %%rax\n"
10595         "movq    %%rax, 48(%%rdi)\n"
10596         "movq    56(%%rsi), %%rax\n"
10597         "sbbq    56(%%rdx), %%rax\n"
10598         "movq    %%rax, 56(%%rdi)\n"
10599         "movq    64(%%rsi), %%rax\n"
10600         "sbbq    64(%%rdx), %%rax\n"
10601         "movq    %%rax, 64(%%rdi)\n"
10602         "movq    72(%%rsi), %%rax\n"
10603         "sbbq    72(%%rdx), %%rax\n"
10604         "movq    %%rax, 72(%%rdi)\n"
10605         "movq    80(%%rsi), %%rax\n"
10606         "sbbq    80(%%rdx), %%rax\n"
10607         "movq    %%rax, 80(%%rdi)\n"
10608         "movq    88(%%rsi), %%rax\n"
10609         "sbbq    88(%%rdx), %%rax\n"
10610         "movq    %%rax, 88(%%rdi)\n"
10611         "movq    96(%%rsi), %%rax\n"
10612         "sbbq    96(%%rdx), %%rax\n"
10613         "movq    %%rax, 96(%%rdi)\n"
10614     :
10615     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
10616     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
10617 }
10618 
10619 /* x has 13 words, z has 15.
10620  * Put (z+x*c) in z. Return carry bit. */
10621 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
10622 static inline
mpfq_fixmp_13_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)10623 mp_limb_t mpfq_fixmp_13_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
10624 {
10625     mp_limb_t carry;
10626     __asm__ __volatile__(
10627         "movq    %[z], %%rdi\n"
10628         "movq    %[x], %%rsi\n"
10629         "movq    0(%%rsi), %%rax\n"
10630         "mulq    %[mult]\n"
10631         "addq    %%rax, 0(%%rdi)\n"
10632         "movq    8(%%rsi), %%rax\n"
10633         "adcq    $0, %%rdx\n"
10634         "movq    %%rdx, %%rcx\n"
10635         "mulq    %[mult]\n"
10636         "addq    %%rax, %%rcx\n"
10637         "adcq    $0, %%rdx\n"
10638         "movq    16(%%rsi), %%rax\n"
10639         "addq    %%rcx, 8(%%rdi)\n"
10640         "adcq    $0, %%rdx\n"
10641         "movq    %%rdx, %%rcx\n"
10642         "mulq    %[mult]\n"
10643         "addq    %%rax, %%rcx\n"
10644         "adcq    $0, %%rdx\n"
10645         "movq    24(%%rsi), %%rax\n"
10646         "addq    %%rcx, 16(%%rdi)\n"
10647         "adcq    $0, %%rdx\n"
10648         "movq    %%rdx, %%rcx\n"
10649         "mulq    %[mult]\n"
10650         "addq    %%rax, %%rcx\n"
10651         "adcq    $0, %%rdx\n"
10652         "movq    32(%%rsi), %%rax\n"
10653         "addq    %%rcx, 24(%%rdi)\n"
10654         "adcq    $0, %%rdx\n"
10655         "movq    %%rdx, %%rcx\n"
10656         "mulq    %[mult]\n"
10657         "addq    %%rax, %%rcx\n"
10658         "adcq    $0, %%rdx\n"
10659         "movq    40(%%rsi), %%rax\n"
10660         "addq    %%rcx, 32(%%rdi)\n"
10661         "adcq    $0, %%rdx\n"
10662         "movq    %%rdx, %%rcx\n"
10663         "mulq    %[mult]\n"
10664         "addq    %%rax, %%rcx\n"
10665         "adcq    $0, %%rdx\n"
10666         "movq    48(%%rsi), %%rax\n"
10667         "addq    %%rcx, 40(%%rdi)\n"
10668         "adcq    $0, %%rdx\n"
10669         "movq    %%rdx, %%rcx\n"
10670         "mulq    %[mult]\n"
10671         "addq    %%rax, %%rcx\n"
10672         "adcq    $0, %%rdx\n"
10673         "movq    56(%%rsi), %%rax\n"
10674         "addq    %%rcx, 48(%%rdi)\n"
10675         "adcq    $0, %%rdx\n"
10676         "movq    %%rdx, %%rcx\n"
10677         "mulq    %[mult]\n"
10678         "addq    %%rax, %%rcx\n"
10679         "adcq    $0, %%rdx\n"
10680         "movq    64(%%rsi), %%rax\n"
10681         "addq    %%rcx, 56(%%rdi)\n"
10682         "adcq    $0, %%rdx\n"
10683         "movq    %%rdx, %%rcx\n"
10684         "mulq    %[mult]\n"
10685         "addq    %%rax, %%rcx\n"
10686         "adcq    $0, %%rdx\n"
10687         "movq    72(%%rsi), %%rax\n"
10688         "addq    %%rcx, 64(%%rdi)\n"
10689         "adcq    $0, %%rdx\n"
10690         "movq    %%rdx, %%rcx\n"
10691         "mulq    %[mult]\n"
10692         "addq    %%rax, %%rcx\n"
10693         "adcq    $0, %%rdx\n"
10694         "movq    80(%%rsi), %%rax\n"
10695         "addq    %%rcx, 72(%%rdi)\n"
10696         "adcq    $0, %%rdx\n"
10697         "movq    %%rdx, %%rcx\n"
10698         "mulq    %[mult]\n"
10699         "addq    %%rax, %%rcx\n"
10700         "adcq    $0, %%rdx\n"
10701         "movq    88(%%rsi), %%rax\n"
10702         "addq    %%rcx, 80(%%rdi)\n"
10703         "adcq    $0, %%rdx\n"
10704         "movq    %%rdx, %%rcx\n"
10705         "mulq    %[mult]\n"
10706         "addq    %%rax, %%rcx\n"
10707         "adcq    $0, %%rdx\n"
10708         "movq    96(%%rsi), %%rax\n"
10709         "addq    %%rcx, 88(%%rdi)\n"
10710         "adcq    $0, %%rdx\n"
10711         "movq    %%rdx, %%rcx\n"
10712         "mulq    %[mult]\n"
10713         "addq    %%rax, %%rcx\n"
10714         "adcq    $0, %%rdx\n"
10715         "addq    %%rcx, 96(%%rdi)\n"
10716         "adcq    $0, %%rdx\n"
10717         "xorq    %%rcx, %%rcx\n"
10718         "addq    %%rdx, 104(%%rdi)\n"
10719         "adcq    $0, %%rcx\n"
10720         "movq    %%rcx, %[carry]\n"
10721     : [carry]"=g"(carry), [z] "+m" (z)
10722     : [mult] "r" (c), [x] "m" (x)
10723     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
10724     return carry;
10725 }
10726 
10727 /* x has 13 words, z has 15.
10728  * Put (z+x*c) in z. Carry bit is lost. */
10729 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
10730 static inline
mpfq_fixmp_13_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)10731 void mpfq_fixmp_13_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
10732 {
10733     __asm__ __volatile__(
10734         "movq    %[z], %%rdi\n"
10735         "movq    %[x], %%rsi\n"
10736         "movq    0(%%rsi), %%rax\n"
10737         "mulq    %[mult]\n"
10738         "addq    %%rax, 0(%%rdi)\n"
10739         "movq    8(%%rsi), %%rax\n"
10740         "adcq    $0, %%rdx\n"
10741         "movq    %%rdx, %%rcx\n"
10742         "mulq    %[mult]\n"
10743         "addq    %%rax, %%rcx\n"
10744         "adcq    $0, %%rdx\n"
10745         "movq    16(%%rsi), %%rax\n"
10746         "addq    %%rcx, 8(%%rdi)\n"
10747         "adcq    $0, %%rdx\n"
10748         "movq    %%rdx, %%rcx\n"
10749         "mulq    %[mult]\n"
10750         "addq    %%rax, %%rcx\n"
10751         "adcq    $0, %%rdx\n"
10752         "movq    24(%%rsi), %%rax\n"
10753         "addq    %%rcx, 16(%%rdi)\n"
10754         "adcq    $0, %%rdx\n"
10755         "movq    %%rdx, %%rcx\n"
10756         "mulq    %[mult]\n"
10757         "addq    %%rax, %%rcx\n"
10758         "adcq    $0, %%rdx\n"
10759         "movq    32(%%rsi), %%rax\n"
10760         "addq    %%rcx, 24(%%rdi)\n"
10761         "adcq    $0, %%rdx\n"
10762         "movq    %%rdx, %%rcx\n"
10763         "mulq    %[mult]\n"
10764         "addq    %%rax, %%rcx\n"
10765         "adcq    $0, %%rdx\n"
10766         "movq    40(%%rsi), %%rax\n"
10767         "addq    %%rcx, 32(%%rdi)\n"
10768         "adcq    $0, %%rdx\n"
10769         "movq    %%rdx, %%rcx\n"
10770         "mulq    %[mult]\n"
10771         "addq    %%rax, %%rcx\n"
10772         "adcq    $0, %%rdx\n"
10773         "movq    48(%%rsi), %%rax\n"
10774         "addq    %%rcx, 40(%%rdi)\n"
10775         "adcq    $0, %%rdx\n"
10776         "movq    %%rdx, %%rcx\n"
10777         "mulq    %[mult]\n"
10778         "addq    %%rax, %%rcx\n"
10779         "adcq    $0, %%rdx\n"
10780         "movq    56(%%rsi), %%rax\n"
10781         "addq    %%rcx, 48(%%rdi)\n"
10782         "adcq    $0, %%rdx\n"
10783         "movq    %%rdx, %%rcx\n"
10784         "mulq    %[mult]\n"
10785         "addq    %%rax, %%rcx\n"
10786         "adcq    $0, %%rdx\n"
10787         "movq    64(%%rsi), %%rax\n"
10788         "addq    %%rcx, 56(%%rdi)\n"
10789         "adcq    $0, %%rdx\n"
10790         "movq    %%rdx, %%rcx\n"
10791         "mulq    %[mult]\n"
10792         "addq    %%rax, %%rcx\n"
10793         "adcq    $0, %%rdx\n"
10794         "movq    72(%%rsi), %%rax\n"
10795         "addq    %%rcx, 64(%%rdi)\n"
10796         "adcq    $0, %%rdx\n"
10797         "movq    %%rdx, %%rcx\n"
10798         "mulq    %[mult]\n"
10799         "addq    %%rax, %%rcx\n"
10800         "adcq    $0, %%rdx\n"
10801         "movq    80(%%rsi), %%rax\n"
10802         "addq    %%rcx, 72(%%rdi)\n"
10803         "adcq    $0, %%rdx\n"
10804         "movq    %%rdx, %%rcx\n"
10805         "mulq    %[mult]\n"
10806         "addq    %%rax, %%rcx\n"
10807         "adcq    $0, %%rdx\n"
10808         "movq    88(%%rsi), %%rax\n"
10809         "addq    %%rcx, 80(%%rdi)\n"
10810         "adcq    $0, %%rdx\n"
10811         "movq    %%rdx, %%rcx\n"
10812         "mulq    %[mult]\n"
10813         "addq    %%rax, %%rcx\n"
10814         "adcq    $0, %%rdx\n"
10815         "movq    96(%%rsi), %%rax\n"
10816         "addq    %%rcx, 88(%%rdi)\n"
10817         "adcq    $0, %%rdx\n"
10818         "movq    %%rdx, %%rcx\n"
10819         "mulq    %[mult]\n"
10820         "addq    %%rax, %%rcx\n"
10821         "adcq    $0, %%rdx\n"
10822         "addq    %%rcx, 96(%%rdi)\n"
10823         "adcq    $0, %%rdx\n"
10824         "addq    %%rdx, 104(%%rdi)\n"
10825     : [z] "+m" (z)
10826     : [mult] "r" (c), [x] "m" (x)
10827     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
10828 }
10829 
10830 /* x has 13 words, z has 14.
10831  * Put (z+x*c) in z. Return carry word. */
10832 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
10833 static inline
mpfq_fixmp_13_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)10834 mp_limb_t mpfq_fixmp_13_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
10835 {
10836     mp_limb_t carry;
10837     __asm__ __volatile__(
10838         "movq    %[z], %%rdi\n"
10839         "movq    %[x], %%rsi\n"
10840         "movq    0(%%rsi), %%rax\n"
10841         "mulq    %[mult]\n"
10842         "addq    %%rax, 0(%%rdi)\n"
10843         "movq    8(%%rsi), %%rax\n"
10844         "adcq    $0, %%rdx\n"
10845         "movq    %%rdx, %%rcx\n"
10846         "mulq    %[mult]\n"
10847         "addq    %%rax, %%rcx\n"
10848         "adcq    $0, %%rdx\n"
10849         "movq    16(%%rsi), %%rax\n"
10850         "addq    %%rcx, 8(%%rdi)\n"
10851         "adcq    $0, %%rdx\n"
10852         "movq    %%rdx, %%rcx\n"
10853         "mulq    %[mult]\n"
10854         "addq    %%rax, %%rcx\n"
10855         "adcq    $0, %%rdx\n"
10856         "movq    24(%%rsi), %%rax\n"
10857         "addq    %%rcx, 16(%%rdi)\n"
10858         "adcq    $0, %%rdx\n"
10859         "movq    %%rdx, %%rcx\n"
10860         "mulq    %[mult]\n"
10861         "addq    %%rax, %%rcx\n"
10862         "adcq    $0, %%rdx\n"
10863         "movq    32(%%rsi), %%rax\n"
10864         "addq    %%rcx, 24(%%rdi)\n"
10865         "adcq    $0, %%rdx\n"
10866         "movq    %%rdx, %%rcx\n"
10867         "mulq    %[mult]\n"
10868         "addq    %%rax, %%rcx\n"
10869         "adcq    $0, %%rdx\n"
10870         "movq    40(%%rsi), %%rax\n"
10871         "addq    %%rcx, 32(%%rdi)\n"
10872         "adcq    $0, %%rdx\n"
10873         "movq    %%rdx, %%rcx\n"
10874         "mulq    %[mult]\n"
10875         "addq    %%rax, %%rcx\n"
10876         "adcq    $0, %%rdx\n"
10877         "movq    48(%%rsi), %%rax\n"
10878         "addq    %%rcx, 40(%%rdi)\n"
10879         "adcq    $0, %%rdx\n"
10880         "movq    %%rdx, %%rcx\n"
10881         "mulq    %[mult]\n"
10882         "addq    %%rax, %%rcx\n"
10883         "adcq    $0, %%rdx\n"
10884         "movq    56(%%rsi), %%rax\n"
10885         "addq    %%rcx, 48(%%rdi)\n"
10886         "adcq    $0, %%rdx\n"
10887         "movq    %%rdx, %%rcx\n"
10888         "mulq    %[mult]\n"
10889         "addq    %%rax, %%rcx\n"
10890         "adcq    $0, %%rdx\n"
10891         "movq    64(%%rsi), %%rax\n"
10892         "addq    %%rcx, 56(%%rdi)\n"
10893         "adcq    $0, %%rdx\n"
10894         "movq    %%rdx, %%rcx\n"
10895         "mulq    %[mult]\n"
10896         "addq    %%rax, %%rcx\n"
10897         "adcq    $0, %%rdx\n"
10898         "movq    72(%%rsi), %%rax\n"
10899         "addq    %%rcx, 64(%%rdi)\n"
10900         "adcq    $0, %%rdx\n"
10901         "movq    %%rdx, %%rcx\n"
10902         "mulq    %[mult]\n"
10903         "addq    %%rax, %%rcx\n"
10904         "adcq    $0, %%rdx\n"
10905         "movq    80(%%rsi), %%rax\n"
10906         "addq    %%rcx, 72(%%rdi)\n"
10907         "adcq    $0, %%rdx\n"
10908         "movq    %%rdx, %%rcx\n"
10909         "mulq    %[mult]\n"
10910         "addq    %%rax, %%rcx\n"
10911         "adcq    $0, %%rdx\n"
10912         "movq    88(%%rsi), %%rax\n"
10913         "addq    %%rcx, 80(%%rdi)\n"
10914         "adcq    $0, %%rdx\n"
10915         "movq    %%rdx, %%rcx\n"
10916         "mulq    %[mult]\n"
10917         "addq    %%rax, %%rcx\n"
10918         "adcq    $0, %%rdx\n"
10919         "movq    96(%%rsi), %%rax\n"
10920         "addq    %%rcx, 88(%%rdi)\n"
10921         "adcq    $0, %%rdx\n"
10922         "movq    %%rdx, %%rcx\n"
10923         "mulq    %[mult]\n"
10924         "addq    %%rax, %%rcx\n"
10925         "adcq    $0, %%rdx\n"
10926         "addq    %%rcx, 96(%%rdi)\n"
10927         "adcq    $0, %%rdx\n"
10928         "movq    %%rdx, %[carry]\n"
10929     : [carry]"=g"(carry), [z] "+m" (z)
10930     : [mult] "r" (c), [x] "m" (x)
10931     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
10932     return carry;
10933 }
10934 
10935 /* x and y have 13 words, z has 28. Put x*y in z. */
10936 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
10937 static inline
mpfq_fixmp_13_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)10938 void mpfq_fixmp_13_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
10939 {
10940     __asm__ __volatile__(
10941         "### x*y[0]\n"
10942         "movq    %2, %%r8\n"
10943         "movq    %0, %%rdi\n"
10944         "movq    0(%%r8), %%r9\n"
10945         "movq    %1, %%rsi\n"
10946         "movq    0(%%rsi), %%rax\n"
10947         "mulq    %%r9\n"
10948         "movq    %%rax, 0(%%rdi)\n"
10949         "movq    8(%%rsi), %%rax\n"
10950         "movq    %%rdx, %%rcx\n"
10951         "mulq    %%r9\n"
10952         "addq    %%rax, %%rcx\n"
10953         "adcq    $0, %%rdx\n"
10954         "movq    16(%%rsi), %%rax\n"
10955         "movq    %%rcx, 8(%%rdi)\n"
10956         "movq    %%rdx, %%rcx\n"
10957         "mulq    %%r9\n"
10958         "addq    %%rax, %%rcx\n"
10959         "adcq    $0, %%rdx\n"
10960         "movq    24(%%rsi), %%rax\n"
10961         "movq    %%rcx, 16(%%rdi)\n"
10962         "movq    %%rdx, %%rcx\n"
10963         "mulq    %%r9\n"
10964         "addq    %%rax, %%rcx\n"
10965         "adcq    $0, %%rdx\n"
10966         "movq    32(%%rsi), %%rax\n"
10967         "movq    %%rcx, 24(%%rdi)\n"
10968         "movq    %%rdx, %%rcx\n"
10969         "mulq    %%r9\n"
10970         "addq    %%rax, %%rcx\n"
10971         "adcq    $0, %%rdx\n"
10972         "movq    40(%%rsi), %%rax\n"
10973         "movq    %%rcx, 32(%%rdi)\n"
10974         "movq    %%rdx, %%rcx\n"
10975         "mulq    %%r9\n"
10976         "addq    %%rax, %%rcx\n"
10977         "adcq    $0, %%rdx\n"
10978         "movq    48(%%rsi), %%rax\n"
10979         "movq    %%rcx, 40(%%rdi)\n"
10980         "movq    %%rdx, %%rcx\n"
10981         "mulq    %%r9\n"
10982         "addq    %%rax, %%rcx\n"
10983         "adcq    $0, %%rdx\n"
10984         "movq    56(%%rsi), %%rax\n"
10985         "movq    %%rcx, 48(%%rdi)\n"
10986         "movq    %%rdx, %%rcx\n"
10987         "mulq    %%r9\n"
10988         "addq    %%rax, %%rcx\n"
10989         "adcq    $0, %%rdx\n"
10990         "movq    64(%%rsi), %%rax\n"
10991         "movq    %%rcx, 56(%%rdi)\n"
10992         "movq    %%rdx, %%rcx\n"
10993         "mulq    %%r9\n"
10994         "addq    %%rax, %%rcx\n"
10995         "adcq    $0, %%rdx\n"
10996         "movq    72(%%rsi), %%rax\n"
10997         "movq    %%rcx, 64(%%rdi)\n"
10998         "movq    %%rdx, %%rcx\n"
10999         "mulq    %%r9\n"
11000         "addq    %%rax, %%rcx\n"
11001         "adcq    $0, %%rdx\n"
11002         "movq    80(%%rsi), %%rax\n"
11003         "movq    %%rcx, 72(%%rdi)\n"
11004         "movq    %%rdx, %%rcx\n"
11005         "mulq    %%r9\n"
11006         "addq    %%rax, %%rcx\n"
11007         "adcq    $0, %%rdx\n"
11008         "movq    88(%%rsi), %%rax\n"
11009         "movq    %%rcx, 80(%%rdi)\n"
11010         "movq    %%rdx, %%rcx\n"
11011         "mulq    %%r9\n"
11012         "addq    %%rax, %%rcx\n"
11013         "adcq    $0, %%rdx\n"
11014         "movq    96(%%rsi), %%rax\n"
11015         "movq    %%rcx, 88(%%rdi)\n"
11016         "movq    %%rdx, %%rcx\n"
11017         "mulq    %%r9\n"
11018         "addq    %%rax, %%rcx\n"
11019         "adcq    $0, %%rdx\n"
11020         "movq    %%rcx, 96(%%rdi)\n"
11021         "movq    %%rdx, 104(%%rdi)\n"
11022         "movq    $0, 112(%%rdi)\n"
11023         "movq    $0, 120(%%rdi)\n"
11024         "movq    $0, 128(%%rdi)\n"
11025         "movq    $0, 136(%%rdi)\n"
11026         "movq    $0, 144(%%rdi)\n"
11027         "movq    $0, 152(%%rdi)\n"
11028         "movq    $0, 160(%%rdi)\n"
11029         "movq    $0, 168(%%rdi)\n"
11030         "movq    $0, 176(%%rdi)\n"
11031         "movq    $0, 184(%%rdi)\n"
11032         "movq    $0, 192(%%rdi)\n"
11033         "movq    $0, 200(%%rdi)\n"
11034         "### x*y[1]\n"
11035         "movq    8(%%r8), %%r9\n"
11036         "movq    0(%%rsi), %%rax\n"
11037         "mulq    %%r9\n"
11038         "addq    %%rax, 8(%%rdi)\n"
11039         "movq    8(%%rsi), %%rax\n"
11040         "adcq    $0, %%rdx\n"
11041         "movq    %%rdx, %%rcx\n"
11042         "mulq    %%r9\n"
11043         "addq    %%rax, %%rcx\n"
11044         "adcq    $0, %%rdx\n"
11045         "movq    16(%%rsi), %%rax\n"
11046         "addq    %%rcx, 16(%%rdi)\n"
11047         "adcq    $0, %%rdx\n"
11048         "movq    %%rdx, %%rcx\n"
11049         "mulq    %%r9\n"
11050         "addq    %%rax, %%rcx\n"
11051         "adcq    $0, %%rdx\n"
11052         "movq    24(%%rsi), %%rax\n"
11053         "addq    %%rcx, 24(%%rdi)\n"
11054         "adcq    $0, %%rdx\n"
11055         "movq    %%rdx, %%rcx\n"
11056         "mulq    %%r9\n"
11057         "addq    %%rax, %%rcx\n"
11058         "adcq    $0, %%rdx\n"
11059         "movq    32(%%rsi), %%rax\n"
11060         "addq    %%rcx, 32(%%rdi)\n"
11061         "adcq    $0, %%rdx\n"
11062         "movq    %%rdx, %%rcx\n"
11063         "mulq    %%r9\n"
11064         "addq    %%rax, %%rcx\n"
11065         "adcq    $0, %%rdx\n"
11066         "movq    40(%%rsi), %%rax\n"
11067         "addq    %%rcx, 40(%%rdi)\n"
11068         "adcq    $0, %%rdx\n"
11069         "movq    %%rdx, %%rcx\n"
11070         "mulq    %%r9\n"
11071         "addq    %%rax, %%rcx\n"
11072         "adcq    $0, %%rdx\n"
11073         "movq    48(%%rsi), %%rax\n"
11074         "addq    %%rcx, 48(%%rdi)\n"
11075         "adcq    $0, %%rdx\n"
11076         "movq    %%rdx, %%rcx\n"
11077         "mulq    %%r9\n"
11078         "addq    %%rax, %%rcx\n"
11079         "adcq    $0, %%rdx\n"
11080         "movq    56(%%rsi), %%rax\n"
11081         "addq    %%rcx, 56(%%rdi)\n"
11082         "adcq    $0, %%rdx\n"
11083         "movq    %%rdx, %%rcx\n"
11084         "mulq    %%r9\n"
11085         "addq    %%rax, %%rcx\n"
11086         "adcq    $0, %%rdx\n"
11087         "movq    64(%%rsi), %%rax\n"
11088         "addq    %%rcx, 64(%%rdi)\n"
11089         "adcq    $0, %%rdx\n"
11090         "movq    %%rdx, %%rcx\n"
11091         "mulq    %%r9\n"
11092         "addq    %%rax, %%rcx\n"
11093         "adcq    $0, %%rdx\n"
11094         "movq    72(%%rsi), %%rax\n"
11095         "addq    %%rcx, 72(%%rdi)\n"
11096         "adcq    $0, %%rdx\n"
11097         "movq    %%rdx, %%rcx\n"
11098         "mulq    %%r9\n"
11099         "addq    %%rax, %%rcx\n"
11100         "adcq    $0, %%rdx\n"
11101         "movq    80(%%rsi), %%rax\n"
11102         "addq    %%rcx, 80(%%rdi)\n"
11103         "adcq    $0, %%rdx\n"
11104         "movq    %%rdx, %%rcx\n"
11105         "mulq    %%r9\n"
11106         "addq    %%rax, %%rcx\n"
11107         "adcq    $0, %%rdx\n"
11108         "movq    88(%%rsi), %%rax\n"
11109         "addq    %%rcx, 88(%%rdi)\n"
11110         "adcq    $0, %%rdx\n"
11111         "movq    %%rdx, %%rcx\n"
11112         "mulq    %%r9\n"
11113         "addq    %%rax, %%rcx\n"
11114         "adcq    $0, %%rdx\n"
11115         "movq    96(%%rsi), %%rax\n"
11116         "addq    %%rcx, 96(%%rdi)\n"
11117         "adcq    $0, %%rdx\n"
11118         "movq    %%rdx, %%rcx\n"
11119         "mulq    %%r9\n"
11120         "addq    %%rax, %%rcx\n"
11121         "adcq    $0, %%rdx\n"
11122         "addq    %%rcx, 104(%%rdi)\n"
11123         "adcq    $0, %%rdx\n"
11124         "movq    %%rdx, 112(%%rdi)\n"
11125         "### x*y[2]\n"
11126         "movq    16(%%r8), %%r9\n"
11127         "movq    0(%%rsi), %%rax\n"
11128         "mulq    %%r9\n"
11129         "addq    %%rax, 16(%%rdi)\n"
11130         "movq    8(%%rsi), %%rax\n"
11131         "adcq    $0, %%rdx\n"
11132         "movq    %%rdx, %%rcx\n"
11133         "mulq    %%r9\n"
11134         "addq    %%rax, %%rcx\n"
11135         "adcq    $0, %%rdx\n"
11136         "movq    16(%%rsi), %%rax\n"
11137         "addq    %%rcx, 24(%%rdi)\n"
11138         "adcq    $0, %%rdx\n"
11139         "movq    %%rdx, %%rcx\n"
11140         "mulq    %%r9\n"
11141         "addq    %%rax, %%rcx\n"
11142         "adcq    $0, %%rdx\n"
11143         "movq    24(%%rsi), %%rax\n"
11144         "addq    %%rcx, 32(%%rdi)\n"
11145         "adcq    $0, %%rdx\n"
11146         "movq    %%rdx, %%rcx\n"
11147         "mulq    %%r9\n"
11148         "addq    %%rax, %%rcx\n"
11149         "adcq    $0, %%rdx\n"
11150         "movq    32(%%rsi), %%rax\n"
11151         "addq    %%rcx, 40(%%rdi)\n"
11152         "adcq    $0, %%rdx\n"
11153         "movq    %%rdx, %%rcx\n"
11154         "mulq    %%r9\n"
11155         "addq    %%rax, %%rcx\n"
11156         "adcq    $0, %%rdx\n"
11157         "movq    40(%%rsi), %%rax\n"
11158         "addq    %%rcx, 48(%%rdi)\n"
11159         "adcq    $0, %%rdx\n"
11160         "movq    %%rdx, %%rcx\n"
11161         "mulq    %%r9\n"
11162         "addq    %%rax, %%rcx\n"
11163         "adcq    $0, %%rdx\n"
11164         "movq    48(%%rsi), %%rax\n"
11165         "addq    %%rcx, 56(%%rdi)\n"
11166         "adcq    $0, %%rdx\n"
11167         "movq    %%rdx, %%rcx\n"
11168         "mulq    %%r9\n"
11169         "addq    %%rax, %%rcx\n"
11170         "adcq    $0, %%rdx\n"
11171         "movq    56(%%rsi), %%rax\n"
11172         "addq    %%rcx, 64(%%rdi)\n"
11173         "adcq    $0, %%rdx\n"
11174         "movq    %%rdx, %%rcx\n"
11175         "mulq    %%r9\n"
11176         "addq    %%rax, %%rcx\n"
11177         "adcq    $0, %%rdx\n"
11178         "movq    64(%%rsi), %%rax\n"
11179         "addq    %%rcx, 72(%%rdi)\n"
11180         "adcq    $0, %%rdx\n"
11181         "movq    %%rdx, %%rcx\n"
11182         "mulq    %%r9\n"
11183         "addq    %%rax, %%rcx\n"
11184         "adcq    $0, %%rdx\n"
11185         "movq    72(%%rsi), %%rax\n"
11186         "addq    %%rcx, 80(%%rdi)\n"
11187         "adcq    $0, %%rdx\n"
11188         "movq    %%rdx, %%rcx\n"
11189         "mulq    %%r9\n"
11190         "addq    %%rax, %%rcx\n"
11191         "adcq    $0, %%rdx\n"
11192         "movq    80(%%rsi), %%rax\n"
11193         "addq    %%rcx, 88(%%rdi)\n"
11194         "adcq    $0, %%rdx\n"
11195         "movq    %%rdx, %%rcx\n"
11196         "mulq    %%r9\n"
11197         "addq    %%rax, %%rcx\n"
11198         "adcq    $0, %%rdx\n"
11199         "movq    88(%%rsi), %%rax\n"
11200         "addq    %%rcx, 96(%%rdi)\n"
11201         "adcq    $0, %%rdx\n"
11202         "movq    %%rdx, %%rcx\n"
11203         "mulq    %%r9\n"
11204         "addq    %%rax, %%rcx\n"
11205         "adcq    $0, %%rdx\n"
11206         "movq    96(%%rsi), %%rax\n"
11207         "addq    %%rcx, 104(%%rdi)\n"
11208         "adcq    $0, %%rdx\n"
11209         "movq    %%rdx, %%rcx\n"
11210         "mulq    %%r9\n"
11211         "addq    %%rax, %%rcx\n"
11212         "adcq    $0, %%rdx\n"
11213         "addq    %%rcx, 112(%%rdi)\n"
11214         "adcq    $0, %%rdx\n"
11215         "movq    %%rdx, 120(%%rdi)\n"
11216         "### x*y[3]\n"
11217         "movq    24(%%r8), %%r9\n"
11218         "movq    0(%%rsi), %%rax\n"
11219         "mulq    %%r9\n"
11220         "addq    %%rax, 24(%%rdi)\n"
11221         "movq    8(%%rsi), %%rax\n"
11222         "adcq    $0, %%rdx\n"
11223         "movq    %%rdx, %%rcx\n"
11224         "mulq    %%r9\n"
11225         "addq    %%rax, %%rcx\n"
11226         "adcq    $0, %%rdx\n"
11227         "movq    16(%%rsi), %%rax\n"
11228         "addq    %%rcx, 32(%%rdi)\n"
11229         "adcq    $0, %%rdx\n"
11230         "movq    %%rdx, %%rcx\n"
11231         "mulq    %%r9\n"
11232         "addq    %%rax, %%rcx\n"
11233         "adcq    $0, %%rdx\n"
11234         "movq    24(%%rsi), %%rax\n"
11235         "addq    %%rcx, 40(%%rdi)\n"
11236         "adcq    $0, %%rdx\n"
11237         "movq    %%rdx, %%rcx\n"
11238         "mulq    %%r9\n"
11239         "addq    %%rax, %%rcx\n"
11240         "adcq    $0, %%rdx\n"
11241         "movq    32(%%rsi), %%rax\n"
11242         "addq    %%rcx, 48(%%rdi)\n"
11243         "adcq    $0, %%rdx\n"
11244         "movq    %%rdx, %%rcx\n"
11245         "mulq    %%r9\n"
11246         "addq    %%rax, %%rcx\n"
11247         "adcq    $0, %%rdx\n"
11248         "movq    40(%%rsi), %%rax\n"
11249         "addq    %%rcx, 56(%%rdi)\n"
11250         "adcq    $0, %%rdx\n"
11251         "movq    %%rdx, %%rcx\n"
11252         "mulq    %%r9\n"
11253         "addq    %%rax, %%rcx\n"
11254         "adcq    $0, %%rdx\n"
11255         "movq    48(%%rsi), %%rax\n"
11256         "addq    %%rcx, 64(%%rdi)\n"
11257         "adcq    $0, %%rdx\n"
11258         "movq    %%rdx, %%rcx\n"
11259         "mulq    %%r9\n"
11260         "addq    %%rax, %%rcx\n"
11261         "adcq    $0, %%rdx\n"
11262         "movq    56(%%rsi), %%rax\n"
11263         "addq    %%rcx, 72(%%rdi)\n"
11264         "adcq    $0, %%rdx\n"
11265         "movq    %%rdx, %%rcx\n"
11266         "mulq    %%r9\n"
11267         "addq    %%rax, %%rcx\n"
11268         "adcq    $0, %%rdx\n"
11269         "movq    64(%%rsi), %%rax\n"
11270         "addq    %%rcx, 80(%%rdi)\n"
11271         "adcq    $0, %%rdx\n"
11272         "movq    %%rdx, %%rcx\n"
11273         "mulq    %%r9\n"
11274         "addq    %%rax, %%rcx\n"
11275         "adcq    $0, %%rdx\n"
11276         "movq    72(%%rsi), %%rax\n"
11277         "addq    %%rcx, 88(%%rdi)\n"
11278         "adcq    $0, %%rdx\n"
11279         "movq    %%rdx, %%rcx\n"
11280         "mulq    %%r9\n"
11281         "addq    %%rax, %%rcx\n"
11282         "adcq    $0, %%rdx\n"
11283         "movq    80(%%rsi), %%rax\n"
11284         "addq    %%rcx, 96(%%rdi)\n"
11285         "adcq    $0, %%rdx\n"
11286         "movq    %%rdx, %%rcx\n"
11287         "mulq    %%r9\n"
11288         "addq    %%rax, %%rcx\n"
11289         "adcq    $0, %%rdx\n"
11290         "movq    88(%%rsi), %%rax\n"
11291         "addq    %%rcx, 104(%%rdi)\n"
11292         "adcq    $0, %%rdx\n"
11293         "movq    %%rdx, %%rcx\n"
11294         "mulq    %%r9\n"
11295         "addq    %%rax, %%rcx\n"
11296         "adcq    $0, %%rdx\n"
11297         "movq    96(%%rsi), %%rax\n"
11298         "addq    %%rcx, 112(%%rdi)\n"
11299         "adcq    $0, %%rdx\n"
11300         "movq    %%rdx, %%rcx\n"
11301         "mulq    %%r9\n"
11302         "addq    %%rax, %%rcx\n"
11303         "adcq    $0, %%rdx\n"
11304         "addq    %%rcx, 120(%%rdi)\n"
11305         "adcq    $0, %%rdx\n"
11306         "movq    %%rdx, 128(%%rdi)\n"
11307         "### x*y[4]\n"
11308         "movq    32(%%r8), %%r9\n"
11309         "movq    0(%%rsi), %%rax\n"
11310         "mulq    %%r9\n"
11311         "addq    %%rax, 32(%%rdi)\n"
11312         "movq    8(%%rsi), %%rax\n"
11313         "adcq    $0, %%rdx\n"
11314         "movq    %%rdx, %%rcx\n"
11315         "mulq    %%r9\n"
11316         "addq    %%rax, %%rcx\n"
11317         "adcq    $0, %%rdx\n"
11318         "movq    16(%%rsi), %%rax\n"
11319         "addq    %%rcx, 40(%%rdi)\n"
11320         "adcq    $0, %%rdx\n"
11321         "movq    %%rdx, %%rcx\n"
11322         "mulq    %%r9\n"
11323         "addq    %%rax, %%rcx\n"
11324         "adcq    $0, %%rdx\n"
11325         "movq    24(%%rsi), %%rax\n"
11326         "addq    %%rcx, 48(%%rdi)\n"
11327         "adcq    $0, %%rdx\n"
11328         "movq    %%rdx, %%rcx\n"
11329         "mulq    %%r9\n"
11330         "addq    %%rax, %%rcx\n"
11331         "adcq    $0, %%rdx\n"
11332         "movq    32(%%rsi), %%rax\n"
11333         "addq    %%rcx, 56(%%rdi)\n"
11334         "adcq    $0, %%rdx\n"
11335         "movq    %%rdx, %%rcx\n"
11336         "mulq    %%r9\n"
11337         "addq    %%rax, %%rcx\n"
11338         "adcq    $0, %%rdx\n"
11339         "movq    40(%%rsi), %%rax\n"
11340         "addq    %%rcx, 64(%%rdi)\n"
11341         "adcq    $0, %%rdx\n"
11342         "movq    %%rdx, %%rcx\n"
11343         "mulq    %%r9\n"
11344         "addq    %%rax, %%rcx\n"
11345         "adcq    $0, %%rdx\n"
11346         "movq    48(%%rsi), %%rax\n"
11347         "addq    %%rcx, 72(%%rdi)\n"
11348         "adcq    $0, %%rdx\n"
11349         "movq    %%rdx, %%rcx\n"
11350         "mulq    %%r9\n"
11351         "addq    %%rax, %%rcx\n"
11352         "adcq    $0, %%rdx\n"
11353         "movq    56(%%rsi), %%rax\n"
11354         "addq    %%rcx, 80(%%rdi)\n"
11355         "adcq    $0, %%rdx\n"
11356         "movq    %%rdx, %%rcx\n"
11357         "mulq    %%r9\n"
11358         "addq    %%rax, %%rcx\n"
11359         "adcq    $0, %%rdx\n"
11360         "movq    64(%%rsi), %%rax\n"
11361         "addq    %%rcx, 88(%%rdi)\n"
11362         "adcq    $0, %%rdx\n"
11363         "movq    %%rdx, %%rcx\n"
11364         "mulq    %%r9\n"
11365         "addq    %%rax, %%rcx\n"
11366         "adcq    $0, %%rdx\n"
11367         "movq    72(%%rsi), %%rax\n"
11368         "addq    %%rcx, 96(%%rdi)\n"
11369         "adcq    $0, %%rdx\n"
11370         "movq    %%rdx, %%rcx\n"
11371         "mulq    %%r9\n"
11372         "addq    %%rax, %%rcx\n"
11373         "adcq    $0, %%rdx\n"
11374         "movq    80(%%rsi), %%rax\n"
11375         "addq    %%rcx, 104(%%rdi)\n"
11376         "adcq    $0, %%rdx\n"
11377         "movq    %%rdx, %%rcx\n"
11378         "mulq    %%r9\n"
11379         "addq    %%rax, %%rcx\n"
11380         "adcq    $0, %%rdx\n"
11381         "movq    88(%%rsi), %%rax\n"
11382         "addq    %%rcx, 112(%%rdi)\n"
11383         "adcq    $0, %%rdx\n"
11384         "movq    %%rdx, %%rcx\n"
11385         "mulq    %%r9\n"
11386         "addq    %%rax, %%rcx\n"
11387         "adcq    $0, %%rdx\n"
11388         "movq    96(%%rsi), %%rax\n"
11389         "addq    %%rcx, 120(%%rdi)\n"
11390         "adcq    $0, %%rdx\n"
11391         "movq    %%rdx, %%rcx\n"
11392         "mulq    %%r9\n"
11393         "addq    %%rax, %%rcx\n"
11394         "adcq    $0, %%rdx\n"
11395         "addq    %%rcx, 128(%%rdi)\n"
11396         "adcq    $0, %%rdx\n"
11397         "movq    %%rdx, 136(%%rdi)\n"
11398         "### x*y[5]\n"
11399         "movq    40(%%r8), %%r9\n"
11400         "movq    0(%%rsi), %%rax\n"
11401         "mulq    %%r9\n"
11402         "addq    %%rax, 40(%%rdi)\n"
11403         "movq    8(%%rsi), %%rax\n"
11404         "adcq    $0, %%rdx\n"
11405         "movq    %%rdx, %%rcx\n"
11406         "mulq    %%r9\n"
11407         "addq    %%rax, %%rcx\n"
11408         "adcq    $0, %%rdx\n"
11409         "movq    16(%%rsi), %%rax\n"
11410         "addq    %%rcx, 48(%%rdi)\n"
11411         "adcq    $0, %%rdx\n"
11412         "movq    %%rdx, %%rcx\n"
11413         "mulq    %%r9\n"
11414         "addq    %%rax, %%rcx\n"
11415         "adcq    $0, %%rdx\n"
11416         "movq    24(%%rsi), %%rax\n"
11417         "addq    %%rcx, 56(%%rdi)\n"
11418         "adcq    $0, %%rdx\n"
11419         "movq    %%rdx, %%rcx\n"
11420         "mulq    %%r9\n"
11421         "addq    %%rax, %%rcx\n"
11422         "adcq    $0, %%rdx\n"
11423         "movq    32(%%rsi), %%rax\n"
11424         "addq    %%rcx, 64(%%rdi)\n"
11425         "adcq    $0, %%rdx\n"
11426         "movq    %%rdx, %%rcx\n"
11427         "mulq    %%r9\n"
11428         "addq    %%rax, %%rcx\n"
11429         "adcq    $0, %%rdx\n"
11430         "movq    40(%%rsi), %%rax\n"
11431         "addq    %%rcx, 72(%%rdi)\n"
11432         "adcq    $0, %%rdx\n"
11433         "movq    %%rdx, %%rcx\n"
11434         "mulq    %%r9\n"
11435         "addq    %%rax, %%rcx\n"
11436         "adcq    $0, %%rdx\n"
11437         "movq    48(%%rsi), %%rax\n"
11438         "addq    %%rcx, 80(%%rdi)\n"
11439         "adcq    $0, %%rdx\n"
11440         "movq    %%rdx, %%rcx\n"
11441         "mulq    %%r9\n"
11442         "addq    %%rax, %%rcx\n"
11443         "adcq    $0, %%rdx\n"
11444         "movq    56(%%rsi), %%rax\n"
11445         "addq    %%rcx, 88(%%rdi)\n"
11446         "adcq    $0, %%rdx\n"
11447         "movq    %%rdx, %%rcx\n"
11448         "mulq    %%r9\n"
11449         "addq    %%rax, %%rcx\n"
11450         "adcq    $0, %%rdx\n"
11451         "movq    64(%%rsi), %%rax\n"
11452         "addq    %%rcx, 96(%%rdi)\n"
11453         "adcq    $0, %%rdx\n"
11454         "movq    %%rdx, %%rcx\n"
11455         "mulq    %%r9\n"
11456         "addq    %%rax, %%rcx\n"
11457         "adcq    $0, %%rdx\n"
11458         "movq    72(%%rsi), %%rax\n"
11459         "addq    %%rcx, 104(%%rdi)\n"
11460         "adcq    $0, %%rdx\n"
11461         "movq    %%rdx, %%rcx\n"
11462         "mulq    %%r9\n"
11463         "addq    %%rax, %%rcx\n"
11464         "adcq    $0, %%rdx\n"
11465         "movq    80(%%rsi), %%rax\n"
11466         "addq    %%rcx, 112(%%rdi)\n"
11467         "adcq    $0, %%rdx\n"
11468         "movq    %%rdx, %%rcx\n"
11469         "mulq    %%r9\n"
11470         "addq    %%rax, %%rcx\n"
11471         "adcq    $0, %%rdx\n"
11472         "movq    88(%%rsi), %%rax\n"
11473         "addq    %%rcx, 120(%%rdi)\n"
11474         "adcq    $0, %%rdx\n"
11475         "movq    %%rdx, %%rcx\n"
11476         "mulq    %%r9\n"
11477         "addq    %%rax, %%rcx\n"
11478         "adcq    $0, %%rdx\n"
11479         "movq    96(%%rsi), %%rax\n"
11480         "addq    %%rcx, 128(%%rdi)\n"
11481         "adcq    $0, %%rdx\n"
11482         "movq    %%rdx, %%rcx\n"
11483         "mulq    %%r9\n"
11484         "addq    %%rax, %%rcx\n"
11485         "adcq    $0, %%rdx\n"
11486         "addq    %%rcx, 136(%%rdi)\n"
11487         "adcq    $0, %%rdx\n"
11488         "movq    %%rdx, 144(%%rdi)\n"
11489         "### x*y[6]\n"
11490         "movq    48(%%r8), %%r9\n"
11491         "movq    0(%%rsi), %%rax\n"
11492         "mulq    %%r9\n"
11493         "addq    %%rax, 48(%%rdi)\n"
11494         "movq    8(%%rsi), %%rax\n"
11495         "adcq    $0, %%rdx\n"
11496         "movq    %%rdx, %%rcx\n"
11497         "mulq    %%r9\n"
11498         "addq    %%rax, %%rcx\n"
11499         "adcq    $0, %%rdx\n"
11500         "movq    16(%%rsi), %%rax\n"
11501         "addq    %%rcx, 56(%%rdi)\n"
11502         "adcq    $0, %%rdx\n"
11503         "movq    %%rdx, %%rcx\n"
11504         "mulq    %%r9\n"
11505         "addq    %%rax, %%rcx\n"
11506         "adcq    $0, %%rdx\n"
11507         "movq    24(%%rsi), %%rax\n"
11508         "addq    %%rcx, 64(%%rdi)\n"
11509         "adcq    $0, %%rdx\n"
11510         "movq    %%rdx, %%rcx\n"
11511         "mulq    %%r9\n"
11512         "addq    %%rax, %%rcx\n"
11513         "adcq    $0, %%rdx\n"
11514         "movq    32(%%rsi), %%rax\n"
11515         "addq    %%rcx, 72(%%rdi)\n"
11516         "adcq    $0, %%rdx\n"
11517         "movq    %%rdx, %%rcx\n"
11518         "mulq    %%r9\n"
11519         "addq    %%rax, %%rcx\n"
11520         "adcq    $0, %%rdx\n"
11521         "movq    40(%%rsi), %%rax\n"
11522         "addq    %%rcx, 80(%%rdi)\n"
11523         "adcq    $0, %%rdx\n"
11524         "movq    %%rdx, %%rcx\n"
11525         "mulq    %%r9\n"
11526         "addq    %%rax, %%rcx\n"
11527         "adcq    $0, %%rdx\n"
11528         "movq    48(%%rsi), %%rax\n"
11529         "addq    %%rcx, 88(%%rdi)\n"
11530         "adcq    $0, %%rdx\n"
11531         "movq    %%rdx, %%rcx\n"
11532         "mulq    %%r9\n"
11533         "addq    %%rax, %%rcx\n"
11534         "adcq    $0, %%rdx\n"
11535         "movq    56(%%rsi), %%rax\n"
11536         "addq    %%rcx, 96(%%rdi)\n"
11537         "adcq    $0, %%rdx\n"
11538         "movq    %%rdx, %%rcx\n"
11539         "mulq    %%r9\n"
11540         "addq    %%rax, %%rcx\n"
11541         "adcq    $0, %%rdx\n"
11542         "movq    64(%%rsi), %%rax\n"
11543         "addq    %%rcx, 104(%%rdi)\n"
11544         "adcq    $0, %%rdx\n"
11545         "movq    %%rdx, %%rcx\n"
11546         "mulq    %%r9\n"
11547         "addq    %%rax, %%rcx\n"
11548         "adcq    $0, %%rdx\n"
11549         "movq    72(%%rsi), %%rax\n"
11550         "addq    %%rcx, 112(%%rdi)\n"
11551         "adcq    $0, %%rdx\n"
11552         "movq    %%rdx, %%rcx\n"
11553         "mulq    %%r9\n"
11554         "addq    %%rax, %%rcx\n"
11555         "adcq    $0, %%rdx\n"
11556         "movq    80(%%rsi), %%rax\n"
11557         "addq    %%rcx, 120(%%rdi)\n"
11558         "adcq    $0, %%rdx\n"
11559         "movq    %%rdx, %%rcx\n"
11560         "mulq    %%r9\n"
11561         "addq    %%rax, %%rcx\n"
11562         "adcq    $0, %%rdx\n"
11563         "movq    88(%%rsi), %%rax\n"
11564         "addq    %%rcx, 128(%%rdi)\n"
11565         "adcq    $0, %%rdx\n"
11566         "movq    %%rdx, %%rcx\n"
11567         "mulq    %%r9\n"
11568         "addq    %%rax, %%rcx\n"
11569         "adcq    $0, %%rdx\n"
11570         "movq    96(%%rsi), %%rax\n"
11571         "addq    %%rcx, 136(%%rdi)\n"
11572         "adcq    $0, %%rdx\n"
11573         "movq    %%rdx, %%rcx\n"
11574         "mulq    %%r9\n"
11575         "addq    %%rax, %%rcx\n"
11576         "adcq    $0, %%rdx\n"
11577         "addq    %%rcx, 144(%%rdi)\n"
11578         "adcq    $0, %%rdx\n"
11579         "movq    %%rdx, 152(%%rdi)\n"
11580         "### x*y[7]\n"
11581         "movq    56(%%r8), %%r9\n"
11582         "movq    0(%%rsi), %%rax\n"
11583         "mulq    %%r9\n"
11584         "addq    %%rax, 56(%%rdi)\n"
11585         "movq    8(%%rsi), %%rax\n"
11586         "adcq    $0, %%rdx\n"
11587         "movq    %%rdx, %%rcx\n"
11588         "mulq    %%r9\n"
11589         "addq    %%rax, %%rcx\n"
11590         "adcq    $0, %%rdx\n"
11591         "movq    16(%%rsi), %%rax\n"
11592         "addq    %%rcx, 64(%%rdi)\n"
11593         "adcq    $0, %%rdx\n"
11594         "movq    %%rdx, %%rcx\n"
11595         "mulq    %%r9\n"
11596         "addq    %%rax, %%rcx\n"
11597         "adcq    $0, %%rdx\n"
11598         "movq    24(%%rsi), %%rax\n"
11599         "addq    %%rcx, 72(%%rdi)\n"
11600         "adcq    $0, %%rdx\n"
11601         "movq    %%rdx, %%rcx\n"
11602         "mulq    %%r9\n"
11603         "addq    %%rax, %%rcx\n"
11604         "adcq    $0, %%rdx\n"
11605         "movq    32(%%rsi), %%rax\n"
11606         "addq    %%rcx, 80(%%rdi)\n"
11607         "adcq    $0, %%rdx\n"
11608         "movq    %%rdx, %%rcx\n"
11609         "mulq    %%r9\n"
11610         "addq    %%rax, %%rcx\n"
11611         "adcq    $0, %%rdx\n"
11612         "movq    40(%%rsi), %%rax\n"
11613         "addq    %%rcx, 88(%%rdi)\n"
11614         "adcq    $0, %%rdx\n"
11615         "movq    %%rdx, %%rcx\n"
11616         "mulq    %%r9\n"
11617         "addq    %%rax, %%rcx\n"
11618         "adcq    $0, %%rdx\n"
11619         "movq    48(%%rsi), %%rax\n"
11620         "addq    %%rcx, 96(%%rdi)\n"
11621         "adcq    $0, %%rdx\n"
11622         "movq    %%rdx, %%rcx\n"
11623         "mulq    %%r9\n"
11624         "addq    %%rax, %%rcx\n"
11625         "adcq    $0, %%rdx\n"
11626         "movq    56(%%rsi), %%rax\n"
11627         "addq    %%rcx, 104(%%rdi)\n"
11628         "adcq    $0, %%rdx\n"
11629         "movq    %%rdx, %%rcx\n"
11630         "mulq    %%r9\n"
11631         "addq    %%rax, %%rcx\n"
11632         "adcq    $0, %%rdx\n"
11633         "movq    64(%%rsi), %%rax\n"
11634         "addq    %%rcx, 112(%%rdi)\n"
11635         "adcq    $0, %%rdx\n"
11636         "movq    %%rdx, %%rcx\n"
11637         "mulq    %%r9\n"
11638         "addq    %%rax, %%rcx\n"
11639         "adcq    $0, %%rdx\n"
11640         "movq    72(%%rsi), %%rax\n"
11641         "addq    %%rcx, 120(%%rdi)\n"
11642         "adcq    $0, %%rdx\n"
11643         "movq    %%rdx, %%rcx\n"
11644         "mulq    %%r9\n"
11645         "addq    %%rax, %%rcx\n"
11646         "adcq    $0, %%rdx\n"
11647         "movq    80(%%rsi), %%rax\n"
11648         "addq    %%rcx, 128(%%rdi)\n"
11649         "adcq    $0, %%rdx\n"
11650         "movq    %%rdx, %%rcx\n"
11651         "mulq    %%r9\n"
11652         "addq    %%rax, %%rcx\n"
11653         "adcq    $0, %%rdx\n"
11654         "movq    88(%%rsi), %%rax\n"
11655         "addq    %%rcx, 136(%%rdi)\n"
11656         "adcq    $0, %%rdx\n"
11657         "movq    %%rdx, %%rcx\n"
11658         "mulq    %%r9\n"
11659         "addq    %%rax, %%rcx\n"
11660         "adcq    $0, %%rdx\n"
11661         "movq    96(%%rsi), %%rax\n"
11662         "addq    %%rcx, 144(%%rdi)\n"
11663         "adcq    $0, %%rdx\n"
11664         "movq    %%rdx, %%rcx\n"
11665         "mulq    %%r9\n"
11666         "addq    %%rax, %%rcx\n"
11667         "adcq    $0, %%rdx\n"
11668         "addq    %%rcx, 152(%%rdi)\n"
11669         "adcq    $0, %%rdx\n"
11670         "movq    %%rdx, 160(%%rdi)\n"
11671         "### x*y[8]\n"
11672         "movq    64(%%r8), %%r9\n"
11673         "movq    0(%%rsi), %%rax\n"
11674         "mulq    %%r9\n"
11675         "addq    %%rax, 64(%%rdi)\n"
11676         "movq    8(%%rsi), %%rax\n"
11677         "adcq    $0, %%rdx\n"
11678         "movq    %%rdx, %%rcx\n"
11679         "mulq    %%r9\n"
11680         "addq    %%rax, %%rcx\n"
11681         "adcq    $0, %%rdx\n"
11682         "movq    16(%%rsi), %%rax\n"
11683         "addq    %%rcx, 72(%%rdi)\n"
11684         "adcq    $0, %%rdx\n"
11685         "movq    %%rdx, %%rcx\n"
11686         "mulq    %%r9\n"
11687         "addq    %%rax, %%rcx\n"
11688         "adcq    $0, %%rdx\n"
11689         "movq    24(%%rsi), %%rax\n"
11690         "addq    %%rcx, 80(%%rdi)\n"
11691         "adcq    $0, %%rdx\n"
11692         "movq    %%rdx, %%rcx\n"
11693         "mulq    %%r9\n"
11694         "addq    %%rax, %%rcx\n"
11695         "adcq    $0, %%rdx\n"
11696         "movq    32(%%rsi), %%rax\n"
11697         "addq    %%rcx, 88(%%rdi)\n"
11698         "adcq    $0, %%rdx\n"
11699         "movq    %%rdx, %%rcx\n"
11700         "mulq    %%r9\n"
11701         "addq    %%rax, %%rcx\n"
11702         "adcq    $0, %%rdx\n"
11703         "movq    40(%%rsi), %%rax\n"
11704         "addq    %%rcx, 96(%%rdi)\n"
11705         "adcq    $0, %%rdx\n"
11706         "movq    %%rdx, %%rcx\n"
11707         "mulq    %%r9\n"
11708         "addq    %%rax, %%rcx\n"
11709         "adcq    $0, %%rdx\n"
11710         "movq    48(%%rsi), %%rax\n"
11711         "addq    %%rcx, 104(%%rdi)\n"
11712         "adcq    $0, %%rdx\n"
11713         "movq    %%rdx, %%rcx\n"
11714         "mulq    %%r9\n"
11715         "addq    %%rax, %%rcx\n"
11716         "adcq    $0, %%rdx\n"
11717         "movq    56(%%rsi), %%rax\n"
11718         "addq    %%rcx, 112(%%rdi)\n"
11719         "adcq    $0, %%rdx\n"
11720         "movq    %%rdx, %%rcx\n"
11721         "mulq    %%r9\n"
11722         "addq    %%rax, %%rcx\n"
11723         "adcq    $0, %%rdx\n"
11724         "movq    64(%%rsi), %%rax\n"
11725         "addq    %%rcx, 120(%%rdi)\n"
11726         "adcq    $0, %%rdx\n"
11727         "movq    %%rdx, %%rcx\n"
11728         "mulq    %%r9\n"
11729         "addq    %%rax, %%rcx\n"
11730         "adcq    $0, %%rdx\n"
11731         "movq    72(%%rsi), %%rax\n"
11732         "addq    %%rcx, 128(%%rdi)\n"
11733         "adcq    $0, %%rdx\n"
11734         "movq    %%rdx, %%rcx\n"
11735         "mulq    %%r9\n"
11736         "addq    %%rax, %%rcx\n"
11737         "adcq    $0, %%rdx\n"
11738         "movq    80(%%rsi), %%rax\n"
11739         "addq    %%rcx, 136(%%rdi)\n"
11740         "adcq    $0, %%rdx\n"
11741         "movq    %%rdx, %%rcx\n"
11742         "mulq    %%r9\n"
11743         "addq    %%rax, %%rcx\n"
11744         "adcq    $0, %%rdx\n"
11745         "movq    88(%%rsi), %%rax\n"
11746         "addq    %%rcx, 144(%%rdi)\n"
11747         "adcq    $0, %%rdx\n"
11748         "movq    %%rdx, %%rcx\n"
11749         "mulq    %%r9\n"
11750         "addq    %%rax, %%rcx\n"
11751         "adcq    $0, %%rdx\n"
11752         "movq    96(%%rsi), %%rax\n"
11753         "addq    %%rcx, 152(%%rdi)\n"
11754         "adcq    $0, %%rdx\n"
11755         "movq    %%rdx, %%rcx\n"
11756         "mulq    %%r9\n"
11757         "addq    %%rax, %%rcx\n"
11758         "adcq    $0, %%rdx\n"
11759         "addq    %%rcx, 160(%%rdi)\n"
11760         "adcq    $0, %%rdx\n"
11761         "movq    %%rdx, 168(%%rdi)\n"
11762         "### x*y[9]\n"
11763         "movq    72(%%r8), %%r9\n"
11764         "movq    0(%%rsi), %%rax\n"
11765         "mulq    %%r9\n"
11766         "addq    %%rax, 72(%%rdi)\n"
11767         "movq    8(%%rsi), %%rax\n"
11768         "adcq    $0, %%rdx\n"
11769         "movq    %%rdx, %%rcx\n"
11770         "mulq    %%r9\n"
11771         "addq    %%rax, %%rcx\n"
11772         "adcq    $0, %%rdx\n"
11773         "movq    16(%%rsi), %%rax\n"
11774         "addq    %%rcx, 80(%%rdi)\n"
11775         "adcq    $0, %%rdx\n"
11776         "movq    %%rdx, %%rcx\n"
11777         "mulq    %%r9\n"
11778         "addq    %%rax, %%rcx\n"
11779         "adcq    $0, %%rdx\n"
11780         "movq    24(%%rsi), %%rax\n"
11781         "addq    %%rcx, 88(%%rdi)\n"
11782         "adcq    $0, %%rdx\n"
11783         "movq    %%rdx, %%rcx\n"
11784         "mulq    %%r9\n"
11785         "addq    %%rax, %%rcx\n"
11786         "adcq    $0, %%rdx\n"
11787         "movq    32(%%rsi), %%rax\n"
11788         "addq    %%rcx, 96(%%rdi)\n"
11789         "adcq    $0, %%rdx\n"
11790         "movq    %%rdx, %%rcx\n"
11791         "mulq    %%r9\n"
11792         "addq    %%rax, %%rcx\n"
11793         "adcq    $0, %%rdx\n"
11794         "movq    40(%%rsi), %%rax\n"
11795         "addq    %%rcx, 104(%%rdi)\n"
11796         "adcq    $0, %%rdx\n"
11797         "movq    %%rdx, %%rcx\n"
11798         "mulq    %%r9\n"
11799         "addq    %%rax, %%rcx\n"
11800         "adcq    $0, %%rdx\n"
11801         "movq    48(%%rsi), %%rax\n"
11802         "addq    %%rcx, 112(%%rdi)\n"
11803         "adcq    $0, %%rdx\n"
11804         "movq    %%rdx, %%rcx\n"
11805         "mulq    %%r9\n"
11806         "addq    %%rax, %%rcx\n"
11807         "adcq    $0, %%rdx\n"
11808         "movq    56(%%rsi), %%rax\n"
11809         "addq    %%rcx, 120(%%rdi)\n"
11810         "adcq    $0, %%rdx\n"
11811         "movq    %%rdx, %%rcx\n"
11812         "mulq    %%r9\n"
11813         "addq    %%rax, %%rcx\n"
11814         "adcq    $0, %%rdx\n"
11815         "movq    64(%%rsi), %%rax\n"
11816         "addq    %%rcx, 128(%%rdi)\n"
11817         "adcq    $0, %%rdx\n"
11818         "movq    %%rdx, %%rcx\n"
11819         "mulq    %%r9\n"
11820         "addq    %%rax, %%rcx\n"
11821         "adcq    $0, %%rdx\n"
11822         "movq    72(%%rsi), %%rax\n"
11823         "addq    %%rcx, 136(%%rdi)\n"
11824         "adcq    $0, %%rdx\n"
11825         "movq    %%rdx, %%rcx\n"
11826         "mulq    %%r9\n"
11827         "addq    %%rax, %%rcx\n"
11828         "adcq    $0, %%rdx\n"
11829         "movq    80(%%rsi), %%rax\n"
11830         "addq    %%rcx, 144(%%rdi)\n"
11831         "adcq    $0, %%rdx\n"
11832         "movq    %%rdx, %%rcx\n"
11833         "mulq    %%r9\n"
11834         "addq    %%rax, %%rcx\n"
11835         "adcq    $0, %%rdx\n"
11836         "movq    88(%%rsi), %%rax\n"
11837         "addq    %%rcx, 152(%%rdi)\n"
11838         "adcq    $0, %%rdx\n"
11839         "movq    %%rdx, %%rcx\n"
11840         "mulq    %%r9\n"
11841         "addq    %%rax, %%rcx\n"
11842         "adcq    $0, %%rdx\n"
11843         "movq    96(%%rsi), %%rax\n"
11844         "addq    %%rcx, 160(%%rdi)\n"
11845         "adcq    $0, %%rdx\n"
11846         "movq    %%rdx, %%rcx\n"
11847         "mulq    %%r9\n"
11848         "addq    %%rax, %%rcx\n"
11849         "adcq    $0, %%rdx\n"
11850         "addq    %%rcx, 168(%%rdi)\n"
11851         "adcq    $0, %%rdx\n"
11852         "movq    %%rdx, 176(%%rdi)\n"
11853         "### x*y[10]\n"
11854         "movq    80(%%r8), %%r9\n"
11855         "movq    0(%%rsi), %%rax\n"
11856         "mulq    %%r9\n"
11857         "addq    %%rax, 80(%%rdi)\n"
11858         "movq    8(%%rsi), %%rax\n"
11859         "adcq    $0, %%rdx\n"
11860         "movq    %%rdx, %%rcx\n"
11861         "mulq    %%r9\n"
11862         "addq    %%rax, %%rcx\n"
11863         "adcq    $0, %%rdx\n"
11864         "movq    16(%%rsi), %%rax\n"
11865         "addq    %%rcx, 88(%%rdi)\n"
11866         "adcq    $0, %%rdx\n"
11867         "movq    %%rdx, %%rcx\n"
11868         "mulq    %%r9\n"
11869         "addq    %%rax, %%rcx\n"
11870         "adcq    $0, %%rdx\n"
11871         "movq    24(%%rsi), %%rax\n"
11872         "addq    %%rcx, 96(%%rdi)\n"
11873         "adcq    $0, %%rdx\n"
11874         "movq    %%rdx, %%rcx\n"
11875         "mulq    %%r9\n"
11876         "addq    %%rax, %%rcx\n"
11877         "adcq    $0, %%rdx\n"
11878         "movq    32(%%rsi), %%rax\n"
11879         "addq    %%rcx, 104(%%rdi)\n"
11880         "adcq    $0, %%rdx\n"
11881         "movq    %%rdx, %%rcx\n"
11882         "mulq    %%r9\n"
11883         "addq    %%rax, %%rcx\n"
11884         "adcq    $0, %%rdx\n"
11885         "movq    40(%%rsi), %%rax\n"
11886         "addq    %%rcx, 112(%%rdi)\n"
11887         "adcq    $0, %%rdx\n"
11888         "movq    %%rdx, %%rcx\n"
11889         "mulq    %%r9\n"
11890         "addq    %%rax, %%rcx\n"
11891         "adcq    $0, %%rdx\n"
11892         "movq    48(%%rsi), %%rax\n"
11893         "addq    %%rcx, 120(%%rdi)\n"
11894         "adcq    $0, %%rdx\n"
11895         "movq    %%rdx, %%rcx\n"
11896         "mulq    %%r9\n"
11897         "addq    %%rax, %%rcx\n"
11898         "adcq    $0, %%rdx\n"
11899         "movq    56(%%rsi), %%rax\n"
11900         "addq    %%rcx, 128(%%rdi)\n"
11901         "adcq    $0, %%rdx\n"
11902         "movq    %%rdx, %%rcx\n"
11903         "mulq    %%r9\n"
11904         "addq    %%rax, %%rcx\n"
11905         "adcq    $0, %%rdx\n"
11906         "movq    64(%%rsi), %%rax\n"
11907         "addq    %%rcx, 136(%%rdi)\n"
11908         "adcq    $0, %%rdx\n"
11909         "movq    %%rdx, %%rcx\n"
11910         "mulq    %%r9\n"
11911         "addq    %%rax, %%rcx\n"
11912         "adcq    $0, %%rdx\n"
11913         "movq    72(%%rsi), %%rax\n"
11914         "addq    %%rcx, 144(%%rdi)\n"
11915         "adcq    $0, %%rdx\n"
11916         "movq    %%rdx, %%rcx\n"
11917         "mulq    %%r9\n"
11918         "addq    %%rax, %%rcx\n"
11919         "adcq    $0, %%rdx\n"
11920         "movq    80(%%rsi), %%rax\n"
11921         "addq    %%rcx, 152(%%rdi)\n"
11922         "adcq    $0, %%rdx\n"
11923         "movq    %%rdx, %%rcx\n"
11924         "mulq    %%r9\n"
11925         "addq    %%rax, %%rcx\n"
11926         "adcq    $0, %%rdx\n"
11927         "movq    88(%%rsi), %%rax\n"
11928         "addq    %%rcx, 160(%%rdi)\n"
11929         "adcq    $0, %%rdx\n"
11930         "movq    %%rdx, %%rcx\n"
11931         "mulq    %%r9\n"
11932         "addq    %%rax, %%rcx\n"
11933         "adcq    $0, %%rdx\n"
11934         "movq    96(%%rsi), %%rax\n"
11935         "addq    %%rcx, 168(%%rdi)\n"
11936         "adcq    $0, %%rdx\n"
11937         "movq    %%rdx, %%rcx\n"
11938         "mulq    %%r9\n"
11939         "addq    %%rax, %%rcx\n"
11940         "adcq    $0, %%rdx\n"
11941         "addq    %%rcx, 176(%%rdi)\n"
11942         "adcq    $0, %%rdx\n"
11943         "movq    %%rdx, 184(%%rdi)\n"
11944         "### x*y[11]\n"
11945         "movq    88(%%r8), %%r9\n"
11946         "movq    0(%%rsi), %%rax\n"
11947         "mulq    %%r9\n"
11948         "addq    %%rax, 88(%%rdi)\n"
11949         "movq    8(%%rsi), %%rax\n"
11950         "adcq    $0, %%rdx\n"
11951         "movq    %%rdx, %%rcx\n"
11952         "mulq    %%r9\n"
11953         "addq    %%rax, %%rcx\n"
11954         "adcq    $0, %%rdx\n"
11955         "movq    16(%%rsi), %%rax\n"
11956         "addq    %%rcx, 96(%%rdi)\n"
11957         "adcq    $0, %%rdx\n"
11958         "movq    %%rdx, %%rcx\n"
11959         "mulq    %%r9\n"
11960         "addq    %%rax, %%rcx\n"
11961         "adcq    $0, %%rdx\n"
11962         "movq    24(%%rsi), %%rax\n"
11963         "addq    %%rcx, 104(%%rdi)\n"
11964         "adcq    $0, %%rdx\n"
11965         "movq    %%rdx, %%rcx\n"
11966         "mulq    %%r9\n"
11967         "addq    %%rax, %%rcx\n"
11968         "adcq    $0, %%rdx\n"
11969         "movq    32(%%rsi), %%rax\n"
11970         "addq    %%rcx, 112(%%rdi)\n"
11971         "adcq    $0, %%rdx\n"
11972         "movq    %%rdx, %%rcx\n"
11973         "mulq    %%r9\n"
11974         "addq    %%rax, %%rcx\n"
11975         "adcq    $0, %%rdx\n"
11976         "movq    40(%%rsi), %%rax\n"
11977         "addq    %%rcx, 120(%%rdi)\n"
11978         "adcq    $0, %%rdx\n"
11979         "movq    %%rdx, %%rcx\n"
11980         "mulq    %%r9\n"
11981         "addq    %%rax, %%rcx\n"
11982         "adcq    $0, %%rdx\n"
11983         "movq    48(%%rsi), %%rax\n"
11984         "addq    %%rcx, 128(%%rdi)\n"
11985         "adcq    $0, %%rdx\n"
11986         "movq    %%rdx, %%rcx\n"
11987         "mulq    %%r9\n"
11988         "addq    %%rax, %%rcx\n"
11989         "adcq    $0, %%rdx\n"
11990         "movq    56(%%rsi), %%rax\n"
11991         "addq    %%rcx, 136(%%rdi)\n"
11992         "adcq    $0, %%rdx\n"
11993         "movq    %%rdx, %%rcx\n"
11994         "mulq    %%r9\n"
11995         "addq    %%rax, %%rcx\n"
11996         "adcq    $0, %%rdx\n"
11997         "movq    64(%%rsi), %%rax\n"
11998         "addq    %%rcx, 144(%%rdi)\n"
11999         "adcq    $0, %%rdx\n"
12000         "movq    %%rdx, %%rcx\n"
12001         "mulq    %%r9\n"
12002         "addq    %%rax, %%rcx\n"
12003         "adcq    $0, %%rdx\n"
12004         "movq    72(%%rsi), %%rax\n"
12005         "addq    %%rcx, 152(%%rdi)\n"
12006         "adcq    $0, %%rdx\n"
12007         "movq    %%rdx, %%rcx\n"
12008         "mulq    %%r9\n"
12009         "addq    %%rax, %%rcx\n"
12010         "adcq    $0, %%rdx\n"
12011         "movq    80(%%rsi), %%rax\n"
12012         "addq    %%rcx, 160(%%rdi)\n"
12013         "adcq    $0, %%rdx\n"
12014         "movq    %%rdx, %%rcx\n"
12015         "mulq    %%r9\n"
12016         "addq    %%rax, %%rcx\n"
12017         "adcq    $0, %%rdx\n"
12018         "movq    88(%%rsi), %%rax\n"
12019         "addq    %%rcx, 168(%%rdi)\n"
12020         "adcq    $0, %%rdx\n"
12021         "movq    %%rdx, %%rcx\n"
12022         "mulq    %%r9\n"
12023         "addq    %%rax, %%rcx\n"
12024         "adcq    $0, %%rdx\n"
12025         "movq    96(%%rsi), %%rax\n"
12026         "addq    %%rcx, 176(%%rdi)\n"
12027         "adcq    $0, %%rdx\n"
12028         "movq    %%rdx, %%rcx\n"
12029         "mulq    %%r9\n"
12030         "addq    %%rax, %%rcx\n"
12031         "adcq    $0, %%rdx\n"
12032         "addq    %%rcx, 184(%%rdi)\n"
12033         "adcq    $0, %%rdx\n"
12034         "movq    %%rdx, 192(%%rdi)\n"
12035         "### x*y[12]\n"
12036         "movq    96(%%r8), %%r9\n"
12037         "movq    0(%%rsi), %%rax\n"
12038         "mulq    %%r9\n"
12039         "addq    %%rax, 96(%%rdi)\n"
12040         "movq    8(%%rsi), %%rax\n"
12041         "adcq    $0, %%rdx\n"
12042         "movq    %%rdx, %%rcx\n"
12043         "mulq    %%r9\n"
12044         "addq    %%rax, %%rcx\n"
12045         "adcq    $0, %%rdx\n"
12046         "movq    16(%%rsi), %%rax\n"
12047         "addq    %%rcx, 104(%%rdi)\n"
12048         "adcq    $0, %%rdx\n"
12049         "movq    %%rdx, %%rcx\n"
12050         "mulq    %%r9\n"
12051         "addq    %%rax, %%rcx\n"
12052         "adcq    $0, %%rdx\n"
12053         "movq    24(%%rsi), %%rax\n"
12054         "addq    %%rcx, 112(%%rdi)\n"
12055         "adcq    $0, %%rdx\n"
12056         "movq    %%rdx, %%rcx\n"
12057         "mulq    %%r9\n"
12058         "addq    %%rax, %%rcx\n"
12059         "adcq    $0, %%rdx\n"
12060         "movq    32(%%rsi), %%rax\n"
12061         "addq    %%rcx, 120(%%rdi)\n"
12062         "adcq    $0, %%rdx\n"
12063         "movq    %%rdx, %%rcx\n"
12064         "mulq    %%r9\n"
12065         "addq    %%rax, %%rcx\n"
12066         "adcq    $0, %%rdx\n"
12067         "movq    40(%%rsi), %%rax\n"
12068         "addq    %%rcx, 128(%%rdi)\n"
12069         "adcq    $0, %%rdx\n"
12070         "movq    %%rdx, %%rcx\n"
12071         "mulq    %%r9\n"
12072         "addq    %%rax, %%rcx\n"
12073         "adcq    $0, %%rdx\n"
12074         "movq    48(%%rsi), %%rax\n"
12075         "addq    %%rcx, 136(%%rdi)\n"
12076         "adcq    $0, %%rdx\n"
12077         "movq    %%rdx, %%rcx\n"
12078         "mulq    %%r9\n"
12079         "addq    %%rax, %%rcx\n"
12080         "adcq    $0, %%rdx\n"
12081         "movq    56(%%rsi), %%rax\n"
12082         "addq    %%rcx, 144(%%rdi)\n"
12083         "adcq    $0, %%rdx\n"
12084         "movq    %%rdx, %%rcx\n"
12085         "mulq    %%r9\n"
12086         "addq    %%rax, %%rcx\n"
12087         "adcq    $0, %%rdx\n"
12088         "movq    64(%%rsi), %%rax\n"
12089         "addq    %%rcx, 152(%%rdi)\n"
12090         "adcq    $0, %%rdx\n"
12091         "movq    %%rdx, %%rcx\n"
12092         "mulq    %%r9\n"
12093         "addq    %%rax, %%rcx\n"
12094         "adcq    $0, %%rdx\n"
12095         "movq    72(%%rsi), %%rax\n"
12096         "addq    %%rcx, 160(%%rdi)\n"
12097         "adcq    $0, %%rdx\n"
12098         "movq    %%rdx, %%rcx\n"
12099         "mulq    %%r9\n"
12100         "addq    %%rax, %%rcx\n"
12101         "adcq    $0, %%rdx\n"
12102         "movq    80(%%rsi), %%rax\n"
12103         "addq    %%rcx, 168(%%rdi)\n"
12104         "adcq    $0, %%rdx\n"
12105         "movq    %%rdx, %%rcx\n"
12106         "mulq    %%r9\n"
12107         "addq    %%rax, %%rcx\n"
12108         "adcq    $0, %%rdx\n"
12109         "movq    88(%%rsi), %%rax\n"
12110         "addq    %%rcx, 176(%%rdi)\n"
12111         "adcq    $0, %%rdx\n"
12112         "movq    %%rdx, %%rcx\n"
12113         "mulq    %%r9\n"
12114         "addq    %%rax, %%rcx\n"
12115         "adcq    $0, %%rdx\n"
12116         "movq    96(%%rsi), %%rax\n"
12117         "addq    %%rcx, 184(%%rdi)\n"
12118         "adcq    $0, %%rdx\n"
12119         "movq    %%rdx, %%rcx\n"
12120         "mulq    %%r9\n"
12121         "addq    %%rax, %%rcx\n"
12122         "adcq    $0, %%rdx\n"
12123         "addq    %%rcx, 192(%%rdi)\n"
12124         "adcq    $0, %%rdx\n"
12125         "movq    %%rdx, 200(%%rdi)\n"
12126       : "+m" (z)
12127       : "m" (x), "m" (y)
12128       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
12129 }
12130 
12131 /* x has 13 words, z has 28. Put x*y in z. */
12132 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
12133 static inline
mpfq_fixmp_13_sqr(mp_limb_t * z,const mp_limb_t * x)12134 void mpfq_fixmp_13_sqr(mp_limb_t * z, const mp_limb_t * x)
12135 {
12136     mpfq_fixmp_13_mul(z, x, x);
12137 }
12138 
12139 /* x has 13 words, z has 15. Put x*y in z. */
12140 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
12141 static inline
mpfq_fixmp_13_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)12142 void mpfq_fixmp_13_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
12143 {
12144     __asm__ __volatile__(
12145         "movq    %[z], %%rdi\n"
12146         "movq    %[x], %%rsi\n"
12147         "movq    0(%%rsi), %%rax\n"
12148         "mulq    %[mult]\n"
12149         "movq    %%rax, 0(%%rdi)\n"
12150         "movq    8(%%rsi), %%rax\n"
12151         "movq    %%rdx, %%rcx\n"
12152         "mulq    %[mult]\n"
12153         "addq    %%rax, %%rcx\n"
12154         "adcq    $0, %%rdx\n"
12155         "movq    16(%%rsi), %%rax\n"
12156         "movq    %%rcx, 8(%%rdi)\n"
12157         "movq    %%rdx, %%rcx\n"
12158         "mulq    %[mult]\n"
12159         "addq    %%rax, %%rcx\n"
12160         "adcq    $0, %%rdx\n"
12161         "movq    24(%%rsi), %%rax\n"
12162         "movq    %%rcx, 16(%%rdi)\n"
12163         "movq    %%rdx, %%rcx\n"
12164         "mulq    %[mult]\n"
12165         "addq    %%rax, %%rcx\n"
12166         "adcq    $0, %%rdx\n"
12167         "movq    32(%%rsi), %%rax\n"
12168         "movq    %%rcx, 24(%%rdi)\n"
12169         "movq    %%rdx, %%rcx\n"
12170         "mulq    %[mult]\n"
12171         "addq    %%rax, %%rcx\n"
12172         "adcq    $0, %%rdx\n"
12173         "movq    40(%%rsi), %%rax\n"
12174         "movq    %%rcx, 32(%%rdi)\n"
12175         "movq    %%rdx, %%rcx\n"
12176         "mulq    %[mult]\n"
12177         "addq    %%rax, %%rcx\n"
12178         "adcq    $0, %%rdx\n"
12179         "movq    48(%%rsi), %%rax\n"
12180         "movq    %%rcx, 40(%%rdi)\n"
12181         "movq    %%rdx, %%rcx\n"
12182         "mulq    %[mult]\n"
12183         "addq    %%rax, %%rcx\n"
12184         "adcq    $0, %%rdx\n"
12185         "movq    56(%%rsi), %%rax\n"
12186         "movq    %%rcx, 48(%%rdi)\n"
12187         "movq    %%rdx, %%rcx\n"
12188         "mulq    %[mult]\n"
12189         "addq    %%rax, %%rcx\n"
12190         "adcq    $0, %%rdx\n"
12191         "movq    64(%%rsi), %%rax\n"
12192         "movq    %%rcx, 56(%%rdi)\n"
12193         "movq    %%rdx, %%rcx\n"
12194         "mulq    %[mult]\n"
12195         "addq    %%rax, %%rcx\n"
12196         "adcq    $0, %%rdx\n"
12197         "movq    72(%%rsi), %%rax\n"
12198         "movq    %%rcx, 64(%%rdi)\n"
12199         "movq    %%rdx, %%rcx\n"
12200         "mulq    %[mult]\n"
12201         "addq    %%rax, %%rcx\n"
12202         "adcq    $0, %%rdx\n"
12203         "movq    80(%%rsi), %%rax\n"
12204         "movq    %%rcx, 72(%%rdi)\n"
12205         "movq    %%rdx, %%rcx\n"
12206         "mulq    %[mult]\n"
12207         "addq    %%rax, %%rcx\n"
12208         "adcq    $0, %%rdx\n"
12209         "movq    88(%%rsi), %%rax\n"
12210         "movq    %%rcx, 80(%%rdi)\n"
12211         "movq    %%rdx, %%rcx\n"
12212         "mulq    %[mult]\n"
12213         "addq    %%rax, %%rcx\n"
12214         "adcq    $0, %%rdx\n"
12215         "movq    96(%%rsi), %%rax\n"
12216         "movq    %%rcx, 88(%%rdi)\n"
12217         "movq    %%rdx, %%rcx\n"
12218         "mulq    %[mult]\n"
12219         "addq    %%rax, %%rcx\n"
12220         "adcq    $0, %%rdx\n"
12221         "movq    %%rcx, 96(%%rdi)\n"
12222         "movq    %%rdx, 104(%%rdi)\n"
12223     :
12224     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
12225     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
12226 }
12227 
12228 /* x, y, and z have 14 words. Result in z. Return carry bit */
12229 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
12230 static inline
mpfq_fixmp_14_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)12231 mp_limb_t mpfq_fixmp_14_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
12232 {
12233     mp_limb_t carry;
12234     __asm__ __volatile__(
12235         "movq    %[z], %%rdi\n"
12236         "movq    %[x], %%rsi\n"
12237         "movq    %[y], %%rdx\n"
12238         "movq    0(%%rsi), %%rax\n"
12239         "addq    0(%%rdx), %%rax\n"
12240         "movq    %%rax, 0(%%rdi)\n"
12241         "movq    8(%%rsi), %%rax\n"
12242         "adcq    8(%%rdx), %%rax\n"
12243         "movq    %%rax, 8(%%rdi)\n"
12244         "movq    16(%%rsi), %%rax\n"
12245         "adcq    16(%%rdx), %%rax\n"
12246         "movq    %%rax, 16(%%rdi)\n"
12247         "movq    24(%%rsi), %%rax\n"
12248         "adcq    24(%%rdx), %%rax\n"
12249         "movq    %%rax, 24(%%rdi)\n"
12250         "movq    32(%%rsi), %%rax\n"
12251         "adcq    32(%%rdx), %%rax\n"
12252         "movq    %%rax, 32(%%rdi)\n"
12253         "movq    40(%%rsi), %%rax\n"
12254         "adcq    40(%%rdx), %%rax\n"
12255         "movq    %%rax, 40(%%rdi)\n"
12256         "movq    48(%%rsi), %%rax\n"
12257         "adcq    48(%%rdx), %%rax\n"
12258         "movq    %%rax, 48(%%rdi)\n"
12259         "movq    56(%%rsi), %%rax\n"
12260         "adcq    56(%%rdx), %%rax\n"
12261         "movq    %%rax, 56(%%rdi)\n"
12262         "movq    64(%%rsi), %%rax\n"
12263         "adcq    64(%%rdx), %%rax\n"
12264         "movq    %%rax, 64(%%rdi)\n"
12265         "movq    72(%%rsi), %%rax\n"
12266         "adcq    72(%%rdx), %%rax\n"
12267         "movq    %%rax, 72(%%rdi)\n"
12268         "movq    80(%%rsi), %%rax\n"
12269         "adcq    80(%%rdx), %%rax\n"
12270         "movq    %%rax, 80(%%rdi)\n"
12271         "movq    88(%%rsi), %%rax\n"
12272         "adcq    88(%%rdx), %%rax\n"
12273         "movq    %%rax, 88(%%rdi)\n"
12274         "movq    96(%%rsi), %%rax\n"
12275         "adcq    96(%%rdx), %%rax\n"
12276         "movq    %%rax, 96(%%rdi)\n"
12277         "movq    104(%%rsi), %%rax\n"
12278         "adcq    104(%%rdx), %%rax\n"
12279         "movq    %%rax, 104(%%rdi)\n"
12280         "movq $0, %%rax\n"
12281         "adcq $0, %%rax\n"
12282     : "=&a"(carry)
12283     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
12284     : "%rdx", "%rsi", "%rdi", "memory");
12285     return carry;
12286 }
12287 
12288 /* x, y, and z have 14 words. Result in z. Return borrow bit */
12289 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
12290 static inline
mpfq_fixmp_14_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)12291 mp_limb_t mpfq_fixmp_14_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
12292 {
12293     mp_limb_t carry;
12294     __asm__ __volatile__(
12295         "movq    %[z], %%rdi\n"
12296         "movq    %[x], %%rsi\n"
12297         "movq    %[y], %%rdx\n"
12298         "movq    0(%%rsi), %%rax\n"
12299         "subq    0(%%rdx), %%rax\n"
12300         "movq    %%rax, 0(%%rdi)\n"
12301         "movq    8(%%rsi), %%rax\n"
12302         "sbbq    8(%%rdx), %%rax\n"
12303         "movq    %%rax, 8(%%rdi)\n"
12304         "movq    16(%%rsi), %%rax\n"
12305         "sbbq    16(%%rdx), %%rax\n"
12306         "movq    %%rax, 16(%%rdi)\n"
12307         "movq    24(%%rsi), %%rax\n"
12308         "sbbq    24(%%rdx), %%rax\n"
12309         "movq    %%rax, 24(%%rdi)\n"
12310         "movq    32(%%rsi), %%rax\n"
12311         "sbbq    32(%%rdx), %%rax\n"
12312         "movq    %%rax, 32(%%rdi)\n"
12313         "movq    40(%%rsi), %%rax\n"
12314         "sbbq    40(%%rdx), %%rax\n"
12315         "movq    %%rax, 40(%%rdi)\n"
12316         "movq    48(%%rsi), %%rax\n"
12317         "sbbq    48(%%rdx), %%rax\n"
12318         "movq    %%rax, 48(%%rdi)\n"
12319         "movq    56(%%rsi), %%rax\n"
12320         "sbbq    56(%%rdx), %%rax\n"
12321         "movq    %%rax, 56(%%rdi)\n"
12322         "movq    64(%%rsi), %%rax\n"
12323         "sbbq    64(%%rdx), %%rax\n"
12324         "movq    %%rax, 64(%%rdi)\n"
12325         "movq    72(%%rsi), %%rax\n"
12326         "sbbq    72(%%rdx), %%rax\n"
12327         "movq    %%rax, 72(%%rdi)\n"
12328         "movq    80(%%rsi), %%rax\n"
12329         "sbbq    80(%%rdx), %%rax\n"
12330         "movq    %%rax, 80(%%rdi)\n"
12331         "movq    88(%%rsi), %%rax\n"
12332         "sbbq    88(%%rdx), %%rax\n"
12333         "movq    %%rax, 88(%%rdi)\n"
12334         "movq    96(%%rsi), %%rax\n"
12335         "sbbq    96(%%rdx), %%rax\n"
12336         "movq    %%rax, 96(%%rdi)\n"
12337         "movq    104(%%rsi), %%rax\n"
12338         "sbbq    104(%%rdx), %%rax\n"
12339         "movq    %%rax, 104(%%rdi)\n"
12340         "movq $0, %%rax\n"
12341         "adcq $0, %%rax\n"
12342     : "=&a"(carry)
12343     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
12344     : "%rdx", "%rsi", "%rdi", "memory");
12345     return carry;
12346 }
12347 
12348 /* x, y, and z have 14 words. Result in z. Carry bit is lost. */
12349 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
12350 static inline
mpfq_fixmp_14_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)12351 void mpfq_fixmp_14_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
12352 {
12353     __asm__ __volatile__(
12354         "movq    %[z], %%rdi\n"
12355         "movq    %[x], %%rsi\n"
12356         "movq    %[y], %%rdx\n"
12357         "movq    0(%%rsi), %%rax\n"
12358         "addq    0(%%rdx), %%rax\n"
12359         "movq    %%rax, 0(%%rdi)\n"
12360         "movq    8(%%rsi), %%rax\n"
12361         "adcq    8(%%rdx), %%rax\n"
12362         "movq    %%rax, 8(%%rdi)\n"
12363         "movq    16(%%rsi), %%rax\n"
12364         "adcq    16(%%rdx), %%rax\n"
12365         "movq    %%rax, 16(%%rdi)\n"
12366         "movq    24(%%rsi), %%rax\n"
12367         "adcq    24(%%rdx), %%rax\n"
12368         "movq    %%rax, 24(%%rdi)\n"
12369         "movq    32(%%rsi), %%rax\n"
12370         "adcq    32(%%rdx), %%rax\n"
12371         "movq    %%rax, 32(%%rdi)\n"
12372         "movq    40(%%rsi), %%rax\n"
12373         "adcq    40(%%rdx), %%rax\n"
12374         "movq    %%rax, 40(%%rdi)\n"
12375         "movq    48(%%rsi), %%rax\n"
12376         "adcq    48(%%rdx), %%rax\n"
12377         "movq    %%rax, 48(%%rdi)\n"
12378         "movq    56(%%rsi), %%rax\n"
12379         "adcq    56(%%rdx), %%rax\n"
12380         "movq    %%rax, 56(%%rdi)\n"
12381         "movq    64(%%rsi), %%rax\n"
12382         "adcq    64(%%rdx), %%rax\n"
12383         "movq    %%rax, 64(%%rdi)\n"
12384         "movq    72(%%rsi), %%rax\n"
12385         "adcq    72(%%rdx), %%rax\n"
12386         "movq    %%rax, 72(%%rdi)\n"
12387         "movq    80(%%rsi), %%rax\n"
12388         "adcq    80(%%rdx), %%rax\n"
12389         "movq    %%rax, 80(%%rdi)\n"
12390         "movq    88(%%rsi), %%rax\n"
12391         "adcq    88(%%rdx), %%rax\n"
12392         "movq    %%rax, 88(%%rdi)\n"
12393         "movq    96(%%rsi), %%rax\n"
12394         "adcq    96(%%rdx), %%rax\n"
12395         "movq    %%rax, 96(%%rdi)\n"
12396         "movq    104(%%rsi), %%rax\n"
12397         "adcq    104(%%rdx), %%rax\n"
12398         "movq    %%rax, 104(%%rdi)\n"
12399     :
12400     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
12401     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
12402 }
12403 
12404 /* x, y, and z have 14 words. Result in z. Borrow bit is lost. */
12405 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
12406 static inline
mpfq_fixmp_14_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)12407 void mpfq_fixmp_14_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
12408 {
12409     __asm__ __volatile__(
12410         "movq    %[z], %%rdi\n"
12411         "movq    %[x], %%rsi\n"
12412         "movq    %[y], %%rdx\n"
12413         "movq    0(%%rsi), %%rax\n"
12414         "subq    0(%%rdx), %%rax\n"
12415         "movq    %%rax, 0(%%rdi)\n"
12416         "movq    8(%%rsi), %%rax\n"
12417         "sbbq    8(%%rdx), %%rax\n"
12418         "movq    %%rax, 8(%%rdi)\n"
12419         "movq    16(%%rsi), %%rax\n"
12420         "sbbq    16(%%rdx), %%rax\n"
12421         "movq    %%rax, 16(%%rdi)\n"
12422         "movq    24(%%rsi), %%rax\n"
12423         "sbbq    24(%%rdx), %%rax\n"
12424         "movq    %%rax, 24(%%rdi)\n"
12425         "movq    32(%%rsi), %%rax\n"
12426         "sbbq    32(%%rdx), %%rax\n"
12427         "movq    %%rax, 32(%%rdi)\n"
12428         "movq    40(%%rsi), %%rax\n"
12429         "sbbq    40(%%rdx), %%rax\n"
12430         "movq    %%rax, 40(%%rdi)\n"
12431         "movq    48(%%rsi), %%rax\n"
12432         "sbbq    48(%%rdx), %%rax\n"
12433         "movq    %%rax, 48(%%rdi)\n"
12434         "movq    56(%%rsi), %%rax\n"
12435         "sbbq    56(%%rdx), %%rax\n"
12436         "movq    %%rax, 56(%%rdi)\n"
12437         "movq    64(%%rsi), %%rax\n"
12438         "sbbq    64(%%rdx), %%rax\n"
12439         "movq    %%rax, 64(%%rdi)\n"
12440         "movq    72(%%rsi), %%rax\n"
12441         "sbbq    72(%%rdx), %%rax\n"
12442         "movq    %%rax, 72(%%rdi)\n"
12443         "movq    80(%%rsi), %%rax\n"
12444         "sbbq    80(%%rdx), %%rax\n"
12445         "movq    %%rax, 80(%%rdi)\n"
12446         "movq    88(%%rsi), %%rax\n"
12447         "sbbq    88(%%rdx), %%rax\n"
12448         "movq    %%rax, 88(%%rdi)\n"
12449         "movq    96(%%rsi), %%rax\n"
12450         "sbbq    96(%%rdx), %%rax\n"
12451         "movq    %%rax, 96(%%rdi)\n"
12452         "movq    104(%%rsi), %%rax\n"
12453         "sbbq    104(%%rdx), %%rax\n"
12454         "movq    %%rax, 104(%%rdi)\n"
12455     :
12456     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
12457     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
12458 }
12459 
12460 /* x has 14 words, z has 16.
12461  * Put (z+x*c) in z. Return carry bit. */
12462 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
12463 static inline
mpfq_fixmp_14_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)12464 mp_limb_t mpfq_fixmp_14_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
12465 {
12466     mp_limb_t carry;
12467     __asm__ __volatile__(
12468         "movq    %[z], %%rdi\n"
12469         "movq    %[x], %%rsi\n"
12470         "movq    0(%%rsi), %%rax\n"
12471         "mulq    %[mult]\n"
12472         "addq    %%rax, 0(%%rdi)\n"
12473         "movq    8(%%rsi), %%rax\n"
12474         "adcq    $0, %%rdx\n"
12475         "movq    %%rdx, %%rcx\n"
12476         "mulq    %[mult]\n"
12477         "addq    %%rax, %%rcx\n"
12478         "adcq    $0, %%rdx\n"
12479         "movq    16(%%rsi), %%rax\n"
12480         "addq    %%rcx, 8(%%rdi)\n"
12481         "adcq    $0, %%rdx\n"
12482         "movq    %%rdx, %%rcx\n"
12483         "mulq    %[mult]\n"
12484         "addq    %%rax, %%rcx\n"
12485         "adcq    $0, %%rdx\n"
12486         "movq    24(%%rsi), %%rax\n"
12487         "addq    %%rcx, 16(%%rdi)\n"
12488         "adcq    $0, %%rdx\n"
12489         "movq    %%rdx, %%rcx\n"
12490         "mulq    %[mult]\n"
12491         "addq    %%rax, %%rcx\n"
12492         "adcq    $0, %%rdx\n"
12493         "movq    32(%%rsi), %%rax\n"
12494         "addq    %%rcx, 24(%%rdi)\n"
12495         "adcq    $0, %%rdx\n"
12496         "movq    %%rdx, %%rcx\n"
12497         "mulq    %[mult]\n"
12498         "addq    %%rax, %%rcx\n"
12499         "adcq    $0, %%rdx\n"
12500         "movq    40(%%rsi), %%rax\n"
12501         "addq    %%rcx, 32(%%rdi)\n"
12502         "adcq    $0, %%rdx\n"
12503         "movq    %%rdx, %%rcx\n"
12504         "mulq    %[mult]\n"
12505         "addq    %%rax, %%rcx\n"
12506         "adcq    $0, %%rdx\n"
12507         "movq    48(%%rsi), %%rax\n"
12508         "addq    %%rcx, 40(%%rdi)\n"
12509         "adcq    $0, %%rdx\n"
12510         "movq    %%rdx, %%rcx\n"
12511         "mulq    %[mult]\n"
12512         "addq    %%rax, %%rcx\n"
12513         "adcq    $0, %%rdx\n"
12514         "movq    56(%%rsi), %%rax\n"
12515         "addq    %%rcx, 48(%%rdi)\n"
12516         "adcq    $0, %%rdx\n"
12517         "movq    %%rdx, %%rcx\n"
12518         "mulq    %[mult]\n"
12519         "addq    %%rax, %%rcx\n"
12520         "adcq    $0, %%rdx\n"
12521         "movq    64(%%rsi), %%rax\n"
12522         "addq    %%rcx, 56(%%rdi)\n"
12523         "adcq    $0, %%rdx\n"
12524         "movq    %%rdx, %%rcx\n"
12525         "mulq    %[mult]\n"
12526         "addq    %%rax, %%rcx\n"
12527         "adcq    $0, %%rdx\n"
12528         "movq    72(%%rsi), %%rax\n"
12529         "addq    %%rcx, 64(%%rdi)\n"
12530         "adcq    $0, %%rdx\n"
12531         "movq    %%rdx, %%rcx\n"
12532         "mulq    %[mult]\n"
12533         "addq    %%rax, %%rcx\n"
12534         "adcq    $0, %%rdx\n"
12535         "movq    80(%%rsi), %%rax\n"
12536         "addq    %%rcx, 72(%%rdi)\n"
12537         "adcq    $0, %%rdx\n"
12538         "movq    %%rdx, %%rcx\n"
12539         "mulq    %[mult]\n"
12540         "addq    %%rax, %%rcx\n"
12541         "adcq    $0, %%rdx\n"
12542         "movq    88(%%rsi), %%rax\n"
12543         "addq    %%rcx, 80(%%rdi)\n"
12544         "adcq    $0, %%rdx\n"
12545         "movq    %%rdx, %%rcx\n"
12546         "mulq    %[mult]\n"
12547         "addq    %%rax, %%rcx\n"
12548         "adcq    $0, %%rdx\n"
12549         "movq    96(%%rsi), %%rax\n"
12550         "addq    %%rcx, 88(%%rdi)\n"
12551         "adcq    $0, %%rdx\n"
12552         "movq    %%rdx, %%rcx\n"
12553         "mulq    %[mult]\n"
12554         "addq    %%rax, %%rcx\n"
12555         "adcq    $0, %%rdx\n"
12556         "movq    104(%%rsi), %%rax\n"
12557         "addq    %%rcx, 96(%%rdi)\n"
12558         "adcq    $0, %%rdx\n"
12559         "movq    %%rdx, %%rcx\n"
12560         "mulq    %[mult]\n"
12561         "addq    %%rax, %%rcx\n"
12562         "adcq    $0, %%rdx\n"
12563         "addq    %%rcx, 104(%%rdi)\n"
12564         "adcq    $0, %%rdx\n"
12565         "xorq    %%rcx, %%rcx\n"
12566         "addq    %%rdx, 112(%%rdi)\n"
12567         "adcq    $0, %%rcx\n"
12568         "movq    %%rcx, %[carry]\n"
12569     : [carry]"=g"(carry), [z] "+m" (z)
12570     : [mult] "r" (c), [x] "m" (x)
12571     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
12572     return carry;
12573 }
12574 
12575 /* x has 14 words, z has 16.
12576  * Put (z+x*c) in z. Carry bit is lost. */
12577 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
12578 static inline
mpfq_fixmp_14_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)12579 void mpfq_fixmp_14_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
12580 {
12581     __asm__ __volatile__(
12582         "movq    %[z], %%rdi\n"
12583         "movq    %[x], %%rsi\n"
12584         "movq    0(%%rsi), %%rax\n"
12585         "mulq    %[mult]\n"
12586         "addq    %%rax, 0(%%rdi)\n"
12587         "movq    8(%%rsi), %%rax\n"
12588         "adcq    $0, %%rdx\n"
12589         "movq    %%rdx, %%rcx\n"
12590         "mulq    %[mult]\n"
12591         "addq    %%rax, %%rcx\n"
12592         "adcq    $0, %%rdx\n"
12593         "movq    16(%%rsi), %%rax\n"
12594         "addq    %%rcx, 8(%%rdi)\n"
12595         "adcq    $0, %%rdx\n"
12596         "movq    %%rdx, %%rcx\n"
12597         "mulq    %[mult]\n"
12598         "addq    %%rax, %%rcx\n"
12599         "adcq    $0, %%rdx\n"
12600         "movq    24(%%rsi), %%rax\n"
12601         "addq    %%rcx, 16(%%rdi)\n"
12602         "adcq    $0, %%rdx\n"
12603         "movq    %%rdx, %%rcx\n"
12604         "mulq    %[mult]\n"
12605         "addq    %%rax, %%rcx\n"
12606         "adcq    $0, %%rdx\n"
12607         "movq    32(%%rsi), %%rax\n"
12608         "addq    %%rcx, 24(%%rdi)\n"
12609         "adcq    $0, %%rdx\n"
12610         "movq    %%rdx, %%rcx\n"
12611         "mulq    %[mult]\n"
12612         "addq    %%rax, %%rcx\n"
12613         "adcq    $0, %%rdx\n"
12614         "movq    40(%%rsi), %%rax\n"
12615         "addq    %%rcx, 32(%%rdi)\n"
12616         "adcq    $0, %%rdx\n"
12617         "movq    %%rdx, %%rcx\n"
12618         "mulq    %[mult]\n"
12619         "addq    %%rax, %%rcx\n"
12620         "adcq    $0, %%rdx\n"
12621         "movq    48(%%rsi), %%rax\n"
12622         "addq    %%rcx, 40(%%rdi)\n"
12623         "adcq    $0, %%rdx\n"
12624         "movq    %%rdx, %%rcx\n"
12625         "mulq    %[mult]\n"
12626         "addq    %%rax, %%rcx\n"
12627         "adcq    $0, %%rdx\n"
12628         "movq    56(%%rsi), %%rax\n"
12629         "addq    %%rcx, 48(%%rdi)\n"
12630         "adcq    $0, %%rdx\n"
12631         "movq    %%rdx, %%rcx\n"
12632         "mulq    %[mult]\n"
12633         "addq    %%rax, %%rcx\n"
12634         "adcq    $0, %%rdx\n"
12635         "movq    64(%%rsi), %%rax\n"
12636         "addq    %%rcx, 56(%%rdi)\n"
12637         "adcq    $0, %%rdx\n"
12638         "movq    %%rdx, %%rcx\n"
12639         "mulq    %[mult]\n"
12640         "addq    %%rax, %%rcx\n"
12641         "adcq    $0, %%rdx\n"
12642         "movq    72(%%rsi), %%rax\n"
12643         "addq    %%rcx, 64(%%rdi)\n"
12644         "adcq    $0, %%rdx\n"
12645         "movq    %%rdx, %%rcx\n"
12646         "mulq    %[mult]\n"
12647         "addq    %%rax, %%rcx\n"
12648         "adcq    $0, %%rdx\n"
12649         "movq    80(%%rsi), %%rax\n"
12650         "addq    %%rcx, 72(%%rdi)\n"
12651         "adcq    $0, %%rdx\n"
12652         "movq    %%rdx, %%rcx\n"
12653         "mulq    %[mult]\n"
12654         "addq    %%rax, %%rcx\n"
12655         "adcq    $0, %%rdx\n"
12656         "movq    88(%%rsi), %%rax\n"
12657         "addq    %%rcx, 80(%%rdi)\n"
12658         "adcq    $0, %%rdx\n"
12659         "movq    %%rdx, %%rcx\n"
12660         "mulq    %[mult]\n"
12661         "addq    %%rax, %%rcx\n"
12662         "adcq    $0, %%rdx\n"
12663         "movq    96(%%rsi), %%rax\n"
12664         "addq    %%rcx, 88(%%rdi)\n"
12665         "adcq    $0, %%rdx\n"
12666         "movq    %%rdx, %%rcx\n"
12667         "mulq    %[mult]\n"
12668         "addq    %%rax, %%rcx\n"
12669         "adcq    $0, %%rdx\n"
12670         "movq    104(%%rsi), %%rax\n"
12671         "addq    %%rcx, 96(%%rdi)\n"
12672         "adcq    $0, %%rdx\n"
12673         "movq    %%rdx, %%rcx\n"
12674         "mulq    %[mult]\n"
12675         "addq    %%rax, %%rcx\n"
12676         "adcq    $0, %%rdx\n"
12677         "addq    %%rcx, 104(%%rdi)\n"
12678         "adcq    $0, %%rdx\n"
12679         "addq    %%rdx, 112(%%rdi)\n"
12680     : [z] "+m" (z)
12681     : [mult] "r" (c), [x] "m" (x)
12682     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
12683 }
12684 
12685 /* x has 14 words, z has 15.
12686  * Put (z+x*c) in z. Return carry word. */
12687 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
12688 static inline
mpfq_fixmp_14_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)12689 mp_limb_t mpfq_fixmp_14_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
12690 {
12691     mp_limb_t carry;
12692     __asm__ __volatile__(
12693         "movq    %[z], %%rdi\n"
12694         "movq    %[x], %%rsi\n"
12695         "movq    0(%%rsi), %%rax\n"
12696         "mulq    %[mult]\n"
12697         "addq    %%rax, 0(%%rdi)\n"
12698         "movq    8(%%rsi), %%rax\n"
12699         "adcq    $0, %%rdx\n"
12700         "movq    %%rdx, %%rcx\n"
12701         "mulq    %[mult]\n"
12702         "addq    %%rax, %%rcx\n"
12703         "adcq    $0, %%rdx\n"
12704         "movq    16(%%rsi), %%rax\n"
12705         "addq    %%rcx, 8(%%rdi)\n"
12706         "adcq    $0, %%rdx\n"
12707         "movq    %%rdx, %%rcx\n"
12708         "mulq    %[mult]\n"
12709         "addq    %%rax, %%rcx\n"
12710         "adcq    $0, %%rdx\n"
12711         "movq    24(%%rsi), %%rax\n"
12712         "addq    %%rcx, 16(%%rdi)\n"
12713         "adcq    $0, %%rdx\n"
12714         "movq    %%rdx, %%rcx\n"
12715         "mulq    %[mult]\n"
12716         "addq    %%rax, %%rcx\n"
12717         "adcq    $0, %%rdx\n"
12718         "movq    32(%%rsi), %%rax\n"
12719         "addq    %%rcx, 24(%%rdi)\n"
12720         "adcq    $0, %%rdx\n"
12721         "movq    %%rdx, %%rcx\n"
12722         "mulq    %[mult]\n"
12723         "addq    %%rax, %%rcx\n"
12724         "adcq    $0, %%rdx\n"
12725         "movq    40(%%rsi), %%rax\n"
12726         "addq    %%rcx, 32(%%rdi)\n"
12727         "adcq    $0, %%rdx\n"
12728         "movq    %%rdx, %%rcx\n"
12729         "mulq    %[mult]\n"
12730         "addq    %%rax, %%rcx\n"
12731         "adcq    $0, %%rdx\n"
12732         "movq    48(%%rsi), %%rax\n"
12733         "addq    %%rcx, 40(%%rdi)\n"
12734         "adcq    $0, %%rdx\n"
12735         "movq    %%rdx, %%rcx\n"
12736         "mulq    %[mult]\n"
12737         "addq    %%rax, %%rcx\n"
12738         "adcq    $0, %%rdx\n"
12739         "movq    56(%%rsi), %%rax\n"
12740         "addq    %%rcx, 48(%%rdi)\n"
12741         "adcq    $0, %%rdx\n"
12742         "movq    %%rdx, %%rcx\n"
12743         "mulq    %[mult]\n"
12744         "addq    %%rax, %%rcx\n"
12745         "adcq    $0, %%rdx\n"
12746         "movq    64(%%rsi), %%rax\n"
12747         "addq    %%rcx, 56(%%rdi)\n"
12748         "adcq    $0, %%rdx\n"
12749         "movq    %%rdx, %%rcx\n"
12750         "mulq    %[mult]\n"
12751         "addq    %%rax, %%rcx\n"
12752         "adcq    $0, %%rdx\n"
12753         "movq    72(%%rsi), %%rax\n"
12754         "addq    %%rcx, 64(%%rdi)\n"
12755         "adcq    $0, %%rdx\n"
12756         "movq    %%rdx, %%rcx\n"
12757         "mulq    %[mult]\n"
12758         "addq    %%rax, %%rcx\n"
12759         "adcq    $0, %%rdx\n"
12760         "movq    80(%%rsi), %%rax\n"
12761         "addq    %%rcx, 72(%%rdi)\n"
12762         "adcq    $0, %%rdx\n"
12763         "movq    %%rdx, %%rcx\n"
12764         "mulq    %[mult]\n"
12765         "addq    %%rax, %%rcx\n"
12766         "adcq    $0, %%rdx\n"
12767         "movq    88(%%rsi), %%rax\n"
12768         "addq    %%rcx, 80(%%rdi)\n"
12769         "adcq    $0, %%rdx\n"
12770         "movq    %%rdx, %%rcx\n"
12771         "mulq    %[mult]\n"
12772         "addq    %%rax, %%rcx\n"
12773         "adcq    $0, %%rdx\n"
12774         "movq    96(%%rsi), %%rax\n"
12775         "addq    %%rcx, 88(%%rdi)\n"
12776         "adcq    $0, %%rdx\n"
12777         "movq    %%rdx, %%rcx\n"
12778         "mulq    %[mult]\n"
12779         "addq    %%rax, %%rcx\n"
12780         "adcq    $0, %%rdx\n"
12781         "movq    104(%%rsi), %%rax\n"
12782         "addq    %%rcx, 96(%%rdi)\n"
12783         "adcq    $0, %%rdx\n"
12784         "movq    %%rdx, %%rcx\n"
12785         "mulq    %[mult]\n"
12786         "addq    %%rax, %%rcx\n"
12787         "adcq    $0, %%rdx\n"
12788         "addq    %%rcx, 104(%%rdi)\n"
12789         "adcq    $0, %%rdx\n"
12790         "movq    %%rdx, %[carry]\n"
12791     : [carry]"=g"(carry), [z] "+m" (z)
12792     : [mult] "r" (c), [x] "m" (x)
12793     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
12794     return carry;
12795 }
12796 
12797 /* x and y have 14 words, z has 30. Put x*y in z. */
12798 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
12799 static inline
mpfq_fixmp_14_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)12800 void mpfq_fixmp_14_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
12801 {
12802     __asm__ __volatile__(
12803         "### x*y[0]\n"
12804         "movq    %2, %%r8\n"
12805         "movq    %0, %%rdi\n"
12806         "movq    0(%%r8), %%r9\n"
12807         "movq    %1, %%rsi\n"
12808         "movq    0(%%rsi), %%rax\n"
12809         "mulq    %%r9\n"
12810         "movq    %%rax, 0(%%rdi)\n"
12811         "movq    8(%%rsi), %%rax\n"
12812         "movq    %%rdx, %%rcx\n"
12813         "mulq    %%r9\n"
12814         "addq    %%rax, %%rcx\n"
12815         "adcq    $0, %%rdx\n"
12816         "movq    16(%%rsi), %%rax\n"
12817         "movq    %%rcx, 8(%%rdi)\n"
12818         "movq    %%rdx, %%rcx\n"
12819         "mulq    %%r9\n"
12820         "addq    %%rax, %%rcx\n"
12821         "adcq    $0, %%rdx\n"
12822         "movq    24(%%rsi), %%rax\n"
12823         "movq    %%rcx, 16(%%rdi)\n"
12824         "movq    %%rdx, %%rcx\n"
12825         "mulq    %%r9\n"
12826         "addq    %%rax, %%rcx\n"
12827         "adcq    $0, %%rdx\n"
12828         "movq    32(%%rsi), %%rax\n"
12829         "movq    %%rcx, 24(%%rdi)\n"
12830         "movq    %%rdx, %%rcx\n"
12831         "mulq    %%r9\n"
12832         "addq    %%rax, %%rcx\n"
12833         "adcq    $0, %%rdx\n"
12834         "movq    40(%%rsi), %%rax\n"
12835         "movq    %%rcx, 32(%%rdi)\n"
12836         "movq    %%rdx, %%rcx\n"
12837         "mulq    %%r9\n"
12838         "addq    %%rax, %%rcx\n"
12839         "adcq    $0, %%rdx\n"
12840         "movq    48(%%rsi), %%rax\n"
12841         "movq    %%rcx, 40(%%rdi)\n"
12842         "movq    %%rdx, %%rcx\n"
12843         "mulq    %%r9\n"
12844         "addq    %%rax, %%rcx\n"
12845         "adcq    $0, %%rdx\n"
12846         "movq    56(%%rsi), %%rax\n"
12847         "movq    %%rcx, 48(%%rdi)\n"
12848         "movq    %%rdx, %%rcx\n"
12849         "mulq    %%r9\n"
12850         "addq    %%rax, %%rcx\n"
12851         "adcq    $0, %%rdx\n"
12852         "movq    64(%%rsi), %%rax\n"
12853         "movq    %%rcx, 56(%%rdi)\n"
12854         "movq    %%rdx, %%rcx\n"
12855         "mulq    %%r9\n"
12856         "addq    %%rax, %%rcx\n"
12857         "adcq    $0, %%rdx\n"
12858         "movq    72(%%rsi), %%rax\n"
12859         "movq    %%rcx, 64(%%rdi)\n"
12860         "movq    %%rdx, %%rcx\n"
12861         "mulq    %%r9\n"
12862         "addq    %%rax, %%rcx\n"
12863         "adcq    $0, %%rdx\n"
12864         "movq    80(%%rsi), %%rax\n"
12865         "movq    %%rcx, 72(%%rdi)\n"
12866         "movq    %%rdx, %%rcx\n"
12867         "mulq    %%r9\n"
12868         "addq    %%rax, %%rcx\n"
12869         "adcq    $0, %%rdx\n"
12870         "movq    88(%%rsi), %%rax\n"
12871         "movq    %%rcx, 80(%%rdi)\n"
12872         "movq    %%rdx, %%rcx\n"
12873         "mulq    %%r9\n"
12874         "addq    %%rax, %%rcx\n"
12875         "adcq    $0, %%rdx\n"
12876         "movq    96(%%rsi), %%rax\n"
12877         "movq    %%rcx, 88(%%rdi)\n"
12878         "movq    %%rdx, %%rcx\n"
12879         "mulq    %%r9\n"
12880         "addq    %%rax, %%rcx\n"
12881         "adcq    $0, %%rdx\n"
12882         "movq    104(%%rsi), %%rax\n"
12883         "movq    %%rcx, 96(%%rdi)\n"
12884         "movq    %%rdx, %%rcx\n"
12885         "mulq    %%r9\n"
12886         "addq    %%rax, %%rcx\n"
12887         "adcq    $0, %%rdx\n"
12888         "movq    %%rcx, 104(%%rdi)\n"
12889         "movq    %%rdx, 112(%%rdi)\n"
12890         "movq    $0, 120(%%rdi)\n"
12891         "movq    $0, 128(%%rdi)\n"
12892         "movq    $0, 136(%%rdi)\n"
12893         "movq    $0, 144(%%rdi)\n"
12894         "movq    $0, 152(%%rdi)\n"
12895         "movq    $0, 160(%%rdi)\n"
12896         "movq    $0, 168(%%rdi)\n"
12897         "movq    $0, 176(%%rdi)\n"
12898         "movq    $0, 184(%%rdi)\n"
12899         "movq    $0, 192(%%rdi)\n"
12900         "movq    $0, 200(%%rdi)\n"
12901         "movq    $0, 208(%%rdi)\n"
12902         "movq    $0, 216(%%rdi)\n"
12903         "### x*y[1]\n"
12904         "movq    8(%%r8), %%r9\n"
12905         "movq    0(%%rsi), %%rax\n"
12906         "mulq    %%r9\n"
12907         "addq    %%rax, 8(%%rdi)\n"
12908         "movq    8(%%rsi), %%rax\n"
12909         "adcq    $0, %%rdx\n"
12910         "movq    %%rdx, %%rcx\n"
12911         "mulq    %%r9\n"
12912         "addq    %%rax, %%rcx\n"
12913         "adcq    $0, %%rdx\n"
12914         "movq    16(%%rsi), %%rax\n"
12915         "addq    %%rcx, 16(%%rdi)\n"
12916         "adcq    $0, %%rdx\n"
12917         "movq    %%rdx, %%rcx\n"
12918         "mulq    %%r9\n"
12919         "addq    %%rax, %%rcx\n"
12920         "adcq    $0, %%rdx\n"
12921         "movq    24(%%rsi), %%rax\n"
12922         "addq    %%rcx, 24(%%rdi)\n"
12923         "adcq    $0, %%rdx\n"
12924         "movq    %%rdx, %%rcx\n"
12925         "mulq    %%r9\n"
12926         "addq    %%rax, %%rcx\n"
12927         "adcq    $0, %%rdx\n"
12928         "movq    32(%%rsi), %%rax\n"
12929         "addq    %%rcx, 32(%%rdi)\n"
12930         "adcq    $0, %%rdx\n"
12931         "movq    %%rdx, %%rcx\n"
12932         "mulq    %%r9\n"
12933         "addq    %%rax, %%rcx\n"
12934         "adcq    $0, %%rdx\n"
12935         "movq    40(%%rsi), %%rax\n"
12936         "addq    %%rcx, 40(%%rdi)\n"
12937         "adcq    $0, %%rdx\n"
12938         "movq    %%rdx, %%rcx\n"
12939         "mulq    %%r9\n"
12940         "addq    %%rax, %%rcx\n"
12941         "adcq    $0, %%rdx\n"
12942         "movq    48(%%rsi), %%rax\n"
12943         "addq    %%rcx, 48(%%rdi)\n"
12944         "adcq    $0, %%rdx\n"
12945         "movq    %%rdx, %%rcx\n"
12946         "mulq    %%r9\n"
12947         "addq    %%rax, %%rcx\n"
12948         "adcq    $0, %%rdx\n"
12949         "movq    56(%%rsi), %%rax\n"
12950         "addq    %%rcx, 56(%%rdi)\n"
12951         "adcq    $0, %%rdx\n"
12952         "movq    %%rdx, %%rcx\n"
12953         "mulq    %%r9\n"
12954         "addq    %%rax, %%rcx\n"
12955         "adcq    $0, %%rdx\n"
12956         "movq    64(%%rsi), %%rax\n"
12957         "addq    %%rcx, 64(%%rdi)\n"
12958         "adcq    $0, %%rdx\n"
12959         "movq    %%rdx, %%rcx\n"
12960         "mulq    %%r9\n"
12961         "addq    %%rax, %%rcx\n"
12962         "adcq    $0, %%rdx\n"
12963         "movq    72(%%rsi), %%rax\n"
12964         "addq    %%rcx, 72(%%rdi)\n"
12965         "adcq    $0, %%rdx\n"
12966         "movq    %%rdx, %%rcx\n"
12967         "mulq    %%r9\n"
12968         "addq    %%rax, %%rcx\n"
12969         "adcq    $0, %%rdx\n"
12970         "movq    80(%%rsi), %%rax\n"
12971         "addq    %%rcx, 80(%%rdi)\n"
12972         "adcq    $0, %%rdx\n"
12973         "movq    %%rdx, %%rcx\n"
12974         "mulq    %%r9\n"
12975         "addq    %%rax, %%rcx\n"
12976         "adcq    $0, %%rdx\n"
12977         "movq    88(%%rsi), %%rax\n"
12978         "addq    %%rcx, 88(%%rdi)\n"
12979         "adcq    $0, %%rdx\n"
12980         "movq    %%rdx, %%rcx\n"
12981         "mulq    %%r9\n"
12982         "addq    %%rax, %%rcx\n"
12983         "adcq    $0, %%rdx\n"
12984         "movq    96(%%rsi), %%rax\n"
12985         "addq    %%rcx, 96(%%rdi)\n"
12986         "adcq    $0, %%rdx\n"
12987         "movq    %%rdx, %%rcx\n"
12988         "mulq    %%r9\n"
12989         "addq    %%rax, %%rcx\n"
12990         "adcq    $0, %%rdx\n"
12991         "movq    104(%%rsi), %%rax\n"
12992         "addq    %%rcx, 104(%%rdi)\n"
12993         "adcq    $0, %%rdx\n"
12994         "movq    %%rdx, %%rcx\n"
12995         "mulq    %%r9\n"
12996         "addq    %%rax, %%rcx\n"
12997         "adcq    $0, %%rdx\n"
12998         "addq    %%rcx, 112(%%rdi)\n"
12999         "adcq    $0, %%rdx\n"
13000         "movq    %%rdx, 120(%%rdi)\n"
13001         "### x*y[2]\n"
13002         "movq    16(%%r8), %%r9\n"
13003         "movq    0(%%rsi), %%rax\n"
13004         "mulq    %%r9\n"
13005         "addq    %%rax, 16(%%rdi)\n"
13006         "movq    8(%%rsi), %%rax\n"
13007         "adcq    $0, %%rdx\n"
13008         "movq    %%rdx, %%rcx\n"
13009         "mulq    %%r9\n"
13010         "addq    %%rax, %%rcx\n"
13011         "adcq    $0, %%rdx\n"
13012         "movq    16(%%rsi), %%rax\n"
13013         "addq    %%rcx, 24(%%rdi)\n"
13014         "adcq    $0, %%rdx\n"
13015         "movq    %%rdx, %%rcx\n"
13016         "mulq    %%r9\n"
13017         "addq    %%rax, %%rcx\n"
13018         "adcq    $0, %%rdx\n"
13019         "movq    24(%%rsi), %%rax\n"
13020         "addq    %%rcx, 32(%%rdi)\n"
13021         "adcq    $0, %%rdx\n"
13022         "movq    %%rdx, %%rcx\n"
13023         "mulq    %%r9\n"
13024         "addq    %%rax, %%rcx\n"
13025         "adcq    $0, %%rdx\n"
13026         "movq    32(%%rsi), %%rax\n"
13027         "addq    %%rcx, 40(%%rdi)\n"
13028         "adcq    $0, %%rdx\n"
13029         "movq    %%rdx, %%rcx\n"
13030         "mulq    %%r9\n"
13031         "addq    %%rax, %%rcx\n"
13032         "adcq    $0, %%rdx\n"
13033         "movq    40(%%rsi), %%rax\n"
13034         "addq    %%rcx, 48(%%rdi)\n"
13035         "adcq    $0, %%rdx\n"
13036         "movq    %%rdx, %%rcx\n"
13037         "mulq    %%r9\n"
13038         "addq    %%rax, %%rcx\n"
13039         "adcq    $0, %%rdx\n"
13040         "movq    48(%%rsi), %%rax\n"
13041         "addq    %%rcx, 56(%%rdi)\n"
13042         "adcq    $0, %%rdx\n"
13043         "movq    %%rdx, %%rcx\n"
13044         "mulq    %%r9\n"
13045         "addq    %%rax, %%rcx\n"
13046         "adcq    $0, %%rdx\n"
13047         "movq    56(%%rsi), %%rax\n"
13048         "addq    %%rcx, 64(%%rdi)\n"
13049         "adcq    $0, %%rdx\n"
13050         "movq    %%rdx, %%rcx\n"
13051         "mulq    %%r9\n"
13052         "addq    %%rax, %%rcx\n"
13053         "adcq    $0, %%rdx\n"
13054         "movq    64(%%rsi), %%rax\n"
13055         "addq    %%rcx, 72(%%rdi)\n"
13056         "adcq    $0, %%rdx\n"
13057         "movq    %%rdx, %%rcx\n"
13058         "mulq    %%r9\n"
13059         "addq    %%rax, %%rcx\n"
13060         "adcq    $0, %%rdx\n"
13061         "movq    72(%%rsi), %%rax\n"
13062         "addq    %%rcx, 80(%%rdi)\n"
13063         "adcq    $0, %%rdx\n"
13064         "movq    %%rdx, %%rcx\n"
13065         "mulq    %%r9\n"
13066         "addq    %%rax, %%rcx\n"
13067         "adcq    $0, %%rdx\n"
13068         "movq    80(%%rsi), %%rax\n"
13069         "addq    %%rcx, 88(%%rdi)\n"
13070         "adcq    $0, %%rdx\n"
13071         "movq    %%rdx, %%rcx\n"
13072         "mulq    %%r9\n"
13073         "addq    %%rax, %%rcx\n"
13074         "adcq    $0, %%rdx\n"
13075         "movq    88(%%rsi), %%rax\n"
13076         "addq    %%rcx, 96(%%rdi)\n"
13077         "adcq    $0, %%rdx\n"
13078         "movq    %%rdx, %%rcx\n"
13079         "mulq    %%r9\n"
13080         "addq    %%rax, %%rcx\n"
13081         "adcq    $0, %%rdx\n"
13082         "movq    96(%%rsi), %%rax\n"
13083         "addq    %%rcx, 104(%%rdi)\n"
13084         "adcq    $0, %%rdx\n"
13085         "movq    %%rdx, %%rcx\n"
13086         "mulq    %%r9\n"
13087         "addq    %%rax, %%rcx\n"
13088         "adcq    $0, %%rdx\n"
13089         "movq    104(%%rsi), %%rax\n"
13090         "addq    %%rcx, 112(%%rdi)\n"
13091         "adcq    $0, %%rdx\n"
13092         "movq    %%rdx, %%rcx\n"
13093         "mulq    %%r9\n"
13094         "addq    %%rax, %%rcx\n"
13095         "adcq    $0, %%rdx\n"
13096         "addq    %%rcx, 120(%%rdi)\n"
13097         "adcq    $0, %%rdx\n"
13098         "movq    %%rdx, 128(%%rdi)\n"
13099         "### x*y[3]\n"
13100         "movq    24(%%r8), %%r9\n"
13101         "movq    0(%%rsi), %%rax\n"
13102         "mulq    %%r9\n"
13103         "addq    %%rax, 24(%%rdi)\n"
13104         "movq    8(%%rsi), %%rax\n"
13105         "adcq    $0, %%rdx\n"
13106         "movq    %%rdx, %%rcx\n"
13107         "mulq    %%r9\n"
13108         "addq    %%rax, %%rcx\n"
13109         "adcq    $0, %%rdx\n"
13110         "movq    16(%%rsi), %%rax\n"
13111         "addq    %%rcx, 32(%%rdi)\n"
13112         "adcq    $0, %%rdx\n"
13113         "movq    %%rdx, %%rcx\n"
13114         "mulq    %%r9\n"
13115         "addq    %%rax, %%rcx\n"
13116         "adcq    $0, %%rdx\n"
13117         "movq    24(%%rsi), %%rax\n"
13118         "addq    %%rcx, 40(%%rdi)\n"
13119         "adcq    $0, %%rdx\n"
13120         "movq    %%rdx, %%rcx\n"
13121         "mulq    %%r9\n"
13122         "addq    %%rax, %%rcx\n"
13123         "adcq    $0, %%rdx\n"
13124         "movq    32(%%rsi), %%rax\n"
13125         "addq    %%rcx, 48(%%rdi)\n"
13126         "adcq    $0, %%rdx\n"
13127         "movq    %%rdx, %%rcx\n"
13128         "mulq    %%r9\n"
13129         "addq    %%rax, %%rcx\n"
13130         "adcq    $0, %%rdx\n"
13131         "movq    40(%%rsi), %%rax\n"
13132         "addq    %%rcx, 56(%%rdi)\n"
13133         "adcq    $0, %%rdx\n"
13134         "movq    %%rdx, %%rcx\n"
13135         "mulq    %%r9\n"
13136         "addq    %%rax, %%rcx\n"
13137         "adcq    $0, %%rdx\n"
13138         "movq    48(%%rsi), %%rax\n"
13139         "addq    %%rcx, 64(%%rdi)\n"
13140         "adcq    $0, %%rdx\n"
13141         "movq    %%rdx, %%rcx\n"
13142         "mulq    %%r9\n"
13143         "addq    %%rax, %%rcx\n"
13144         "adcq    $0, %%rdx\n"
13145         "movq    56(%%rsi), %%rax\n"
13146         "addq    %%rcx, 72(%%rdi)\n"
13147         "adcq    $0, %%rdx\n"
13148         "movq    %%rdx, %%rcx\n"
13149         "mulq    %%r9\n"
13150         "addq    %%rax, %%rcx\n"
13151         "adcq    $0, %%rdx\n"
13152         "movq    64(%%rsi), %%rax\n"
13153         "addq    %%rcx, 80(%%rdi)\n"
13154         "adcq    $0, %%rdx\n"
13155         "movq    %%rdx, %%rcx\n"
13156         "mulq    %%r9\n"
13157         "addq    %%rax, %%rcx\n"
13158         "adcq    $0, %%rdx\n"
13159         "movq    72(%%rsi), %%rax\n"
13160         "addq    %%rcx, 88(%%rdi)\n"
13161         "adcq    $0, %%rdx\n"
13162         "movq    %%rdx, %%rcx\n"
13163         "mulq    %%r9\n"
13164         "addq    %%rax, %%rcx\n"
13165         "adcq    $0, %%rdx\n"
13166         "movq    80(%%rsi), %%rax\n"
13167         "addq    %%rcx, 96(%%rdi)\n"
13168         "adcq    $0, %%rdx\n"
13169         "movq    %%rdx, %%rcx\n"
13170         "mulq    %%r9\n"
13171         "addq    %%rax, %%rcx\n"
13172         "adcq    $0, %%rdx\n"
13173         "movq    88(%%rsi), %%rax\n"
13174         "addq    %%rcx, 104(%%rdi)\n"
13175         "adcq    $0, %%rdx\n"
13176         "movq    %%rdx, %%rcx\n"
13177         "mulq    %%r9\n"
13178         "addq    %%rax, %%rcx\n"
13179         "adcq    $0, %%rdx\n"
13180         "movq    96(%%rsi), %%rax\n"
13181         "addq    %%rcx, 112(%%rdi)\n"
13182         "adcq    $0, %%rdx\n"
13183         "movq    %%rdx, %%rcx\n"
13184         "mulq    %%r9\n"
13185         "addq    %%rax, %%rcx\n"
13186         "adcq    $0, %%rdx\n"
13187         "movq    104(%%rsi), %%rax\n"
13188         "addq    %%rcx, 120(%%rdi)\n"
13189         "adcq    $0, %%rdx\n"
13190         "movq    %%rdx, %%rcx\n"
13191         "mulq    %%r9\n"
13192         "addq    %%rax, %%rcx\n"
13193         "adcq    $0, %%rdx\n"
13194         "addq    %%rcx, 128(%%rdi)\n"
13195         "adcq    $0, %%rdx\n"
13196         "movq    %%rdx, 136(%%rdi)\n"
13197         "### x*y[4]\n"
13198         "movq    32(%%r8), %%r9\n"
13199         "movq    0(%%rsi), %%rax\n"
13200         "mulq    %%r9\n"
13201         "addq    %%rax, 32(%%rdi)\n"
13202         "movq    8(%%rsi), %%rax\n"
13203         "adcq    $0, %%rdx\n"
13204         "movq    %%rdx, %%rcx\n"
13205         "mulq    %%r9\n"
13206         "addq    %%rax, %%rcx\n"
13207         "adcq    $0, %%rdx\n"
13208         "movq    16(%%rsi), %%rax\n"
13209         "addq    %%rcx, 40(%%rdi)\n"
13210         "adcq    $0, %%rdx\n"
13211         "movq    %%rdx, %%rcx\n"
13212         "mulq    %%r9\n"
13213         "addq    %%rax, %%rcx\n"
13214         "adcq    $0, %%rdx\n"
13215         "movq    24(%%rsi), %%rax\n"
13216         "addq    %%rcx, 48(%%rdi)\n"
13217         "adcq    $0, %%rdx\n"
13218         "movq    %%rdx, %%rcx\n"
13219         "mulq    %%r9\n"
13220         "addq    %%rax, %%rcx\n"
13221         "adcq    $0, %%rdx\n"
13222         "movq    32(%%rsi), %%rax\n"
13223         "addq    %%rcx, 56(%%rdi)\n"
13224         "adcq    $0, %%rdx\n"
13225         "movq    %%rdx, %%rcx\n"
13226         "mulq    %%r9\n"
13227         "addq    %%rax, %%rcx\n"
13228         "adcq    $0, %%rdx\n"
13229         "movq    40(%%rsi), %%rax\n"
13230         "addq    %%rcx, 64(%%rdi)\n"
13231         "adcq    $0, %%rdx\n"
13232         "movq    %%rdx, %%rcx\n"
13233         "mulq    %%r9\n"
13234         "addq    %%rax, %%rcx\n"
13235         "adcq    $0, %%rdx\n"
13236         "movq    48(%%rsi), %%rax\n"
13237         "addq    %%rcx, 72(%%rdi)\n"
13238         "adcq    $0, %%rdx\n"
13239         "movq    %%rdx, %%rcx\n"
13240         "mulq    %%r9\n"
13241         "addq    %%rax, %%rcx\n"
13242         "adcq    $0, %%rdx\n"
13243         "movq    56(%%rsi), %%rax\n"
13244         "addq    %%rcx, 80(%%rdi)\n"
13245         "adcq    $0, %%rdx\n"
13246         "movq    %%rdx, %%rcx\n"
13247         "mulq    %%r9\n"
13248         "addq    %%rax, %%rcx\n"
13249         "adcq    $0, %%rdx\n"
13250         "movq    64(%%rsi), %%rax\n"
13251         "addq    %%rcx, 88(%%rdi)\n"
13252         "adcq    $0, %%rdx\n"
13253         "movq    %%rdx, %%rcx\n"
13254         "mulq    %%r9\n"
13255         "addq    %%rax, %%rcx\n"
13256         "adcq    $0, %%rdx\n"
13257         "movq    72(%%rsi), %%rax\n"
13258         "addq    %%rcx, 96(%%rdi)\n"
13259         "adcq    $0, %%rdx\n"
13260         "movq    %%rdx, %%rcx\n"
13261         "mulq    %%r9\n"
13262         "addq    %%rax, %%rcx\n"
13263         "adcq    $0, %%rdx\n"
13264         "movq    80(%%rsi), %%rax\n"
13265         "addq    %%rcx, 104(%%rdi)\n"
13266         "adcq    $0, %%rdx\n"
13267         "movq    %%rdx, %%rcx\n"
13268         "mulq    %%r9\n"
13269         "addq    %%rax, %%rcx\n"
13270         "adcq    $0, %%rdx\n"
13271         "movq    88(%%rsi), %%rax\n"
13272         "addq    %%rcx, 112(%%rdi)\n"
13273         "adcq    $0, %%rdx\n"
13274         "movq    %%rdx, %%rcx\n"
13275         "mulq    %%r9\n"
13276         "addq    %%rax, %%rcx\n"
13277         "adcq    $0, %%rdx\n"
13278         "movq    96(%%rsi), %%rax\n"
13279         "addq    %%rcx, 120(%%rdi)\n"
13280         "adcq    $0, %%rdx\n"
13281         "movq    %%rdx, %%rcx\n"
13282         "mulq    %%r9\n"
13283         "addq    %%rax, %%rcx\n"
13284         "adcq    $0, %%rdx\n"
13285         "movq    104(%%rsi), %%rax\n"
13286         "addq    %%rcx, 128(%%rdi)\n"
13287         "adcq    $0, %%rdx\n"
13288         "movq    %%rdx, %%rcx\n"
13289         "mulq    %%r9\n"
13290         "addq    %%rax, %%rcx\n"
13291         "adcq    $0, %%rdx\n"
13292         "addq    %%rcx, 136(%%rdi)\n"
13293         "adcq    $0, %%rdx\n"
13294         "movq    %%rdx, 144(%%rdi)\n"
13295         "### x*y[5]\n"
13296         "movq    40(%%r8), %%r9\n"
13297         "movq    0(%%rsi), %%rax\n"
13298         "mulq    %%r9\n"
13299         "addq    %%rax, 40(%%rdi)\n"
13300         "movq    8(%%rsi), %%rax\n"
13301         "adcq    $0, %%rdx\n"
13302         "movq    %%rdx, %%rcx\n"
13303         "mulq    %%r9\n"
13304         "addq    %%rax, %%rcx\n"
13305         "adcq    $0, %%rdx\n"
13306         "movq    16(%%rsi), %%rax\n"
13307         "addq    %%rcx, 48(%%rdi)\n"
13308         "adcq    $0, %%rdx\n"
13309         "movq    %%rdx, %%rcx\n"
13310         "mulq    %%r9\n"
13311         "addq    %%rax, %%rcx\n"
13312         "adcq    $0, %%rdx\n"
13313         "movq    24(%%rsi), %%rax\n"
13314         "addq    %%rcx, 56(%%rdi)\n"
13315         "adcq    $0, %%rdx\n"
13316         "movq    %%rdx, %%rcx\n"
13317         "mulq    %%r9\n"
13318         "addq    %%rax, %%rcx\n"
13319         "adcq    $0, %%rdx\n"
13320         "movq    32(%%rsi), %%rax\n"
13321         "addq    %%rcx, 64(%%rdi)\n"
13322         "adcq    $0, %%rdx\n"
13323         "movq    %%rdx, %%rcx\n"
13324         "mulq    %%r9\n"
13325         "addq    %%rax, %%rcx\n"
13326         "adcq    $0, %%rdx\n"
13327         "movq    40(%%rsi), %%rax\n"
13328         "addq    %%rcx, 72(%%rdi)\n"
13329         "adcq    $0, %%rdx\n"
13330         "movq    %%rdx, %%rcx\n"
13331         "mulq    %%r9\n"
13332         "addq    %%rax, %%rcx\n"
13333         "adcq    $0, %%rdx\n"
13334         "movq    48(%%rsi), %%rax\n"
13335         "addq    %%rcx, 80(%%rdi)\n"
13336         "adcq    $0, %%rdx\n"
13337         "movq    %%rdx, %%rcx\n"
13338         "mulq    %%r9\n"
13339         "addq    %%rax, %%rcx\n"
13340         "adcq    $0, %%rdx\n"
13341         "movq    56(%%rsi), %%rax\n"
13342         "addq    %%rcx, 88(%%rdi)\n"
13343         "adcq    $0, %%rdx\n"
13344         "movq    %%rdx, %%rcx\n"
13345         "mulq    %%r9\n"
13346         "addq    %%rax, %%rcx\n"
13347         "adcq    $0, %%rdx\n"
13348         "movq    64(%%rsi), %%rax\n"
13349         "addq    %%rcx, 96(%%rdi)\n"
13350         "adcq    $0, %%rdx\n"
13351         "movq    %%rdx, %%rcx\n"
13352         "mulq    %%r9\n"
13353         "addq    %%rax, %%rcx\n"
13354         "adcq    $0, %%rdx\n"
13355         "movq    72(%%rsi), %%rax\n"
13356         "addq    %%rcx, 104(%%rdi)\n"
13357         "adcq    $0, %%rdx\n"
13358         "movq    %%rdx, %%rcx\n"
13359         "mulq    %%r9\n"
13360         "addq    %%rax, %%rcx\n"
13361         "adcq    $0, %%rdx\n"
13362         "movq    80(%%rsi), %%rax\n"
13363         "addq    %%rcx, 112(%%rdi)\n"
13364         "adcq    $0, %%rdx\n"
13365         "movq    %%rdx, %%rcx\n"
13366         "mulq    %%r9\n"
13367         "addq    %%rax, %%rcx\n"
13368         "adcq    $0, %%rdx\n"
13369         "movq    88(%%rsi), %%rax\n"
13370         "addq    %%rcx, 120(%%rdi)\n"
13371         "adcq    $0, %%rdx\n"
13372         "movq    %%rdx, %%rcx\n"
13373         "mulq    %%r9\n"
13374         "addq    %%rax, %%rcx\n"
13375         "adcq    $0, %%rdx\n"
13376         "movq    96(%%rsi), %%rax\n"
13377         "addq    %%rcx, 128(%%rdi)\n"
13378         "adcq    $0, %%rdx\n"
13379         "movq    %%rdx, %%rcx\n"
13380         "mulq    %%r9\n"
13381         "addq    %%rax, %%rcx\n"
13382         "adcq    $0, %%rdx\n"
13383         "movq    104(%%rsi), %%rax\n"
13384         "addq    %%rcx, 136(%%rdi)\n"
13385         "adcq    $0, %%rdx\n"
13386         "movq    %%rdx, %%rcx\n"
13387         "mulq    %%r9\n"
13388         "addq    %%rax, %%rcx\n"
13389         "adcq    $0, %%rdx\n"
13390         "addq    %%rcx, 144(%%rdi)\n"
13391         "adcq    $0, %%rdx\n"
13392         "movq    %%rdx, 152(%%rdi)\n"
13393         "### x*y[6]\n"
13394         "movq    48(%%r8), %%r9\n"
13395         "movq    0(%%rsi), %%rax\n"
13396         "mulq    %%r9\n"
13397         "addq    %%rax, 48(%%rdi)\n"
13398         "movq    8(%%rsi), %%rax\n"
13399         "adcq    $0, %%rdx\n"
13400         "movq    %%rdx, %%rcx\n"
13401         "mulq    %%r9\n"
13402         "addq    %%rax, %%rcx\n"
13403         "adcq    $0, %%rdx\n"
13404         "movq    16(%%rsi), %%rax\n"
13405         "addq    %%rcx, 56(%%rdi)\n"
13406         "adcq    $0, %%rdx\n"
13407         "movq    %%rdx, %%rcx\n"
13408         "mulq    %%r9\n"
13409         "addq    %%rax, %%rcx\n"
13410         "adcq    $0, %%rdx\n"
13411         "movq    24(%%rsi), %%rax\n"
13412         "addq    %%rcx, 64(%%rdi)\n"
13413         "adcq    $0, %%rdx\n"
13414         "movq    %%rdx, %%rcx\n"
13415         "mulq    %%r9\n"
13416         "addq    %%rax, %%rcx\n"
13417         "adcq    $0, %%rdx\n"
13418         "movq    32(%%rsi), %%rax\n"
13419         "addq    %%rcx, 72(%%rdi)\n"
13420         "adcq    $0, %%rdx\n"
13421         "movq    %%rdx, %%rcx\n"
13422         "mulq    %%r9\n"
13423         "addq    %%rax, %%rcx\n"
13424         "adcq    $0, %%rdx\n"
13425         "movq    40(%%rsi), %%rax\n"
13426         "addq    %%rcx, 80(%%rdi)\n"
13427         "adcq    $0, %%rdx\n"
13428         "movq    %%rdx, %%rcx\n"
13429         "mulq    %%r9\n"
13430         "addq    %%rax, %%rcx\n"
13431         "adcq    $0, %%rdx\n"
13432         "movq    48(%%rsi), %%rax\n"
13433         "addq    %%rcx, 88(%%rdi)\n"
13434         "adcq    $0, %%rdx\n"
13435         "movq    %%rdx, %%rcx\n"
13436         "mulq    %%r9\n"
13437         "addq    %%rax, %%rcx\n"
13438         "adcq    $0, %%rdx\n"
13439         "movq    56(%%rsi), %%rax\n"
13440         "addq    %%rcx, 96(%%rdi)\n"
13441         "adcq    $0, %%rdx\n"
13442         "movq    %%rdx, %%rcx\n"
13443         "mulq    %%r9\n"
13444         "addq    %%rax, %%rcx\n"
13445         "adcq    $0, %%rdx\n"
13446         "movq    64(%%rsi), %%rax\n"
13447         "addq    %%rcx, 104(%%rdi)\n"
13448         "adcq    $0, %%rdx\n"
13449         "movq    %%rdx, %%rcx\n"
13450         "mulq    %%r9\n"
13451         "addq    %%rax, %%rcx\n"
13452         "adcq    $0, %%rdx\n"
13453         "movq    72(%%rsi), %%rax\n"
13454         "addq    %%rcx, 112(%%rdi)\n"
13455         "adcq    $0, %%rdx\n"
13456         "movq    %%rdx, %%rcx\n"
13457         "mulq    %%r9\n"
13458         "addq    %%rax, %%rcx\n"
13459         "adcq    $0, %%rdx\n"
13460         "movq    80(%%rsi), %%rax\n"
13461         "addq    %%rcx, 120(%%rdi)\n"
13462         "adcq    $0, %%rdx\n"
13463         "movq    %%rdx, %%rcx\n"
13464         "mulq    %%r9\n"
13465         "addq    %%rax, %%rcx\n"
13466         "adcq    $0, %%rdx\n"
13467         "movq    88(%%rsi), %%rax\n"
13468         "addq    %%rcx, 128(%%rdi)\n"
13469         "adcq    $0, %%rdx\n"
13470         "movq    %%rdx, %%rcx\n"
13471         "mulq    %%r9\n"
13472         "addq    %%rax, %%rcx\n"
13473         "adcq    $0, %%rdx\n"
13474         "movq    96(%%rsi), %%rax\n"
13475         "addq    %%rcx, 136(%%rdi)\n"
13476         "adcq    $0, %%rdx\n"
13477         "movq    %%rdx, %%rcx\n"
13478         "mulq    %%r9\n"
13479         "addq    %%rax, %%rcx\n"
13480         "adcq    $0, %%rdx\n"
13481         "movq    104(%%rsi), %%rax\n"
13482         "addq    %%rcx, 144(%%rdi)\n"
13483         "adcq    $0, %%rdx\n"
13484         "movq    %%rdx, %%rcx\n"
13485         "mulq    %%r9\n"
13486         "addq    %%rax, %%rcx\n"
13487         "adcq    $0, %%rdx\n"
13488         "addq    %%rcx, 152(%%rdi)\n"
13489         "adcq    $0, %%rdx\n"
13490         "movq    %%rdx, 160(%%rdi)\n"
13491         "### x*y[7]\n"
13492         "movq    56(%%r8), %%r9\n"
13493         "movq    0(%%rsi), %%rax\n"
13494         "mulq    %%r9\n"
13495         "addq    %%rax, 56(%%rdi)\n"
13496         "movq    8(%%rsi), %%rax\n"
13497         "adcq    $0, %%rdx\n"
13498         "movq    %%rdx, %%rcx\n"
13499         "mulq    %%r9\n"
13500         "addq    %%rax, %%rcx\n"
13501         "adcq    $0, %%rdx\n"
13502         "movq    16(%%rsi), %%rax\n"
13503         "addq    %%rcx, 64(%%rdi)\n"
13504         "adcq    $0, %%rdx\n"
13505         "movq    %%rdx, %%rcx\n"
13506         "mulq    %%r9\n"
13507         "addq    %%rax, %%rcx\n"
13508         "adcq    $0, %%rdx\n"
13509         "movq    24(%%rsi), %%rax\n"
13510         "addq    %%rcx, 72(%%rdi)\n"
13511         "adcq    $0, %%rdx\n"
13512         "movq    %%rdx, %%rcx\n"
13513         "mulq    %%r9\n"
13514         "addq    %%rax, %%rcx\n"
13515         "adcq    $0, %%rdx\n"
13516         "movq    32(%%rsi), %%rax\n"
13517         "addq    %%rcx, 80(%%rdi)\n"
13518         "adcq    $0, %%rdx\n"
13519         "movq    %%rdx, %%rcx\n"
13520         "mulq    %%r9\n"
13521         "addq    %%rax, %%rcx\n"
13522         "adcq    $0, %%rdx\n"
13523         "movq    40(%%rsi), %%rax\n"
13524         "addq    %%rcx, 88(%%rdi)\n"
13525         "adcq    $0, %%rdx\n"
13526         "movq    %%rdx, %%rcx\n"
13527         "mulq    %%r9\n"
13528         "addq    %%rax, %%rcx\n"
13529         "adcq    $0, %%rdx\n"
13530         "movq    48(%%rsi), %%rax\n"
13531         "addq    %%rcx, 96(%%rdi)\n"
13532         "adcq    $0, %%rdx\n"
13533         "movq    %%rdx, %%rcx\n"
13534         "mulq    %%r9\n"
13535         "addq    %%rax, %%rcx\n"
13536         "adcq    $0, %%rdx\n"
13537         "movq    56(%%rsi), %%rax\n"
13538         "addq    %%rcx, 104(%%rdi)\n"
13539         "adcq    $0, %%rdx\n"
13540         "movq    %%rdx, %%rcx\n"
13541         "mulq    %%r9\n"
13542         "addq    %%rax, %%rcx\n"
13543         "adcq    $0, %%rdx\n"
13544         "movq    64(%%rsi), %%rax\n"
13545         "addq    %%rcx, 112(%%rdi)\n"
13546         "adcq    $0, %%rdx\n"
13547         "movq    %%rdx, %%rcx\n"
13548         "mulq    %%r9\n"
13549         "addq    %%rax, %%rcx\n"
13550         "adcq    $0, %%rdx\n"
13551         "movq    72(%%rsi), %%rax\n"
13552         "addq    %%rcx, 120(%%rdi)\n"
13553         "adcq    $0, %%rdx\n"
13554         "movq    %%rdx, %%rcx\n"
13555         "mulq    %%r9\n"
13556         "addq    %%rax, %%rcx\n"
13557         "adcq    $0, %%rdx\n"
13558         "movq    80(%%rsi), %%rax\n"
13559         "addq    %%rcx, 128(%%rdi)\n"
13560         "adcq    $0, %%rdx\n"
13561         "movq    %%rdx, %%rcx\n"
13562         "mulq    %%r9\n"
13563         "addq    %%rax, %%rcx\n"
13564         "adcq    $0, %%rdx\n"
13565         "movq    88(%%rsi), %%rax\n"
13566         "addq    %%rcx, 136(%%rdi)\n"
13567         "adcq    $0, %%rdx\n"
13568         "movq    %%rdx, %%rcx\n"
13569         "mulq    %%r9\n"
13570         "addq    %%rax, %%rcx\n"
13571         "adcq    $0, %%rdx\n"
13572         "movq    96(%%rsi), %%rax\n"
13573         "addq    %%rcx, 144(%%rdi)\n"
13574         "adcq    $0, %%rdx\n"
13575         "movq    %%rdx, %%rcx\n"
13576         "mulq    %%r9\n"
13577         "addq    %%rax, %%rcx\n"
13578         "adcq    $0, %%rdx\n"
13579         "movq    104(%%rsi), %%rax\n"
13580         "addq    %%rcx, 152(%%rdi)\n"
13581         "adcq    $0, %%rdx\n"
13582         "movq    %%rdx, %%rcx\n"
13583         "mulq    %%r9\n"
13584         "addq    %%rax, %%rcx\n"
13585         "adcq    $0, %%rdx\n"
13586         "addq    %%rcx, 160(%%rdi)\n"
13587         "adcq    $0, %%rdx\n"
13588         "movq    %%rdx, 168(%%rdi)\n"
13589         "### x*y[8]\n"
13590         "movq    64(%%r8), %%r9\n"
13591         "movq    0(%%rsi), %%rax\n"
13592         "mulq    %%r9\n"
13593         "addq    %%rax, 64(%%rdi)\n"
13594         "movq    8(%%rsi), %%rax\n"
13595         "adcq    $0, %%rdx\n"
13596         "movq    %%rdx, %%rcx\n"
13597         "mulq    %%r9\n"
13598         "addq    %%rax, %%rcx\n"
13599         "adcq    $0, %%rdx\n"
13600         "movq    16(%%rsi), %%rax\n"
13601         "addq    %%rcx, 72(%%rdi)\n"
13602         "adcq    $0, %%rdx\n"
13603         "movq    %%rdx, %%rcx\n"
13604         "mulq    %%r9\n"
13605         "addq    %%rax, %%rcx\n"
13606         "adcq    $0, %%rdx\n"
13607         "movq    24(%%rsi), %%rax\n"
13608         "addq    %%rcx, 80(%%rdi)\n"
13609         "adcq    $0, %%rdx\n"
13610         "movq    %%rdx, %%rcx\n"
13611         "mulq    %%r9\n"
13612         "addq    %%rax, %%rcx\n"
13613         "adcq    $0, %%rdx\n"
13614         "movq    32(%%rsi), %%rax\n"
13615         "addq    %%rcx, 88(%%rdi)\n"
13616         "adcq    $0, %%rdx\n"
13617         "movq    %%rdx, %%rcx\n"
13618         "mulq    %%r9\n"
13619         "addq    %%rax, %%rcx\n"
13620         "adcq    $0, %%rdx\n"
13621         "movq    40(%%rsi), %%rax\n"
13622         "addq    %%rcx, 96(%%rdi)\n"
13623         "adcq    $0, %%rdx\n"
13624         "movq    %%rdx, %%rcx\n"
13625         "mulq    %%r9\n"
13626         "addq    %%rax, %%rcx\n"
13627         "adcq    $0, %%rdx\n"
13628         "movq    48(%%rsi), %%rax\n"
13629         "addq    %%rcx, 104(%%rdi)\n"
13630         "adcq    $0, %%rdx\n"
13631         "movq    %%rdx, %%rcx\n"
13632         "mulq    %%r9\n"
13633         "addq    %%rax, %%rcx\n"
13634         "adcq    $0, %%rdx\n"
13635         "movq    56(%%rsi), %%rax\n"
13636         "addq    %%rcx, 112(%%rdi)\n"
13637         "adcq    $0, %%rdx\n"
13638         "movq    %%rdx, %%rcx\n"
13639         "mulq    %%r9\n"
13640         "addq    %%rax, %%rcx\n"
13641         "adcq    $0, %%rdx\n"
13642         "movq    64(%%rsi), %%rax\n"
13643         "addq    %%rcx, 120(%%rdi)\n"
13644         "adcq    $0, %%rdx\n"
13645         "movq    %%rdx, %%rcx\n"
13646         "mulq    %%r9\n"
13647         "addq    %%rax, %%rcx\n"
13648         "adcq    $0, %%rdx\n"
13649         "movq    72(%%rsi), %%rax\n"
13650         "addq    %%rcx, 128(%%rdi)\n"
13651         "adcq    $0, %%rdx\n"
13652         "movq    %%rdx, %%rcx\n"
13653         "mulq    %%r9\n"
13654         "addq    %%rax, %%rcx\n"
13655         "adcq    $0, %%rdx\n"
13656         "movq    80(%%rsi), %%rax\n"
13657         "addq    %%rcx, 136(%%rdi)\n"
13658         "adcq    $0, %%rdx\n"
13659         "movq    %%rdx, %%rcx\n"
13660         "mulq    %%r9\n"
13661         "addq    %%rax, %%rcx\n"
13662         "adcq    $0, %%rdx\n"
13663         "movq    88(%%rsi), %%rax\n"
13664         "addq    %%rcx, 144(%%rdi)\n"
13665         "adcq    $0, %%rdx\n"
13666         "movq    %%rdx, %%rcx\n"
13667         "mulq    %%r9\n"
13668         "addq    %%rax, %%rcx\n"
13669         "adcq    $0, %%rdx\n"
13670         "movq    96(%%rsi), %%rax\n"
13671         "addq    %%rcx, 152(%%rdi)\n"
13672         "adcq    $0, %%rdx\n"
13673         "movq    %%rdx, %%rcx\n"
13674         "mulq    %%r9\n"
13675         "addq    %%rax, %%rcx\n"
13676         "adcq    $0, %%rdx\n"
13677         "movq    104(%%rsi), %%rax\n"
13678         "addq    %%rcx, 160(%%rdi)\n"
13679         "adcq    $0, %%rdx\n"
13680         "movq    %%rdx, %%rcx\n"
13681         "mulq    %%r9\n"
13682         "addq    %%rax, %%rcx\n"
13683         "adcq    $0, %%rdx\n"
13684         "addq    %%rcx, 168(%%rdi)\n"
13685         "adcq    $0, %%rdx\n"
13686         "movq    %%rdx, 176(%%rdi)\n"
13687         "### x*y[9]\n"
13688         "movq    72(%%r8), %%r9\n"
13689         "movq    0(%%rsi), %%rax\n"
13690         "mulq    %%r9\n"
13691         "addq    %%rax, 72(%%rdi)\n"
13692         "movq    8(%%rsi), %%rax\n"
13693         "adcq    $0, %%rdx\n"
13694         "movq    %%rdx, %%rcx\n"
13695         "mulq    %%r9\n"
13696         "addq    %%rax, %%rcx\n"
13697         "adcq    $0, %%rdx\n"
13698         "movq    16(%%rsi), %%rax\n"
13699         "addq    %%rcx, 80(%%rdi)\n"
13700         "adcq    $0, %%rdx\n"
13701         "movq    %%rdx, %%rcx\n"
13702         "mulq    %%r9\n"
13703         "addq    %%rax, %%rcx\n"
13704         "adcq    $0, %%rdx\n"
13705         "movq    24(%%rsi), %%rax\n"
13706         "addq    %%rcx, 88(%%rdi)\n"
13707         "adcq    $0, %%rdx\n"
13708         "movq    %%rdx, %%rcx\n"
13709         "mulq    %%r9\n"
13710         "addq    %%rax, %%rcx\n"
13711         "adcq    $0, %%rdx\n"
13712         "movq    32(%%rsi), %%rax\n"
13713         "addq    %%rcx, 96(%%rdi)\n"
13714         "adcq    $0, %%rdx\n"
13715         "movq    %%rdx, %%rcx\n"
13716         "mulq    %%r9\n"
13717         "addq    %%rax, %%rcx\n"
13718         "adcq    $0, %%rdx\n"
13719         "movq    40(%%rsi), %%rax\n"
13720         "addq    %%rcx, 104(%%rdi)\n"
13721         "adcq    $0, %%rdx\n"
13722         "movq    %%rdx, %%rcx\n"
13723         "mulq    %%r9\n"
13724         "addq    %%rax, %%rcx\n"
13725         "adcq    $0, %%rdx\n"
13726         "movq    48(%%rsi), %%rax\n"
13727         "addq    %%rcx, 112(%%rdi)\n"
13728         "adcq    $0, %%rdx\n"
13729         "movq    %%rdx, %%rcx\n"
13730         "mulq    %%r9\n"
13731         "addq    %%rax, %%rcx\n"
13732         "adcq    $0, %%rdx\n"
13733         "movq    56(%%rsi), %%rax\n"
13734         "addq    %%rcx, 120(%%rdi)\n"
13735         "adcq    $0, %%rdx\n"
13736         "movq    %%rdx, %%rcx\n"
13737         "mulq    %%r9\n"
13738         "addq    %%rax, %%rcx\n"
13739         "adcq    $0, %%rdx\n"
13740         "movq    64(%%rsi), %%rax\n"
13741         "addq    %%rcx, 128(%%rdi)\n"
13742         "adcq    $0, %%rdx\n"
13743         "movq    %%rdx, %%rcx\n"
13744         "mulq    %%r9\n"
13745         "addq    %%rax, %%rcx\n"
13746         "adcq    $0, %%rdx\n"
13747         "movq    72(%%rsi), %%rax\n"
13748         "addq    %%rcx, 136(%%rdi)\n"
13749         "adcq    $0, %%rdx\n"
13750         "movq    %%rdx, %%rcx\n"
13751         "mulq    %%r9\n"
13752         "addq    %%rax, %%rcx\n"
13753         "adcq    $0, %%rdx\n"
13754         "movq    80(%%rsi), %%rax\n"
13755         "addq    %%rcx, 144(%%rdi)\n"
13756         "adcq    $0, %%rdx\n"
13757         "movq    %%rdx, %%rcx\n"
13758         "mulq    %%r9\n"
13759         "addq    %%rax, %%rcx\n"
13760         "adcq    $0, %%rdx\n"
13761         "movq    88(%%rsi), %%rax\n"
13762         "addq    %%rcx, 152(%%rdi)\n"
13763         "adcq    $0, %%rdx\n"
13764         "movq    %%rdx, %%rcx\n"
13765         "mulq    %%r9\n"
13766         "addq    %%rax, %%rcx\n"
13767         "adcq    $0, %%rdx\n"
13768         "movq    96(%%rsi), %%rax\n"
13769         "addq    %%rcx, 160(%%rdi)\n"
13770         "adcq    $0, %%rdx\n"
13771         "movq    %%rdx, %%rcx\n"
13772         "mulq    %%r9\n"
13773         "addq    %%rax, %%rcx\n"
13774         "adcq    $0, %%rdx\n"
13775         "movq    104(%%rsi), %%rax\n"
13776         "addq    %%rcx, 168(%%rdi)\n"
13777         "adcq    $0, %%rdx\n"
13778         "movq    %%rdx, %%rcx\n"
13779         "mulq    %%r9\n"
13780         "addq    %%rax, %%rcx\n"
13781         "adcq    $0, %%rdx\n"
13782         "addq    %%rcx, 176(%%rdi)\n"
13783         "adcq    $0, %%rdx\n"
13784         "movq    %%rdx, 184(%%rdi)\n"
13785         "### x*y[10]\n"
13786         "movq    80(%%r8), %%r9\n"
13787         "movq    0(%%rsi), %%rax\n"
13788         "mulq    %%r9\n"
13789         "addq    %%rax, 80(%%rdi)\n"
13790         "movq    8(%%rsi), %%rax\n"
13791         "adcq    $0, %%rdx\n"
13792         "movq    %%rdx, %%rcx\n"
13793         "mulq    %%r9\n"
13794         "addq    %%rax, %%rcx\n"
13795         "adcq    $0, %%rdx\n"
13796         "movq    16(%%rsi), %%rax\n"
13797         "addq    %%rcx, 88(%%rdi)\n"
13798         "adcq    $0, %%rdx\n"
13799         "movq    %%rdx, %%rcx\n"
13800         "mulq    %%r9\n"
13801         "addq    %%rax, %%rcx\n"
13802         "adcq    $0, %%rdx\n"
13803         "movq    24(%%rsi), %%rax\n"
13804         "addq    %%rcx, 96(%%rdi)\n"
13805         "adcq    $0, %%rdx\n"
13806         "movq    %%rdx, %%rcx\n"
13807         "mulq    %%r9\n"
13808         "addq    %%rax, %%rcx\n"
13809         "adcq    $0, %%rdx\n"
13810         "movq    32(%%rsi), %%rax\n"
13811         "addq    %%rcx, 104(%%rdi)\n"
13812         "adcq    $0, %%rdx\n"
13813         "movq    %%rdx, %%rcx\n"
13814         "mulq    %%r9\n"
13815         "addq    %%rax, %%rcx\n"
13816         "adcq    $0, %%rdx\n"
13817         "movq    40(%%rsi), %%rax\n"
13818         "addq    %%rcx, 112(%%rdi)\n"
13819         "adcq    $0, %%rdx\n"
13820         "movq    %%rdx, %%rcx\n"
13821         "mulq    %%r9\n"
13822         "addq    %%rax, %%rcx\n"
13823         "adcq    $0, %%rdx\n"
13824         "movq    48(%%rsi), %%rax\n"
13825         "addq    %%rcx, 120(%%rdi)\n"
13826         "adcq    $0, %%rdx\n"
13827         "movq    %%rdx, %%rcx\n"
13828         "mulq    %%r9\n"
13829         "addq    %%rax, %%rcx\n"
13830         "adcq    $0, %%rdx\n"
13831         "movq    56(%%rsi), %%rax\n"
13832         "addq    %%rcx, 128(%%rdi)\n"
13833         "adcq    $0, %%rdx\n"
13834         "movq    %%rdx, %%rcx\n"
13835         "mulq    %%r9\n"
13836         "addq    %%rax, %%rcx\n"
13837         "adcq    $0, %%rdx\n"
13838         "movq    64(%%rsi), %%rax\n"
13839         "addq    %%rcx, 136(%%rdi)\n"
13840         "adcq    $0, %%rdx\n"
13841         "movq    %%rdx, %%rcx\n"
13842         "mulq    %%r9\n"
13843         "addq    %%rax, %%rcx\n"
13844         "adcq    $0, %%rdx\n"
13845         "movq    72(%%rsi), %%rax\n"
13846         "addq    %%rcx, 144(%%rdi)\n"
13847         "adcq    $0, %%rdx\n"
13848         "movq    %%rdx, %%rcx\n"
13849         "mulq    %%r9\n"
13850         "addq    %%rax, %%rcx\n"
13851         "adcq    $0, %%rdx\n"
13852         "movq    80(%%rsi), %%rax\n"
13853         "addq    %%rcx, 152(%%rdi)\n"
13854         "adcq    $0, %%rdx\n"
13855         "movq    %%rdx, %%rcx\n"
13856         "mulq    %%r9\n"
13857         "addq    %%rax, %%rcx\n"
13858         "adcq    $0, %%rdx\n"
13859         "movq    88(%%rsi), %%rax\n"
13860         "addq    %%rcx, 160(%%rdi)\n"
13861         "adcq    $0, %%rdx\n"
13862         "movq    %%rdx, %%rcx\n"
13863         "mulq    %%r9\n"
13864         "addq    %%rax, %%rcx\n"
13865         "adcq    $0, %%rdx\n"
13866         "movq    96(%%rsi), %%rax\n"
13867         "addq    %%rcx, 168(%%rdi)\n"
13868         "adcq    $0, %%rdx\n"
13869         "movq    %%rdx, %%rcx\n"
13870         "mulq    %%r9\n"
13871         "addq    %%rax, %%rcx\n"
13872         "adcq    $0, %%rdx\n"
13873         "movq    104(%%rsi), %%rax\n"
13874         "addq    %%rcx, 176(%%rdi)\n"
13875         "adcq    $0, %%rdx\n"
13876         "movq    %%rdx, %%rcx\n"
13877         "mulq    %%r9\n"
13878         "addq    %%rax, %%rcx\n"
13879         "adcq    $0, %%rdx\n"
13880         "addq    %%rcx, 184(%%rdi)\n"
13881         "adcq    $0, %%rdx\n"
13882         "movq    %%rdx, 192(%%rdi)\n"
13883         "### x*y[11]\n"
13884         "movq    88(%%r8), %%r9\n"
13885         "movq    0(%%rsi), %%rax\n"
13886         "mulq    %%r9\n"
13887         "addq    %%rax, 88(%%rdi)\n"
13888         "movq    8(%%rsi), %%rax\n"
13889         "adcq    $0, %%rdx\n"
13890         "movq    %%rdx, %%rcx\n"
13891         "mulq    %%r9\n"
13892         "addq    %%rax, %%rcx\n"
13893         "adcq    $0, %%rdx\n"
13894         "movq    16(%%rsi), %%rax\n"
13895         "addq    %%rcx, 96(%%rdi)\n"
13896         "adcq    $0, %%rdx\n"
13897         "movq    %%rdx, %%rcx\n"
13898         "mulq    %%r9\n"
13899         "addq    %%rax, %%rcx\n"
13900         "adcq    $0, %%rdx\n"
13901         "movq    24(%%rsi), %%rax\n"
13902         "addq    %%rcx, 104(%%rdi)\n"
13903         "adcq    $0, %%rdx\n"
13904         "movq    %%rdx, %%rcx\n"
13905         "mulq    %%r9\n"
13906         "addq    %%rax, %%rcx\n"
13907         "adcq    $0, %%rdx\n"
13908         "movq    32(%%rsi), %%rax\n"
13909         "addq    %%rcx, 112(%%rdi)\n"
13910         "adcq    $0, %%rdx\n"
13911         "movq    %%rdx, %%rcx\n"
13912         "mulq    %%r9\n"
13913         "addq    %%rax, %%rcx\n"
13914         "adcq    $0, %%rdx\n"
13915         "movq    40(%%rsi), %%rax\n"
13916         "addq    %%rcx, 120(%%rdi)\n"
13917         "adcq    $0, %%rdx\n"
13918         "movq    %%rdx, %%rcx\n"
13919         "mulq    %%r9\n"
13920         "addq    %%rax, %%rcx\n"
13921         "adcq    $0, %%rdx\n"
13922         "movq    48(%%rsi), %%rax\n"
13923         "addq    %%rcx, 128(%%rdi)\n"
13924         "adcq    $0, %%rdx\n"
13925         "movq    %%rdx, %%rcx\n"
13926         "mulq    %%r9\n"
13927         "addq    %%rax, %%rcx\n"
13928         "adcq    $0, %%rdx\n"
13929         "movq    56(%%rsi), %%rax\n"
13930         "addq    %%rcx, 136(%%rdi)\n"
13931         "adcq    $0, %%rdx\n"
13932         "movq    %%rdx, %%rcx\n"
13933         "mulq    %%r9\n"
13934         "addq    %%rax, %%rcx\n"
13935         "adcq    $0, %%rdx\n"
13936         "movq    64(%%rsi), %%rax\n"
13937         "addq    %%rcx, 144(%%rdi)\n"
13938         "adcq    $0, %%rdx\n"
13939         "movq    %%rdx, %%rcx\n"
13940         "mulq    %%r9\n"
13941         "addq    %%rax, %%rcx\n"
13942         "adcq    $0, %%rdx\n"
13943         "movq    72(%%rsi), %%rax\n"
13944         "addq    %%rcx, 152(%%rdi)\n"
13945         "adcq    $0, %%rdx\n"
13946         "movq    %%rdx, %%rcx\n"
13947         "mulq    %%r9\n"
13948         "addq    %%rax, %%rcx\n"
13949         "adcq    $0, %%rdx\n"
13950         "movq    80(%%rsi), %%rax\n"
13951         "addq    %%rcx, 160(%%rdi)\n"
13952         "adcq    $0, %%rdx\n"
13953         "movq    %%rdx, %%rcx\n"
13954         "mulq    %%r9\n"
13955         "addq    %%rax, %%rcx\n"
13956         "adcq    $0, %%rdx\n"
13957         "movq    88(%%rsi), %%rax\n"
13958         "addq    %%rcx, 168(%%rdi)\n"
13959         "adcq    $0, %%rdx\n"
13960         "movq    %%rdx, %%rcx\n"
13961         "mulq    %%r9\n"
13962         "addq    %%rax, %%rcx\n"
13963         "adcq    $0, %%rdx\n"
13964         "movq    96(%%rsi), %%rax\n"
13965         "addq    %%rcx, 176(%%rdi)\n"
13966         "adcq    $0, %%rdx\n"
13967         "movq    %%rdx, %%rcx\n"
13968         "mulq    %%r9\n"
13969         "addq    %%rax, %%rcx\n"
13970         "adcq    $0, %%rdx\n"
13971         "movq    104(%%rsi), %%rax\n"
13972         "addq    %%rcx, 184(%%rdi)\n"
13973         "adcq    $0, %%rdx\n"
13974         "movq    %%rdx, %%rcx\n"
13975         "mulq    %%r9\n"
13976         "addq    %%rax, %%rcx\n"
13977         "adcq    $0, %%rdx\n"
13978         "addq    %%rcx, 192(%%rdi)\n"
13979         "adcq    $0, %%rdx\n"
13980         "movq    %%rdx, 200(%%rdi)\n"
13981         "### x*y[12]\n"
13982         "movq    96(%%r8), %%r9\n"
13983         "movq    0(%%rsi), %%rax\n"
13984         "mulq    %%r9\n"
13985         "addq    %%rax, 96(%%rdi)\n"
13986         "movq    8(%%rsi), %%rax\n"
13987         "adcq    $0, %%rdx\n"
13988         "movq    %%rdx, %%rcx\n"
13989         "mulq    %%r9\n"
13990         "addq    %%rax, %%rcx\n"
13991         "adcq    $0, %%rdx\n"
13992         "movq    16(%%rsi), %%rax\n"
13993         "addq    %%rcx, 104(%%rdi)\n"
13994         "adcq    $0, %%rdx\n"
13995         "movq    %%rdx, %%rcx\n"
13996         "mulq    %%r9\n"
13997         "addq    %%rax, %%rcx\n"
13998         "adcq    $0, %%rdx\n"
13999         "movq    24(%%rsi), %%rax\n"
14000         "addq    %%rcx, 112(%%rdi)\n"
14001         "adcq    $0, %%rdx\n"
14002         "movq    %%rdx, %%rcx\n"
14003         "mulq    %%r9\n"
14004         "addq    %%rax, %%rcx\n"
14005         "adcq    $0, %%rdx\n"
14006         "movq    32(%%rsi), %%rax\n"
14007         "addq    %%rcx, 120(%%rdi)\n"
14008         "adcq    $0, %%rdx\n"
14009         "movq    %%rdx, %%rcx\n"
14010         "mulq    %%r9\n"
14011         "addq    %%rax, %%rcx\n"
14012         "adcq    $0, %%rdx\n"
14013         "movq    40(%%rsi), %%rax\n"
14014         "addq    %%rcx, 128(%%rdi)\n"
14015         "adcq    $0, %%rdx\n"
14016         "movq    %%rdx, %%rcx\n"
14017         "mulq    %%r9\n"
14018         "addq    %%rax, %%rcx\n"
14019         "adcq    $0, %%rdx\n"
14020         "movq    48(%%rsi), %%rax\n"
14021         "addq    %%rcx, 136(%%rdi)\n"
14022         "adcq    $0, %%rdx\n"
14023         "movq    %%rdx, %%rcx\n"
14024         "mulq    %%r9\n"
14025         "addq    %%rax, %%rcx\n"
14026         "adcq    $0, %%rdx\n"
14027         "movq    56(%%rsi), %%rax\n"
14028         "addq    %%rcx, 144(%%rdi)\n"
14029         "adcq    $0, %%rdx\n"
14030         "movq    %%rdx, %%rcx\n"
14031         "mulq    %%r9\n"
14032         "addq    %%rax, %%rcx\n"
14033         "adcq    $0, %%rdx\n"
14034         "movq    64(%%rsi), %%rax\n"
14035         "addq    %%rcx, 152(%%rdi)\n"
14036         "adcq    $0, %%rdx\n"
14037         "movq    %%rdx, %%rcx\n"
14038         "mulq    %%r9\n"
14039         "addq    %%rax, %%rcx\n"
14040         "adcq    $0, %%rdx\n"
14041         "movq    72(%%rsi), %%rax\n"
14042         "addq    %%rcx, 160(%%rdi)\n"
14043         "adcq    $0, %%rdx\n"
14044         "movq    %%rdx, %%rcx\n"
14045         "mulq    %%r9\n"
14046         "addq    %%rax, %%rcx\n"
14047         "adcq    $0, %%rdx\n"
14048         "movq    80(%%rsi), %%rax\n"
14049         "addq    %%rcx, 168(%%rdi)\n"
14050         "adcq    $0, %%rdx\n"
14051         "movq    %%rdx, %%rcx\n"
14052         "mulq    %%r9\n"
14053         "addq    %%rax, %%rcx\n"
14054         "adcq    $0, %%rdx\n"
14055         "movq    88(%%rsi), %%rax\n"
14056         "addq    %%rcx, 176(%%rdi)\n"
14057         "adcq    $0, %%rdx\n"
14058         "movq    %%rdx, %%rcx\n"
14059         "mulq    %%r9\n"
14060         "addq    %%rax, %%rcx\n"
14061         "adcq    $0, %%rdx\n"
14062         "movq    96(%%rsi), %%rax\n"
14063         "addq    %%rcx, 184(%%rdi)\n"
14064         "adcq    $0, %%rdx\n"
14065         "movq    %%rdx, %%rcx\n"
14066         "mulq    %%r9\n"
14067         "addq    %%rax, %%rcx\n"
14068         "adcq    $0, %%rdx\n"
14069         "movq    104(%%rsi), %%rax\n"
14070         "addq    %%rcx, 192(%%rdi)\n"
14071         "adcq    $0, %%rdx\n"
14072         "movq    %%rdx, %%rcx\n"
14073         "mulq    %%r9\n"
14074         "addq    %%rax, %%rcx\n"
14075         "adcq    $0, %%rdx\n"
14076         "addq    %%rcx, 200(%%rdi)\n"
14077         "adcq    $0, %%rdx\n"
14078         "movq    %%rdx, 208(%%rdi)\n"
14079         "### x*y[13]\n"
14080         "movq    104(%%r8), %%r9\n"
14081         "movq    0(%%rsi), %%rax\n"
14082         "mulq    %%r9\n"
14083         "addq    %%rax, 104(%%rdi)\n"
14084         "movq    8(%%rsi), %%rax\n"
14085         "adcq    $0, %%rdx\n"
14086         "movq    %%rdx, %%rcx\n"
14087         "mulq    %%r9\n"
14088         "addq    %%rax, %%rcx\n"
14089         "adcq    $0, %%rdx\n"
14090         "movq    16(%%rsi), %%rax\n"
14091         "addq    %%rcx, 112(%%rdi)\n"
14092         "adcq    $0, %%rdx\n"
14093         "movq    %%rdx, %%rcx\n"
14094         "mulq    %%r9\n"
14095         "addq    %%rax, %%rcx\n"
14096         "adcq    $0, %%rdx\n"
14097         "movq    24(%%rsi), %%rax\n"
14098         "addq    %%rcx, 120(%%rdi)\n"
14099         "adcq    $0, %%rdx\n"
14100         "movq    %%rdx, %%rcx\n"
14101         "mulq    %%r9\n"
14102         "addq    %%rax, %%rcx\n"
14103         "adcq    $0, %%rdx\n"
14104         "movq    32(%%rsi), %%rax\n"
14105         "addq    %%rcx, 128(%%rdi)\n"
14106         "adcq    $0, %%rdx\n"
14107         "movq    %%rdx, %%rcx\n"
14108         "mulq    %%r9\n"
14109         "addq    %%rax, %%rcx\n"
14110         "adcq    $0, %%rdx\n"
14111         "movq    40(%%rsi), %%rax\n"
14112         "addq    %%rcx, 136(%%rdi)\n"
14113         "adcq    $0, %%rdx\n"
14114         "movq    %%rdx, %%rcx\n"
14115         "mulq    %%r9\n"
14116         "addq    %%rax, %%rcx\n"
14117         "adcq    $0, %%rdx\n"
14118         "movq    48(%%rsi), %%rax\n"
14119         "addq    %%rcx, 144(%%rdi)\n"
14120         "adcq    $0, %%rdx\n"
14121         "movq    %%rdx, %%rcx\n"
14122         "mulq    %%r9\n"
14123         "addq    %%rax, %%rcx\n"
14124         "adcq    $0, %%rdx\n"
14125         "movq    56(%%rsi), %%rax\n"
14126         "addq    %%rcx, 152(%%rdi)\n"
14127         "adcq    $0, %%rdx\n"
14128         "movq    %%rdx, %%rcx\n"
14129         "mulq    %%r9\n"
14130         "addq    %%rax, %%rcx\n"
14131         "adcq    $0, %%rdx\n"
14132         "movq    64(%%rsi), %%rax\n"
14133         "addq    %%rcx, 160(%%rdi)\n"
14134         "adcq    $0, %%rdx\n"
14135         "movq    %%rdx, %%rcx\n"
14136         "mulq    %%r9\n"
14137         "addq    %%rax, %%rcx\n"
14138         "adcq    $0, %%rdx\n"
14139         "movq    72(%%rsi), %%rax\n"
14140         "addq    %%rcx, 168(%%rdi)\n"
14141         "adcq    $0, %%rdx\n"
14142         "movq    %%rdx, %%rcx\n"
14143         "mulq    %%r9\n"
14144         "addq    %%rax, %%rcx\n"
14145         "adcq    $0, %%rdx\n"
14146         "movq    80(%%rsi), %%rax\n"
14147         "addq    %%rcx, 176(%%rdi)\n"
14148         "adcq    $0, %%rdx\n"
14149         "movq    %%rdx, %%rcx\n"
14150         "mulq    %%r9\n"
14151         "addq    %%rax, %%rcx\n"
14152         "adcq    $0, %%rdx\n"
14153         "movq    88(%%rsi), %%rax\n"
14154         "addq    %%rcx, 184(%%rdi)\n"
14155         "adcq    $0, %%rdx\n"
14156         "movq    %%rdx, %%rcx\n"
14157         "mulq    %%r9\n"
14158         "addq    %%rax, %%rcx\n"
14159         "adcq    $0, %%rdx\n"
14160         "movq    96(%%rsi), %%rax\n"
14161         "addq    %%rcx, 192(%%rdi)\n"
14162         "adcq    $0, %%rdx\n"
14163         "movq    %%rdx, %%rcx\n"
14164         "mulq    %%r9\n"
14165         "addq    %%rax, %%rcx\n"
14166         "adcq    $0, %%rdx\n"
14167         "movq    104(%%rsi), %%rax\n"
14168         "addq    %%rcx, 200(%%rdi)\n"
14169         "adcq    $0, %%rdx\n"
14170         "movq    %%rdx, %%rcx\n"
14171         "mulq    %%r9\n"
14172         "addq    %%rax, %%rcx\n"
14173         "adcq    $0, %%rdx\n"
14174         "addq    %%rcx, 208(%%rdi)\n"
14175         "adcq    $0, %%rdx\n"
14176         "movq    %%rdx, 216(%%rdi)\n"
14177       : "+m" (z)
14178       : "m" (x), "m" (y)
14179       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
14180 }
14181 
14182 /* x has 14 words, z has 30. Put x*y in z. */
14183 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
14184 static inline
mpfq_fixmp_14_sqr(mp_limb_t * z,const mp_limb_t * x)14185 void mpfq_fixmp_14_sqr(mp_limb_t * z, const mp_limb_t * x)
14186 {
14187     mpfq_fixmp_14_mul(z, x, x);
14188 }
14189 
14190 /* x has 14 words, z has 16. Put x*y in z. */
14191 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
14192 static inline
mpfq_fixmp_14_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)14193 void mpfq_fixmp_14_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
14194 {
14195     __asm__ __volatile__(
14196         "movq    %[z], %%rdi\n"
14197         "movq    %[x], %%rsi\n"
14198         "movq    0(%%rsi), %%rax\n"
14199         "mulq    %[mult]\n"
14200         "movq    %%rax, 0(%%rdi)\n"
14201         "movq    8(%%rsi), %%rax\n"
14202         "movq    %%rdx, %%rcx\n"
14203         "mulq    %[mult]\n"
14204         "addq    %%rax, %%rcx\n"
14205         "adcq    $0, %%rdx\n"
14206         "movq    16(%%rsi), %%rax\n"
14207         "movq    %%rcx, 8(%%rdi)\n"
14208         "movq    %%rdx, %%rcx\n"
14209         "mulq    %[mult]\n"
14210         "addq    %%rax, %%rcx\n"
14211         "adcq    $0, %%rdx\n"
14212         "movq    24(%%rsi), %%rax\n"
14213         "movq    %%rcx, 16(%%rdi)\n"
14214         "movq    %%rdx, %%rcx\n"
14215         "mulq    %[mult]\n"
14216         "addq    %%rax, %%rcx\n"
14217         "adcq    $0, %%rdx\n"
14218         "movq    32(%%rsi), %%rax\n"
14219         "movq    %%rcx, 24(%%rdi)\n"
14220         "movq    %%rdx, %%rcx\n"
14221         "mulq    %[mult]\n"
14222         "addq    %%rax, %%rcx\n"
14223         "adcq    $0, %%rdx\n"
14224         "movq    40(%%rsi), %%rax\n"
14225         "movq    %%rcx, 32(%%rdi)\n"
14226         "movq    %%rdx, %%rcx\n"
14227         "mulq    %[mult]\n"
14228         "addq    %%rax, %%rcx\n"
14229         "adcq    $0, %%rdx\n"
14230         "movq    48(%%rsi), %%rax\n"
14231         "movq    %%rcx, 40(%%rdi)\n"
14232         "movq    %%rdx, %%rcx\n"
14233         "mulq    %[mult]\n"
14234         "addq    %%rax, %%rcx\n"
14235         "adcq    $0, %%rdx\n"
14236         "movq    56(%%rsi), %%rax\n"
14237         "movq    %%rcx, 48(%%rdi)\n"
14238         "movq    %%rdx, %%rcx\n"
14239         "mulq    %[mult]\n"
14240         "addq    %%rax, %%rcx\n"
14241         "adcq    $0, %%rdx\n"
14242         "movq    64(%%rsi), %%rax\n"
14243         "movq    %%rcx, 56(%%rdi)\n"
14244         "movq    %%rdx, %%rcx\n"
14245         "mulq    %[mult]\n"
14246         "addq    %%rax, %%rcx\n"
14247         "adcq    $0, %%rdx\n"
14248         "movq    72(%%rsi), %%rax\n"
14249         "movq    %%rcx, 64(%%rdi)\n"
14250         "movq    %%rdx, %%rcx\n"
14251         "mulq    %[mult]\n"
14252         "addq    %%rax, %%rcx\n"
14253         "adcq    $0, %%rdx\n"
14254         "movq    80(%%rsi), %%rax\n"
14255         "movq    %%rcx, 72(%%rdi)\n"
14256         "movq    %%rdx, %%rcx\n"
14257         "mulq    %[mult]\n"
14258         "addq    %%rax, %%rcx\n"
14259         "adcq    $0, %%rdx\n"
14260         "movq    88(%%rsi), %%rax\n"
14261         "movq    %%rcx, 80(%%rdi)\n"
14262         "movq    %%rdx, %%rcx\n"
14263         "mulq    %[mult]\n"
14264         "addq    %%rax, %%rcx\n"
14265         "adcq    $0, %%rdx\n"
14266         "movq    96(%%rsi), %%rax\n"
14267         "movq    %%rcx, 88(%%rdi)\n"
14268         "movq    %%rdx, %%rcx\n"
14269         "mulq    %[mult]\n"
14270         "addq    %%rax, %%rcx\n"
14271         "adcq    $0, %%rdx\n"
14272         "movq    104(%%rsi), %%rax\n"
14273         "movq    %%rcx, 96(%%rdi)\n"
14274         "movq    %%rdx, %%rcx\n"
14275         "mulq    %[mult]\n"
14276         "addq    %%rax, %%rcx\n"
14277         "adcq    $0, %%rdx\n"
14278         "movq    %%rcx, 104(%%rdi)\n"
14279         "movq    %%rdx, 112(%%rdi)\n"
14280     :
14281     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
14282     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
14283 }
14284 
14285 /* x, y, and z have 15 words. Result in z. Return carry bit */
14286 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
14287 static inline
mpfq_fixmp_15_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)14288 mp_limb_t mpfq_fixmp_15_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
14289 {
14290     mp_limb_t carry;
14291     __asm__ __volatile__(
14292         "movq    %[z], %%rdi\n"
14293         "movq    %[x], %%rsi\n"
14294         "movq    %[y], %%rdx\n"
14295         "movq    0(%%rsi), %%rax\n"
14296         "addq    0(%%rdx), %%rax\n"
14297         "movq    %%rax, 0(%%rdi)\n"
14298         "movq    8(%%rsi), %%rax\n"
14299         "adcq    8(%%rdx), %%rax\n"
14300         "movq    %%rax, 8(%%rdi)\n"
14301         "movq    16(%%rsi), %%rax\n"
14302         "adcq    16(%%rdx), %%rax\n"
14303         "movq    %%rax, 16(%%rdi)\n"
14304         "movq    24(%%rsi), %%rax\n"
14305         "adcq    24(%%rdx), %%rax\n"
14306         "movq    %%rax, 24(%%rdi)\n"
14307         "movq    32(%%rsi), %%rax\n"
14308         "adcq    32(%%rdx), %%rax\n"
14309         "movq    %%rax, 32(%%rdi)\n"
14310         "movq    40(%%rsi), %%rax\n"
14311         "adcq    40(%%rdx), %%rax\n"
14312         "movq    %%rax, 40(%%rdi)\n"
14313         "movq    48(%%rsi), %%rax\n"
14314         "adcq    48(%%rdx), %%rax\n"
14315         "movq    %%rax, 48(%%rdi)\n"
14316         "movq    56(%%rsi), %%rax\n"
14317         "adcq    56(%%rdx), %%rax\n"
14318         "movq    %%rax, 56(%%rdi)\n"
14319         "movq    64(%%rsi), %%rax\n"
14320         "adcq    64(%%rdx), %%rax\n"
14321         "movq    %%rax, 64(%%rdi)\n"
14322         "movq    72(%%rsi), %%rax\n"
14323         "adcq    72(%%rdx), %%rax\n"
14324         "movq    %%rax, 72(%%rdi)\n"
14325         "movq    80(%%rsi), %%rax\n"
14326         "adcq    80(%%rdx), %%rax\n"
14327         "movq    %%rax, 80(%%rdi)\n"
14328         "movq    88(%%rsi), %%rax\n"
14329         "adcq    88(%%rdx), %%rax\n"
14330         "movq    %%rax, 88(%%rdi)\n"
14331         "movq    96(%%rsi), %%rax\n"
14332         "adcq    96(%%rdx), %%rax\n"
14333         "movq    %%rax, 96(%%rdi)\n"
14334         "movq    104(%%rsi), %%rax\n"
14335         "adcq    104(%%rdx), %%rax\n"
14336         "movq    %%rax, 104(%%rdi)\n"
14337         "movq    112(%%rsi), %%rax\n"
14338         "adcq    112(%%rdx), %%rax\n"
14339         "movq    %%rax, 112(%%rdi)\n"
14340         "movq $0, %%rax\n"
14341         "adcq $0, %%rax\n"
14342     : "=&a"(carry)
14343     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
14344     : "%rdx", "%rsi", "%rdi", "memory");
14345     return carry;
14346 }
14347 
14348 /* x, y, and z have 15 words. Result in z. Return borrow bit */
14349 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
14350 static inline
mpfq_fixmp_15_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)14351 mp_limb_t mpfq_fixmp_15_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
14352 {
14353     mp_limb_t carry;
14354     __asm__ __volatile__(
14355         "movq    %[z], %%rdi\n"
14356         "movq    %[x], %%rsi\n"
14357         "movq    %[y], %%rdx\n"
14358         "movq    0(%%rsi), %%rax\n"
14359         "subq    0(%%rdx), %%rax\n"
14360         "movq    %%rax, 0(%%rdi)\n"
14361         "movq    8(%%rsi), %%rax\n"
14362         "sbbq    8(%%rdx), %%rax\n"
14363         "movq    %%rax, 8(%%rdi)\n"
14364         "movq    16(%%rsi), %%rax\n"
14365         "sbbq    16(%%rdx), %%rax\n"
14366         "movq    %%rax, 16(%%rdi)\n"
14367         "movq    24(%%rsi), %%rax\n"
14368         "sbbq    24(%%rdx), %%rax\n"
14369         "movq    %%rax, 24(%%rdi)\n"
14370         "movq    32(%%rsi), %%rax\n"
14371         "sbbq    32(%%rdx), %%rax\n"
14372         "movq    %%rax, 32(%%rdi)\n"
14373         "movq    40(%%rsi), %%rax\n"
14374         "sbbq    40(%%rdx), %%rax\n"
14375         "movq    %%rax, 40(%%rdi)\n"
14376         "movq    48(%%rsi), %%rax\n"
14377         "sbbq    48(%%rdx), %%rax\n"
14378         "movq    %%rax, 48(%%rdi)\n"
14379         "movq    56(%%rsi), %%rax\n"
14380         "sbbq    56(%%rdx), %%rax\n"
14381         "movq    %%rax, 56(%%rdi)\n"
14382         "movq    64(%%rsi), %%rax\n"
14383         "sbbq    64(%%rdx), %%rax\n"
14384         "movq    %%rax, 64(%%rdi)\n"
14385         "movq    72(%%rsi), %%rax\n"
14386         "sbbq    72(%%rdx), %%rax\n"
14387         "movq    %%rax, 72(%%rdi)\n"
14388         "movq    80(%%rsi), %%rax\n"
14389         "sbbq    80(%%rdx), %%rax\n"
14390         "movq    %%rax, 80(%%rdi)\n"
14391         "movq    88(%%rsi), %%rax\n"
14392         "sbbq    88(%%rdx), %%rax\n"
14393         "movq    %%rax, 88(%%rdi)\n"
14394         "movq    96(%%rsi), %%rax\n"
14395         "sbbq    96(%%rdx), %%rax\n"
14396         "movq    %%rax, 96(%%rdi)\n"
14397         "movq    104(%%rsi), %%rax\n"
14398         "sbbq    104(%%rdx), %%rax\n"
14399         "movq    %%rax, 104(%%rdi)\n"
14400         "movq    112(%%rsi), %%rax\n"
14401         "sbbq    112(%%rdx), %%rax\n"
14402         "movq    %%rax, 112(%%rdi)\n"
14403         "movq $0, %%rax\n"
14404         "adcq $0, %%rax\n"
14405     : "=&a"(carry)
14406     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
14407     : "%rdx", "%rsi", "%rdi", "memory");
14408     return carry;
14409 }
14410 
14411 /* x, y, and z have 15 words. Result in z. Carry bit is lost. */
14412 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
14413 static inline
mpfq_fixmp_15_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)14414 void mpfq_fixmp_15_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
14415 {
14416     __asm__ __volatile__(
14417         "movq    %[z], %%rdi\n"
14418         "movq    %[x], %%rsi\n"
14419         "movq    %[y], %%rdx\n"
14420         "movq    0(%%rsi), %%rax\n"
14421         "addq    0(%%rdx), %%rax\n"
14422         "movq    %%rax, 0(%%rdi)\n"
14423         "movq    8(%%rsi), %%rax\n"
14424         "adcq    8(%%rdx), %%rax\n"
14425         "movq    %%rax, 8(%%rdi)\n"
14426         "movq    16(%%rsi), %%rax\n"
14427         "adcq    16(%%rdx), %%rax\n"
14428         "movq    %%rax, 16(%%rdi)\n"
14429         "movq    24(%%rsi), %%rax\n"
14430         "adcq    24(%%rdx), %%rax\n"
14431         "movq    %%rax, 24(%%rdi)\n"
14432         "movq    32(%%rsi), %%rax\n"
14433         "adcq    32(%%rdx), %%rax\n"
14434         "movq    %%rax, 32(%%rdi)\n"
14435         "movq    40(%%rsi), %%rax\n"
14436         "adcq    40(%%rdx), %%rax\n"
14437         "movq    %%rax, 40(%%rdi)\n"
14438         "movq    48(%%rsi), %%rax\n"
14439         "adcq    48(%%rdx), %%rax\n"
14440         "movq    %%rax, 48(%%rdi)\n"
14441         "movq    56(%%rsi), %%rax\n"
14442         "adcq    56(%%rdx), %%rax\n"
14443         "movq    %%rax, 56(%%rdi)\n"
14444         "movq    64(%%rsi), %%rax\n"
14445         "adcq    64(%%rdx), %%rax\n"
14446         "movq    %%rax, 64(%%rdi)\n"
14447         "movq    72(%%rsi), %%rax\n"
14448         "adcq    72(%%rdx), %%rax\n"
14449         "movq    %%rax, 72(%%rdi)\n"
14450         "movq    80(%%rsi), %%rax\n"
14451         "adcq    80(%%rdx), %%rax\n"
14452         "movq    %%rax, 80(%%rdi)\n"
14453         "movq    88(%%rsi), %%rax\n"
14454         "adcq    88(%%rdx), %%rax\n"
14455         "movq    %%rax, 88(%%rdi)\n"
14456         "movq    96(%%rsi), %%rax\n"
14457         "adcq    96(%%rdx), %%rax\n"
14458         "movq    %%rax, 96(%%rdi)\n"
14459         "movq    104(%%rsi), %%rax\n"
14460         "adcq    104(%%rdx), %%rax\n"
14461         "movq    %%rax, 104(%%rdi)\n"
14462         "movq    112(%%rsi), %%rax\n"
14463         "adcq    112(%%rdx), %%rax\n"
14464         "movq    %%rax, 112(%%rdi)\n"
14465     :
14466     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
14467     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
14468 }
14469 
14470 /* x, y, and z have 15 words. Result in z. Borrow bit is lost. */
14471 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
14472 static inline
mpfq_fixmp_15_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)14473 void mpfq_fixmp_15_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
14474 {
14475     __asm__ __volatile__(
14476         "movq    %[z], %%rdi\n"
14477         "movq    %[x], %%rsi\n"
14478         "movq    %[y], %%rdx\n"
14479         "movq    0(%%rsi), %%rax\n"
14480         "subq    0(%%rdx), %%rax\n"
14481         "movq    %%rax, 0(%%rdi)\n"
14482         "movq    8(%%rsi), %%rax\n"
14483         "sbbq    8(%%rdx), %%rax\n"
14484         "movq    %%rax, 8(%%rdi)\n"
14485         "movq    16(%%rsi), %%rax\n"
14486         "sbbq    16(%%rdx), %%rax\n"
14487         "movq    %%rax, 16(%%rdi)\n"
14488         "movq    24(%%rsi), %%rax\n"
14489         "sbbq    24(%%rdx), %%rax\n"
14490         "movq    %%rax, 24(%%rdi)\n"
14491         "movq    32(%%rsi), %%rax\n"
14492         "sbbq    32(%%rdx), %%rax\n"
14493         "movq    %%rax, 32(%%rdi)\n"
14494         "movq    40(%%rsi), %%rax\n"
14495         "sbbq    40(%%rdx), %%rax\n"
14496         "movq    %%rax, 40(%%rdi)\n"
14497         "movq    48(%%rsi), %%rax\n"
14498         "sbbq    48(%%rdx), %%rax\n"
14499         "movq    %%rax, 48(%%rdi)\n"
14500         "movq    56(%%rsi), %%rax\n"
14501         "sbbq    56(%%rdx), %%rax\n"
14502         "movq    %%rax, 56(%%rdi)\n"
14503         "movq    64(%%rsi), %%rax\n"
14504         "sbbq    64(%%rdx), %%rax\n"
14505         "movq    %%rax, 64(%%rdi)\n"
14506         "movq    72(%%rsi), %%rax\n"
14507         "sbbq    72(%%rdx), %%rax\n"
14508         "movq    %%rax, 72(%%rdi)\n"
14509         "movq    80(%%rsi), %%rax\n"
14510         "sbbq    80(%%rdx), %%rax\n"
14511         "movq    %%rax, 80(%%rdi)\n"
14512         "movq    88(%%rsi), %%rax\n"
14513         "sbbq    88(%%rdx), %%rax\n"
14514         "movq    %%rax, 88(%%rdi)\n"
14515         "movq    96(%%rsi), %%rax\n"
14516         "sbbq    96(%%rdx), %%rax\n"
14517         "movq    %%rax, 96(%%rdi)\n"
14518         "movq    104(%%rsi), %%rax\n"
14519         "sbbq    104(%%rdx), %%rax\n"
14520         "movq    %%rax, 104(%%rdi)\n"
14521         "movq    112(%%rsi), %%rax\n"
14522         "sbbq    112(%%rdx), %%rax\n"
14523         "movq    %%rax, 112(%%rdi)\n"
14524     :
14525     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
14526     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
14527 }
14528 
14529 /* x has 15 words, z has 17.
14530  * Put (z+x*c) in z. Return carry bit. */
14531 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
14532 static inline
mpfq_fixmp_15_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)14533 mp_limb_t mpfq_fixmp_15_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
14534 {
14535     mp_limb_t carry;
14536     __asm__ __volatile__(
14537         "movq    %[z], %%rdi\n"
14538         "movq    %[x], %%rsi\n"
14539         "movq    0(%%rsi), %%rax\n"
14540         "mulq    %[mult]\n"
14541         "addq    %%rax, 0(%%rdi)\n"
14542         "movq    8(%%rsi), %%rax\n"
14543         "adcq    $0, %%rdx\n"
14544         "movq    %%rdx, %%rcx\n"
14545         "mulq    %[mult]\n"
14546         "addq    %%rax, %%rcx\n"
14547         "adcq    $0, %%rdx\n"
14548         "movq    16(%%rsi), %%rax\n"
14549         "addq    %%rcx, 8(%%rdi)\n"
14550         "adcq    $0, %%rdx\n"
14551         "movq    %%rdx, %%rcx\n"
14552         "mulq    %[mult]\n"
14553         "addq    %%rax, %%rcx\n"
14554         "adcq    $0, %%rdx\n"
14555         "movq    24(%%rsi), %%rax\n"
14556         "addq    %%rcx, 16(%%rdi)\n"
14557         "adcq    $0, %%rdx\n"
14558         "movq    %%rdx, %%rcx\n"
14559         "mulq    %[mult]\n"
14560         "addq    %%rax, %%rcx\n"
14561         "adcq    $0, %%rdx\n"
14562         "movq    32(%%rsi), %%rax\n"
14563         "addq    %%rcx, 24(%%rdi)\n"
14564         "adcq    $0, %%rdx\n"
14565         "movq    %%rdx, %%rcx\n"
14566         "mulq    %[mult]\n"
14567         "addq    %%rax, %%rcx\n"
14568         "adcq    $0, %%rdx\n"
14569         "movq    40(%%rsi), %%rax\n"
14570         "addq    %%rcx, 32(%%rdi)\n"
14571         "adcq    $0, %%rdx\n"
14572         "movq    %%rdx, %%rcx\n"
14573         "mulq    %[mult]\n"
14574         "addq    %%rax, %%rcx\n"
14575         "adcq    $0, %%rdx\n"
14576         "movq    48(%%rsi), %%rax\n"
14577         "addq    %%rcx, 40(%%rdi)\n"
14578         "adcq    $0, %%rdx\n"
14579         "movq    %%rdx, %%rcx\n"
14580         "mulq    %[mult]\n"
14581         "addq    %%rax, %%rcx\n"
14582         "adcq    $0, %%rdx\n"
14583         "movq    56(%%rsi), %%rax\n"
14584         "addq    %%rcx, 48(%%rdi)\n"
14585         "adcq    $0, %%rdx\n"
14586         "movq    %%rdx, %%rcx\n"
14587         "mulq    %[mult]\n"
14588         "addq    %%rax, %%rcx\n"
14589         "adcq    $0, %%rdx\n"
14590         "movq    64(%%rsi), %%rax\n"
14591         "addq    %%rcx, 56(%%rdi)\n"
14592         "adcq    $0, %%rdx\n"
14593         "movq    %%rdx, %%rcx\n"
14594         "mulq    %[mult]\n"
14595         "addq    %%rax, %%rcx\n"
14596         "adcq    $0, %%rdx\n"
14597         "movq    72(%%rsi), %%rax\n"
14598         "addq    %%rcx, 64(%%rdi)\n"
14599         "adcq    $0, %%rdx\n"
14600         "movq    %%rdx, %%rcx\n"
14601         "mulq    %[mult]\n"
14602         "addq    %%rax, %%rcx\n"
14603         "adcq    $0, %%rdx\n"
14604         "movq    80(%%rsi), %%rax\n"
14605         "addq    %%rcx, 72(%%rdi)\n"
14606         "adcq    $0, %%rdx\n"
14607         "movq    %%rdx, %%rcx\n"
14608         "mulq    %[mult]\n"
14609         "addq    %%rax, %%rcx\n"
14610         "adcq    $0, %%rdx\n"
14611         "movq    88(%%rsi), %%rax\n"
14612         "addq    %%rcx, 80(%%rdi)\n"
14613         "adcq    $0, %%rdx\n"
14614         "movq    %%rdx, %%rcx\n"
14615         "mulq    %[mult]\n"
14616         "addq    %%rax, %%rcx\n"
14617         "adcq    $0, %%rdx\n"
14618         "movq    96(%%rsi), %%rax\n"
14619         "addq    %%rcx, 88(%%rdi)\n"
14620         "adcq    $0, %%rdx\n"
14621         "movq    %%rdx, %%rcx\n"
14622         "mulq    %[mult]\n"
14623         "addq    %%rax, %%rcx\n"
14624         "adcq    $0, %%rdx\n"
14625         "movq    104(%%rsi), %%rax\n"
14626         "addq    %%rcx, 96(%%rdi)\n"
14627         "adcq    $0, %%rdx\n"
14628         "movq    %%rdx, %%rcx\n"
14629         "mulq    %[mult]\n"
14630         "addq    %%rax, %%rcx\n"
14631         "adcq    $0, %%rdx\n"
14632         "movq    112(%%rsi), %%rax\n"
14633         "addq    %%rcx, 104(%%rdi)\n"
14634         "adcq    $0, %%rdx\n"
14635         "movq    %%rdx, %%rcx\n"
14636         "mulq    %[mult]\n"
14637         "addq    %%rax, %%rcx\n"
14638         "adcq    $0, %%rdx\n"
14639         "addq    %%rcx, 112(%%rdi)\n"
14640         "adcq    $0, %%rdx\n"
14641         "xorq    %%rcx, %%rcx\n"
14642         "addq    %%rdx, 120(%%rdi)\n"
14643         "adcq    $0, %%rcx\n"
14644         "movq    %%rcx, %[carry]\n"
14645     : [carry]"=g"(carry), [z] "+m" (z)
14646     : [mult] "r" (c), [x] "m" (x)
14647     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
14648     return carry;
14649 }
14650 
14651 /* x has 15 words, z has 17.
14652  * Put (z+x*c) in z. Carry bit is lost. */
14653 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
14654 static inline
mpfq_fixmp_15_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)14655 void mpfq_fixmp_15_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
14656 {
14657     __asm__ __volatile__(
14658         "movq    %[z], %%rdi\n"
14659         "movq    %[x], %%rsi\n"
14660         "movq    0(%%rsi), %%rax\n"
14661         "mulq    %[mult]\n"
14662         "addq    %%rax, 0(%%rdi)\n"
14663         "movq    8(%%rsi), %%rax\n"
14664         "adcq    $0, %%rdx\n"
14665         "movq    %%rdx, %%rcx\n"
14666         "mulq    %[mult]\n"
14667         "addq    %%rax, %%rcx\n"
14668         "adcq    $0, %%rdx\n"
14669         "movq    16(%%rsi), %%rax\n"
14670         "addq    %%rcx, 8(%%rdi)\n"
14671         "adcq    $0, %%rdx\n"
14672         "movq    %%rdx, %%rcx\n"
14673         "mulq    %[mult]\n"
14674         "addq    %%rax, %%rcx\n"
14675         "adcq    $0, %%rdx\n"
14676         "movq    24(%%rsi), %%rax\n"
14677         "addq    %%rcx, 16(%%rdi)\n"
14678         "adcq    $0, %%rdx\n"
14679         "movq    %%rdx, %%rcx\n"
14680         "mulq    %[mult]\n"
14681         "addq    %%rax, %%rcx\n"
14682         "adcq    $0, %%rdx\n"
14683         "movq    32(%%rsi), %%rax\n"
14684         "addq    %%rcx, 24(%%rdi)\n"
14685         "adcq    $0, %%rdx\n"
14686         "movq    %%rdx, %%rcx\n"
14687         "mulq    %[mult]\n"
14688         "addq    %%rax, %%rcx\n"
14689         "adcq    $0, %%rdx\n"
14690         "movq    40(%%rsi), %%rax\n"
14691         "addq    %%rcx, 32(%%rdi)\n"
14692         "adcq    $0, %%rdx\n"
14693         "movq    %%rdx, %%rcx\n"
14694         "mulq    %[mult]\n"
14695         "addq    %%rax, %%rcx\n"
14696         "adcq    $0, %%rdx\n"
14697         "movq    48(%%rsi), %%rax\n"
14698         "addq    %%rcx, 40(%%rdi)\n"
14699         "adcq    $0, %%rdx\n"
14700         "movq    %%rdx, %%rcx\n"
14701         "mulq    %[mult]\n"
14702         "addq    %%rax, %%rcx\n"
14703         "adcq    $0, %%rdx\n"
14704         "movq    56(%%rsi), %%rax\n"
14705         "addq    %%rcx, 48(%%rdi)\n"
14706         "adcq    $0, %%rdx\n"
14707         "movq    %%rdx, %%rcx\n"
14708         "mulq    %[mult]\n"
14709         "addq    %%rax, %%rcx\n"
14710         "adcq    $0, %%rdx\n"
14711         "movq    64(%%rsi), %%rax\n"
14712         "addq    %%rcx, 56(%%rdi)\n"
14713         "adcq    $0, %%rdx\n"
14714         "movq    %%rdx, %%rcx\n"
14715         "mulq    %[mult]\n"
14716         "addq    %%rax, %%rcx\n"
14717         "adcq    $0, %%rdx\n"
14718         "movq    72(%%rsi), %%rax\n"
14719         "addq    %%rcx, 64(%%rdi)\n"
14720         "adcq    $0, %%rdx\n"
14721         "movq    %%rdx, %%rcx\n"
14722         "mulq    %[mult]\n"
14723         "addq    %%rax, %%rcx\n"
14724         "adcq    $0, %%rdx\n"
14725         "movq    80(%%rsi), %%rax\n"
14726         "addq    %%rcx, 72(%%rdi)\n"
14727         "adcq    $0, %%rdx\n"
14728         "movq    %%rdx, %%rcx\n"
14729         "mulq    %[mult]\n"
14730         "addq    %%rax, %%rcx\n"
14731         "adcq    $0, %%rdx\n"
14732         "movq    88(%%rsi), %%rax\n"
14733         "addq    %%rcx, 80(%%rdi)\n"
14734         "adcq    $0, %%rdx\n"
14735         "movq    %%rdx, %%rcx\n"
14736         "mulq    %[mult]\n"
14737         "addq    %%rax, %%rcx\n"
14738         "adcq    $0, %%rdx\n"
14739         "movq    96(%%rsi), %%rax\n"
14740         "addq    %%rcx, 88(%%rdi)\n"
14741         "adcq    $0, %%rdx\n"
14742         "movq    %%rdx, %%rcx\n"
14743         "mulq    %[mult]\n"
14744         "addq    %%rax, %%rcx\n"
14745         "adcq    $0, %%rdx\n"
14746         "movq    104(%%rsi), %%rax\n"
14747         "addq    %%rcx, 96(%%rdi)\n"
14748         "adcq    $0, %%rdx\n"
14749         "movq    %%rdx, %%rcx\n"
14750         "mulq    %[mult]\n"
14751         "addq    %%rax, %%rcx\n"
14752         "adcq    $0, %%rdx\n"
14753         "movq    112(%%rsi), %%rax\n"
14754         "addq    %%rcx, 104(%%rdi)\n"
14755         "adcq    $0, %%rdx\n"
14756         "movq    %%rdx, %%rcx\n"
14757         "mulq    %[mult]\n"
14758         "addq    %%rax, %%rcx\n"
14759         "adcq    $0, %%rdx\n"
14760         "addq    %%rcx, 112(%%rdi)\n"
14761         "adcq    $0, %%rdx\n"
14762         "addq    %%rdx, 120(%%rdi)\n"
14763     : [z] "+m" (z)
14764     : [mult] "r" (c), [x] "m" (x)
14765     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
14766 }
14767 
14768 /* x has 15 words, z has 16.
14769  * Put (z+x*c) in z. Return carry word. */
14770 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
14771 static inline
mpfq_fixmp_15_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)14772 mp_limb_t mpfq_fixmp_15_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
14773 {
14774     mp_limb_t carry;
14775     __asm__ __volatile__(
14776         "movq    %[z], %%rdi\n"
14777         "movq    %[x], %%rsi\n"
14778         "movq    0(%%rsi), %%rax\n"
14779         "mulq    %[mult]\n"
14780         "addq    %%rax, 0(%%rdi)\n"
14781         "movq    8(%%rsi), %%rax\n"
14782         "adcq    $0, %%rdx\n"
14783         "movq    %%rdx, %%rcx\n"
14784         "mulq    %[mult]\n"
14785         "addq    %%rax, %%rcx\n"
14786         "adcq    $0, %%rdx\n"
14787         "movq    16(%%rsi), %%rax\n"
14788         "addq    %%rcx, 8(%%rdi)\n"
14789         "adcq    $0, %%rdx\n"
14790         "movq    %%rdx, %%rcx\n"
14791         "mulq    %[mult]\n"
14792         "addq    %%rax, %%rcx\n"
14793         "adcq    $0, %%rdx\n"
14794         "movq    24(%%rsi), %%rax\n"
14795         "addq    %%rcx, 16(%%rdi)\n"
14796         "adcq    $0, %%rdx\n"
14797         "movq    %%rdx, %%rcx\n"
14798         "mulq    %[mult]\n"
14799         "addq    %%rax, %%rcx\n"
14800         "adcq    $0, %%rdx\n"
14801         "movq    32(%%rsi), %%rax\n"
14802         "addq    %%rcx, 24(%%rdi)\n"
14803         "adcq    $0, %%rdx\n"
14804         "movq    %%rdx, %%rcx\n"
14805         "mulq    %[mult]\n"
14806         "addq    %%rax, %%rcx\n"
14807         "adcq    $0, %%rdx\n"
14808         "movq    40(%%rsi), %%rax\n"
14809         "addq    %%rcx, 32(%%rdi)\n"
14810         "adcq    $0, %%rdx\n"
14811         "movq    %%rdx, %%rcx\n"
14812         "mulq    %[mult]\n"
14813         "addq    %%rax, %%rcx\n"
14814         "adcq    $0, %%rdx\n"
14815         "movq    48(%%rsi), %%rax\n"
14816         "addq    %%rcx, 40(%%rdi)\n"
14817         "adcq    $0, %%rdx\n"
14818         "movq    %%rdx, %%rcx\n"
14819         "mulq    %[mult]\n"
14820         "addq    %%rax, %%rcx\n"
14821         "adcq    $0, %%rdx\n"
14822         "movq    56(%%rsi), %%rax\n"
14823         "addq    %%rcx, 48(%%rdi)\n"
14824         "adcq    $0, %%rdx\n"
14825         "movq    %%rdx, %%rcx\n"
14826         "mulq    %[mult]\n"
14827         "addq    %%rax, %%rcx\n"
14828         "adcq    $0, %%rdx\n"
14829         "movq    64(%%rsi), %%rax\n"
14830         "addq    %%rcx, 56(%%rdi)\n"
14831         "adcq    $0, %%rdx\n"
14832         "movq    %%rdx, %%rcx\n"
14833         "mulq    %[mult]\n"
14834         "addq    %%rax, %%rcx\n"
14835         "adcq    $0, %%rdx\n"
14836         "movq    72(%%rsi), %%rax\n"
14837         "addq    %%rcx, 64(%%rdi)\n"
14838         "adcq    $0, %%rdx\n"
14839         "movq    %%rdx, %%rcx\n"
14840         "mulq    %[mult]\n"
14841         "addq    %%rax, %%rcx\n"
14842         "adcq    $0, %%rdx\n"
14843         "movq    80(%%rsi), %%rax\n"
14844         "addq    %%rcx, 72(%%rdi)\n"
14845         "adcq    $0, %%rdx\n"
14846         "movq    %%rdx, %%rcx\n"
14847         "mulq    %[mult]\n"
14848         "addq    %%rax, %%rcx\n"
14849         "adcq    $0, %%rdx\n"
14850         "movq    88(%%rsi), %%rax\n"
14851         "addq    %%rcx, 80(%%rdi)\n"
14852         "adcq    $0, %%rdx\n"
14853         "movq    %%rdx, %%rcx\n"
14854         "mulq    %[mult]\n"
14855         "addq    %%rax, %%rcx\n"
14856         "adcq    $0, %%rdx\n"
14857         "movq    96(%%rsi), %%rax\n"
14858         "addq    %%rcx, 88(%%rdi)\n"
14859         "adcq    $0, %%rdx\n"
14860         "movq    %%rdx, %%rcx\n"
14861         "mulq    %[mult]\n"
14862         "addq    %%rax, %%rcx\n"
14863         "adcq    $0, %%rdx\n"
14864         "movq    104(%%rsi), %%rax\n"
14865         "addq    %%rcx, 96(%%rdi)\n"
14866         "adcq    $0, %%rdx\n"
14867         "movq    %%rdx, %%rcx\n"
14868         "mulq    %[mult]\n"
14869         "addq    %%rax, %%rcx\n"
14870         "adcq    $0, %%rdx\n"
14871         "movq    112(%%rsi), %%rax\n"
14872         "addq    %%rcx, 104(%%rdi)\n"
14873         "adcq    $0, %%rdx\n"
14874         "movq    %%rdx, %%rcx\n"
14875         "mulq    %[mult]\n"
14876         "addq    %%rax, %%rcx\n"
14877         "adcq    $0, %%rdx\n"
14878         "addq    %%rcx, 112(%%rdi)\n"
14879         "adcq    $0, %%rdx\n"
14880         "movq    %%rdx, %[carry]\n"
14881     : [carry]"=g"(carry), [z] "+m" (z)
14882     : [mult] "r" (c), [x] "m" (x)
14883     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
14884     return carry;
14885 }
14886 
14887 /* x and y have 15 words, z has 32. Put x*y in z. */
14888 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
14889 static inline
mpfq_fixmp_15_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)14890 void mpfq_fixmp_15_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
14891 {
14892     __asm__ __volatile__(
14893         "### x*y[0]\n"
14894         "movq    %2, %%r8\n"
14895         "movq    %0, %%rdi\n"
14896         "movq    0(%%r8), %%r9\n"
14897         "movq    %1, %%rsi\n"
14898         "movq    0(%%rsi), %%rax\n"
14899         "mulq    %%r9\n"
14900         "movq    %%rax, 0(%%rdi)\n"
14901         "movq    8(%%rsi), %%rax\n"
14902         "movq    %%rdx, %%rcx\n"
14903         "mulq    %%r9\n"
14904         "addq    %%rax, %%rcx\n"
14905         "adcq    $0, %%rdx\n"
14906         "movq    16(%%rsi), %%rax\n"
14907         "movq    %%rcx, 8(%%rdi)\n"
14908         "movq    %%rdx, %%rcx\n"
14909         "mulq    %%r9\n"
14910         "addq    %%rax, %%rcx\n"
14911         "adcq    $0, %%rdx\n"
14912         "movq    24(%%rsi), %%rax\n"
14913         "movq    %%rcx, 16(%%rdi)\n"
14914         "movq    %%rdx, %%rcx\n"
14915         "mulq    %%r9\n"
14916         "addq    %%rax, %%rcx\n"
14917         "adcq    $0, %%rdx\n"
14918         "movq    32(%%rsi), %%rax\n"
14919         "movq    %%rcx, 24(%%rdi)\n"
14920         "movq    %%rdx, %%rcx\n"
14921         "mulq    %%r9\n"
14922         "addq    %%rax, %%rcx\n"
14923         "adcq    $0, %%rdx\n"
14924         "movq    40(%%rsi), %%rax\n"
14925         "movq    %%rcx, 32(%%rdi)\n"
14926         "movq    %%rdx, %%rcx\n"
14927         "mulq    %%r9\n"
14928         "addq    %%rax, %%rcx\n"
14929         "adcq    $0, %%rdx\n"
14930         "movq    48(%%rsi), %%rax\n"
14931         "movq    %%rcx, 40(%%rdi)\n"
14932         "movq    %%rdx, %%rcx\n"
14933         "mulq    %%r9\n"
14934         "addq    %%rax, %%rcx\n"
14935         "adcq    $0, %%rdx\n"
14936         "movq    56(%%rsi), %%rax\n"
14937         "movq    %%rcx, 48(%%rdi)\n"
14938         "movq    %%rdx, %%rcx\n"
14939         "mulq    %%r9\n"
14940         "addq    %%rax, %%rcx\n"
14941         "adcq    $0, %%rdx\n"
14942         "movq    64(%%rsi), %%rax\n"
14943         "movq    %%rcx, 56(%%rdi)\n"
14944         "movq    %%rdx, %%rcx\n"
14945         "mulq    %%r9\n"
14946         "addq    %%rax, %%rcx\n"
14947         "adcq    $0, %%rdx\n"
14948         "movq    72(%%rsi), %%rax\n"
14949         "movq    %%rcx, 64(%%rdi)\n"
14950         "movq    %%rdx, %%rcx\n"
14951         "mulq    %%r9\n"
14952         "addq    %%rax, %%rcx\n"
14953         "adcq    $0, %%rdx\n"
14954         "movq    80(%%rsi), %%rax\n"
14955         "movq    %%rcx, 72(%%rdi)\n"
14956         "movq    %%rdx, %%rcx\n"
14957         "mulq    %%r9\n"
14958         "addq    %%rax, %%rcx\n"
14959         "adcq    $0, %%rdx\n"
14960         "movq    88(%%rsi), %%rax\n"
14961         "movq    %%rcx, 80(%%rdi)\n"
14962         "movq    %%rdx, %%rcx\n"
14963         "mulq    %%r9\n"
14964         "addq    %%rax, %%rcx\n"
14965         "adcq    $0, %%rdx\n"
14966         "movq    96(%%rsi), %%rax\n"
14967         "movq    %%rcx, 88(%%rdi)\n"
14968         "movq    %%rdx, %%rcx\n"
14969         "mulq    %%r9\n"
14970         "addq    %%rax, %%rcx\n"
14971         "adcq    $0, %%rdx\n"
14972         "movq    104(%%rsi), %%rax\n"
14973         "movq    %%rcx, 96(%%rdi)\n"
14974         "movq    %%rdx, %%rcx\n"
14975         "mulq    %%r9\n"
14976         "addq    %%rax, %%rcx\n"
14977         "adcq    $0, %%rdx\n"
14978         "movq    112(%%rsi), %%rax\n"
14979         "movq    %%rcx, 104(%%rdi)\n"
14980         "movq    %%rdx, %%rcx\n"
14981         "mulq    %%r9\n"
14982         "addq    %%rax, %%rcx\n"
14983         "adcq    $0, %%rdx\n"
14984         "movq    %%rcx, 112(%%rdi)\n"
14985         "movq    %%rdx, 120(%%rdi)\n"
14986         "movq    $0, 128(%%rdi)\n"
14987         "movq    $0, 136(%%rdi)\n"
14988         "movq    $0, 144(%%rdi)\n"
14989         "movq    $0, 152(%%rdi)\n"
14990         "movq    $0, 160(%%rdi)\n"
14991         "movq    $0, 168(%%rdi)\n"
14992         "movq    $0, 176(%%rdi)\n"
14993         "movq    $0, 184(%%rdi)\n"
14994         "movq    $0, 192(%%rdi)\n"
14995         "movq    $0, 200(%%rdi)\n"
14996         "movq    $0, 208(%%rdi)\n"
14997         "movq    $0, 216(%%rdi)\n"
14998         "movq    $0, 224(%%rdi)\n"
14999         "movq    $0, 232(%%rdi)\n"
15000         "### x*y[1]\n"
15001         "movq    8(%%r8), %%r9\n"
15002         "movq    0(%%rsi), %%rax\n"
15003         "mulq    %%r9\n"
15004         "addq    %%rax, 8(%%rdi)\n"
15005         "movq    8(%%rsi), %%rax\n"
15006         "adcq    $0, %%rdx\n"
15007         "movq    %%rdx, %%rcx\n"
15008         "mulq    %%r9\n"
15009         "addq    %%rax, %%rcx\n"
15010         "adcq    $0, %%rdx\n"
15011         "movq    16(%%rsi), %%rax\n"
15012         "addq    %%rcx, 16(%%rdi)\n"
15013         "adcq    $0, %%rdx\n"
15014         "movq    %%rdx, %%rcx\n"
15015         "mulq    %%r9\n"
15016         "addq    %%rax, %%rcx\n"
15017         "adcq    $0, %%rdx\n"
15018         "movq    24(%%rsi), %%rax\n"
15019         "addq    %%rcx, 24(%%rdi)\n"
15020         "adcq    $0, %%rdx\n"
15021         "movq    %%rdx, %%rcx\n"
15022         "mulq    %%r9\n"
15023         "addq    %%rax, %%rcx\n"
15024         "adcq    $0, %%rdx\n"
15025         "movq    32(%%rsi), %%rax\n"
15026         "addq    %%rcx, 32(%%rdi)\n"
15027         "adcq    $0, %%rdx\n"
15028         "movq    %%rdx, %%rcx\n"
15029         "mulq    %%r9\n"
15030         "addq    %%rax, %%rcx\n"
15031         "adcq    $0, %%rdx\n"
15032         "movq    40(%%rsi), %%rax\n"
15033         "addq    %%rcx, 40(%%rdi)\n"
15034         "adcq    $0, %%rdx\n"
15035         "movq    %%rdx, %%rcx\n"
15036         "mulq    %%r9\n"
15037         "addq    %%rax, %%rcx\n"
15038         "adcq    $0, %%rdx\n"
15039         "movq    48(%%rsi), %%rax\n"
15040         "addq    %%rcx, 48(%%rdi)\n"
15041         "adcq    $0, %%rdx\n"
15042         "movq    %%rdx, %%rcx\n"
15043         "mulq    %%r9\n"
15044         "addq    %%rax, %%rcx\n"
15045         "adcq    $0, %%rdx\n"
15046         "movq    56(%%rsi), %%rax\n"
15047         "addq    %%rcx, 56(%%rdi)\n"
15048         "adcq    $0, %%rdx\n"
15049         "movq    %%rdx, %%rcx\n"
15050         "mulq    %%r9\n"
15051         "addq    %%rax, %%rcx\n"
15052         "adcq    $0, %%rdx\n"
15053         "movq    64(%%rsi), %%rax\n"
15054         "addq    %%rcx, 64(%%rdi)\n"
15055         "adcq    $0, %%rdx\n"
15056         "movq    %%rdx, %%rcx\n"
15057         "mulq    %%r9\n"
15058         "addq    %%rax, %%rcx\n"
15059         "adcq    $0, %%rdx\n"
15060         "movq    72(%%rsi), %%rax\n"
15061         "addq    %%rcx, 72(%%rdi)\n"
15062         "adcq    $0, %%rdx\n"
15063         "movq    %%rdx, %%rcx\n"
15064         "mulq    %%r9\n"
15065         "addq    %%rax, %%rcx\n"
15066         "adcq    $0, %%rdx\n"
15067         "movq    80(%%rsi), %%rax\n"
15068         "addq    %%rcx, 80(%%rdi)\n"
15069         "adcq    $0, %%rdx\n"
15070         "movq    %%rdx, %%rcx\n"
15071         "mulq    %%r9\n"
15072         "addq    %%rax, %%rcx\n"
15073         "adcq    $0, %%rdx\n"
15074         "movq    88(%%rsi), %%rax\n"
15075         "addq    %%rcx, 88(%%rdi)\n"
15076         "adcq    $0, %%rdx\n"
15077         "movq    %%rdx, %%rcx\n"
15078         "mulq    %%r9\n"
15079         "addq    %%rax, %%rcx\n"
15080         "adcq    $0, %%rdx\n"
15081         "movq    96(%%rsi), %%rax\n"
15082         "addq    %%rcx, 96(%%rdi)\n"
15083         "adcq    $0, %%rdx\n"
15084         "movq    %%rdx, %%rcx\n"
15085         "mulq    %%r9\n"
15086         "addq    %%rax, %%rcx\n"
15087         "adcq    $0, %%rdx\n"
15088         "movq    104(%%rsi), %%rax\n"
15089         "addq    %%rcx, 104(%%rdi)\n"
15090         "adcq    $0, %%rdx\n"
15091         "movq    %%rdx, %%rcx\n"
15092         "mulq    %%r9\n"
15093         "addq    %%rax, %%rcx\n"
15094         "adcq    $0, %%rdx\n"
15095         "movq    112(%%rsi), %%rax\n"
15096         "addq    %%rcx, 112(%%rdi)\n"
15097         "adcq    $0, %%rdx\n"
15098         "movq    %%rdx, %%rcx\n"
15099         "mulq    %%r9\n"
15100         "addq    %%rax, %%rcx\n"
15101         "adcq    $0, %%rdx\n"
15102         "addq    %%rcx, 120(%%rdi)\n"
15103         "adcq    $0, %%rdx\n"
15104         "movq    %%rdx, 128(%%rdi)\n"
15105         "### x*y[2]\n"
15106         "movq    16(%%r8), %%r9\n"
15107         "movq    0(%%rsi), %%rax\n"
15108         "mulq    %%r9\n"
15109         "addq    %%rax, 16(%%rdi)\n"
15110         "movq    8(%%rsi), %%rax\n"
15111         "adcq    $0, %%rdx\n"
15112         "movq    %%rdx, %%rcx\n"
15113         "mulq    %%r9\n"
15114         "addq    %%rax, %%rcx\n"
15115         "adcq    $0, %%rdx\n"
15116         "movq    16(%%rsi), %%rax\n"
15117         "addq    %%rcx, 24(%%rdi)\n"
15118         "adcq    $0, %%rdx\n"
15119         "movq    %%rdx, %%rcx\n"
15120         "mulq    %%r9\n"
15121         "addq    %%rax, %%rcx\n"
15122         "adcq    $0, %%rdx\n"
15123         "movq    24(%%rsi), %%rax\n"
15124         "addq    %%rcx, 32(%%rdi)\n"
15125         "adcq    $0, %%rdx\n"
15126         "movq    %%rdx, %%rcx\n"
15127         "mulq    %%r9\n"
15128         "addq    %%rax, %%rcx\n"
15129         "adcq    $0, %%rdx\n"
15130         "movq    32(%%rsi), %%rax\n"
15131         "addq    %%rcx, 40(%%rdi)\n"
15132         "adcq    $0, %%rdx\n"
15133         "movq    %%rdx, %%rcx\n"
15134         "mulq    %%r9\n"
15135         "addq    %%rax, %%rcx\n"
15136         "adcq    $0, %%rdx\n"
15137         "movq    40(%%rsi), %%rax\n"
15138         "addq    %%rcx, 48(%%rdi)\n"
15139         "adcq    $0, %%rdx\n"
15140         "movq    %%rdx, %%rcx\n"
15141         "mulq    %%r9\n"
15142         "addq    %%rax, %%rcx\n"
15143         "adcq    $0, %%rdx\n"
15144         "movq    48(%%rsi), %%rax\n"
15145         "addq    %%rcx, 56(%%rdi)\n"
15146         "adcq    $0, %%rdx\n"
15147         "movq    %%rdx, %%rcx\n"
15148         "mulq    %%r9\n"
15149         "addq    %%rax, %%rcx\n"
15150         "adcq    $0, %%rdx\n"
15151         "movq    56(%%rsi), %%rax\n"
15152         "addq    %%rcx, 64(%%rdi)\n"
15153         "adcq    $0, %%rdx\n"
15154         "movq    %%rdx, %%rcx\n"
15155         "mulq    %%r9\n"
15156         "addq    %%rax, %%rcx\n"
15157         "adcq    $0, %%rdx\n"
15158         "movq    64(%%rsi), %%rax\n"
15159         "addq    %%rcx, 72(%%rdi)\n"
15160         "adcq    $0, %%rdx\n"
15161         "movq    %%rdx, %%rcx\n"
15162         "mulq    %%r9\n"
15163         "addq    %%rax, %%rcx\n"
15164         "adcq    $0, %%rdx\n"
15165         "movq    72(%%rsi), %%rax\n"
15166         "addq    %%rcx, 80(%%rdi)\n"
15167         "adcq    $0, %%rdx\n"
15168         "movq    %%rdx, %%rcx\n"
15169         "mulq    %%r9\n"
15170         "addq    %%rax, %%rcx\n"
15171         "adcq    $0, %%rdx\n"
15172         "movq    80(%%rsi), %%rax\n"
15173         "addq    %%rcx, 88(%%rdi)\n"
15174         "adcq    $0, %%rdx\n"
15175         "movq    %%rdx, %%rcx\n"
15176         "mulq    %%r9\n"
15177         "addq    %%rax, %%rcx\n"
15178         "adcq    $0, %%rdx\n"
15179         "movq    88(%%rsi), %%rax\n"
15180         "addq    %%rcx, 96(%%rdi)\n"
15181         "adcq    $0, %%rdx\n"
15182         "movq    %%rdx, %%rcx\n"
15183         "mulq    %%r9\n"
15184         "addq    %%rax, %%rcx\n"
15185         "adcq    $0, %%rdx\n"
15186         "movq    96(%%rsi), %%rax\n"
15187         "addq    %%rcx, 104(%%rdi)\n"
15188         "adcq    $0, %%rdx\n"
15189         "movq    %%rdx, %%rcx\n"
15190         "mulq    %%r9\n"
15191         "addq    %%rax, %%rcx\n"
15192         "adcq    $0, %%rdx\n"
15193         "movq    104(%%rsi), %%rax\n"
15194         "addq    %%rcx, 112(%%rdi)\n"
15195         "adcq    $0, %%rdx\n"
15196         "movq    %%rdx, %%rcx\n"
15197         "mulq    %%r9\n"
15198         "addq    %%rax, %%rcx\n"
15199         "adcq    $0, %%rdx\n"
15200         "movq    112(%%rsi), %%rax\n"
15201         "addq    %%rcx, 120(%%rdi)\n"
15202         "adcq    $0, %%rdx\n"
15203         "movq    %%rdx, %%rcx\n"
15204         "mulq    %%r9\n"
15205         "addq    %%rax, %%rcx\n"
15206         "adcq    $0, %%rdx\n"
15207         "addq    %%rcx, 128(%%rdi)\n"
15208         "adcq    $0, %%rdx\n"
15209         "movq    %%rdx, 136(%%rdi)\n"
15210         "### x*y[3]\n"
15211         "movq    24(%%r8), %%r9\n"
15212         "movq    0(%%rsi), %%rax\n"
15213         "mulq    %%r9\n"
15214         "addq    %%rax, 24(%%rdi)\n"
15215         "movq    8(%%rsi), %%rax\n"
15216         "adcq    $0, %%rdx\n"
15217         "movq    %%rdx, %%rcx\n"
15218         "mulq    %%r9\n"
15219         "addq    %%rax, %%rcx\n"
15220         "adcq    $0, %%rdx\n"
15221         "movq    16(%%rsi), %%rax\n"
15222         "addq    %%rcx, 32(%%rdi)\n"
15223         "adcq    $0, %%rdx\n"
15224         "movq    %%rdx, %%rcx\n"
15225         "mulq    %%r9\n"
15226         "addq    %%rax, %%rcx\n"
15227         "adcq    $0, %%rdx\n"
15228         "movq    24(%%rsi), %%rax\n"
15229         "addq    %%rcx, 40(%%rdi)\n"
15230         "adcq    $0, %%rdx\n"
15231         "movq    %%rdx, %%rcx\n"
15232         "mulq    %%r9\n"
15233         "addq    %%rax, %%rcx\n"
15234         "adcq    $0, %%rdx\n"
15235         "movq    32(%%rsi), %%rax\n"
15236         "addq    %%rcx, 48(%%rdi)\n"
15237         "adcq    $0, %%rdx\n"
15238         "movq    %%rdx, %%rcx\n"
15239         "mulq    %%r9\n"
15240         "addq    %%rax, %%rcx\n"
15241         "adcq    $0, %%rdx\n"
15242         "movq    40(%%rsi), %%rax\n"
15243         "addq    %%rcx, 56(%%rdi)\n"
15244         "adcq    $0, %%rdx\n"
15245         "movq    %%rdx, %%rcx\n"
15246         "mulq    %%r9\n"
15247         "addq    %%rax, %%rcx\n"
15248         "adcq    $0, %%rdx\n"
15249         "movq    48(%%rsi), %%rax\n"
15250         "addq    %%rcx, 64(%%rdi)\n"
15251         "adcq    $0, %%rdx\n"
15252         "movq    %%rdx, %%rcx\n"
15253         "mulq    %%r9\n"
15254         "addq    %%rax, %%rcx\n"
15255         "adcq    $0, %%rdx\n"
15256         "movq    56(%%rsi), %%rax\n"
15257         "addq    %%rcx, 72(%%rdi)\n"
15258         "adcq    $0, %%rdx\n"
15259         "movq    %%rdx, %%rcx\n"
15260         "mulq    %%r9\n"
15261         "addq    %%rax, %%rcx\n"
15262         "adcq    $0, %%rdx\n"
15263         "movq    64(%%rsi), %%rax\n"
15264         "addq    %%rcx, 80(%%rdi)\n"
15265         "adcq    $0, %%rdx\n"
15266         "movq    %%rdx, %%rcx\n"
15267         "mulq    %%r9\n"
15268         "addq    %%rax, %%rcx\n"
15269         "adcq    $0, %%rdx\n"
15270         "movq    72(%%rsi), %%rax\n"
15271         "addq    %%rcx, 88(%%rdi)\n"
15272         "adcq    $0, %%rdx\n"
15273         "movq    %%rdx, %%rcx\n"
15274         "mulq    %%r9\n"
15275         "addq    %%rax, %%rcx\n"
15276         "adcq    $0, %%rdx\n"
15277         "movq    80(%%rsi), %%rax\n"
15278         "addq    %%rcx, 96(%%rdi)\n"
15279         "adcq    $0, %%rdx\n"
15280         "movq    %%rdx, %%rcx\n"
15281         "mulq    %%r9\n"
15282         "addq    %%rax, %%rcx\n"
15283         "adcq    $0, %%rdx\n"
15284         "movq    88(%%rsi), %%rax\n"
15285         "addq    %%rcx, 104(%%rdi)\n"
15286         "adcq    $0, %%rdx\n"
15287         "movq    %%rdx, %%rcx\n"
15288         "mulq    %%r9\n"
15289         "addq    %%rax, %%rcx\n"
15290         "adcq    $0, %%rdx\n"
15291         "movq    96(%%rsi), %%rax\n"
15292         "addq    %%rcx, 112(%%rdi)\n"
15293         "adcq    $0, %%rdx\n"
15294         "movq    %%rdx, %%rcx\n"
15295         "mulq    %%r9\n"
15296         "addq    %%rax, %%rcx\n"
15297         "adcq    $0, %%rdx\n"
15298         "movq    104(%%rsi), %%rax\n"
15299         "addq    %%rcx, 120(%%rdi)\n"
15300         "adcq    $0, %%rdx\n"
15301         "movq    %%rdx, %%rcx\n"
15302         "mulq    %%r9\n"
15303         "addq    %%rax, %%rcx\n"
15304         "adcq    $0, %%rdx\n"
15305         "movq    112(%%rsi), %%rax\n"
15306         "addq    %%rcx, 128(%%rdi)\n"
15307         "adcq    $0, %%rdx\n"
15308         "movq    %%rdx, %%rcx\n"
15309         "mulq    %%r9\n"
15310         "addq    %%rax, %%rcx\n"
15311         "adcq    $0, %%rdx\n"
15312         "addq    %%rcx, 136(%%rdi)\n"
15313         "adcq    $0, %%rdx\n"
15314         "movq    %%rdx, 144(%%rdi)\n"
15315         "### x*y[4]\n"
15316         "movq    32(%%r8), %%r9\n"
15317         "movq    0(%%rsi), %%rax\n"
15318         "mulq    %%r9\n"
15319         "addq    %%rax, 32(%%rdi)\n"
15320         "movq    8(%%rsi), %%rax\n"
15321         "adcq    $0, %%rdx\n"
15322         "movq    %%rdx, %%rcx\n"
15323         "mulq    %%r9\n"
15324         "addq    %%rax, %%rcx\n"
15325         "adcq    $0, %%rdx\n"
15326         "movq    16(%%rsi), %%rax\n"
15327         "addq    %%rcx, 40(%%rdi)\n"
15328         "adcq    $0, %%rdx\n"
15329         "movq    %%rdx, %%rcx\n"
15330         "mulq    %%r9\n"
15331         "addq    %%rax, %%rcx\n"
15332         "adcq    $0, %%rdx\n"
15333         "movq    24(%%rsi), %%rax\n"
15334         "addq    %%rcx, 48(%%rdi)\n"
15335         "adcq    $0, %%rdx\n"
15336         "movq    %%rdx, %%rcx\n"
15337         "mulq    %%r9\n"
15338         "addq    %%rax, %%rcx\n"
15339         "adcq    $0, %%rdx\n"
15340         "movq    32(%%rsi), %%rax\n"
15341         "addq    %%rcx, 56(%%rdi)\n"
15342         "adcq    $0, %%rdx\n"
15343         "movq    %%rdx, %%rcx\n"
15344         "mulq    %%r9\n"
15345         "addq    %%rax, %%rcx\n"
15346         "adcq    $0, %%rdx\n"
15347         "movq    40(%%rsi), %%rax\n"
15348         "addq    %%rcx, 64(%%rdi)\n"
15349         "adcq    $0, %%rdx\n"
15350         "movq    %%rdx, %%rcx\n"
15351         "mulq    %%r9\n"
15352         "addq    %%rax, %%rcx\n"
15353         "adcq    $0, %%rdx\n"
15354         "movq    48(%%rsi), %%rax\n"
15355         "addq    %%rcx, 72(%%rdi)\n"
15356         "adcq    $0, %%rdx\n"
15357         "movq    %%rdx, %%rcx\n"
15358         "mulq    %%r9\n"
15359         "addq    %%rax, %%rcx\n"
15360         "adcq    $0, %%rdx\n"
15361         "movq    56(%%rsi), %%rax\n"
15362         "addq    %%rcx, 80(%%rdi)\n"
15363         "adcq    $0, %%rdx\n"
15364         "movq    %%rdx, %%rcx\n"
15365         "mulq    %%r9\n"
15366         "addq    %%rax, %%rcx\n"
15367         "adcq    $0, %%rdx\n"
15368         "movq    64(%%rsi), %%rax\n"
15369         "addq    %%rcx, 88(%%rdi)\n"
15370         "adcq    $0, %%rdx\n"
15371         "movq    %%rdx, %%rcx\n"
15372         "mulq    %%r9\n"
15373         "addq    %%rax, %%rcx\n"
15374         "adcq    $0, %%rdx\n"
15375         "movq    72(%%rsi), %%rax\n"
15376         "addq    %%rcx, 96(%%rdi)\n"
15377         "adcq    $0, %%rdx\n"
15378         "movq    %%rdx, %%rcx\n"
15379         "mulq    %%r9\n"
15380         "addq    %%rax, %%rcx\n"
15381         "adcq    $0, %%rdx\n"
15382         "movq    80(%%rsi), %%rax\n"
15383         "addq    %%rcx, 104(%%rdi)\n"
15384         "adcq    $0, %%rdx\n"
15385         "movq    %%rdx, %%rcx\n"
15386         "mulq    %%r9\n"
15387         "addq    %%rax, %%rcx\n"
15388         "adcq    $0, %%rdx\n"
15389         "movq    88(%%rsi), %%rax\n"
15390         "addq    %%rcx, 112(%%rdi)\n"
15391         "adcq    $0, %%rdx\n"
15392         "movq    %%rdx, %%rcx\n"
15393         "mulq    %%r9\n"
15394         "addq    %%rax, %%rcx\n"
15395         "adcq    $0, %%rdx\n"
15396         "movq    96(%%rsi), %%rax\n"
15397         "addq    %%rcx, 120(%%rdi)\n"
15398         "adcq    $0, %%rdx\n"
15399         "movq    %%rdx, %%rcx\n"
15400         "mulq    %%r9\n"
15401         "addq    %%rax, %%rcx\n"
15402         "adcq    $0, %%rdx\n"
15403         "movq    104(%%rsi), %%rax\n"
15404         "addq    %%rcx, 128(%%rdi)\n"
15405         "adcq    $0, %%rdx\n"
15406         "movq    %%rdx, %%rcx\n"
15407         "mulq    %%r9\n"
15408         "addq    %%rax, %%rcx\n"
15409         "adcq    $0, %%rdx\n"
15410         "movq    112(%%rsi), %%rax\n"
15411         "addq    %%rcx, 136(%%rdi)\n"
15412         "adcq    $0, %%rdx\n"
15413         "movq    %%rdx, %%rcx\n"
15414         "mulq    %%r9\n"
15415         "addq    %%rax, %%rcx\n"
15416         "adcq    $0, %%rdx\n"
15417         "addq    %%rcx, 144(%%rdi)\n"
15418         "adcq    $0, %%rdx\n"
15419         "movq    %%rdx, 152(%%rdi)\n"
15420         "### x*y[5]\n"
15421         "movq    40(%%r8), %%r9\n"
15422         "movq    0(%%rsi), %%rax\n"
15423         "mulq    %%r9\n"
15424         "addq    %%rax, 40(%%rdi)\n"
15425         "movq    8(%%rsi), %%rax\n"
15426         "adcq    $0, %%rdx\n"
15427         "movq    %%rdx, %%rcx\n"
15428         "mulq    %%r9\n"
15429         "addq    %%rax, %%rcx\n"
15430         "adcq    $0, %%rdx\n"
15431         "movq    16(%%rsi), %%rax\n"
15432         "addq    %%rcx, 48(%%rdi)\n"
15433         "adcq    $0, %%rdx\n"
15434         "movq    %%rdx, %%rcx\n"
15435         "mulq    %%r9\n"
15436         "addq    %%rax, %%rcx\n"
15437         "adcq    $0, %%rdx\n"
15438         "movq    24(%%rsi), %%rax\n"
15439         "addq    %%rcx, 56(%%rdi)\n"
15440         "adcq    $0, %%rdx\n"
15441         "movq    %%rdx, %%rcx\n"
15442         "mulq    %%r9\n"
15443         "addq    %%rax, %%rcx\n"
15444         "adcq    $0, %%rdx\n"
15445         "movq    32(%%rsi), %%rax\n"
15446         "addq    %%rcx, 64(%%rdi)\n"
15447         "adcq    $0, %%rdx\n"
15448         "movq    %%rdx, %%rcx\n"
15449         "mulq    %%r9\n"
15450         "addq    %%rax, %%rcx\n"
15451         "adcq    $0, %%rdx\n"
15452         "movq    40(%%rsi), %%rax\n"
15453         "addq    %%rcx, 72(%%rdi)\n"
15454         "adcq    $0, %%rdx\n"
15455         "movq    %%rdx, %%rcx\n"
15456         "mulq    %%r9\n"
15457         "addq    %%rax, %%rcx\n"
15458         "adcq    $0, %%rdx\n"
15459         "movq    48(%%rsi), %%rax\n"
15460         "addq    %%rcx, 80(%%rdi)\n"
15461         "adcq    $0, %%rdx\n"
15462         "movq    %%rdx, %%rcx\n"
15463         "mulq    %%r9\n"
15464         "addq    %%rax, %%rcx\n"
15465         "adcq    $0, %%rdx\n"
15466         "movq    56(%%rsi), %%rax\n"
15467         "addq    %%rcx, 88(%%rdi)\n"
15468         "adcq    $0, %%rdx\n"
15469         "movq    %%rdx, %%rcx\n"
15470         "mulq    %%r9\n"
15471         "addq    %%rax, %%rcx\n"
15472         "adcq    $0, %%rdx\n"
15473         "movq    64(%%rsi), %%rax\n"
15474         "addq    %%rcx, 96(%%rdi)\n"
15475         "adcq    $0, %%rdx\n"
15476         "movq    %%rdx, %%rcx\n"
15477         "mulq    %%r9\n"
15478         "addq    %%rax, %%rcx\n"
15479         "adcq    $0, %%rdx\n"
15480         "movq    72(%%rsi), %%rax\n"
15481         "addq    %%rcx, 104(%%rdi)\n"
15482         "adcq    $0, %%rdx\n"
15483         "movq    %%rdx, %%rcx\n"
15484         "mulq    %%r9\n"
15485         "addq    %%rax, %%rcx\n"
15486         "adcq    $0, %%rdx\n"
15487         "movq    80(%%rsi), %%rax\n"
15488         "addq    %%rcx, 112(%%rdi)\n"
15489         "adcq    $0, %%rdx\n"
15490         "movq    %%rdx, %%rcx\n"
15491         "mulq    %%r9\n"
15492         "addq    %%rax, %%rcx\n"
15493         "adcq    $0, %%rdx\n"
15494         "movq    88(%%rsi), %%rax\n"
15495         "addq    %%rcx, 120(%%rdi)\n"
15496         "adcq    $0, %%rdx\n"
15497         "movq    %%rdx, %%rcx\n"
15498         "mulq    %%r9\n"
15499         "addq    %%rax, %%rcx\n"
15500         "adcq    $0, %%rdx\n"
15501         "movq    96(%%rsi), %%rax\n"
15502         "addq    %%rcx, 128(%%rdi)\n"
15503         "adcq    $0, %%rdx\n"
15504         "movq    %%rdx, %%rcx\n"
15505         "mulq    %%r9\n"
15506         "addq    %%rax, %%rcx\n"
15507         "adcq    $0, %%rdx\n"
15508         "movq    104(%%rsi), %%rax\n"
15509         "addq    %%rcx, 136(%%rdi)\n"
15510         "adcq    $0, %%rdx\n"
15511         "movq    %%rdx, %%rcx\n"
15512         "mulq    %%r9\n"
15513         "addq    %%rax, %%rcx\n"
15514         "adcq    $0, %%rdx\n"
15515         "movq    112(%%rsi), %%rax\n"
15516         "addq    %%rcx, 144(%%rdi)\n"
15517         "adcq    $0, %%rdx\n"
15518         "movq    %%rdx, %%rcx\n"
15519         "mulq    %%r9\n"
15520         "addq    %%rax, %%rcx\n"
15521         "adcq    $0, %%rdx\n"
15522         "addq    %%rcx, 152(%%rdi)\n"
15523         "adcq    $0, %%rdx\n"
15524         "movq    %%rdx, 160(%%rdi)\n"
15525         "### x*y[6]\n"
15526         "movq    48(%%r8), %%r9\n"
15527         "movq    0(%%rsi), %%rax\n"
15528         "mulq    %%r9\n"
15529         "addq    %%rax, 48(%%rdi)\n"
15530         "movq    8(%%rsi), %%rax\n"
15531         "adcq    $0, %%rdx\n"
15532         "movq    %%rdx, %%rcx\n"
15533         "mulq    %%r9\n"
15534         "addq    %%rax, %%rcx\n"
15535         "adcq    $0, %%rdx\n"
15536         "movq    16(%%rsi), %%rax\n"
15537         "addq    %%rcx, 56(%%rdi)\n"
15538         "adcq    $0, %%rdx\n"
15539         "movq    %%rdx, %%rcx\n"
15540         "mulq    %%r9\n"
15541         "addq    %%rax, %%rcx\n"
15542         "adcq    $0, %%rdx\n"
15543         "movq    24(%%rsi), %%rax\n"
15544         "addq    %%rcx, 64(%%rdi)\n"
15545         "adcq    $0, %%rdx\n"
15546         "movq    %%rdx, %%rcx\n"
15547         "mulq    %%r9\n"
15548         "addq    %%rax, %%rcx\n"
15549         "adcq    $0, %%rdx\n"
15550         "movq    32(%%rsi), %%rax\n"
15551         "addq    %%rcx, 72(%%rdi)\n"
15552         "adcq    $0, %%rdx\n"
15553         "movq    %%rdx, %%rcx\n"
15554         "mulq    %%r9\n"
15555         "addq    %%rax, %%rcx\n"
15556         "adcq    $0, %%rdx\n"
15557         "movq    40(%%rsi), %%rax\n"
15558         "addq    %%rcx, 80(%%rdi)\n"
15559         "adcq    $0, %%rdx\n"
15560         "movq    %%rdx, %%rcx\n"
15561         "mulq    %%r9\n"
15562         "addq    %%rax, %%rcx\n"
15563         "adcq    $0, %%rdx\n"
15564         "movq    48(%%rsi), %%rax\n"
15565         "addq    %%rcx, 88(%%rdi)\n"
15566         "adcq    $0, %%rdx\n"
15567         "movq    %%rdx, %%rcx\n"
15568         "mulq    %%r9\n"
15569         "addq    %%rax, %%rcx\n"
15570         "adcq    $0, %%rdx\n"
15571         "movq    56(%%rsi), %%rax\n"
15572         "addq    %%rcx, 96(%%rdi)\n"
15573         "adcq    $0, %%rdx\n"
15574         "movq    %%rdx, %%rcx\n"
15575         "mulq    %%r9\n"
15576         "addq    %%rax, %%rcx\n"
15577         "adcq    $0, %%rdx\n"
15578         "movq    64(%%rsi), %%rax\n"
15579         "addq    %%rcx, 104(%%rdi)\n"
15580         "adcq    $0, %%rdx\n"
15581         "movq    %%rdx, %%rcx\n"
15582         "mulq    %%r9\n"
15583         "addq    %%rax, %%rcx\n"
15584         "adcq    $0, %%rdx\n"
15585         "movq    72(%%rsi), %%rax\n"
15586         "addq    %%rcx, 112(%%rdi)\n"
15587         "adcq    $0, %%rdx\n"
15588         "movq    %%rdx, %%rcx\n"
15589         "mulq    %%r9\n"
15590         "addq    %%rax, %%rcx\n"
15591         "adcq    $0, %%rdx\n"
15592         "movq    80(%%rsi), %%rax\n"
15593         "addq    %%rcx, 120(%%rdi)\n"
15594         "adcq    $0, %%rdx\n"
15595         "movq    %%rdx, %%rcx\n"
15596         "mulq    %%r9\n"
15597         "addq    %%rax, %%rcx\n"
15598         "adcq    $0, %%rdx\n"
15599         "movq    88(%%rsi), %%rax\n"
15600         "addq    %%rcx, 128(%%rdi)\n"
15601         "adcq    $0, %%rdx\n"
15602         "movq    %%rdx, %%rcx\n"
15603         "mulq    %%r9\n"
15604         "addq    %%rax, %%rcx\n"
15605         "adcq    $0, %%rdx\n"
15606         "movq    96(%%rsi), %%rax\n"
15607         "addq    %%rcx, 136(%%rdi)\n"
15608         "adcq    $0, %%rdx\n"
15609         "movq    %%rdx, %%rcx\n"
15610         "mulq    %%r9\n"
15611         "addq    %%rax, %%rcx\n"
15612         "adcq    $0, %%rdx\n"
15613         "movq    104(%%rsi), %%rax\n"
15614         "addq    %%rcx, 144(%%rdi)\n"
15615         "adcq    $0, %%rdx\n"
15616         "movq    %%rdx, %%rcx\n"
15617         "mulq    %%r9\n"
15618         "addq    %%rax, %%rcx\n"
15619         "adcq    $0, %%rdx\n"
15620         "movq    112(%%rsi), %%rax\n"
15621         "addq    %%rcx, 152(%%rdi)\n"
15622         "adcq    $0, %%rdx\n"
15623         "movq    %%rdx, %%rcx\n"
15624         "mulq    %%r9\n"
15625         "addq    %%rax, %%rcx\n"
15626         "adcq    $0, %%rdx\n"
15627         "addq    %%rcx, 160(%%rdi)\n"
15628         "adcq    $0, %%rdx\n"
15629         "movq    %%rdx, 168(%%rdi)\n"
15630         "### x*y[7]\n"
15631         "movq    56(%%r8), %%r9\n"
15632         "movq    0(%%rsi), %%rax\n"
15633         "mulq    %%r9\n"
15634         "addq    %%rax, 56(%%rdi)\n"
15635         "movq    8(%%rsi), %%rax\n"
15636         "adcq    $0, %%rdx\n"
15637         "movq    %%rdx, %%rcx\n"
15638         "mulq    %%r9\n"
15639         "addq    %%rax, %%rcx\n"
15640         "adcq    $0, %%rdx\n"
15641         "movq    16(%%rsi), %%rax\n"
15642         "addq    %%rcx, 64(%%rdi)\n"
15643         "adcq    $0, %%rdx\n"
15644         "movq    %%rdx, %%rcx\n"
15645         "mulq    %%r9\n"
15646         "addq    %%rax, %%rcx\n"
15647         "adcq    $0, %%rdx\n"
15648         "movq    24(%%rsi), %%rax\n"
15649         "addq    %%rcx, 72(%%rdi)\n"
15650         "adcq    $0, %%rdx\n"
15651         "movq    %%rdx, %%rcx\n"
15652         "mulq    %%r9\n"
15653         "addq    %%rax, %%rcx\n"
15654         "adcq    $0, %%rdx\n"
15655         "movq    32(%%rsi), %%rax\n"
15656         "addq    %%rcx, 80(%%rdi)\n"
15657         "adcq    $0, %%rdx\n"
15658         "movq    %%rdx, %%rcx\n"
15659         "mulq    %%r9\n"
15660         "addq    %%rax, %%rcx\n"
15661         "adcq    $0, %%rdx\n"
15662         "movq    40(%%rsi), %%rax\n"
15663         "addq    %%rcx, 88(%%rdi)\n"
15664         "adcq    $0, %%rdx\n"
15665         "movq    %%rdx, %%rcx\n"
15666         "mulq    %%r9\n"
15667         "addq    %%rax, %%rcx\n"
15668         "adcq    $0, %%rdx\n"
15669         "movq    48(%%rsi), %%rax\n"
15670         "addq    %%rcx, 96(%%rdi)\n"
15671         "adcq    $0, %%rdx\n"
15672         "movq    %%rdx, %%rcx\n"
15673         "mulq    %%r9\n"
15674         "addq    %%rax, %%rcx\n"
15675         "adcq    $0, %%rdx\n"
15676         "movq    56(%%rsi), %%rax\n"
15677         "addq    %%rcx, 104(%%rdi)\n"
15678         "adcq    $0, %%rdx\n"
15679         "movq    %%rdx, %%rcx\n"
15680         "mulq    %%r9\n"
15681         "addq    %%rax, %%rcx\n"
15682         "adcq    $0, %%rdx\n"
15683         "movq    64(%%rsi), %%rax\n"
15684         "addq    %%rcx, 112(%%rdi)\n"
15685         "adcq    $0, %%rdx\n"
15686         "movq    %%rdx, %%rcx\n"
15687         "mulq    %%r9\n"
15688         "addq    %%rax, %%rcx\n"
15689         "adcq    $0, %%rdx\n"
15690         "movq    72(%%rsi), %%rax\n"
15691         "addq    %%rcx, 120(%%rdi)\n"
15692         "adcq    $0, %%rdx\n"
15693         "movq    %%rdx, %%rcx\n"
15694         "mulq    %%r9\n"
15695         "addq    %%rax, %%rcx\n"
15696         "adcq    $0, %%rdx\n"
15697         "movq    80(%%rsi), %%rax\n"
15698         "addq    %%rcx, 128(%%rdi)\n"
15699         "adcq    $0, %%rdx\n"
15700         "movq    %%rdx, %%rcx\n"
15701         "mulq    %%r9\n"
15702         "addq    %%rax, %%rcx\n"
15703         "adcq    $0, %%rdx\n"
15704         "movq    88(%%rsi), %%rax\n"
15705         "addq    %%rcx, 136(%%rdi)\n"
15706         "adcq    $0, %%rdx\n"
15707         "movq    %%rdx, %%rcx\n"
15708         "mulq    %%r9\n"
15709         "addq    %%rax, %%rcx\n"
15710         "adcq    $0, %%rdx\n"
15711         "movq    96(%%rsi), %%rax\n"
15712         "addq    %%rcx, 144(%%rdi)\n"
15713         "adcq    $0, %%rdx\n"
15714         "movq    %%rdx, %%rcx\n"
15715         "mulq    %%r9\n"
15716         "addq    %%rax, %%rcx\n"
15717         "adcq    $0, %%rdx\n"
15718         "movq    104(%%rsi), %%rax\n"
15719         "addq    %%rcx, 152(%%rdi)\n"
15720         "adcq    $0, %%rdx\n"
15721         "movq    %%rdx, %%rcx\n"
15722         "mulq    %%r9\n"
15723         "addq    %%rax, %%rcx\n"
15724         "adcq    $0, %%rdx\n"
15725         "movq    112(%%rsi), %%rax\n"
15726         "addq    %%rcx, 160(%%rdi)\n"
15727         "adcq    $0, %%rdx\n"
15728         "movq    %%rdx, %%rcx\n"
15729         "mulq    %%r9\n"
15730         "addq    %%rax, %%rcx\n"
15731         "adcq    $0, %%rdx\n"
15732         "addq    %%rcx, 168(%%rdi)\n"
15733         "adcq    $0, %%rdx\n"
15734         "movq    %%rdx, 176(%%rdi)\n"
15735         "### x*y[8]\n"
15736         "movq    64(%%r8), %%r9\n"
15737         "movq    0(%%rsi), %%rax\n"
15738         "mulq    %%r9\n"
15739         "addq    %%rax, 64(%%rdi)\n"
15740         "movq    8(%%rsi), %%rax\n"
15741         "adcq    $0, %%rdx\n"
15742         "movq    %%rdx, %%rcx\n"
15743         "mulq    %%r9\n"
15744         "addq    %%rax, %%rcx\n"
15745         "adcq    $0, %%rdx\n"
15746         "movq    16(%%rsi), %%rax\n"
15747         "addq    %%rcx, 72(%%rdi)\n"
15748         "adcq    $0, %%rdx\n"
15749         "movq    %%rdx, %%rcx\n"
15750         "mulq    %%r9\n"
15751         "addq    %%rax, %%rcx\n"
15752         "adcq    $0, %%rdx\n"
15753         "movq    24(%%rsi), %%rax\n"
15754         "addq    %%rcx, 80(%%rdi)\n"
15755         "adcq    $0, %%rdx\n"
15756         "movq    %%rdx, %%rcx\n"
15757         "mulq    %%r9\n"
15758         "addq    %%rax, %%rcx\n"
15759         "adcq    $0, %%rdx\n"
15760         "movq    32(%%rsi), %%rax\n"
15761         "addq    %%rcx, 88(%%rdi)\n"
15762         "adcq    $0, %%rdx\n"
15763         "movq    %%rdx, %%rcx\n"
15764         "mulq    %%r9\n"
15765         "addq    %%rax, %%rcx\n"
15766         "adcq    $0, %%rdx\n"
15767         "movq    40(%%rsi), %%rax\n"
15768         "addq    %%rcx, 96(%%rdi)\n"
15769         "adcq    $0, %%rdx\n"
15770         "movq    %%rdx, %%rcx\n"
15771         "mulq    %%r9\n"
15772         "addq    %%rax, %%rcx\n"
15773         "adcq    $0, %%rdx\n"
15774         "movq    48(%%rsi), %%rax\n"
15775         "addq    %%rcx, 104(%%rdi)\n"
15776         "adcq    $0, %%rdx\n"
15777         "movq    %%rdx, %%rcx\n"
15778         "mulq    %%r9\n"
15779         "addq    %%rax, %%rcx\n"
15780         "adcq    $0, %%rdx\n"
15781         "movq    56(%%rsi), %%rax\n"
15782         "addq    %%rcx, 112(%%rdi)\n"
15783         "adcq    $0, %%rdx\n"
15784         "movq    %%rdx, %%rcx\n"
15785         "mulq    %%r9\n"
15786         "addq    %%rax, %%rcx\n"
15787         "adcq    $0, %%rdx\n"
15788         "movq    64(%%rsi), %%rax\n"
15789         "addq    %%rcx, 120(%%rdi)\n"
15790         "adcq    $0, %%rdx\n"
15791         "movq    %%rdx, %%rcx\n"
15792         "mulq    %%r9\n"
15793         "addq    %%rax, %%rcx\n"
15794         "adcq    $0, %%rdx\n"
15795         "movq    72(%%rsi), %%rax\n"
15796         "addq    %%rcx, 128(%%rdi)\n"
15797         "adcq    $0, %%rdx\n"
15798         "movq    %%rdx, %%rcx\n"
15799         "mulq    %%r9\n"
15800         "addq    %%rax, %%rcx\n"
15801         "adcq    $0, %%rdx\n"
15802         "movq    80(%%rsi), %%rax\n"
15803         "addq    %%rcx, 136(%%rdi)\n"
15804         "adcq    $0, %%rdx\n"
15805         "movq    %%rdx, %%rcx\n"
15806         "mulq    %%r9\n"
15807         "addq    %%rax, %%rcx\n"
15808         "adcq    $0, %%rdx\n"
15809         "movq    88(%%rsi), %%rax\n"
15810         "addq    %%rcx, 144(%%rdi)\n"
15811         "adcq    $0, %%rdx\n"
15812         "movq    %%rdx, %%rcx\n"
15813         "mulq    %%r9\n"
15814         "addq    %%rax, %%rcx\n"
15815         "adcq    $0, %%rdx\n"
15816         "movq    96(%%rsi), %%rax\n"
15817         "addq    %%rcx, 152(%%rdi)\n"
15818         "adcq    $0, %%rdx\n"
15819         "movq    %%rdx, %%rcx\n"
15820         "mulq    %%r9\n"
15821         "addq    %%rax, %%rcx\n"
15822         "adcq    $0, %%rdx\n"
15823         "movq    104(%%rsi), %%rax\n"
15824         "addq    %%rcx, 160(%%rdi)\n"
15825         "adcq    $0, %%rdx\n"
15826         "movq    %%rdx, %%rcx\n"
15827         "mulq    %%r9\n"
15828         "addq    %%rax, %%rcx\n"
15829         "adcq    $0, %%rdx\n"
15830         "movq    112(%%rsi), %%rax\n"
15831         "addq    %%rcx, 168(%%rdi)\n"
15832         "adcq    $0, %%rdx\n"
15833         "movq    %%rdx, %%rcx\n"
15834         "mulq    %%r9\n"
15835         "addq    %%rax, %%rcx\n"
15836         "adcq    $0, %%rdx\n"
15837         "addq    %%rcx, 176(%%rdi)\n"
15838         "adcq    $0, %%rdx\n"
15839         "movq    %%rdx, 184(%%rdi)\n"
15840         "### x*y[9]\n"
15841         "movq    72(%%r8), %%r9\n"
15842         "movq    0(%%rsi), %%rax\n"
15843         "mulq    %%r9\n"
15844         "addq    %%rax, 72(%%rdi)\n"
15845         "movq    8(%%rsi), %%rax\n"
15846         "adcq    $0, %%rdx\n"
15847         "movq    %%rdx, %%rcx\n"
15848         "mulq    %%r9\n"
15849         "addq    %%rax, %%rcx\n"
15850         "adcq    $0, %%rdx\n"
15851         "movq    16(%%rsi), %%rax\n"
15852         "addq    %%rcx, 80(%%rdi)\n"
15853         "adcq    $0, %%rdx\n"
15854         "movq    %%rdx, %%rcx\n"
15855         "mulq    %%r9\n"
15856         "addq    %%rax, %%rcx\n"
15857         "adcq    $0, %%rdx\n"
15858         "movq    24(%%rsi), %%rax\n"
15859         "addq    %%rcx, 88(%%rdi)\n"
15860         "adcq    $0, %%rdx\n"
15861         "movq    %%rdx, %%rcx\n"
15862         "mulq    %%r9\n"
15863         "addq    %%rax, %%rcx\n"
15864         "adcq    $0, %%rdx\n"
15865         "movq    32(%%rsi), %%rax\n"
15866         "addq    %%rcx, 96(%%rdi)\n"
15867         "adcq    $0, %%rdx\n"
15868         "movq    %%rdx, %%rcx\n"
15869         "mulq    %%r9\n"
15870         "addq    %%rax, %%rcx\n"
15871         "adcq    $0, %%rdx\n"
15872         "movq    40(%%rsi), %%rax\n"
15873         "addq    %%rcx, 104(%%rdi)\n"
15874         "adcq    $0, %%rdx\n"
15875         "movq    %%rdx, %%rcx\n"
15876         "mulq    %%r9\n"
15877         "addq    %%rax, %%rcx\n"
15878         "adcq    $0, %%rdx\n"
15879         "movq    48(%%rsi), %%rax\n"
15880         "addq    %%rcx, 112(%%rdi)\n"
15881         "adcq    $0, %%rdx\n"
15882         "movq    %%rdx, %%rcx\n"
15883         "mulq    %%r9\n"
15884         "addq    %%rax, %%rcx\n"
15885         "adcq    $0, %%rdx\n"
15886         "movq    56(%%rsi), %%rax\n"
15887         "addq    %%rcx, 120(%%rdi)\n"
15888         "adcq    $0, %%rdx\n"
15889         "movq    %%rdx, %%rcx\n"
15890         "mulq    %%r9\n"
15891         "addq    %%rax, %%rcx\n"
15892         "adcq    $0, %%rdx\n"
15893         "movq    64(%%rsi), %%rax\n"
15894         "addq    %%rcx, 128(%%rdi)\n"
15895         "adcq    $0, %%rdx\n"
15896         "movq    %%rdx, %%rcx\n"
15897         "mulq    %%r9\n"
15898         "addq    %%rax, %%rcx\n"
15899         "adcq    $0, %%rdx\n"
15900         "movq    72(%%rsi), %%rax\n"
15901         "addq    %%rcx, 136(%%rdi)\n"
15902         "adcq    $0, %%rdx\n"
15903         "movq    %%rdx, %%rcx\n"
15904         "mulq    %%r9\n"
15905         "addq    %%rax, %%rcx\n"
15906         "adcq    $0, %%rdx\n"
15907         "movq    80(%%rsi), %%rax\n"
15908         "addq    %%rcx, 144(%%rdi)\n"
15909         "adcq    $0, %%rdx\n"
15910         "movq    %%rdx, %%rcx\n"
15911         "mulq    %%r9\n"
15912         "addq    %%rax, %%rcx\n"
15913         "adcq    $0, %%rdx\n"
15914         "movq    88(%%rsi), %%rax\n"
15915         "addq    %%rcx, 152(%%rdi)\n"
15916         "adcq    $0, %%rdx\n"
15917         "movq    %%rdx, %%rcx\n"
15918         "mulq    %%r9\n"
15919         "addq    %%rax, %%rcx\n"
15920         "adcq    $0, %%rdx\n"
15921         "movq    96(%%rsi), %%rax\n"
15922         "addq    %%rcx, 160(%%rdi)\n"
15923         "adcq    $0, %%rdx\n"
15924         "movq    %%rdx, %%rcx\n"
15925         "mulq    %%r9\n"
15926         "addq    %%rax, %%rcx\n"
15927         "adcq    $0, %%rdx\n"
15928         "movq    104(%%rsi), %%rax\n"
15929         "addq    %%rcx, 168(%%rdi)\n"
15930         "adcq    $0, %%rdx\n"
15931         "movq    %%rdx, %%rcx\n"
15932         "mulq    %%r9\n"
15933         "addq    %%rax, %%rcx\n"
15934         "adcq    $0, %%rdx\n"
15935         "movq    112(%%rsi), %%rax\n"
15936         "addq    %%rcx, 176(%%rdi)\n"
15937         "adcq    $0, %%rdx\n"
15938         "movq    %%rdx, %%rcx\n"
15939         "mulq    %%r9\n"
15940         "addq    %%rax, %%rcx\n"
15941         "adcq    $0, %%rdx\n"
15942         "addq    %%rcx, 184(%%rdi)\n"
15943         "adcq    $0, %%rdx\n"
15944         "movq    %%rdx, 192(%%rdi)\n"
15945         "### x*y[10]\n"
15946         "movq    80(%%r8), %%r9\n"
15947         "movq    0(%%rsi), %%rax\n"
15948         "mulq    %%r9\n"
15949         "addq    %%rax, 80(%%rdi)\n"
15950         "movq    8(%%rsi), %%rax\n"
15951         "adcq    $0, %%rdx\n"
15952         "movq    %%rdx, %%rcx\n"
15953         "mulq    %%r9\n"
15954         "addq    %%rax, %%rcx\n"
15955         "adcq    $0, %%rdx\n"
15956         "movq    16(%%rsi), %%rax\n"
15957         "addq    %%rcx, 88(%%rdi)\n"
15958         "adcq    $0, %%rdx\n"
15959         "movq    %%rdx, %%rcx\n"
15960         "mulq    %%r9\n"
15961         "addq    %%rax, %%rcx\n"
15962         "adcq    $0, %%rdx\n"
15963         "movq    24(%%rsi), %%rax\n"
15964         "addq    %%rcx, 96(%%rdi)\n"
15965         "adcq    $0, %%rdx\n"
15966         "movq    %%rdx, %%rcx\n"
15967         "mulq    %%r9\n"
15968         "addq    %%rax, %%rcx\n"
15969         "adcq    $0, %%rdx\n"
15970         "movq    32(%%rsi), %%rax\n"
15971         "addq    %%rcx, 104(%%rdi)\n"
15972         "adcq    $0, %%rdx\n"
15973         "movq    %%rdx, %%rcx\n"
15974         "mulq    %%r9\n"
15975         "addq    %%rax, %%rcx\n"
15976         "adcq    $0, %%rdx\n"
15977         "movq    40(%%rsi), %%rax\n"
15978         "addq    %%rcx, 112(%%rdi)\n"
15979         "adcq    $0, %%rdx\n"
15980         "movq    %%rdx, %%rcx\n"
15981         "mulq    %%r9\n"
15982         "addq    %%rax, %%rcx\n"
15983         "adcq    $0, %%rdx\n"
15984         "movq    48(%%rsi), %%rax\n"
15985         "addq    %%rcx, 120(%%rdi)\n"
15986         "adcq    $0, %%rdx\n"
15987         "movq    %%rdx, %%rcx\n"
15988         "mulq    %%r9\n"
15989         "addq    %%rax, %%rcx\n"
15990         "adcq    $0, %%rdx\n"
15991         "movq    56(%%rsi), %%rax\n"
15992         "addq    %%rcx, 128(%%rdi)\n"
15993         "adcq    $0, %%rdx\n"
15994         "movq    %%rdx, %%rcx\n"
15995         "mulq    %%r9\n"
15996         "addq    %%rax, %%rcx\n"
15997         "adcq    $0, %%rdx\n"
15998         "movq    64(%%rsi), %%rax\n"
15999         "addq    %%rcx, 136(%%rdi)\n"
16000         "adcq    $0, %%rdx\n"
16001         "movq    %%rdx, %%rcx\n"
16002         "mulq    %%r9\n"
16003         "addq    %%rax, %%rcx\n"
16004         "adcq    $0, %%rdx\n"
16005         "movq    72(%%rsi), %%rax\n"
16006         "addq    %%rcx, 144(%%rdi)\n"
16007         "adcq    $0, %%rdx\n"
16008         "movq    %%rdx, %%rcx\n"
16009         "mulq    %%r9\n"
16010         "addq    %%rax, %%rcx\n"
16011         "adcq    $0, %%rdx\n"
16012         "movq    80(%%rsi), %%rax\n"
16013         "addq    %%rcx, 152(%%rdi)\n"
16014         "adcq    $0, %%rdx\n"
16015         "movq    %%rdx, %%rcx\n"
16016         "mulq    %%r9\n"
16017         "addq    %%rax, %%rcx\n"
16018         "adcq    $0, %%rdx\n"
16019         "movq    88(%%rsi), %%rax\n"
16020         "addq    %%rcx, 160(%%rdi)\n"
16021         "adcq    $0, %%rdx\n"
16022         "movq    %%rdx, %%rcx\n"
16023         "mulq    %%r9\n"
16024         "addq    %%rax, %%rcx\n"
16025         "adcq    $0, %%rdx\n"
16026         "movq    96(%%rsi), %%rax\n"
16027         "addq    %%rcx, 168(%%rdi)\n"
16028         "adcq    $0, %%rdx\n"
16029         "movq    %%rdx, %%rcx\n"
16030         "mulq    %%r9\n"
16031         "addq    %%rax, %%rcx\n"
16032         "adcq    $0, %%rdx\n"
16033         "movq    104(%%rsi), %%rax\n"
16034         "addq    %%rcx, 176(%%rdi)\n"
16035         "adcq    $0, %%rdx\n"
16036         "movq    %%rdx, %%rcx\n"
16037         "mulq    %%r9\n"
16038         "addq    %%rax, %%rcx\n"
16039         "adcq    $0, %%rdx\n"
16040         "movq    112(%%rsi), %%rax\n"
16041         "addq    %%rcx, 184(%%rdi)\n"
16042         "adcq    $0, %%rdx\n"
16043         "movq    %%rdx, %%rcx\n"
16044         "mulq    %%r9\n"
16045         "addq    %%rax, %%rcx\n"
16046         "adcq    $0, %%rdx\n"
16047         "addq    %%rcx, 192(%%rdi)\n"
16048         "adcq    $0, %%rdx\n"
16049         "movq    %%rdx, 200(%%rdi)\n"
16050         "### x*y[11]\n"
16051         "movq    88(%%r8), %%r9\n"
16052         "movq    0(%%rsi), %%rax\n"
16053         "mulq    %%r9\n"
16054         "addq    %%rax, 88(%%rdi)\n"
16055         "movq    8(%%rsi), %%rax\n"
16056         "adcq    $0, %%rdx\n"
16057         "movq    %%rdx, %%rcx\n"
16058         "mulq    %%r9\n"
16059         "addq    %%rax, %%rcx\n"
16060         "adcq    $0, %%rdx\n"
16061         "movq    16(%%rsi), %%rax\n"
16062         "addq    %%rcx, 96(%%rdi)\n"
16063         "adcq    $0, %%rdx\n"
16064         "movq    %%rdx, %%rcx\n"
16065         "mulq    %%r9\n"
16066         "addq    %%rax, %%rcx\n"
16067         "adcq    $0, %%rdx\n"
16068         "movq    24(%%rsi), %%rax\n"
16069         "addq    %%rcx, 104(%%rdi)\n"
16070         "adcq    $0, %%rdx\n"
16071         "movq    %%rdx, %%rcx\n"
16072         "mulq    %%r9\n"
16073         "addq    %%rax, %%rcx\n"
16074         "adcq    $0, %%rdx\n"
16075         "movq    32(%%rsi), %%rax\n"
16076         "addq    %%rcx, 112(%%rdi)\n"
16077         "adcq    $0, %%rdx\n"
16078         "movq    %%rdx, %%rcx\n"
16079         "mulq    %%r9\n"
16080         "addq    %%rax, %%rcx\n"
16081         "adcq    $0, %%rdx\n"
16082         "movq    40(%%rsi), %%rax\n"
16083         "addq    %%rcx, 120(%%rdi)\n"
16084         "adcq    $0, %%rdx\n"
16085         "movq    %%rdx, %%rcx\n"
16086         "mulq    %%r9\n"
16087         "addq    %%rax, %%rcx\n"
16088         "adcq    $0, %%rdx\n"
16089         "movq    48(%%rsi), %%rax\n"
16090         "addq    %%rcx, 128(%%rdi)\n"
16091         "adcq    $0, %%rdx\n"
16092         "movq    %%rdx, %%rcx\n"
16093         "mulq    %%r9\n"
16094         "addq    %%rax, %%rcx\n"
16095         "adcq    $0, %%rdx\n"
16096         "movq    56(%%rsi), %%rax\n"
16097         "addq    %%rcx, 136(%%rdi)\n"
16098         "adcq    $0, %%rdx\n"
16099         "movq    %%rdx, %%rcx\n"
16100         "mulq    %%r9\n"
16101         "addq    %%rax, %%rcx\n"
16102         "adcq    $0, %%rdx\n"
16103         "movq    64(%%rsi), %%rax\n"
16104         "addq    %%rcx, 144(%%rdi)\n"
16105         "adcq    $0, %%rdx\n"
16106         "movq    %%rdx, %%rcx\n"
16107         "mulq    %%r9\n"
16108         "addq    %%rax, %%rcx\n"
16109         "adcq    $0, %%rdx\n"
16110         "movq    72(%%rsi), %%rax\n"
16111         "addq    %%rcx, 152(%%rdi)\n"
16112         "adcq    $0, %%rdx\n"
16113         "movq    %%rdx, %%rcx\n"
16114         "mulq    %%r9\n"
16115         "addq    %%rax, %%rcx\n"
16116         "adcq    $0, %%rdx\n"
16117         "movq    80(%%rsi), %%rax\n"
16118         "addq    %%rcx, 160(%%rdi)\n"
16119         "adcq    $0, %%rdx\n"
16120         "movq    %%rdx, %%rcx\n"
16121         "mulq    %%r9\n"
16122         "addq    %%rax, %%rcx\n"
16123         "adcq    $0, %%rdx\n"
16124         "movq    88(%%rsi), %%rax\n"
16125         "addq    %%rcx, 168(%%rdi)\n"
16126         "adcq    $0, %%rdx\n"
16127         "movq    %%rdx, %%rcx\n"
16128         "mulq    %%r9\n"
16129         "addq    %%rax, %%rcx\n"
16130         "adcq    $0, %%rdx\n"
16131         "movq    96(%%rsi), %%rax\n"
16132         "addq    %%rcx, 176(%%rdi)\n"
16133         "adcq    $0, %%rdx\n"
16134         "movq    %%rdx, %%rcx\n"
16135         "mulq    %%r9\n"
16136         "addq    %%rax, %%rcx\n"
16137         "adcq    $0, %%rdx\n"
16138         "movq    104(%%rsi), %%rax\n"
16139         "addq    %%rcx, 184(%%rdi)\n"
16140         "adcq    $0, %%rdx\n"
16141         "movq    %%rdx, %%rcx\n"
16142         "mulq    %%r9\n"
16143         "addq    %%rax, %%rcx\n"
16144         "adcq    $0, %%rdx\n"
16145         "movq    112(%%rsi), %%rax\n"
16146         "addq    %%rcx, 192(%%rdi)\n"
16147         "adcq    $0, %%rdx\n"
16148         "movq    %%rdx, %%rcx\n"
16149         "mulq    %%r9\n"
16150         "addq    %%rax, %%rcx\n"
16151         "adcq    $0, %%rdx\n"
16152         "addq    %%rcx, 200(%%rdi)\n"
16153         "adcq    $0, %%rdx\n"
16154         "movq    %%rdx, 208(%%rdi)\n"
16155         "### x*y[12]\n"
16156         "movq    96(%%r8), %%r9\n"
16157         "movq    0(%%rsi), %%rax\n"
16158         "mulq    %%r9\n"
16159         "addq    %%rax, 96(%%rdi)\n"
16160         "movq    8(%%rsi), %%rax\n"
16161         "adcq    $0, %%rdx\n"
16162         "movq    %%rdx, %%rcx\n"
16163         "mulq    %%r9\n"
16164         "addq    %%rax, %%rcx\n"
16165         "adcq    $0, %%rdx\n"
16166         "movq    16(%%rsi), %%rax\n"
16167         "addq    %%rcx, 104(%%rdi)\n"
16168         "adcq    $0, %%rdx\n"
16169         "movq    %%rdx, %%rcx\n"
16170         "mulq    %%r9\n"
16171         "addq    %%rax, %%rcx\n"
16172         "adcq    $0, %%rdx\n"
16173         "movq    24(%%rsi), %%rax\n"
16174         "addq    %%rcx, 112(%%rdi)\n"
16175         "adcq    $0, %%rdx\n"
16176         "movq    %%rdx, %%rcx\n"
16177         "mulq    %%r9\n"
16178         "addq    %%rax, %%rcx\n"
16179         "adcq    $0, %%rdx\n"
16180         "movq    32(%%rsi), %%rax\n"
16181         "addq    %%rcx, 120(%%rdi)\n"
16182         "adcq    $0, %%rdx\n"
16183         "movq    %%rdx, %%rcx\n"
16184         "mulq    %%r9\n"
16185         "addq    %%rax, %%rcx\n"
16186         "adcq    $0, %%rdx\n"
16187         "movq    40(%%rsi), %%rax\n"
16188         "addq    %%rcx, 128(%%rdi)\n"
16189         "adcq    $0, %%rdx\n"
16190         "movq    %%rdx, %%rcx\n"
16191         "mulq    %%r9\n"
16192         "addq    %%rax, %%rcx\n"
16193         "adcq    $0, %%rdx\n"
16194         "movq    48(%%rsi), %%rax\n"
16195         "addq    %%rcx, 136(%%rdi)\n"
16196         "adcq    $0, %%rdx\n"
16197         "movq    %%rdx, %%rcx\n"
16198         "mulq    %%r9\n"
16199         "addq    %%rax, %%rcx\n"
16200         "adcq    $0, %%rdx\n"
16201         "movq    56(%%rsi), %%rax\n"
16202         "addq    %%rcx, 144(%%rdi)\n"
16203         "adcq    $0, %%rdx\n"
16204         "movq    %%rdx, %%rcx\n"
16205         "mulq    %%r9\n"
16206         "addq    %%rax, %%rcx\n"
16207         "adcq    $0, %%rdx\n"
16208         "movq    64(%%rsi), %%rax\n"
16209         "addq    %%rcx, 152(%%rdi)\n"
16210         "adcq    $0, %%rdx\n"
16211         "movq    %%rdx, %%rcx\n"
16212         "mulq    %%r9\n"
16213         "addq    %%rax, %%rcx\n"
16214         "adcq    $0, %%rdx\n"
16215         "movq    72(%%rsi), %%rax\n"
16216         "addq    %%rcx, 160(%%rdi)\n"
16217         "adcq    $0, %%rdx\n"
16218         "movq    %%rdx, %%rcx\n"
16219         "mulq    %%r9\n"
16220         "addq    %%rax, %%rcx\n"
16221         "adcq    $0, %%rdx\n"
16222         "movq    80(%%rsi), %%rax\n"
16223         "addq    %%rcx, 168(%%rdi)\n"
16224         "adcq    $0, %%rdx\n"
16225         "movq    %%rdx, %%rcx\n"
16226         "mulq    %%r9\n"
16227         "addq    %%rax, %%rcx\n"
16228         "adcq    $0, %%rdx\n"
16229         "movq    88(%%rsi), %%rax\n"
16230         "addq    %%rcx, 176(%%rdi)\n"
16231         "adcq    $0, %%rdx\n"
16232         "movq    %%rdx, %%rcx\n"
16233         "mulq    %%r9\n"
16234         "addq    %%rax, %%rcx\n"
16235         "adcq    $0, %%rdx\n"
16236         "movq    96(%%rsi), %%rax\n"
16237         "addq    %%rcx, 184(%%rdi)\n"
16238         "adcq    $0, %%rdx\n"
16239         "movq    %%rdx, %%rcx\n"
16240         "mulq    %%r9\n"
16241         "addq    %%rax, %%rcx\n"
16242         "adcq    $0, %%rdx\n"
16243         "movq    104(%%rsi), %%rax\n"
16244         "addq    %%rcx, 192(%%rdi)\n"
16245         "adcq    $0, %%rdx\n"
16246         "movq    %%rdx, %%rcx\n"
16247         "mulq    %%r9\n"
16248         "addq    %%rax, %%rcx\n"
16249         "adcq    $0, %%rdx\n"
16250         "movq    112(%%rsi), %%rax\n"
16251         "addq    %%rcx, 200(%%rdi)\n"
16252         "adcq    $0, %%rdx\n"
16253         "movq    %%rdx, %%rcx\n"
16254         "mulq    %%r9\n"
16255         "addq    %%rax, %%rcx\n"
16256         "adcq    $0, %%rdx\n"
16257         "addq    %%rcx, 208(%%rdi)\n"
16258         "adcq    $0, %%rdx\n"
16259         "movq    %%rdx, 216(%%rdi)\n"
16260         "### x*y[13]\n"
16261         "movq    104(%%r8), %%r9\n"
16262         "movq    0(%%rsi), %%rax\n"
16263         "mulq    %%r9\n"
16264         "addq    %%rax, 104(%%rdi)\n"
16265         "movq    8(%%rsi), %%rax\n"
16266         "adcq    $0, %%rdx\n"
16267         "movq    %%rdx, %%rcx\n"
16268         "mulq    %%r9\n"
16269         "addq    %%rax, %%rcx\n"
16270         "adcq    $0, %%rdx\n"
16271         "movq    16(%%rsi), %%rax\n"
16272         "addq    %%rcx, 112(%%rdi)\n"
16273         "adcq    $0, %%rdx\n"
16274         "movq    %%rdx, %%rcx\n"
16275         "mulq    %%r9\n"
16276         "addq    %%rax, %%rcx\n"
16277         "adcq    $0, %%rdx\n"
16278         "movq    24(%%rsi), %%rax\n"
16279         "addq    %%rcx, 120(%%rdi)\n"
16280         "adcq    $0, %%rdx\n"
16281         "movq    %%rdx, %%rcx\n"
16282         "mulq    %%r9\n"
16283         "addq    %%rax, %%rcx\n"
16284         "adcq    $0, %%rdx\n"
16285         "movq    32(%%rsi), %%rax\n"
16286         "addq    %%rcx, 128(%%rdi)\n"
16287         "adcq    $0, %%rdx\n"
16288         "movq    %%rdx, %%rcx\n"
16289         "mulq    %%r9\n"
16290         "addq    %%rax, %%rcx\n"
16291         "adcq    $0, %%rdx\n"
16292         "movq    40(%%rsi), %%rax\n"
16293         "addq    %%rcx, 136(%%rdi)\n"
16294         "adcq    $0, %%rdx\n"
16295         "movq    %%rdx, %%rcx\n"
16296         "mulq    %%r9\n"
16297         "addq    %%rax, %%rcx\n"
16298         "adcq    $0, %%rdx\n"
16299         "movq    48(%%rsi), %%rax\n"
16300         "addq    %%rcx, 144(%%rdi)\n"
16301         "adcq    $0, %%rdx\n"
16302         "movq    %%rdx, %%rcx\n"
16303         "mulq    %%r9\n"
16304         "addq    %%rax, %%rcx\n"
16305         "adcq    $0, %%rdx\n"
16306         "movq    56(%%rsi), %%rax\n"
16307         "addq    %%rcx, 152(%%rdi)\n"
16308         "adcq    $0, %%rdx\n"
16309         "movq    %%rdx, %%rcx\n"
16310         "mulq    %%r9\n"
16311         "addq    %%rax, %%rcx\n"
16312         "adcq    $0, %%rdx\n"
16313         "movq    64(%%rsi), %%rax\n"
16314         "addq    %%rcx, 160(%%rdi)\n"
16315         "adcq    $0, %%rdx\n"
16316         "movq    %%rdx, %%rcx\n"
16317         "mulq    %%r9\n"
16318         "addq    %%rax, %%rcx\n"
16319         "adcq    $0, %%rdx\n"
16320         "movq    72(%%rsi), %%rax\n"
16321         "addq    %%rcx, 168(%%rdi)\n"
16322         "adcq    $0, %%rdx\n"
16323         "movq    %%rdx, %%rcx\n"
16324         "mulq    %%r9\n"
16325         "addq    %%rax, %%rcx\n"
16326         "adcq    $0, %%rdx\n"
16327         "movq    80(%%rsi), %%rax\n"
16328         "addq    %%rcx, 176(%%rdi)\n"
16329         "adcq    $0, %%rdx\n"
16330         "movq    %%rdx, %%rcx\n"
16331         "mulq    %%r9\n"
16332         "addq    %%rax, %%rcx\n"
16333         "adcq    $0, %%rdx\n"
16334         "movq    88(%%rsi), %%rax\n"
16335         "addq    %%rcx, 184(%%rdi)\n"
16336         "adcq    $0, %%rdx\n"
16337         "movq    %%rdx, %%rcx\n"
16338         "mulq    %%r9\n"
16339         "addq    %%rax, %%rcx\n"
16340         "adcq    $0, %%rdx\n"
16341         "movq    96(%%rsi), %%rax\n"
16342         "addq    %%rcx, 192(%%rdi)\n"
16343         "adcq    $0, %%rdx\n"
16344         "movq    %%rdx, %%rcx\n"
16345         "mulq    %%r9\n"
16346         "addq    %%rax, %%rcx\n"
16347         "adcq    $0, %%rdx\n"
16348         "movq    104(%%rsi), %%rax\n"
16349         "addq    %%rcx, 200(%%rdi)\n"
16350         "adcq    $0, %%rdx\n"
16351         "movq    %%rdx, %%rcx\n"
16352         "mulq    %%r9\n"
16353         "addq    %%rax, %%rcx\n"
16354         "adcq    $0, %%rdx\n"
16355         "movq    112(%%rsi), %%rax\n"
16356         "addq    %%rcx, 208(%%rdi)\n"
16357         "adcq    $0, %%rdx\n"
16358         "movq    %%rdx, %%rcx\n"
16359         "mulq    %%r9\n"
16360         "addq    %%rax, %%rcx\n"
16361         "adcq    $0, %%rdx\n"
16362         "addq    %%rcx, 216(%%rdi)\n"
16363         "adcq    $0, %%rdx\n"
16364         "movq    %%rdx, 224(%%rdi)\n"
16365         "### x*y[14]\n"
16366         "movq    112(%%r8), %%r9\n"
16367         "movq    0(%%rsi), %%rax\n"
16368         "mulq    %%r9\n"
16369         "addq    %%rax, 112(%%rdi)\n"
16370         "movq    8(%%rsi), %%rax\n"
16371         "adcq    $0, %%rdx\n"
16372         "movq    %%rdx, %%rcx\n"
16373         "mulq    %%r9\n"
16374         "addq    %%rax, %%rcx\n"
16375         "adcq    $0, %%rdx\n"
16376         "movq    16(%%rsi), %%rax\n"
16377         "addq    %%rcx, 120(%%rdi)\n"
16378         "adcq    $0, %%rdx\n"
16379         "movq    %%rdx, %%rcx\n"
16380         "mulq    %%r9\n"
16381         "addq    %%rax, %%rcx\n"
16382         "adcq    $0, %%rdx\n"
16383         "movq    24(%%rsi), %%rax\n"
16384         "addq    %%rcx, 128(%%rdi)\n"
16385         "adcq    $0, %%rdx\n"
16386         "movq    %%rdx, %%rcx\n"
16387         "mulq    %%r9\n"
16388         "addq    %%rax, %%rcx\n"
16389         "adcq    $0, %%rdx\n"
16390         "movq    32(%%rsi), %%rax\n"
16391         "addq    %%rcx, 136(%%rdi)\n"
16392         "adcq    $0, %%rdx\n"
16393         "movq    %%rdx, %%rcx\n"
16394         "mulq    %%r9\n"
16395         "addq    %%rax, %%rcx\n"
16396         "adcq    $0, %%rdx\n"
16397         "movq    40(%%rsi), %%rax\n"
16398         "addq    %%rcx, 144(%%rdi)\n"
16399         "adcq    $0, %%rdx\n"
16400         "movq    %%rdx, %%rcx\n"
16401         "mulq    %%r9\n"
16402         "addq    %%rax, %%rcx\n"
16403         "adcq    $0, %%rdx\n"
16404         "movq    48(%%rsi), %%rax\n"
16405         "addq    %%rcx, 152(%%rdi)\n"
16406         "adcq    $0, %%rdx\n"
16407         "movq    %%rdx, %%rcx\n"
16408         "mulq    %%r9\n"
16409         "addq    %%rax, %%rcx\n"
16410         "adcq    $0, %%rdx\n"
16411         "movq    56(%%rsi), %%rax\n"
16412         "addq    %%rcx, 160(%%rdi)\n"
16413         "adcq    $0, %%rdx\n"
16414         "movq    %%rdx, %%rcx\n"
16415         "mulq    %%r9\n"
16416         "addq    %%rax, %%rcx\n"
16417         "adcq    $0, %%rdx\n"
16418         "movq    64(%%rsi), %%rax\n"
16419         "addq    %%rcx, 168(%%rdi)\n"
16420         "adcq    $0, %%rdx\n"
16421         "movq    %%rdx, %%rcx\n"
16422         "mulq    %%r9\n"
16423         "addq    %%rax, %%rcx\n"
16424         "adcq    $0, %%rdx\n"
16425         "movq    72(%%rsi), %%rax\n"
16426         "addq    %%rcx, 176(%%rdi)\n"
16427         "adcq    $0, %%rdx\n"
16428         "movq    %%rdx, %%rcx\n"
16429         "mulq    %%r9\n"
16430         "addq    %%rax, %%rcx\n"
16431         "adcq    $0, %%rdx\n"
16432         "movq    80(%%rsi), %%rax\n"
16433         "addq    %%rcx, 184(%%rdi)\n"
16434         "adcq    $0, %%rdx\n"
16435         "movq    %%rdx, %%rcx\n"
16436         "mulq    %%r9\n"
16437         "addq    %%rax, %%rcx\n"
16438         "adcq    $0, %%rdx\n"
16439         "movq    88(%%rsi), %%rax\n"
16440         "addq    %%rcx, 192(%%rdi)\n"
16441         "adcq    $0, %%rdx\n"
16442         "movq    %%rdx, %%rcx\n"
16443         "mulq    %%r9\n"
16444         "addq    %%rax, %%rcx\n"
16445         "adcq    $0, %%rdx\n"
16446         "movq    96(%%rsi), %%rax\n"
16447         "addq    %%rcx, 200(%%rdi)\n"
16448         "adcq    $0, %%rdx\n"
16449         "movq    %%rdx, %%rcx\n"
16450         "mulq    %%r9\n"
16451         "addq    %%rax, %%rcx\n"
16452         "adcq    $0, %%rdx\n"
16453         "movq    104(%%rsi), %%rax\n"
16454         "addq    %%rcx, 208(%%rdi)\n"
16455         "adcq    $0, %%rdx\n"
16456         "movq    %%rdx, %%rcx\n"
16457         "mulq    %%r9\n"
16458         "addq    %%rax, %%rcx\n"
16459         "adcq    $0, %%rdx\n"
16460         "movq    112(%%rsi), %%rax\n"
16461         "addq    %%rcx, 216(%%rdi)\n"
16462         "adcq    $0, %%rdx\n"
16463         "movq    %%rdx, %%rcx\n"
16464         "mulq    %%r9\n"
16465         "addq    %%rax, %%rcx\n"
16466         "adcq    $0, %%rdx\n"
16467         "addq    %%rcx, 224(%%rdi)\n"
16468         "adcq    $0, %%rdx\n"
16469         "movq    %%rdx, 232(%%rdi)\n"
16470       : "+m" (z)
16471       : "m" (x), "m" (y)
16472       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
16473 }
16474 
16475 /* x has 15 words, z has 32. Put x*y in z. */
16476 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
16477 static inline
mpfq_fixmp_15_sqr(mp_limb_t * z,const mp_limb_t * x)16478 void mpfq_fixmp_15_sqr(mp_limb_t * z, const mp_limb_t * x)
16479 {
16480     mpfq_fixmp_15_mul(z, x, x);
16481 }
16482 
16483 /* x has 15 words, z has 17. Put x*y in z. */
16484 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
16485 static inline
mpfq_fixmp_15_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16486 void mpfq_fixmp_15_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16487 {
16488     __asm__ __volatile__(
16489         "movq    %[z], %%rdi\n"
16490         "movq    %[x], %%rsi\n"
16491         "movq    0(%%rsi), %%rax\n"
16492         "mulq    %[mult]\n"
16493         "movq    %%rax, 0(%%rdi)\n"
16494         "movq    8(%%rsi), %%rax\n"
16495         "movq    %%rdx, %%rcx\n"
16496         "mulq    %[mult]\n"
16497         "addq    %%rax, %%rcx\n"
16498         "adcq    $0, %%rdx\n"
16499         "movq    16(%%rsi), %%rax\n"
16500         "movq    %%rcx, 8(%%rdi)\n"
16501         "movq    %%rdx, %%rcx\n"
16502         "mulq    %[mult]\n"
16503         "addq    %%rax, %%rcx\n"
16504         "adcq    $0, %%rdx\n"
16505         "movq    24(%%rsi), %%rax\n"
16506         "movq    %%rcx, 16(%%rdi)\n"
16507         "movq    %%rdx, %%rcx\n"
16508         "mulq    %[mult]\n"
16509         "addq    %%rax, %%rcx\n"
16510         "adcq    $0, %%rdx\n"
16511         "movq    32(%%rsi), %%rax\n"
16512         "movq    %%rcx, 24(%%rdi)\n"
16513         "movq    %%rdx, %%rcx\n"
16514         "mulq    %[mult]\n"
16515         "addq    %%rax, %%rcx\n"
16516         "adcq    $0, %%rdx\n"
16517         "movq    40(%%rsi), %%rax\n"
16518         "movq    %%rcx, 32(%%rdi)\n"
16519         "movq    %%rdx, %%rcx\n"
16520         "mulq    %[mult]\n"
16521         "addq    %%rax, %%rcx\n"
16522         "adcq    $0, %%rdx\n"
16523         "movq    48(%%rsi), %%rax\n"
16524         "movq    %%rcx, 40(%%rdi)\n"
16525         "movq    %%rdx, %%rcx\n"
16526         "mulq    %[mult]\n"
16527         "addq    %%rax, %%rcx\n"
16528         "adcq    $0, %%rdx\n"
16529         "movq    56(%%rsi), %%rax\n"
16530         "movq    %%rcx, 48(%%rdi)\n"
16531         "movq    %%rdx, %%rcx\n"
16532         "mulq    %[mult]\n"
16533         "addq    %%rax, %%rcx\n"
16534         "adcq    $0, %%rdx\n"
16535         "movq    64(%%rsi), %%rax\n"
16536         "movq    %%rcx, 56(%%rdi)\n"
16537         "movq    %%rdx, %%rcx\n"
16538         "mulq    %[mult]\n"
16539         "addq    %%rax, %%rcx\n"
16540         "adcq    $0, %%rdx\n"
16541         "movq    72(%%rsi), %%rax\n"
16542         "movq    %%rcx, 64(%%rdi)\n"
16543         "movq    %%rdx, %%rcx\n"
16544         "mulq    %[mult]\n"
16545         "addq    %%rax, %%rcx\n"
16546         "adcq    $0, %%rdx\n"
16547         "movq    80(%%rsi), %%rax\n"
16548         "movq    %%rcx, 72(%%rdi)\n"
16549         "movq    %%rdx, %%rcx\n"
16550         "mulq    %[mult]\n"
16551         "addq    %%rax, %%rcx\n"
16552         "adcq    $0, %%rdx\n"
16553         "movq    88(%%rsi), %%rax\n"
16554         "movq    %%rcx, 80(%%rdi)\n"
16555         "movq    %%rdx, %%rcx\n"
16556         "mulq    %[mult]\n"
16557         "addq    %%rax, %%rcx\n"
16558         "adcq    $0, %%rdx\n"
16559         "movq    96(%%rsi), %%rax\n"
16560         "movq    %%rcx, 88(%%rdi)\n"
16561         "movq    %%rdx, %%rcx\n"
16562         "mulq    %[mult]\n"
16563         "addq    %%rax, %%rcx\n"
16564         "adcq    $0, %%rdx\n"
16565         "movq    104(%%rsi), %%rax\n"
16566         "movq    %%rcx, 96(%%rdi)\n"
16567         "movq    %%rdx, %%rcx\n"
16568         "mulq    %[mult]\n"
16569         "addq    %%rax, %%rcx\n"
16570         "adcq    $0, %%rdx\n"
16571         "movq    112(%%rsi), %%rax\n"
16572         "movq    %%rcx, 104(%%rdi)\n"
16573         "movq    %%rdx, %%rcx\n"
16574         "mulq    %[mult]\n"
16575         "addq    %%rax, %%rcx\n"
16576         "adcq    $0, %%rdx\n"
16577         "movq    %%rcx, 112(%%rdi)\n"
16578         "movq    %%rdx, 120(%%rdi)\n"
16579     :
16580     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
16581     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
16582 }
16583 
16584 /* x, y, and z have 0.5 words. Result in z. Return carry bit */
16585 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
16586 static inline
mpfq_fixmp_0_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16587 mp_limb_t mpfq_fixmp_0_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16588 {
16589     mp_limb_t carry;
16590     __asm__ __volatile__(
16591         "movq    %[x0], %%rax\n"
16592         "addq    %[y0], %%rax\n"
16593         "movq    %%rax, %[z0]\n"
16594         "movq $0, %%rax\n"
16595         "adcq $0, %%rax\n"
16596     : [z0]"=m"(z[0]), "=&a"(carry)
16597     : [x0]"m"(x[0]), [y0]"m"(y[0])
16598     );
16599     return carry;
16600 }
16601 
16602 /* x, y, and z have 0.5 words. Result in z. Return borrow bit */
16603 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
16604 static inline
mpfq_fixmp_0_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16605 mp_limb_t mpfq_fixmp_0_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16606 {
16607     mp_limb_t carry;
16608     __asm__ __volatile__(
16609         "movq    %[x0], %%rax\n"
16610         "subq    %[y0], %%rax\n"
16611         "movq    %%rax, %[z0]\n"
16612         "movq $0, %%rax\n"
16613         "adcq $0, %%rax\n"
16614     : [z0]"=m"(z[0]), "=&a"(carry)
16615     : [x0]"m"(x[0]), [y0]"m"(y[0])
16616     );
16617     return carry;
16618 }
16619 
16620 /* x, y, and z have 0.5 words. Result in z. Carry bit is lost. */
16621 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
16622 static inline
mpfq_fixmp_0_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16623 void mpfq_fixmp_0_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16624 {
16625     *z = *x + *y;
16626 }
16627 
16628 /* x, y, and z have 0.5 words. Result in z. Borrow bit is lost. */
16629 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
16630 static inline
mpfq_fixmp_0_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16631 void mpfq_fixmp_0_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16632 {
16633     *z = *x - *y;
16634 }
16635 
16636 /* x has 0.5 words, z has 2.
16637  * Put (z+x*c) in z. Return carry bit. */
16638 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
16639 static inline
mpfq_fixmp_0_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16640 mp_limb_t mpfq_fixmp_0_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16641 {
16642     mp_limb_t carry;
16643     __asm__ __volatile__(
16644         "mulq    %[mult]\n"
16645         "addq    %%rax, %[z0]\n"
16646         "adcq    $0, %%rdx\n"
16647         "xorq    %%rax, %%rax\n"
16648         "addq    %%rdx, %[z1]\n"
16649         "adcq    $0, %%rax\n"
16650     : "=a"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1])
16651     : [x0]"0"(x[0]), [mult]"m"(c)
16652     : "%rdx");
16653     return carry;
16654 }
16655 
16656 /* x has 0.5 words, z has 2.
16657  * Put (z+x*c) in z. Carry bit is lost. */
16658 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
16659 static inline
mpfq_fixmp_0_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16660 void mpfq_fixmp_0_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16661 {
16662     mp_limb_t junk;
16663     __asm__ __volatile__(
16664         "mulq    %[mult]\n"
16665         "addq    %%rax, %[z0]\n"
16666         "adcq    $0, %%rdx\n"
16667         "addq    %%rdx, %[z1]\n"
16668     : "=a"(junk), [z0]"+m"(z[0]), [z1]"+m"(z[1])
16669     : [x0]"0"(x[0]), [mult]"m"(c)
16670     : "%rdx");
16671 }
16672 
16673 /* x has 0.5 words, z has 1.
16674  * Put (z+x*c) in z. Return carry word. */
16675 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
16676 static inline
mpfq_fixmp_0_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16677 mp_limb_t mpfq_fixmp_0_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16678 {
16679     mp_limb_t carry;
16680     mp_limb_t junk;
16681     __asm__ __volatile__(
16682         "mulq    %[mult]\n"
16683         "addq    %%rax, %[z0]\n"
16684         "adcq    $0, %%rdx\n"
16685     : "=a"(junk), [z0]"+m"(z[0]), "=&d"(carry)
16686     : [x0]"0"(x[0]), [mult]"m"(c)
16687     );
16688     return carry;
16689 }
16690 
16691 /* x and y have 0.5 words, z has 1. Put x*y in z. */
16692 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
16693 static inline
mpfq_fixmp_0_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16694 void mpfq_fixmp_0_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16695 {
16696     __asm__ __volatile__(
16697         "imulq %[y0], %%rax\n"
16698               : "=a" (z[0])
16699               : "0" (x[0]), [y0] "rm" (y[0])
16700               );
16701 }
16702 
16703 /* x has 0.5 words, z has 1. Put x*y in z. */
16704 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
16705 static inline
mpfq_fixmp_0_5_sqr(mp_limb_t * z,const mp_limb_t * x)16706 void mpfq_fixmp_0_5_sqr(mp_limb_t * z, const mp_limb_t * x)
16707 {
16708     __asm__ __volatile__(
16709         "imulq %%rax, %%rax\n"
16710     : "=a" (z[0])
16711     : "0" (x[0])
16712     );
16713 }
16714 
16715 /* x has 0.5 words, z has 2. Put x*y in z. */
16716 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
16717 static inline
mpfq_fixmp_0_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16718 void mpfq_fixmp_0_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16719 {
16720     __asm__ __volatile__(
16721         "mulq    %[mult]\n"
16722     : [z0]"=a"(z[0]), [z1]"=d"(z[1])
16723     : [x0]"0"(x[0]), [mult]"m"(c)
16724     );
16725 }
16726 
16727 /* x has 0.5 words, z has 1. c is 0.5 word.
16728  * Put (z+x*c) in z. Return carry bit. */
16729 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
16730 static inline
mpfq_fixmp_0_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16731 mp_limb_t mpfq_fixmp_0_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16732 {
16733     mp_limb_t carry;
16734     mp_limb_t junk;
16735     __asm__ __volatile__(
16736         "imulq    %[mult], %[x0]\n"
16737         "xorq    %%rdx, %%rdx\n"
16738         "addq    %%rax, %[z0]\n"
16739         "adcq    $0, %%rdx\n"
16740     : "=a"(junk), [z0]"+m"(z[0]), "=&d"(carry)
16741     : [x0]"0"(x[0]), [mult]"m"(c)
16742     );
16743     return carry;
16744 }
16745 
16746 /* x has 0.5 words, z has 1. c is 0.5 word.
16747  * Put (z+x*c) in z. Carry bit is lost. */
16748 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
16749 static inline
mpfq_fixmp_0_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16750 void mpfq_fixmp_0_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16751 {
16752     mp_limb_t junk;
16753     __asm__ __volatile__(
16754         "imulq    %[mult], %[x0]\n"
16755         "addq    %[x0], %[z0]\n"
16756     : "=a"(junk), [z0]"+m"(z[0])
16757     : [x0]"0"(x[0]), [mult]"m"(c)
16758     );
16759 }
16760 
16761 /* x has 0.5 words, z has 1. c is 0.5 word.
16762  * Put (x*c) in z. No carry. */
16763 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
16764 static inline
mpfq_fixmp_0_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16765 void mpfq_fixmp_0_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16766 {
16767     __asm__ __volatile__(
16768         "imulq    %[mult], %%rax\n"
16769     : [z0]"=a"(z[0])
16770     : [x0]"0"(x[0]), [mult]"m"(c)
16771     );
16772 }
16773 
16774 /* x, y, and z have 1.5 words. Result in z. Return carry bit */
16775 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
16776 static inline
mpfq_fixmp_1_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16777 mp_limb_t mpfq_fixmp_1_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16778 {
16779     mp_limb_t carry;
16780     __asm__ __volatile__(
16781         "movq    %[x0], %%rax\n"
16782         "addq    %[y0], %%rax\n"
16783         "movq    %%rax, %[z0]\n"
16784         "movq    %[x1], %%rax\n"
16785         "adcq    %[y1], %%rax\n"
16786         "movq    %%rax, %[z1]\n"
16787         "movq $0, %%rax\n"
16788         "adcq $0, %%rax\n"
16789     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), "=&a"(carry)
16790     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
16791     );
16792     return carry;
16793 }
16794 
16795 /* x, y, and z have 1.5 words. Result in z. Return borrow bit */
16796 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
16797 static inline
mpfq_fixmp_1_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16798 mp_limb_t mpfq_fixmp_1_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16799 {
16800     mp_limb_t carry;
16801     __asm__ __volatile__(
16802         "movq    %[x0], %%rax\n"
16803         "subq    %[y0], %%rax\n"
16804         "movq    %%rax, %[z0]\n"
16805         "movq    %[x1], %%rax\n"
16806         "sbbq    %[y1], %%rax\n"
16807         "movq    %%rax, %[z1]\n"
16808         "movq $0, %%rax\n"
16809         "adcq $0, %%rax\n"
16810     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), "=&a"(carry)
16811     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
16812     );
16813     return carry;
16814 }
16815 
16816 /* x, y, and z have 1.5 words. Result in z. Carry bit is lost. */
16817 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
16818 static inline
mpfq_fixmp_1_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16819 void mpfq_fixmp_1_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16820 {
16821     __asm__ __volatile__(
16822         "movq    %[x0], %%rax\n"
16823         "addq    %[y0], %%rax\n"
16824         "movq    %%rax, %[z0]\n"
16825         "movq    %[x1], %%rax\n"
16826         "adcq    %[y1], %%rax\n"
16827         "movq    %%rax, %[z1]\n"
16828     : [z0]"=m"(z[0]), [z1]"=m"(z[1])
16829     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
16830     : "%rax");
16831 }
16832 
16833 /* x, y, and z have 1.5 words. Result in z. Borrow bit is lost. */
16834 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
16835 static inline
mpfq_fixmp_1_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16836 void mpfq_fixmp_1_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16837 {
16838     __asm__ __volatile__(
16839         "movq    %[x0], %%rax\n"
16840         "subq    %[y0], %%rax\n"
16841         "movq    %%rax, %[z0]\n"
16842         "movq    %[x1], %%rax\n"
16843         "sbbq    %[y1], %%rax\n"
16844         "movq    %%rax, %[z1]\n"
16845     : [z0]"=m"(z[0]), [z1]"=m"(z[1])
16846     : [x0]"m"(x[0]), [x1]"m"(x[1]), [y0]"m"(y[0]), [y1]"m"(y[1])
16847     : "%rax");
16848 }
16849 
16850 /* x has 1.5 words, z has 3.
16851  * Put (z+x*c) in z. Return carry bit. */
16852 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
16853 static inline
mpfq_fixmp_1_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16854 mp_limb_t mpfq_fixmp_1_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16855 {
16856     mp_limb_t carry;
16857     __asm__ __volatile__(
16858         "movq    %[x0], %%rax\n"
16859         "mulq    %[mult]\n"
16860         "addq    %%rax, %[z0]\n"
16861         "movq    %[x1], %%rax\n"
16862         "adcq    $0, %%rdx\n"
16863         "movq    %%rdx, %%rcx\n"
16864         "mulq    %[mult]\n"
16865         "addq    %%rax, %%rcx\n"
16866         "adcq    $0, %%rdx\n"
16867         "addq    %%rcx, %[z1]\n"
16868         "adcq    $0, %%rdx\n"
16869         "xorq    %%rcx, %%rcx\n"
16870         "addq    %%rdx, %[z2]\n"
16871         "adcq    $0, %%rcx\n"
16872         "movq    %%rcx, %[carry]\n"
16873     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
16874     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
16875     : "%rax", "%rcx", "%rdx");
16876     return carry;
16877 }
16878 
16879 /* x has 1.5 words, z has 3.
16880  * Put (z+x*c) in z. Carry bit is lost. */
16881 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
16882 static inline
mpfq_fixmp_1_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16883 void mpfq_fixmp_1_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16884 {
16885     __asm__ __volatile__(
16886         "movq    %[x0], %%rax\n"
16887         "mulq    %[mult]\n"
16888         "addq    %%rax, %[z0]\n"
16889         "movq    %[x1], %%rax\n"
16890         "adcq    $0, %%rdx\n"
16891         "movq    %%rdx, %%rcx\n"
16892         "mulq    %[mult]\n"
16893         "addq    %%rax, %%rcx\n"
16894         "adcq    $0, %%rdx\n"
16895         "addq    %%rcx, %[z1]\n"
16896         "adcq    $0, %%rdx\n"
16897         "addq    %%rdx, %[z2]\n"
16898     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
16899     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
16900     : "%rax", "%rcx", "%rdx");
16901 }
16902 
16903 /* x has 1.5 words, z has 2.
16904  * Put (z+x*c) in z. Return carry word. */
16905 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
16906 static inline
mpfq_fixmp_1_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16907 mp_limb_t mpfq_fixmp_1_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16908 {
16909     mp_limb_t carry;
16910     __asm__ __volatile__(
16911         "movq    %[x0], %%rax\n"
16912         "mulq    %[mult]\n"
16913         "addq    %%rax, %[z0]\n"
16914         "movq    %[x1], %%rax\n"
16915         "adcq    $0, %%rdx\n"
16916         "movq    %%rdx, %%rcx\n"
16917         "mulq    %[mult]\n"
16918         "addq    %%rax, %%rcx\n"
16919         "adcq    $0, %%rdx\n"
16920         "addq    %%rcx, %[z1]\n"
16921         "adcq    $0, %%rdx\n"
16922         "movq    %%rdx, %[carry]\n"
16923     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
16924     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
16925     : "%rax", "%rcx", "%rdx");
16926     return carry;
16927 }
16928 
16929 /* x and y have 1.5 words, z has 3. Put x*y in z. */
16930 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
16931 static inline
mpfq_fixmp_1_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)16932 void mpfq_fixmp_1_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
16933 {
16934     __asm__ __volatile__(
16935         "### x*y[0]\n"
16936         "movq    %2, %%r8\n"
16937         "movq    %0, %%rdi\n"
16938         "movq    0(%%r8), %%r9\n"
16939         "movq    %1, %%rsi\n"
16940         "movq    0(%%rsi), %%rax\n"
16941         "mulq    %%r9\n"
16942         "movq    %%rax, 0(%%rdi)\n"
16943         "movq    8(%%rsi), %%rax\n"
16944         "movq    %%rdx, %%rcx\n"
16945         "mulq    %%r9\n"
16946         "addq    %%rax, %%rcx\n"
16947         "adcq    $0, %%rdx\n"
16948         "movq    %%rcx, 8(%%rdi)\n"
16949         "movq    %%rdx, 16(%%rdi)\n"
16950         "### x*y[1]\n"
16951         "movq    8(%%r8), %%r9\n"
16952         "movq    0(%%rsi), %%rax\n"
16953         "mulq    %%r9\n"
16954         "addq    %%rax, 8(%%rdi)\n"
16955         "movq    8(%%rsi), %%rax\n"
16956         "adcq    $0, %%rdx\n"
16957         "movq    %%rdx, %%rcx\n"
16958         "mulq    %%r9\n"
16959         "addq    %%rax, %%rcx\n"
16960         "adcq    $0, %%rdx\n"
16961         "addq    %%rcx, 16(%%rdi)\n"
16962       : "+m" (z)
16963       : "m" (x), "m" (y)
16964       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
16965 }
16966 
16967 /* x has 1.5 words, z has 3. Put x*y in z. */
16968 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
16969 static inline
mpfq_fixmp_1_5_sqr(mp_limb_t * z,const mp_limb_t * x)16970 void mpfq_fixmp_1_5_sqr(mp_limb_t * z, const mp_limb_t * x)
16971 {
16972     __asm__ __volatile__(
16973         "movq    %1, %%r8\n"
16974         "movq    %0, %%rdi\n"
16975         "movq    (%%r8), %%rax\n"
16976         "mulq    %%rax\n"
16977         "movq    %%rax, (%%rdi)\n"
16978         "movq    8(%%r8), %%rax\n"
16979         "movq    %%rdx, %%r9\n"
16980         "mulq    %%rax\n"
16981         "movq    %%rax, %%r10\n"
16982         "movq    (%%r8), %%rax\n"
16983         "mulq    8(%%r8)\n"
16984         "addq    %%rax, %%r9\n"
16985         "adcq    %%rdx, %%r10\n"
16986         "addq    %%rax, %%r9\n"
16987         "movq    %%r9, 8(%%rdi)\n"
16988         "adcq    %%rdx, %%r10\n"
16989         "movq    %%r10, 16(%%rdi)\n"
16990     : "+m" (z)
16991     : "m" (x)
16992     : "%rax", "%rdx", "%rdi", "%r8", "%r9", "%r10", "%r11", "memory");
16993 }
16994 
16995 /* x has 1.5 words, z has 3. Put x*y in z. */
16996 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
16997 static inline
mpfq_fixmp_1_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)16998 void mpfq_fixmp_1_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
16999 {
17000     __asm__ __volatile__(
17001         "movq    %[x0], %%rax\n"
17002         "mulq    %[mult]\n"
17003         "movq    %%rax, %[z0]\n"
17004         "movq    %[x1], %%rax\n"
17005         "movq    %%rdx, %%rcx\n"
17006         "mulq    %[mult]\n"
17007         "addq    %%rax, %%rcx\n"
17008         "adcq    $0, %%rdx\n"
17009         "movq    %%rcx, %[z1]\n"
17010         "movq    %%rdx, %[z2]\n"
17011     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2])
17012     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
17013     : "%rax", "%rcx", "%rdx");
17014 }
17015 
17016 /* x has 1.5 words, z has 2. c is 0.5 word.
17017  * Put (z+x*c) in z. Return carry bit. */
17018 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
17019 static inline
mpfq_fixmp_1_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17020 mp_limb_t mpfq_fixmp_1_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17021 {
17022     mp_limb_t carry;
17023     __asm__ __volatile__(
17024         "movq    %[x0], %%rax\n"
17025         "mulq    %[mult]\n"
17026         "addq    %%rax, %[z0]\n"
17027         "movq    %[x1], %%rax\n"
17028         "adcq    $0, %%rdx\n"
17029         "movq    %%rdx, %%rcx\n"
17030         "imulq    %[mult], %%rax\n"
17031         "xorq    %%rdx, %%rdx\n"
17032         "addq    %%rcx, %%rax\n"
17033         "adcq    $0, %%rdx\n"
17034         "addq    %%rax, %[z1]\n"
17035         "adcq    $0, %%rdx\n"
17036         "movq    %%rdx, %[carry]\n"
17037     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1])
17038     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
17039     : "%rax", "%rcx", "%rdx");
17040     return carry;
17041 }
17042 
17043 /* x has 1.5 words, z has 2. c is 0.5 word.
17044  * Put (z+x*c) in z. Carry bit is lost. */
17045 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
17046 static inline
mpfq_fixmp_1_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17047 void mpfq_fixmp_1_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17048 {
17049     __asm__ __volatile__(
17050         "movq    %[x0], %%rax\n"
17051         "mulq    %[mult]\n"
17052         "addq    %%rax, %[z0]\n"
17053         "movq    %[x1], %%rax\n"
17054         "adcq    $0, %%rdx\n"
17055         "movq    %%rdx, %%rcx\n"
17056         "imulq    %[mult], %%rax\n"
17057         "addq    %%rcx, %%rax\n"
17058         "addq    %%rax, %[z1]\n"
17059     : [z0]"+m"(z[0]), [z1]"+m"(z[1])
17060     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
17061     : "%rax", "%rcx", "%rdx");
17062 }
17063 
17064 /* x has 1.5 words, z has 2. c is 0.5 word.
17065  * Put (x*c) in z. No carry. */
17066 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
17067 static inline
mpfq_fixmp_1_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17068 void mpfq_fixmp_1_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17069 {
17070     __asm__ __volatile__(
17071         "movq    %[x0], %%rax\n"
17072         "mulq    %[mult]\n"
17073         "movq    %%rax, %[z0]\n"
17074         "movq    %[x1], %%rax\n"
17075         "movq    %%rdx, %%rcx\n"
17076         "imulq    %[mult], %%rax\n"
17077         "addq    %%rcx, %%rax\n"
17078         "movq    %%rax, %[z1]\n"
17079     : [z0]"=m"(z[0]), [z1]"=m"(z[1])
17080     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1])
17081     : "%rax", "%rcx", "%rdx");
17082 }
17083 
17084 /* x, y, and z have 2.5 words. Result in z. Return carry bit */
17085 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
17086 static inline
mpfq_fixmp_2_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17087 mp_limb_t mpfq_fixmp_2_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17088 {
17089     mp_limb_t carry;
17090     __asm__ __volatile__(
17091         "movq    %[x0], %%rax\n"
17092         "addq    %[y0], %%rax\n"
17093         "movq    %%rax, %[z0]\n"
17094         "movq    %[x1], %%rax\n"
17095         "adcq    %[y1], %%rax\n"
17096         "movq    %%rax, %[z1]\n"
17097         "movq    %[x2], %%rax\n"
17098         "adcq    %[y2], %%rax\n"
17099         "movq    %%rax, %[z2]\n"
17100         "movq $0, %%rax\n"
17101         "adcq $0, %%rax\n"
17102     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), "=&a"(carry)
17103     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
17104     );
17105     return carry;
17106 }
17107 
17108 /* x, y, and z have 2.5 words. Result in z. Return borrow bit */
17109 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
17110 static inline
mpfq_fixmp_2_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17111 mp_limb_t mpfq_fixmp_2_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17112 {
17113     mp_limb_t carry;
17114     __asm__ __volatile__(
17115         "movq    %[x0], %%rax\n"
17116         "subq    %[y0], %%rax\n"
17117         "movq    %%rax, %[z0]\n"
17118         "movq    %[x1], %%rax\n"
17119         "sbbq    %[y1], %%rax\n"
17120         "movq    %%rax, %[z1]\n"
17121         "movq    %[x2], %%rax\n"
17122         "sbbq    %[y2], %%rax\n"
17123         "movq    %%rax, %[z2]\n"
17124         "movq $0, %%rax\n"
17125         "adcq $0, %%rax\n"
17126     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), "=&a"(carry)
17127     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
17128     );
17129     return carry;
17130 }
17131 
17132 /* x, y, and z have 2.5 words. Result in z. Carry bit is lost. */
17133 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
17134 static inline
mpfq_fixmp_2_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17135 void mpfq_fixmp_2_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17136 {
17137     __asm__ __volatile__(
17138         "movq    %[x0], %%rax\n"
17139         "addq    %[y0], %%rax\n"
17140         "movq    %%rax, %[z0]\n"
17141         "movq    %[x1], %%rax\n"
17142         "adcq    %[y1], %%rax\n"
17143         "movq    %%rax, %[z1]\n"
17144         "movq    %[x2], %%rax\n"
17145         "adcq    %[y2], %%rax\n"
17146         "movq    %%rax, %[z2]\n"
17147     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2])
17148     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
17149     : "%rax");
17150 }
17151 
17152 /* x, y, and z have 2.5 words. Result in z. Borrow bit is lost. */
17153 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
17154 static inline
mpfq_fixmp_2_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17155 void mpfq_fixmp_2_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17156 {
17157     __asm__ __volatile__(
17158         "movq    %[x0], %%rax\n"
17159         "subq    %[y0], %%rax\n"
17160         "movq    %%rax, %[z0]\n"
17161         "movq    %[x1], %%rax\n"
17162         "sbbq    %[y1], %%rax\n"
17163         "movq    %%rax, %[z1]\n"
17164         "movq    %[x2], %%rax\n"
17165         "sbbq    %[y2], %%rax\n"
17166         "movq    %%rax, %[z2]\n"
17167     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2])
17168     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2])
17169     : "%rax");
17170 }
17171 
17172 /* x has 2.5 words, z has 4.
17173  * Put (z+x*c) in z. Return carry bit. */
17174 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
17175 static inline
mpfq_fixmp_2_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17176 mp_limb_t mpfq_fixmp_2_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17177 {
17178     mp_limb_t carry;
17179     __asm__ __volatile__(
17180         "movq    %[x0], %%rax\n"
17181         "mulq    %[mult]\n"
17182         "addq    %%rax, %[z0]\n"
17183         "movq    %[x1], %%rax\n"
17184         "adcq    $0, %%rdx\n"
17185         "movq    %%rdx, %%rcx\n"
17186         "mulq    %[mult]\n"
17187         "addq    %%rax, %%rcx\n"
17188         "adcq    $0, %%rdx\n"
17189         "movq    %[x2], %%rax\n"
17190         "addq    %%rcx, %[z1]\n"
17191         "adcq    $0, %%rdx\n"
17192         "movq    %%rdx, %%rcx\n"
17193         "mulq    %[mult]\n"
17194         "addq    %%rax, %%rcx\n"
17195         "adcq    $0, %%rdx\n"
17196         "addq    %%rcx, %[z2]\n"
17197         "adcq    $0, %%rdx\n"
17198         "xorq    %%rcx, %%rcx\n"
17199         "addq    %%rdx, %[z3]\n"
17200         "adcq    $0, %%rcx\n"
17201         "movq    %%rcx, %[carry]\n"
17202     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
17203     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
17204     : "%rax", "%rcx", "%rdx");
17205     return carry;
17206 }
17207 
17208 /* x has 2.5 words, z has 4.
17209  * Put (z+x*c) in z. Carry bit is lost. */
17210 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
17211 static inline
mpfq_fixmp_2_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17212 void mpfq_fixmp_2_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17213 {
17214     __asm__ __volatile__(
17215         "movq    %[x0], %%rax\n"
17216         "mulq    %[mult]\n"
17217         "addq    %%rax, %[z0]\n"
17218         "movq    %[x1], %%rax\n"
17219         "adcq    $0, %%rdx\n"
17220         "movq    %%rdx, %%rcx\n"
17221         "mulq    %[mult]\n"
17222         "addq    %%rax, %%rcx\n"
17223         "adcq    $0, %%rdx\n"
17224         "movq    %[x2], %%rax\n"
17225         "addq    %%rcx, %[z1]\n"
17226         "adcq    $0, %%rdx\n"
17227         "movq    %%rdx, %%rcx\n"
17228         "mulq    %[mult]\n"
17229         "addq    %%rax, %%rcx\n"
17230         "adcq    $0, %%rdx\n"
17231         "addq    %%rcx, %[z2]\n"
17232         "adcq    $0, %%rdx\n"
17233         "addq    %%rdx, %[z3]\n"
17234     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
17235     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
17236     : "%rax", "%rcx", "%rdx");
17237 }
17238 
17239 /* x has 2.5 words, z has 3.
17240  * Put (z+x*c) in z. Return carry word. */
17241 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
17242 static inline
mpfq_fixmp_2_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17243 mp_limb_t mpfq_fixmp_2_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17244 {
17245     mp_limb_t carry;
17246     __asm__ __volatile__(
17247         "movq    %[x0], %%rax\n"
17248         "mulq    %[mult]\n"
17249         "addq    %%rax, %[z0]\n"
17250         "movq    %[x1], %%rax\n"
17251         "adcq    $0, %%rdx\n"
17252         "movq    %%rdx, %%rcx\n"
17253         "mulq    %[mult]\n"
17254         "addq    %%rax, %%rcx\n"
17255         "adcq    $0, %%rdx\n"
17256         "movq    %[x2], %%rax\n"
17257         "addq    %%rcx, %[z1]\n"
17258         "adcq    $0, %%rdx\n"
17259         "movq    %%rdx, %%rcx\n"
17260         "mulq    %[mult]\n"
17261         "addq    %%rax, %%rcx\n"
17262         "adcq    $0, %%rdx\n"
17263         "addq    %%rcx, %[z2]\n"
17264         "adcq    $0, %%rdx\n"
17265         "movq    %%rdx, %[carry]\n"
17266     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
17267     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
17268     : "%rax", "%rcx", "%rdx");
17269     return carry;
17270 }
17271 
17272 /* x and y have 2.5 words, z has 5. Put x*y in z. */
17273 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
17274 static inline
mpfq_fixmp_2_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17275 void mpfq_fixmp_2_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17276 {
17277     __asm__ __volatile__(
17278         "### x*y[0]\n"
17279         "movq    %2, %%r8\n"
17280         "movq    %0, %%rdi\n"
17281         "movq    0(%%r8), %%r9\n"
17282         "movq    %1, %%rsi\n"
17283         "movq    0(%%rsi), %%rax\n"
17284         "mulq    %%r9\n"
17285         "movq    %%rax, 0(%%rdi)\n"
17286         "movq    8(%%rsi), %%rax\n"
17287         "movq    %%rdx, %%rcx\n"
17288         "mulq    %%r9\n"
17289         "addq    %%rax, %%rcx\n"
17290         "adcq    $0, %%rdx\n"
17291         "movq    16(%%rsi), %%rax\n"
17292         "movq    %%rcx, 8(%%rdi)\n"
17293         "movq    %%rdx, %%rcx\n"
17294         "mulq    %%r9\n"
17295         "addq    %%rax, %%rcx\n"
17296         "adcq    $0, %%rdx\n"
17297         "movq    %%rcx, 16(%%rdi)\n"
17298         "movq    %%rdx, 24(%%rdi)\n"
17299         "movq    $0, 32(%%rdi)\n"
17300         "### x*y[1]\n"
17301         "movq    8(%%r8), %%r9\n"
17302         "movq    0(%%rsi), %%rax\n"
17303         "mulq    %%r9\n"
17304         "addq    %%rax, 8(%%rdi)\n"
17305         "movq    8(%%rsi), %%rax\n"
17306         "adcq    $0, %%rdx\n"
17307         "movq    %%rdx, %%rcx\n"
17308         "mulq    %%r9\n"
17309         "addq    %%rax, %%rcx\n"
17310         "adcq    $0, %%rdx\n"
17311         "movq    16(%%rsi), %%rax\n"
17312         "addq    %%rcx, 16(%%rdi)\n"
17313         "adcq    $0, %%rdx\n"
17314         "movq    %%rdx, %%rcx\n"
17315         "mulq    %%r9\n"
17316         "addq    %%rax, %%rcx\n"
17317         "adcq    $0, %%rdx\n"
17318         "addq    %%rcx, 24(%%rdi)\n"
17319         "adcq    $0, %%rdx\n"
17320         "movq    %%rdx, 32(%%rdi)\n"
17321         "### x*y[2]\n"
17322         "movq    16(%%r8), %%r9\n"
17323         "movq    0(%%rsi), %%rax\n"
17324         "mulq    %%r9\n"
17325         "addq    %%rax, 16(%%rdi)\n"
17326         "movq    8(%%rsi), %%rax\n"
17327         "adcq    $0, %%rdx\n"
17328         "movq    %%rdx, %%rcx\n"
17329         "mulq    %%r9\n"
17330         "addq    %%rax, %%rcx\n"
17331         "adcq    $0, %%rdx\n"
17332         "movq    16(%%rsi), %%rax\n"
17333         "addq    %%rcx, 24(%%rdi)\n"
17334         "adcq    $0, %%rdx\n"
17335         "movq    %%rdx, %%rcx\n"
17336         "mulq    %%r9\n"
17337         "addq    %%rax, %%rcx\n"
17338         "adcq    $0, %%rdx\n"
17339         "addq    %%rcx, 32(%%rdi)\n"
17340       : "+m" (z)
17341       : "m" (x), "m" (y)
17342       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
17343 }
17344 
17345 /* x has 2.5 words, z has 5. Put x*y in z. */
17346 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
17347 static inline
mpfq_fixmp_2_5_sqr(mp_limb_t * z,const mp_limb_t * x)17348 void mpfq_fixmp_2_5_sqr(mp_limb_t * z, const mp_limb_t * x)
17349 {
17350     __asm__ __volatile__(
17351         "movq    %1, %%rsi\n"
17352         "movq    %0, %%rdi\n"
17353         "### diagonal elements\n"
17354         "movq    (%%rsi), %%rax\n"
17355         "mulq    %%rax\n"
17356         "movq    %%rax, (%%rdi)\n"
17357         "movq    8(%%rsi), %%rax\n"
17358         "movq    %%rdx, 8(%%rdi)\n"
17359         "mulq    %%rax\n"
17360         "movq    %%rax, 16(%%rdi)\n"
17361         "movq    16(%%rsi), %%rax\n"
17362         "movq    %%rdx, 24(%%rdi)\n"
17363         "mulq    %%rax\n"
17364         "movq    %%rax, 32(%%rdi)\n"
17365         "### precompute triangle\n"
17366         "### x[0]*x[1,2]\n"
17367         "movq    (%%rsi), %%rcx\n"
17368         "movq    8(%%rsi), %%rax\n"
17369         "mulq    %%rcx\n"
17370         "movq    %%rax, %%r8\n"
17371         "movq    %%rdx, %%r9\n"
17372         "movq    16(%%rsi), %%rax\n"
17373         "mulq    %%rcx\n"
17374         "addq    %%rax, %%r9\n"
17375         "adcq    $0, %%rdx\n"
17376         "movq    %%rdx, %%r10\n"
17377         "### x[1]*x[2]\n"
17378         "movq    8(%%rsi), %%rax\n"
17379         "mulq    16(%%rsi)\n"
17380         "addq    %%rax, %%r10\n"
17381         "adcq    $0, %%rdx\n"
17382         "### Shift triangle\n"
17383         "addq    %%r8, %%r8\n"
17384         "adcq    %%r9, %%r9\n"
17385         "adcq    %%r10, %%r10\n"
17386         "adcq    %%rdx, %%rdx\n"
17387         "### add shifted triangle to diagonal\n"
17388         "addq    %%r8, 8(%%rdi)\n"
17389         "adcq    %%r9, 16(%%rdi)\n"
17390         "adcq    %%r10, 24(%%rdi)\n"
17391         "adcq    %%rdx, 32(%%rdi)\n"
17392     : "+m" (z)
17393     : "m" (x)
17394     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "%r10", "memory");
17395 }
17396 
17397 /* x has 2.5 words, z has 4. Put x*y in z. */
17398 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
17399 static inline
mpfq_fixmp_2_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17400 void mpfq_fixmp_2_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17401 {
17402     __asm__ __volatile__(
17403         "movq    %[x0], %%rax\n"
17404         "mulq    %[mult]\n"
17405         "movq    %%rax, %[z0]\n"
17406         "movq    %[x1], %%rax\n"
17407         "movq    %%rdx, %%rcx\n"
17408         "mulq    %[mult]\n"
17409         "addq    %%rax, %%rcx\n"
17410         "adcq    $0, %%rdx\n"
17411         "movq    %[x2], %%rax\n"
17412         "movq    %%rcx, %[z1]\n"
17413         "movq    %%rdx, %%rcx\n"
17414         "mulq    %[mult]\n"
17415         "addq    %%rax, %%rcx\n"
17416         "adcq    $0, %%rdx\n"
17417         "movq    %%rcx, %[z2]\n"
17418         "movq    %%rdx, %[z3]\n"
17419     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3])
17420     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
17421     : "%rax", "%rcx", "%rdx");
17422 }
17423 
17424 /* x has 2.5 words, z has 3. c is 0.5 word.
17425  * Put (z+x*c) in z. Return carry bit. */
17426 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
17427 static inline
mpfq_fixmp_2_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17428 mp_limb_t mpfq_fixmp_2_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17429 {
17430     mp_limb_t carry;
17431     __asm__ __volatile__(
17432         "movq    %[x0], %%rax\n"
17433         "mulq    %[mult]\n"
17434         "addq    %%rax, %[z0]\n"
17435         "movq    %[x1], %%rax\n"
17436         "adcq    $0, %%rdx\n"
17437         "movq    %%rdx, %%rcx\n"
17438         "mulq    %[mult]\n"
17439         "addq    %%rax, %%rcx\n"
17440         "adcq    $0, %%rdx\n"
17441         "movq    %[x2], %%rax\n"
17442         "addq    %%rcx, %[z1]\n"
17443         "adcq    $0, %%rdx\n"
17444         "movq    %%rdx, %%rcx\n"
17445         "imulq    %[mult], %%rax\n"
17446         "xorq    %%rdx, %%rdx\n"
17447         "addq    %%rcx, %%rax\n"
17448         "adcq    $0, %%rdx\n"
17449         "addq    %%rax, %[z2]\n"
17450         "adcq    $0, %%rdx\n"
17451         "movq    %%rdx, %[carry]\n"
17452     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
17453     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
17454     : "%rax", "%rcx", "%rdx");
17455     return carry;
17456 }
17457 
17458 /* x has 2.5 words, z has 3. c is 0.5 word.
17459  * Put (z+x*c) in z. Carry bit is lost. */
17460 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
17461 static inline
mpfq_fixmp_2_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17462 void mpfq_fixmp_2_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17463 {
17464     __asm__ __volatile__(
17465         "movq    %[x0], %%rax\n"
17466         "mulq    %[mult]\n"
17467         "addq    %%rax, %[z0]\n"
17468         "movq    %[x1], %%rax\n"
17469         "adcq    $0, %%rdx\n"
17470         "movq    %%rdx, %%rcx\n"
17471         "mulq    %[mult]\n"
17472         "addq    %%rax, %%rcx\n"
17473         "adcq    $0, %%rdx\n"
17474         "movq    %[x2], %%rax\n"
17475         "addq    %%rcx, %[z1]\n"
17476         "adcq    $0, %%rdx\n"
17477         "movq    %%rdx, %%rcx\n"
17478         "imulq    %[mult], %%rax\n"
17479         "addq    %%rcx, %%rax\n"
17480         "addq    %%rax, %[z2]\n"
17481     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2])
17482     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
17483     : "%rax", "%rcx", "%rdx");
17484 }
17485 
17486 /* x has 2.5 words, z has 3. c is 0.5 word.
17487  * Put (x*c) in z. No carry. */
17488 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
17489 static inline
mpfq_fixmp_2_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17490 void mpfq_fixmp_2_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17491 {
17492     __asm__ __volatile__(
17493         "movq    %[x0], %%rax\n"
17494         "mulq    %[mult]\n"
17495         "movq    %%rax, %[z0]\n"
17496         "movq    %[x1], %%rax\n"
17497         "movq    %%rdx, %%rcx\n"
17498         "mulq    %[mult]\n"
17499         "addq    %%rax, %%rcx\n"
17500         "adcq    $0, %%rdx\n"
17501         "movq    %[x2], %%rax\n"
17502         "movq    %%rcx, %[z1]\n"
17503         "movq    %%rdx, %%rcx\n"
17504         "imulq    %[mult], %%rax\n"
17505         "addq    %%rcx, %%rax\n"
17506         "movq    %%rax, %[z2]\n"
17507     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2])
17508     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2])
17509     : "%rax", "%rcx", "%rdx");
17510 }
17511 
17512 /* x, y, and z have 3.5 words. Result in z. Return carry bit */
17513 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
17514 static inline
mpfq_fixmp_3_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17515 mp_limb_t mpfq_fixmp_3_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17516 {
17517     mp_limb_t carry;
17518     __asm__ __volatile__(
17519         "movq    %[x0], %%rax\n"
17520         "addq    %[y0], %%rax\n"
17521         "movq    %%rax, %[z0]\n"
17522         "movq    %[x1], %%rax\n"
17523         "adcq    %[y1], %%rax\n"
17524         "movq    %%rax, %[z1]\n"
17525         "movq    %[x2], %%rax\n"
17526         "adcq    %[y2], %%rax\n"
17527         "movq    %%rax, %[z2]\n"
17528         "movq    %[x3], %%rax\n"
17529         "adcq    %[y3], %%rax\n"
17530         "movq    %%rax, %[z3]\n"
17531         "movq $0, %%rax\n"
17532         "adcq $0, %%rax\n"
17533     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3]), "=&a"(carry)
17534     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
17535     );
17536     return carry;
17537 }
17538 
17539 /* x, y, and z have 3.5 words. Result in z. Return borrow bit */
17540 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
17541 static inline
mpfq_fixmp_3_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17542 mp_limb_t mpfq_fixmp_3_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17543 {
17544     mp_limb_t carry;
17545     __asm__ __volatile__(
17546         "movq    %[x0], %%rax\n"
17547         "subq    %[y0], %%rax\n"
17548         "movq    %%rax, %[z0]\n"
17549         "movq    %[x1], %%rax\n"
17550         "sbbq    %[y1], %%rax\n"
17551         "movq    %%rax, %[z1]\n"
17552         "movq    %[x2], %%rax\n"
17553         "sbbq    %[y2], %%rax\n"
17554         "movq    %%rax, %[z2]\n"
17555         "movq    %[x3], %%rax\n"
17556         "sbbq    %[y3], %%rax\n"
17557         "movq    %%rax, %[z3]\n"
17558         "movq $0, %%rax\n"
17559         "adcq $0, %%rax\n"
17560     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3]), "=&a"(carry)
17561     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
17562     );
17563     return carry;
17564 }
17565 
17566 /* x, y, and z have 3.5 words. Result in z. Carry bit is lost. */
17567 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
17568 static inline
mpfq_fixmp_3_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17569 void mpfq_fixmp_3_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17570 {
17571     __asm__ __volatile__(
17572         "movq    %[x0], %%rax\n"
17573         "addq    %[y0], %%rax\n"
17574         "movq    %%rax, %[z0]\n"
17575         "movq    %[x1], %%rax\n"
17576         "adcq    %[y1], %%rax\n"
17577         "movq    %%rax, %[z1]\n"
17578         "movq    %[x2], %%rax\n"
17579         "adcq    %[y2], %%rax\n"
17580         "movq    %%rax, %[z2]\n"
17581         "movq    %[x3], %%rax\n"
17582         "adcq    %[y3], %%rax\n"
17583         "movq    %%rax, %[z3]\n"
17584     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3])
17585     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
17586     : "%rax");
17587 }
17588 
17589 /* x, y, and z have 3.5 words. Result in z. Borrow bit is lost. */
17590 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
17591 static inline
mpfq_fixmp_3_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17592 void mpfq_fixmp_3_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17593 {
17594     __asm__ __volatile__(
17595         "movq    %[x0], %%rax\n"
17596         "subq    %[y0], %%rax\n"
17597         "movq    %%rax, %[z0]\n"
17598         "movq    %[x1], %%rax\n"
17599         "sbbq    %[y1], %%rax\n"
17600         "movq    %%rax, %[z1]\n"
17601         "movq    %[x2], %%rax\n"
17602         "sbbq    %[y2], %%rax\n"
17603         "movq    %%rax, %[z2]\n"
17604         "movq    %[x3], %%rax\n"
17605         "sbbq    %[y3], %%rax\n"
17606         "movq    %%rax, %[z3]\n"
17607     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3])
17608     : [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3]), [y0]"m"(y[0]), [y1]"m"(y[1]), [y2]"m"(y[2]), [y3]"m"(y[3])
17609     : "%rax");
17610 }
17611 
17612 /* x has 3.5 words, z has 5.
17613  * Put (z+x*c) in z. Return carry bit. */
17614 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
17615 static inline
mpfq_fixmp_3_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17616 mp_limb_t mpfq_fixmp_3_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17617 {
17618     mp_limb_t carry;
17619     __asm__ __volatile__(
17620         "movq    %[x0], %%rax\n"
17621         "mulq    %[mult]\n"
17622         "addq    %%rax, %[z0]\n"
17623         "movq    %[x1], %%rax\n"
17624         "adcq    $0, %%rdx\n"
17625         "movq    %%rdx, %%rcx\n"
17626         "mulq    %[mult]\n"
17627         "addq    %%rax, %%rcx\n"
17628         "adcq    $0, %%rdx\n"
17629         "movq    %[x2], %%rax\n"
17630         "addq    %%rcx, %[z1]\n"
17631         "adcq    $0, %%rdx\n"
17632         "movq    %%rdx, %%rcx\n"
17633         "mulq    %[mult]\n"
17634         "addq    %%rax, %%rcx\n"
17635         "adcq    $0, %%rdx\n"
17636         "movq    %[x3], %%rax\n"
17637         "addq    %%rcx, %[z2]\n"
17638         "adcq    $0, %%rdx\n"
17639         "movq    %%rdx, %%rcx\n"
17640         "mulq    %[mult]\n"
17641         "addq    %%rax, %%rcx\n"
17642         "adcq    $0, %%rdx\n"
17643         "addq    %%rcx, %[z3]\n"
17644         "adcq    $0, %%rdx\n"
17645         "xorq    %%rcx, %%rcx\n"
17646         "addq    %%rdx, %[z4]\n"
17647         "adcq    $0, %%rcx\n"
17648         "movq    %%rcx, %[carry]\n"
17649     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3]), [z4]"+m"(z[4])
17650     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
17651     : "%rax", "%rcx", "%rdx");
17652     return carry;
17653 }
17654 
17655 /* x has 3.5 words, z has 5.
17656  * Put (z+x*c) in z. Carry bit is lost. */
17657 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
17658 static inline
mpfq_fixmp_3_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17659 void mpfq_fixmp_3_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17660 {
17661     __asm__ __volatile__(
17662         "movq    %[x0], %%rax\n"
17663         "mulq    %[mult]\n"
17664         "addq    %%rax, %[z0]\n"
17665         "movq    %[x1], %%rax\n"
17666         "adcq    $0, %%rdx\n"
17667         "movq    %%rdx, %%rcx\n"
17668         "mulq    %[mult]\n"
17669         "addq    %%rax, %%rcx\n"
17670         "adcq    $0, %%rdx\n"
17671         "movq    %[x2], %%rax\n"
17672         "addq    %%rcx, %[z1]\n"
17673         "adcq    $0, %%rdx\n"
17674         "movq    %%rdx, %%rcx\n"
17675         "mulq    %[mult]\n"
17676         "addq    %%rax, %%rcx\n"
17677         "adcq    $0, %%rdx\n"
17678         "movq    %[x3], %%rax\n"
17679         "addq    %%rcx, %[z2]\n"
17680         "adcq    $0, %%rdx\n"
17681         "movq    %%rdx, %%rcx\n"
17682         "mulq    %[mult]\n"
17683         "addq    %%rax, %%rcx\n"
17684         "adcq    $0, %%rdx\n"
17685         "addq    %%rcx, %[z3]\n"
17686         "adcq    $0, %%rdx\n"
17687         "addq    %%rdx, %[z4]\n"
17688     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3]), [z4]"+m"(z[4])
17689     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
17690     : "%rax", "%rcx", "%rdx");
17691 }
17692 
17693 /* x has 3.5 words, z has 4.
17694  * Put (z+x*c) in z. Return carry word. */
17695 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
17696 static inline
mpfq_fixmp_3_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17697 mp_limb_t mpfq_fixmp_3_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17698 {
17699     mp_limb_t carry;
17700     __asm__ __volatile__(
17701         "movq    %[x0], %%rax\n"
17702         "mulq    %[mult]\n"
17703         "addq    %%rax, %[z0]\n"
17704         "movq    %[x1], %%rax\n"
17705         "adcq    $0, %%rdx\n"
17706         "movq    %%rdx, %%rcx\n"
17707         "mulq    %[mult]\n"
17708         "addq    %%rax, %%rcx\n"
17709         "adcq    $0, %%rdx\n"
17710         "movq    %[x2], %%rax\n"
17711         "addq    %%rcx, %[z1]\n"
17712         "adcq    $0, %%rdx\n"
17713         "movq    %%rdx, %%rcx\n"
17714         "mulq    %[mult]\n"
17715         "addq    %%rax, %%rcx\n"
17716         "adcq    $0, %%rdx\n"
17717         "movq    %[x3], %%rax\n"
17718         "addq    %%rcx, %[z2]\n"
17719         "adcq    $0, %%rdx\n"
17720         "movq    %%rdx, %%rcx\n"
17721         "mulq    %[mult]\n"
17722         "addq    %%rax, %%rcx\n"
17723         "adcq    $0, %%rdx\n"
17724         "addq    %%rcx, %[z3]\n"
17725         "adcq    $0, %%rdx\n"
17726         "movq    %%rdx, %[carry]\n"
17727     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3]), [z4]"+m"(z[4])
17728     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
17729     : "%rax", "%rcx", "%rdx");
17730     return carry;
17731 }
17732 
17733 /* x and y have 3.5 words, z has 7. Put x*y in z. */
17734 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
17735 static inline
mpfq_fixmp_3_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)17736 void mpfq_fixmp_3_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
17737 {
17738     __asm__ __volatile__(
17739         "### x*y[0]\n"
17740         "movq    %2, %%r8\n"
17741         "movq    %0, %%rdi\n"
17742         "movq    0(%%r8), %%r9\n"
17743         "movq    %1, %%rsi\n"
17744         "movq    0(%%rsi), %%rax\n"
17745         "mulq    %%r9\n"
17746         "movq    %%rax, 0(%%rdi)\n"
17747         "movq    8(%%rsi), %%rax\n"
17748         "movq    %%rdx, %%rcx\n"
17749         "mulq    %%r9\n"
17750         "addq    %%rax, %%rcx\n"
17751         "adcq    $0, %%rdx\n"
17752         "movq    16(%%rsi), %%rax\n"
17753         "movq    %%rcx, 8(%%rdi)\n"
17754         "movq    %%rdx, %%rcx\n"
17755         "mulq    %%r9\n"
17756         "addq    %%rax, %%rcx\n"
17757         "adcq    $0, %%rdx\n"
17758         "movq    24(%%rsi), %%rax\n"
17759         "movq    %%rcx, 16(%%rdi)\n"
17760         "movq    %%rdx, %%rcx\n"
17761         "mulq    %%r9\n"
17762         "addq    %%rax, %%rcx\n"
17763         "adcq    $0, %%rdx\n"
17764         "movq    %%rcx, 24(%%rdi)\n"
17765         "movq    %%rdx, 32(%%rdi)\n"
17766         "movq    $0, 40(%%rdi)\n"
17767         "movq    $0, 48(%%rdi)\n"
17768         "### x*y[1]\n"
17769         "movq    8(%%r8), %%r9\n"
17770         "movq    0(%%rsi), %%rax\n"
17771         "mulq    %%r9\n"
17772         "addq    %%rax, 8(%%rdi)\n"
17773         "movq    8(%%rsi), %%rax\n"
17774         "adcq    $0, %%rdx\n"
17775         "movq    %%rdx, %%rcx\n"
17776         "mulq    %%r9\n"
17777         "addq    %%rax, %%rcx\n"
17778         "adcq    $0, %%rdx\n"
17779         "movq    16(%%rsi), %%rax\n"
17780         "addq    %%rcx, 16(%%rdi)\n"
17781         "adcq    $0, %%rdx\n"
17782         "movq    %%rdx, %%rcx\n"
17783         "mulq    %%r9\n"
17784         "addq    %%rax, %%rcx\n"
17785         "adcq    $0, %%rdx\n"
17786         "movq    24(%%rsi), %%rax\n"
17787         "addq    %%rcx, 24(%%rdi)\n"
17788         "adcq    $0, %%rdx\n"
17789         "movq    %%rdx, %%rcx\n"
17790         "mulq    %%r9\n"
17791         "addq    %%rax, %%rcx\n"
17792         "adcq    $0, %%rdx\n"
17793         "addq    %%rcx, 32(%%rdi)\n"
17794         "adcq    $0, %%rdx\n"
17795         "movq    %%rdx, 40(%%rdi)\n"
17796         "### x*y[2]\n"
17797         "movq    16(%%r8), %%r9\n"
17798         "movq    0(%%rsi), %%rax\n"
17799         "mulq    %%r9\n"
17800         "addq    %%rax, 16(%%rdi)\n"
17801         "movq    8(%%rsi), %%rax\n"
17802         "adcq    $0, %%rdx\n"
17803         "movq    %%rdx, %%rcx\n"
17804         "mulq    %%r9\n"
17805         "addq    %%rax, %%rcx\n"
17806         "adcq    $0, %%rdx\n"
17807         "movq    16(%%rsi), %%rax\n"
17808         "addq    %%rcx, 24(%%rdi)\n"
17809         "adcq    $0, %%rdx\n"
17810         "movq    %%rdx, %%rcx\n"
17811         "mulq    %%r9\n"
17812         "addq    %%rax, %%rcx\n"
17813         "adcq    $0, %%rdx\n"
17814         "movq    24(%%rsi), %%rax\n"
17815         "addq    %%rcx, 32(%%rdi)\n"
17816         "adcq    $0, %%rdx\n"
17817         "movq    %%rdx, %%rcx\n"
17818         "mulq    %%r9\n"
17819         "addq    %%rax, %%rcx\n"
17820         "adcq    $0, %%rdx\n"
17821         "addq    %%rcx, 40(%%rdi)\n"
17822         "adcq    $0, %%rdx\n"
17823         "movq    %%rdx, 48(%%rdi)\n"
17824         "### x*y[3]\n"
17825         "movq    24(%%r8), %%r9\n"
17826         "movq    0(%%rsi), %%rax\n"
17827         "mulq    %%r9\n"
17828         "addq    %%rax, 24(%%rdi)\n"
17829         "movq    8(%%rsi), %%rax\n"
17830         "adcq    $0, %%rdx\n"
17831         "movq    %%rdx, %%rcx\n"
17832         "mulq    %%r9\n"
17833         "addq    %%rax, %%rcx\n"
17834         "adcq    $0, %%rdx\n"
17835         "movq    16(%%rsi), %%rax\n"
17836         "addq    %%rcx, 32(%%rdi)\n"
17837         "adcq    $0, %%rdx\n"
17838         "movq    %%rdx, %%rcx\n"
17839         "mulq    %%r9\n"
17840         "addq    %%rax, %%rcx\n"
17841         "adcq    $0, %%rdx\n"
17842         "movq    24(%%rsi), %%rax\n"
17843         "addq    %%rcx, 40(%%rdi)\n"
17844         "adcq    $0, %%rdx\n"
17845         "movq    %%rdx, %%rcx\n"
17846         "mulq    %%r9\n"
17847         "addq    %%rax, %%rcx\n"
17848         "adcq    $0, %%rdx\n"
17849         "addq    %%rcx, 48(%%rdi)\n"
17850       : "+m" (z)
17851       : "m" (x), "m" (y)
17852       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
17853 }
17854 
17855 /* x has 3.5 words, z has 7. Put x*y in z. */
17856 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
17857 static inline
mpfq_fixmp_3_5_sqr(mp_limb_t * z,const mp_limb_t * x)17858 void mpfq_fixmp_3_5_sqr(mp_limb_t * z, const mp_limb_t * x)
17859 {
17860     __asm__ __volatile__(
17861         "movq    %1, %%rsi\n"
17862         "movq    %0, %%rdi\n"
17863         "### diagonal elements\n"
17864         "movq    (%%rsi), %%rax\n"
17865         "mulq    %%rax\n"
17866         "movq    %%rax, (%%rdi)\n"
17867         "movq    8(%%rsi), %%rax\n"
17868         "movq    %%rdx, 8(%%rdi)\n"
17869         "mulq    %%rax\n"
17870         "movq    %%rax, 16(%%rdi)\n"
17871         "movq    16(%%rsi), %%rax\n"
17872         "movq    %%rdx, 24(%%rdi)\n"
17873         "mulq    %%rax\n"
17874         "movq    %%rax, 32(%%rdi)\n"
17875         "movq    24(%%rsi), %%rax\n"
17876         "movq    %%rdx, 40(%%rdi)\n"
17877         "mulq    %%rax\n"
17878         "movq    %%rax, 48(%%rdi)\n"
17879         "### precompute triangle\n"
17880         "### x[0]*x[1:3]\n"
17881         "movq    (%%rsi), %%rcx\n"
17882         "movq    8(%%rsi), %%rax\n"
17883         "mulq    %%rcx\n"
17884         "movq    %%rax, %%r8\n"
17885         "movq    %%rdx, %%r9\n"
17886         "movq    16(%%rsi), %%rax\n"
17887         "mulq    %%rcx\n"
17888         "addq    %%rax, %%r9\n"
17889         "adcq    $0, %%rdx\n"
17890         "movq    %%rdx, %%r10\n"
17891         "movq    24(%%rsi), %%rax\n"
17892         "mulq    %%rcx\n"
17893         "addq    %%rax, %%r10\n"
17894         "adcq    $0, %%rdx\n"
17895         "movq    %%rdx, %%r11\n"
17896         "### x[1]*x[2:3]\n"
17897         "movq    8(%%rsi), %%rcx\n"
17898         "movq    16(%%rsi), %%rax\n"
17899         "xorq    %%r12, %%r12\n"
17900         "mulq    %%rcx\n"
17901         "addq    %%rax, %%r10\n"
17902         "adcq    %%rdx, %%r11\n"
17903         "adcq    $0, %%r12\n"
17904         "movq    24(%%rsi), %%rax\n"
17905         "mulq    %%rcx\n"
17906         "addq    %%rax, %%r11\n"
17907         "adcq    $0, %%rdx\n"
17908         "addq    %%rdx, %%r12\n"
17909         "### x[2]*x[3]\n"
17910         "movq    16(%%rsi), %%rax\n"
17911         "mulq    24(%%rsi)\n"
17912         "addq    %%rax, %%r12\n"
17913         "adcq    $0, %%rdx\n"
17914         "### Shift triangle\n"
17915         "addq    %%r8, %%r8\n"
17916         "adcq    %%r9, %%r9\n"
17917         "adcq    %%r10, %%r10\n"
17918         "adcq    %%r11, %%r11\n"
17919         "adcq    %%r12, %%r12\n"
17920         "adcq    %%rdx, %%rdx\n"
17921         "### add shifted triangle to diagonal\n"
17922         "addq    %%r8, 8(%%rdi)\n"
17923         "adcq    %%r9, 16(%%rdi)\n"
17924         "adcq    %%r10, 24(%%rdi)\n"
17925         "adcq    %%r11, 32(%%rdi)\n"
17926         "adcq    %%r12, 40(%%rdi)\n"
17927         "adcq    %%rdx, 48(%%rdi)\n"
17928     : "+m" (z)
17929     : "m" (x)
17930     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "%r10", "%r11", "%r12", "memory");
17931 }
17932 
17933 /* x has 3.5 words, z has 5. Put x*y in z. */
17934 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
17935 static inline
mpfq_fixmp_3_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17936 void mpfq_fixmp_3_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17937 {
17938     __asm__ __volatile__(
17939         "movq    %[x0], %%rax\n"
17940         "mulq    %[mult]\n"
17941         "movq    %%rax, %[z0]\n"
17942         "movq    %[x1], %%rax\n"
17943         "movq    %%rdx, %%rcx\n"
17944         "mulq    %[mult]\n"
17945         "addq    %%rax, %%rcx\n"
17946         "adcq    $0, %%rdx\n"
17947         "movq    %[x2], %%rax\n"
17948         "movq    %%rcx, %[z1]\n"
17949         "movq    %%rdx, %%rcx\n"
17950         "mulq    %[mult]\n"
17951         "addq    %%rax, %%rcx\n"
17952         "adcq    $0, %%rdx\n"
17953         "movq    %[x3], %%rax\n"
17954         "movq    %%rcx, %[z2]\n"
17955         "movq    %%rdx, %%rcx\n"
17956         "mulq    %[mult]\n"
17957         "addq    %%rax, %%rcx\n"
17958         "adcq    $0, %%rdx\n"
17959         "movq    %%rcx, %[z3]\n"
17960         "movq    %%rdx, %[z4]\n"
17961     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3]), [z4]"=m"(z[4])
17962     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
17963     : "%rax", "%rcx", "%rdx");
17964 }
17965 
17966 /* x has 3.5 words, z has 4. c is 0.5 word.
17967  * Put (z+x*c) in z. Return carry bit. */
17968 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
17969 static inline
mpfq_fixmp_3_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)17970 mp_limb_t mpfq_fixmp_3_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
17971 {
17972     mp_limb_t carry;
17973     __asm__ __volatile__(
17974         "movq    %[x0], %%rax\n"
17975         "mulq    %[mult]\n"
17976         "addq    %%rax, %[z0]\n"
17977         "movq    %[x1], %%rax\n"
17978         "adcq    $0, %%rdx\n"
17979         "movq    %%rdx, %%rcx\n"
17980         "mulq    %[mult]\n"
17981         "addq    %%rax, %%rcx\n"
17982         "adcq    $0, %%rdx\n"
17983         "movq    %[x2], %%rax\n"
17984         "addq    %%rcx, %[z1]\n"
17985         "adcq    $0, %%rdx\n"
17986         "movq    %%rdx, %%rcx\n"
17987         "mulq    %[mult]\n"
17988         "addq    %%rax, %%rcx\n"
17989         "adcq    $0, %%rdx\n"
17990         "movq    %[x3], %%rax\n"
17991         "addq    %%rcx, %[z2]\n"
17992         "adcq    $0, %%rdx\n"
17993         "movq    %%rdx, %%rcx\n"
17994         "imulq    %[mult], %%rax\n"
17995         "xorq    %%rdx, %%rdx\n"
17996         "addq    %%rcx, %%rax\n"
17997         "adcq    $0, %%rdx\n"
17998         "addq    %%rax, %[z3]\n"
17999         "adcq    $0, %%rdx\n"
18000         "movq    %%rdx, %[carry]\n"
18001     : [carry]"=g"(carry), [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
18002     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
18003     : "%rax", "%rcx", "%rdx");
18004     return carry;
18005 }
18006 
18007 /* x has 3.5 words, z has 4. c is 0.5 word.
18008  * Put (z+x*c) in z. Carry bit is lost. */
18009 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
18010 static inline
mpfq_fixmp_3_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18011 void mpfq_fixmp_3_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18012 {
18013     __asm__ __volatile__(
18014         "movq    %[x0], %%rax\n"
18015         "mulq    %[mult]\n"
18016         "addq    %%rax, %[z0]\n"
18017         "movq    %[x1], %%rax\n"
18018         "adcq    $0, %%rdx\n"
18019         "movq    %%rdx, %%rcx\n"
18020         "mulq    %[mult]\n"
18021         "addq    %%rax, %%rcx\n"
18022         "adcq    $0, %%rdx\n"
18023         "movq    %[x2], %%rax\n"
18024         "addq    %%rcx, %[z1]\n"
18025         "adcq    $0, %%rdx\n"
18026         "movq    %%rdx, %%rcx\n"
18027         "mulq    %[mult]\n"
18028         "addq    %%rax, %%rcx\n"
18029         "adcq    $0, %%rdx\n"
18030         "movq    %[x3], %%rax\n"
18031         "addq    %%rcx, %[z2]\n"
18032         "adcq    $0, %%rdx\n"
18033         "movq    %%rdx, %%rcx\n"
18034         "imulq    %[mult], %%rax\n"
18035         "addq    %%rcx, %%rax\n"
18036         "addq    %%rax, %[z3]\n"
18037     : [z0]"+m"(z[0]), [z1]"+m"(z[1]), [z2]"+m"(z[2]), [z3]"+m"(z[3])
18038     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
18039     : "%rax", "%rcx", "%rdx");
18040 }
18041 
18042 /* x has 3.5 words, z has 4. c is 0.5 word.
18043  * Put (x*c) in z. No carry. */
18044 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
18045 static inline
mpfq_fixmp_3_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18046 void mpfq_fixmp_3_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18047 {
18048     __asm__ __volatile__(
18049         "movq    %[x0], %%rax\n"
18050         "mulq    %[mult]\n"
18051         "movq    %%rax, %[z0]\n"
18052         "movq    %[x1], %%rax\n"
18053         "movq    %%rdx, %%rcx\n"
18054         "mulq    %[mult]\n"
18055         "addq    %%rax, %%rcx\n"
18056         "adcq    $0, %%rdx\n"
18057         "movq    %[x2], %%rax\n"
18058         "movq    %%rcx, %[z1]\n"
18059         "movq    %%rdx, %%rcx\n"
18060         "mulq    %[mult]\n"
18061         "addq    %%rax, %%rcx\n"
18062         "adcq    $0, %%rdx\n"
18063         "movq    %[x3], %%rax\n"
18064         "movq    %%rcx, %[z2]\n"
18065         "movq    %%rdx, %%rcx\n"
18066         "imulq    %[mult], %%rax\n"
18067         "addq    %%rcx, %%rax\n"
18068         "movq    %%rax, %[z3]\n"
18069     : [z0]"=m"(z[0]), [z1]"=m"(z[1]), [z2]"=m"(z[2]), [z3]"=m"(z[3])
18070     : [mult] "r" (c), [x0]"m"(x[0]), [x1]"m"(x[1]), [x2]"m"(x[2]), [x3]"m"(x[3])
18071     : "%rax", "%rcx", "%rdx");
18072 }
18073 
18074 /* x, y, and z have 4.5 words. Result in z. Return carry bit */
18075 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
18076 static inline
mpfq_fixmp_4_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18077 mp_limb_t mpfq_fixmp_4_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18078 {
18079     mp_limb_t carry;
18080     __asm__ __volatile__(
18081         "movq    %[z], %%rdi\n"
18082         "movq    %[x], %%rsi\n"
18083         "movq    %[y], %%rdx\n"
18084         "movq    0(%%rsi), %%rax\n"
18085         "addq    0(%%rdx), %%rax\n"
18086         "movq    %%rax, 0(%%rdi)\n"
18087         "movq    8(%%rsi), %%rax\n"
18088         "adcq    8(%%rdx), %%rax\n"
18089         "movq    %%rax, 8(%%rdi)\n"
18090         "movq    16(%%rsi), %%rax\n"
18091         "adcq    16(%%rdx), %%rax\n"
18092         "movq    %%rax, 16(%%rdi)\n"
18093         "movq    24(%%rsi), %%rax\n"
18094         "adcq    24(%%rdx), %%rax\n"
18095         "movq    %%rax, 24(%%rdi)\n"
18096         "movq    32(%%rsi), %%rax\n"
18097         "adcq    32(%%rdx), %%rax\n"
18098         "movq    %%rax, 32(%%rdi)\n"
18099         "movq $0, %%rax\n"
18100         "adcq $0, %%rax\n"
18101     : "=&a"(carry)
18102     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18103     : "%rdx", "%rsi", "%rdi", "memory");
18104     return carry;
18105 }
18106 
18107 /* x, y, and z have 4.5 words. Result in z. Return borrow bit */
18108 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
18109 static inline
mpfq_fixmp_4_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18110 mp_limb_t mpfq_fixmp_4_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18111 {
18112     mp_limb_t carry;
18113     __asm__ __volatile__(
18114         "movq    %[z], %%rdi\n"
18115         "movq    %[x], %%rsi\n"
18116         "movq    %[y], %%rdx\n"
18117         "movq    0(%%rsi), %%rax\n"
18118         "subq    0(%%rdx), %%rax\n"
18119         "movq    %%rax, 0(%%rdi)\n"
18120         "movq    8(%%rsi), %%rax\n"
18121         "sbbq    8(%%rdx), %%rax\n"
18122         "movq    %%rax, 8(%%rdi)\n"
18123         "movq    16(%%rsi), %%rax\n"
18124         "sbbq    16(%%rdx), %%rax\n"
18125         "movq    %%rax, 16(%%rdi)\n"
18126         "movq    24(%%rsi), %%rax\n"
18127         "sbbq    24(%%rdx), %%rax\n"
18128         "movq    %%rax, 24(%%rdi)\n"
18129         "movq    32(%%rsi), %%rax\n"
18130         "sbbq    32(%%rdx), %%rax\n"
18131         "movq    %%rax, 32(%%rdi)\n"
18132         "movq $0, %%rax\n"
18133         "adcq $0, %%rax\n"
18134     : "=&a"(carry)
18135     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18136     : "%rdx", "%rsi", "%rdi", "memory");
18137     return carry;
18138 }
18139 
18140 /* x, y, and z have 4.5 words. Result in z. Carry bit is lost. */
18141 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
18142 static inline
mpfq_fixmp_4_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18143 void mpfq_fixmp_4_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18144 {
18145     __asm__ __volatile__(
18146         "movq    %[z], %%rdi\n"
18147         "movq    %[x], %%rsi\n"
18148         "movq    %[y], %%rdx\n"
18149         "movq    0(%%rsi), %%rax\n"
18150         "addq    0(%%rdx), %%rax\n"
18151         "movq    %%rax, 0(%%rdi)\n"
18152         "movq    8(%%rsi), %%rax\n"
18153         "adcq    8(%%rdx), %%rax\n"
18154         "movq    %%rax, 8(%%rdi)\n"
18155         "movq    16(%%rsi), %%rax\n"
18156         "adcq    16(%%rdx), %%rax\n"
18157         "movq    %%rax, 16(%%rdi)\n"
18158         "movq    24(%%rsi), %%rax\n"
18159         "adcq    24(%%rdx), %%rax\n"
18160         "movq    %%rax, 24(%%rdi)\n"
18161         "movq    32(%%rsi), %%rax\n"
18162         "adcq    32(%%rdx), %%rax\n"
18163         "movq    %%rax, 32(%%rdi)\n"
18164     :
18165     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18166     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
18167 }
18168 
18169 /* x, y, and z have 4.5 words. Result in z. Borrow bit is lost. */
18170 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
18171 static inline
mpfq_fixmp_4_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18172 void mpfq_fixmp_4_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18173 {
18174     __asm__ __volatile__(
18175         "movq    %[z], %%rdi\n"
18176         "movq    %[x], %%rsi\n"
18177         "movq    %[y], %%rdx\n"
18178         "movq    0(%%rsi), %%rax\n"
18179         "subq    0(%%rdx), %%rax\n"
18180         "movq    %%rax, 0(%%rdi)\n"
18181         "movq    8(%%rsi), %%rax\n"
18182         "sbbq    8(%%rdx), %%rax\n"
18183         "movq    %%rax, 8(%%rdi)\n"
18184         "movq    16(%%rsi), %%rax\n"
18185         "sbbq    16(%%rdx), %%rax\n"
18186         "movq    %%rax, 16(%%rdi)\n"
18187         "movq    24(%%rsi), %%rax\n"
18188         "sbbq    24(%%rdx), %%rax\n"
18189         "movq    %%rax, 24(%%rdi)\n"
18190         "movq    32(%%rsi), %%rax\n"
18191         "sbbq    32(%%rdx), %%rax\n"
18192         "movq    %%rax, 32(%%rdi)\n"
18193     :
18194     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18195     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
18196 }
18197 
18198 /* x has 4.5 words, z has 6.
18199  * Put (z+x*c) in z. Return carry bit. */
18200 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
18201 static inline
mpfq_fixmp_4_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18202 mp_limb_t mpfq_fixmp_4_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18203 {
18204     mp_limb_t carry;
18205     __asm__ __volatile__(
18206         "movq    %[z], %%rdi\n"
18207         "movq    %[x], %%rsi\n"
18208         "movq    0(%%rsi), %%rax\n"
18209         "mulq    %[mult]\n"
18210         "addq    %%rax, 0(%%rdi)\n"
18211         "movq    8(%%rsi), %%rax\n"
18212         "adcq    $0, %%rdx\n"
18213         "movq    %%rdx, %%rcx\n"
18214         "mulq    %[mult]\n"
18215         "addq    %%rax, %%rcx\n"
18216         "adcq    $0, %%rdx\n"
18217         "movq    16(%%rsi), %%rax\n"
18218         "addq    %%rcx, 8(%%rdi)\n"
18219         "adcq    $0, %%rdx\n"
18220         "movq    %%rdx, %%rcx\n"
18221         "mulq    %[mult]\n"
18222         "addq    %%rax, %%rcx\n"
18223         "adcq    $0, %%rdx\n"
18224         "movq    24(%%rsi), %%rax\n"
18225         "addq    %%rcx, 16(%%rdi)\n"
18226         "adcq    $0, %%rdx\n"
18227         "movq    %%rdx, %%rcx\n"
18228         "mulq    %[mult]\n"
18229         "addq    %%rax, %%rcx\n"
18230         "adcq    $0, %%rdx\n"
18231         "movq    32(%%rsi), %%rax\n"
18232         "addq    %%rcx, 24(%%rdi)\n"
18233         "adcq    $0, %%rdx\n"
18234         "movq    %%rdx, %%rcx\n"
18235         "mulq    %[mult]\n"
18236         "addq    %%rax, %%rcx\n"
18237         "adcq    $0, %%rdx\n"
18238         "addq    %%rcx, 32(%%rdi)\n"
18239         "adcq    $0, %%rdx\n"
18240         "xorq    %%rcx, %%rcx\n"
18241         "addq    %%rdx, 40(%%rdi)\n"
18242         "adcq    $0, %%rcx\n"
18243         "movq    %%rcx, %[carry]\n"
18244     : [carry]"=g"(carry), [z] "+m" (z)
18245     : [mult] "r" (c), [x] "m" (x)
18246     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18247     return carry;
18248 }
18249 
18250 /* x has 4.5 words, z has 6.
18251  * Put (z+x*c) in z. Carry bit is lost. */
18252 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
18253 static inline
mpfq_fixmp_4_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18254 void mpfq_fixmp_4_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18255 {
18256     __asm__ __volatile__(
18257         "movq    %[z], %%rdi\n"
18258         "movq    %[x], %%rsi\n"
18259         "movq    0(%%rsi), %%rax\n"
18260         "mulq    %[mult]\n"
18261         "addq    %%rax, 0(%%rdi)\n"
18262         "movq    8(%%rsi), %%rax\n"
18263         "adcq    $0, %%rdx\n"
18264         "movq    %%rdx, %%rcx\n"
18265         "mulq    %[mult]\n"
18266         "addq    %%rax, %%rcx\n"
18267         "adcq    $0, %%rdx\n"
18268         "movq    16(%%rsi), %%rax\n"
18269         "addq    %%rcx, 8(%%rdi)\n"
18270         "adcq    $0, %%rdx\n"
18271         "movq    %%rdx, %%rcx\n"
18272         "mulq    %[mult]\n"
18273         "addq    %%rax, %%rcx\n"
18274         "adcq    $0, %%rdx\n"
18275         "movq    24(%%rsi), %%rax\n"
18276         "addq    %%rcx, 16(%%rdi)\n"
18277         "adcq    $0, %%rdx\n"
18278         "movq    %%rdx, %%rcx\n"
18279         "mulq    %[mult]\n"
18280         "addq    %%rax, %%rcx\n"
18281         "adcq    $0, %%rdx\n"
18282         "movq    32(%%rsi), %%rax\n"
18283         "addq    %%rcx, 24(%%rdi)\n"
18284         "adcq    $0, %%rdx\n"
18285         "movq    %%rdx, %%rcx\n"
18286         "mulq    %[mult]\n"
18287         "addq    %%rax, %%rcx\n"
18288         "adcq    $0, %%rdx\n"
18289         "addq    %%rcx, 32(%%rdi)\n"
18290         "adcq    $0, %%rdx\n"
18291         "addq    %%rdx, 40(%%rdi)\n"
18292     : [z] "+m" (z)
18293     : [mult] "r" (c), [x] "m" (x)
18294     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18295 }
18296 
18297 /* x has 4.5 words, z has 5.
18298  * Put (z+x*c) in z. Return carry word. */
18299 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
18300 static inline
mpfq_fixmp_4_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18301 mp_limb_t mpfq_fixmp_4_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18302 {
18303     mp_limb_t carry;
18304     __asm__ __volatile__(
18305         "movq    %[z], %%rdi\n"
18306         "movq    %[x], %%rsi\n"
18307         "movq    0(%%rsi), %%rax\n"
18308         "mulq    %[mult]\n"
18309         "addq    %%rax, 0(%%rdi)\n"
18310         "movq    8(%%rsi), %%rax\n"
18311         "adcq    $0, %%rdx\n"
18312         "movq    %%rdx, %%rcx\n"
18313         "mulq    %[mult]\n"
18314         "addq    %%rax, %%rcx\n"
18315         "adcq    $0, %%rdx\n"
18316         "movq    16(%%rsi), %%rax\n"
18317         "addq    %%rcx, 8(%%rdi)\n"
18318         "adcq    $0, %%rdx\n"
18319         "movq    %%rdx, %%rcx\n"
18320         "mulq    %[mult]\n"
18321         "addq    %%rax, %%rcx\n"
18322         "adcq    $0, %%rdx\n"
18323         "movq    24(%%rsi), %%rax\n"
18324         "addq    %%rcx, 16(%%rdi)\n"
18325         "adcq    $0, %%rdx\n"
18326         "movq    %%rdx, %%rcx\n"
18327         "mulq    %[mult]\n"
18328         "addq    %%rax, %%rcx\n"
18329         "adcq    $0, %%rdx\n"
18330         "movq    32(%%rsi), %%rax\n"
18331         "addq    %%rcx, 24(%%rdi)\n"
18332         "adcq    $0, %%rdx\n"
18333         "movq    %%rdx, %%rcx\n"
18334         "mulq    %[mult]\n"
18335         "addq    %%rax, %%rcx\n"
18336         "adcq    $0, %%rdx\n"
18337         "addq    %%rcx, 32(%%rdi)\n"
18338         "adcq    $0, %%rdx\n"
18339         "movq    %%rdx, %[carry]\n"
18340     : [carry]"=g"(carry), [z] "+m" (z)
18341     : [mult] "r" (c), [x] "m" (x)
18342     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18343     return carry;
18344 }
18345 
18346 /* x and y have 4.5 words, z has 9. Put x*y in z. */
18347 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
18348 static inline
mpfq_fixmp_4_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18349 void mpfq_fixmp_4_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18350 {
18351     __asm__ __volatile__(
18352         "### x*y[0]\n"
18353         "movq    %2, %%r8\n"
18354         "movq    %0, %%rdi\n"
18355         "movq    0(%%r8), %%r9\n"
18356         "movq    %1, %%rsi\n"
18357         "movq    0(%%rsi), %%rax\n"
18358         "mulq    %%r9\n"
18359         "movq    %%rax, 0(%%rdi)\n"
18360         "movq    8(%%rsi), %%rax\n"
18361         "movq    %%rdx, %%rcx\n"
18362         "mulq    %%r9\n"
18363         "addq    %%rax, %%rcx\n"
18364         "adcq    $0, %%rdx\n"
18365         "movq    16(%%rsi), %%rax\n"
18366         "movq    %%rcx, 8(%%rdi)\n"
18367         "movq    %%rdx, %%rcx\n"
18368         "mulq    %%r9\n"
18369         "addq    %%rax, %%rcx\n"
18370         "adcq    $0, %%rdx\n"
18371         "movq    24(%%rsi), %%rax\n"
18372         "movq    %%rcx, 16(%%rdi)\n"
18373         "movq    %%rdx, %%rcx\n"
18374         "mulq    %%r9\n"
18375         "addq    %%rax, %%rcx\n"
18376         "adcq    $0, %%rdx\n"
18377         "movq    32(%%rsi), %%rax\n"
18378         "movq    %%rcx, 24(%%rdi)\n"
18379         "movq    %%rdx, %%rcx\n"
18380         "mulq    %%r9\n"
18381         "addq    %%rax, %%rcx\n"
18382         "adcq    $0, %%rdx\n"
18383         "movq    %%rcx, 32(%%rdi)\n"
18384         "movq    %%rdx, 40(%%rdi)\n"
18385         "movq    $0, 48(%%rdi)\n"
18386         "movq    $0, 56(%%rdi)\n"
18387         "movq    $0, 64(%%rdi)\n"
18388         "### x*y[1]\n"
18389         "movq    8(%%r8), %%r9\n"
18390         "movq    0(%%rsi), %%rax\n"
18391         "mulq    %%r9\n"
18392         "addq    %%rax, 8(%%rdi)\n"
18393         "movq    8(%%rsi), %%rax\n"
18394         "adcq    $0, %%rdx\n"
18395         "movq    %%rdx, %%rcx\n"
18396         "mulq    %%r9\n"
18397         "addq    %%rax, %%rcx\n"
18398         "adcq    $0, %%rdx\n"
18399         "movq    16(%%rsi), %%rax\n"
18400         "addq    %%rcx, 16(%%rdi)\n"
18401         "adcq    $0, %%rdx\n"
18402         "movq    %%rdx, %%rcx\n"
18403         "mulq    %%r9\n"
18404         "addq    %%rax, %%rcx\n"
18405         "adcq    $0, %%rdx\n"
18406         "movq    24(%%rsi), %%rax\n"
18407         "addq    %%rcx, 24(%%rdi)\n"
18408         "adcq    $0, %%rdx\n"
18409         "movq    %%rdx, %%rcx\n"
18410         "mulq    %%r9\n"
18411         "addq    %%rax, %%rcx\n"
18412         "adcq    $0, %%rdx\n"
18413         "movq    32(%%rsi), %%rax\n"
18414         "addq    %%rcx, 32(%%rdi)\n"
18415         "adcq    $0, %%rdx\n"
18416         "movq    %%rdx, %%rcx\n"
18417         "mulq    %%r9\n"
18418         "addq    %%rax, %%rcx\n"
18419         "adcq    $0, %%rdx\n"
18420         "addq    %%rcx, 40(%%rdi)\n"
18421         "adcq    $0, %%rdx\n"
18422         "movq    %%rdx, 48(%%rdi)\n"
18423         "### x*y[2]\n"
18424         "movq    16(%%r8), %%r9\n"
18425         "movq    0(%%rsi), %%rax\n"
18426         "mulq    %%r9\n"
18427         "addq    %%rax, 16(%%rdi)\n"
18428         "movq    8(%%rsi), %%rax\n"
18429         "adcq    $0, %%rdx\n"
18430         "movq    %%rdx, %%rcx\n"
18431         "mulq    %%r9\n"
18432         "addq    %%rax, %%rcx\n"
18433         "adcq    $0, %%rdx\n"
18434         "movq    16(%%rsi), %%rax\n"
18435         "addq    %%rcx, 24(%%rdi)\n"
18436         "adcq    $0, %%rdx\n"
18437         "movq    %%rdx, %%rcx\n"
18438         "mulq    %%r9\n"
18439         "addq    %%rax, %%rcx\n"
18440         "adcq    $0, %%rdx\n"
18441         "movq    24(%%rsi), %%rax\n"
18442         "addq    %%rcx, 32(%%rdi)\n"
18443         "adcq    $0, %%rdx\n"
18444         "movq    %%rdx, %%rcx\n"
18445         "mulq    %%r9\n"
18446         "addq    %%rax, %%rcx\n"
18447         "adcq    $0, %%rdx\n"
18448         "movq    32(%%rsi), %%rax\n"
18449         "addq    %%rcx, 40(%%rdi)\n"
18450         "adcq    $0, %%rdx\n"
18451         "movq    %%rdx, %%rcx\n"
18452         "mulq    %%r9\n"
18453         "addq    %%rax, %%rcx\n"
18454         "adcq    $0, %%rdx\n"
18455         "addq    %%rcx, 48(%%rdi)\n"
18456         "adcq    $0, %%rdx\n"
18457         "movq    %%rdx, 56(%%rdi)\n"
18458         "### x*y[3]\n"
18459         "movq    24(%%r8), %%r9\n"
18460         "movq    0(%%rsi), %%rax\n"
18461         "mulq    %%r9\n"
18462         "addq    %%rax, 24(%%rdi)\n"
18463         "movq    8(%%rsi), %%rax\n"
18464         "adcq    $0, %%rdx\n"
18465         "movq    %%rdx, %%rcx\n"
18466         "mulq    %%r9\n"
18467         "addq    %%rax, %%rcx\n"
18468         "adcq    $0, %%rdx\n"
18469         "movq    16(%%rsi), %%rax\n"
18470         "addq    %%rcx, 32(%%rdi)\n"
18471         "adcq    $0, %%rdx\n"
18472         "movq    %%rdx, %%rcx\n"
18473         "mulq    %%r9\n"
18474         "addq    %%rax, %%rcx\n"
18475         "adcq    $0, %%rdx\n"
18476         "movq    24(%%rsi), %%rax\n"
18477         "addq    %%rcx, 40(%%rdi)\n"
18478         "adcq    $0, %%rdx\n"
18479         "movq    %%rdx, %%rcx\n"
18480         "mulq    %%r9\n"
18481         "addq    %%rax, %%rcx\n"
18482         "adcq    $0, %%rdx\n"
18483         "movq    32(%%rsi), %%rax\n"
18484         "addq    %%rcx, 48(%%rdi)\n"
18485         "adcq    $0, %%rdx\n"
18486         "movq    %%rdx, %%rcx\n"
18487         "mulq    %%r9\n"
18488         "addq    %%rax, %%rcx\n"
18489         "adcq    $0, %%rdx\n"
18490         "addq    %%rcx, 56(%%rdi)\n"
18491         "adcq    $0, %%rdx\n"
18492         "movq    %%rdx, 64(%%rdi)\n"
18493         "### x*y[4]\n"
18494         "movq    32(%%r8), %%r9\n"
18495         "movq    0(%%rsi), %%rax\n"
18496         "mulq    %%r9\n"
18497         "addq    %%rax, 32(%%rdi)\n"
18498         "movq    8(%%rsi), %%rax\n"
18499         "adcq    $0, %%rdx\n"
18500         "movq    %%rdx, %%rcx\n"
18501         "mulq    %%r9\n"
18502         "addq    %%rax, %%rcx\n"
18503         "adcq    $0, %%rdx\n"
18504         "movq    16(%%rsi), %%rax\n"
18505         "addq    %%rcx, 40(%%rdi)\n"
18506         "adcq    $0, %%rdx\n"
18507         "movq    %%rdx, %%rcx\n"
18508         "mulq    %%r9\n"
18509         "addq    %%rax, %%rcx\n"
18510         "adcq    $0, %%rdx\n"
18511         "movq    24(%%rsi), %%rax\n"
18512         "addq    %%rcx, 48(%%rdi)\n"
18513         "adcq    $0, %%rdx\n"
18514         "movq    %%rdx, %%rcx\n"
18515         "mulq    %%r9\n"
18516         "addq    %%rax, %%rcx\n"
18517         "adcq    $0, %%rdx\n"
18518         "movq    32(%%rsi), %%rax\n"
18519         "addq    %%rcx, 56(%%rdi)\n"
18520         "adcq    $0, %%rdx\n"
18521         "movq    %%rdx, %%rcx\n"
18522         "mulq    %%r9\n"
18523         "addq    %%rax, %%rcx\n"
18524         "adcq    $0, %%rdx\n"
18525         "addq    %%rcx, 64(%%rdi)\n"
18526       : "+m" (z)
18527       : "m" (x), "m" (y)
18528       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
18529 }
18530 
18531 /* x has 4.5 words, z has 9. Put x*y in z. */
18532 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
18533 static inline
mpfq_fixmp_4_5_sqr(mp_limb_t * z,const mp_limb_t * x)18534 void mpfq_fixmp_4_5_sqr(mp_limb_t * z, const mp_limb_t * x)
18535 {
18536     mpfq_fixmp_4_5_mul(z, x, x);
18537 }
18538 
18539 /* x has 4.5 words, z has 6. Put x*y in z. */
18540 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
18541 static inline
mpfq_fixmp_4_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18542 void mpfq_fixmp_4_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18543 {
18544     __asm__ __volatile__(
18545         "movq    %[z], %%rdi\n"
18546         "movq    %[x], %%rsi\n"
18547         "movq    0(%%rsi), %%rax\n"
18548         "mulq    %[mult]\n"
18549         "movq    %%rax, 0(%%rdi)\n"
18550         "movq    8(%%rsi), %%rax\n"
18551         "movq    %%rdx, %%rcx\n"
18552         "mulq    %[mult]\n"
18553         "addq    %%rax, %%rcx\n"
18554         "adcq    $0, %%rdx\n"
18555         "movq    16(%%rsi), %%rax\n"
18556         "movq    %%rcx, 8(%%rdi)\n"
18557         "movq    %%rdx, %%rcx\n"
18558         "mulq    %[mult]\n"
18559         "addq    %%rax, %%rcx\n"
18560         "adcq    $0, %%rdx\n"
18561         "movq    24(%%rsi), %%rax\n"
18562         "movq    %%rcx, 16(%%rdi)\n"
18563         "movq    %%rdx, %%rcx\n"
18564         "mulq    %[mult]\n"
18565         "addq    %%rax, %%rcx\n"
18566         "adcq    $0, %%rdx\n"
18567         "movq    32(%%rsi), %%rax\n"
18568         "movq    %%rcx, 24(%%rdi)\n"
18569         "movq    %%rdx, %%rcx\n"
18570         "mulq    %[mult]\n"
18571         "addq    %%rax, %%rcx\n"
18572         "adcq    $0, %%rdx\n"
18573         "movq    %%rcx, 32(%%rdi)\n"
18574         "movq    %%rdx, 40(%%rdi)\n"
18575     :
18576     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
18577     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18578 }
18579 
18580 /* x has 4.5 words, z has 5. c is 0.5 word.
18581  * Put (z+x*c) in z. Return carry bit. */
18582 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
18583 static inline
mpfq_fixmp_4_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18584 mp_limb_t mpfq_fixmp_4_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18585 {
18586     mp_limb_t carry;
18587     __asm__ __volatile__(
18588         "movq    %[z], %%rdi\n"
18589         "movq    %[x], %%rsi\n"
18590         "movq    0(%%rsi), %%rax\n"
18591         "mulq    %[mult]\n"
18592         "addq    %%rax, 0(%%rdi)\n"
18593         "movq    8(%%rsi), %%rax\n"
18594         "adcq    $0, %%rdx\n"
18595         "movq    %%rdx, %%rcx\n"
18596         "mulq    %[mult]\n"
18597         "addq    %%rax, %%rcx\n"
18598         "adcq    $0, %%rdx\n"
18599         "movq    16(%%rsi), %%rax\n"
18600         "addq    %%rcx, 8(%%rdi)\n"
18601         "adcq    $0, %%rdx\n"
18602         "movq    %%rdx, %%rcx\n"
18603         "mulq    %[mult]\n"
18604         "addq    %%rax, %%rcx\n"
18605         "adcq    $0, %%rdx\n"
18606         "movq    24(%%rsi), %%rax\n"
18607         "addq    %%rcx, 16(%%rdi)\n"
18608         "adcq    $0, %%rdx\n"
18609         "movq    %%rdx, %%rcx\n"
18610         "mulq    %[mult]\n"
18611         "addq    %%rax, %%rcx\n"
18612         "adcq    $0, %%rdx\n"
18613         "movq    32(%%rsi), %%rax\n"
18614         "addq    %%rcx, 24(%%rdi)\n"
18615         "adcq    $0, %%rdx\n"
18616         "movq    %%rdx, %%rcx\n"
18617         "imulq    %[mult], %%rax\n"
18618         "xorq    %%rdx, %%rdx\n"
18619         "addq    %%rcx, %%rax\n"
18620         "adcq    $0, %%rdx\n"
18621         "addq    %%rax, 32(%%rdi)\n"
18622         "adcq    $0, %%rdx\n"
18623         "movq    %%rdx, %[carry]\n"
18624     : [carry]"=g"(carry), [z] "+m" (z)
18625     : [mult] "r" (c), [x] "m" (x)
18626     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18627     return carry;
18628 }
18629 
18630 /* x has 4.5 words, z has 5. c is 0.5 word.
18631  * Put (z+x*c) in z. Carry bit is lost. */
18632 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
18633 static inline
mpfq_fixmp_4_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18634 void mpfq_fixmp_4_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18635 {
18636     __asm__ __volatile__(
18637         "movq    %[z], %%rdi\n"
18638         "movq    %[x], %%rsi\n"
18639         "movq    0(%%rsi), %%rax\n"
18640         "mulq    %[mult]\n"
18641         "addq    %%rax, 0(%%rdi)\n"
18642         "movq    8(%%rsi), %%rax\n"
18643         "adcq    $0, %%rdx\n"
18644         "movq    %%rdx, %%rcx\n"
18645         "mulq    %[mult]\n"
18646         "addq    %%rax, %%rcx\n"
18647         "adcq    $0, %%rdx\n"
18648         "movq    16(%%rsi), %%rax\n"
18649         "addq    %%rcx, 8(%%rdi)\n"
18650         "adcq    $0, %%rdx\n"
18651         "movq    %%rdx, %%rcx\n"
18652         "mulq    %[mult]\n"
18653         "addq    %%rax, %%rcx\n"
18654         "adcq    $0, %%rdx\n"
18655         "movq    24(%%rsi), %%rax\n"
18656         "addq    %%rcx, 16(%%rdi)\n"
18657         "adcq    $0, %%rdx\n"
18658         "movq    %%rdx, %%rcx\n"
18659         "mulq    %[mult]\n"
18660         "addq    %%rax, %%rcx\n"
18661         "adcq    $0, %%rdx\n"
18662         "movq    32(%%rsi), %%rax\n"
18663         "addq    %%rcx, 24(%%rdi)\n"
18664         "adcq    $0, %%rdx\n"
18665         "movq    %%rdx, %%rcx\n"
18666         "imulq    %[mult], %%rax\n"
18667         "addq    %%rcx, %%rax\n"
18668         "addq    %%rax, 32(%%rdi)\n"
18669     : [z] "+m" (z)
18670     : [mult] "r" (c), [x] "m" (x)
18671     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18672 }
18673 
18674 /* x has 4.5 words, z has 5. c is 0.5 word.
18675  * Put (x*c) in z. No carry. */
18676 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
18677 static inline
mpfq_fixmp_4_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18678 void mpfq_fixmp_4_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18679 {
18680     __asm__ __volatile__(
18681         "movq    %[z], %%rdi\n"
18682         "movq    %[x], %%rsi\n"
18683         "movq    0(%%rsi), %%rax\n"
18684         "mulq    %[mult]\n"
18685         "movq    %%rax, 0(%%rdi)\n"
18686         "movq    8(%%rsi), %%rax\n"
18687         "movq    %%rdx, %%rcx\n"
18688         "mulq    %[mult]\n"
18689         "addq    %%rax, %%rcx\n"
18690         "adcq    $0, %%rdx\n"
18691         "movq    16(%%rsi), %%rax\n"
18692         "movq    %%rcx, 8(%%rdi)\n"
18693         "movq    %%rdx, %%rcx\n"
18694         "mulq    %[mult]\n"
18695         "addq    %%rax, %%rcx\n"
18696         "adcq    $0, %%rdx\n"
18697         "movq    24(%%rsi), %%rax\n"
18698         "movq    %%rcx, 16(%%rdi)\n"
18699         "movq    %%rdx, %%rcx\n"
18700         "mulq    %[mult]\n"
18701         "addq    %%rax, %%rcx\n"
18702         "adcq    $0, %%rdx\n"
18703         "movq    32(%%rsi), %%rax\n"
18704         "movq    %%rcx, 24(%%rdi)\n"
18705         "movq    %%rdx, %%rcx\n"
18706         "imulq    %[mult], %%rax\n"
18707         "addq    %%rcx, %%rax\n"
18708         "movq    %%rax, 32(%%rdi)\n"
18709     :
18710     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
18711     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18712 }
18713 
18714 /* x, y, and z have 5.5 words. Result in z. Return carry bit */
18715 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
18716 static inline
mpfq_fixmp_5_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18717 mp_limb_t mpfq_fixmp_5_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18718 {
18719     mp_limb_t carry;
18720     __asm__ __volatile__(
18721         "movq    %[z], %%rdi\n"
18722         "movq    %[x], %%rsi\n"
18723         "movq    %[y], %%rdx\n"
18724         "movq    0(%%rsi), %%rax\n"
18725         "addq    0(%%rdx), %%rax\n"
18726         "movq    %%rax, 0(%%rdi)\n"
18727         "movq    8(%%rsi), %%rax\n"
18728         "adcq    8(%%rdx), %%rax\n"
18729         "movq    %%rax, 8(%%rdi)\n"
18730         "movq    16(%%rsi), %%rax\n"
18731         "adcq    16(%%rdx), %%rax\n"
18732         "movq    %%rax, 16(%%rdi)\n"
18733         "movq    24(%%rsi), %%rax\n"
18734         "adcq    24(%%rdx), %%rax\n"
18735         "movq    %%rax, 24(%%rdi)\n"
18736         "movq    32(%%rsi), %%rax\n"
18737         "adcq    32(%%rdx), %%rax\n"
18738         "movq    %%rax, 32(%%rdi)\n"
18739         "movq    40(%%rsi), %%rax\n"
18740         "adcq    40(%%rdx), %%rax\n"
18741         "movq    %%rax, 40(%%rdi)\n"
18742         "movq $0, %%rax\n"
18743         "adcq $0, %%rax\n"
18744     : "=&a"(carry)
18745     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18746     : "%rdx", "%rsi", "%rdi", "memory");
18747     return carry;
18748 }
18749 
18750 /* x, y, and z have 5.5 words. Result in z. Return borrow bit */
18751 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
18752 static inline
mpfq_fixmp_5_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18753 mp_limb_t mpfq_fixmp_5_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18754 {
18755     mp_limb_t carry;
18756     __asm__ __volatile__(
18757         "movq    %[z], %%rdi\n"
18758         "movq    %[x], %%rsi\n"
18759         "movq    %[y], %%rdx\n"
18760         "movq    0(%%rsi), %%rax\n"
18761         "subq    0(%%rdx), %%rax\n"
18762         "movq    %%rax, 0(%%rdi)\n"
18763         "movq    8(%%rsi), %%rax\n"
18764         "sbbq    8(%%rdx), %%rax\n"
18765         "movq    %%rax, 8(%%rdi)\n"
18766         "movq    16(%%rsi), %%rax\n"
18767         "sbbq    16(%%rdx), %%rax\n"
18768         "movq    %%rax, 16(%%rdi)\n"
18769         "movq    24(%%rsi), %%rax\n"
18770         "sbbq    24(%%rdx), %%rax\n"
18771         "movq    %%rax, 24(%%rdi)\n"
18772         "movq    32(%%rsi), %%rax\n"
18773         "sbbq    32(%%rdx), %%rax\n"
18774         "movq    %%rax, 32(%%rdi)\n"
18775         "movq    40(%%rsi), %%rax\n"
18776         "sbbq    40(%%rdx), %%rax\n"
18777         "movq    %%rax, 40(%%rdi)\n"
18778         "movq $0, %%rax\n"
18779         "adcq $0, %%rax\n"
18780     : "=&a"(carry)
18781     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18782     : "%rdx", "%rsi", "%rdi", "memory");
18783     return carry;
18784 }
18785 
18786 /* x, y, and z have 5.5 words. Result in z. Carry bit is lost. */
18787 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
18788 static inline
mpfq_fixmp_5_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18789 void mpfq_fixmp_5_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18790 {
18791     __asm__ __volatile__(
18792         "movq    %[z], %%rdi\n"
18793         "movq    %[x], %%rsi\n"
18794         "movq    %[y], %%rdx\n"
18795         "movq    0(%%rsi), %%rax\n"
18796         "addq    0(%%rdx), %%rax\n"
18797         "movq    %%rax, 0(%%rdi)\n"
18798         "movq    8(%%rsi), %%rax\n"
18799         "adcq    8(%%rdx), %%rax\n"
18800         "movq    %%rax, 8(%%rdi)\n"
18801         "movq    16(%%rsi), %%rax\n"
18802         "adcq    16(%%rdx), %%rax\n"
18803         "movq    %%rax, 16(%%rdi)\n"
18804         "movq    24(%%rsi), %%rax\n"
18805         "adcq    24(%%rdx), %%rax\n"
18806         "movq    %%rax, 24(%%rdi)\n"
18807         "movq    32(%%rsi), %%rax\n"
18808         "adcq    32(%%rdx), %%rax\n"
18809         "movq    %%rax, 32(%%rdi)\n"
18810         "movq    40(%%rsi), %%rax\n"
18811         "adcq    40(%%rdx), %%rax\n"
18812         "movq    %%rax, 40(%%rdi)\n"
18813     :
18814     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18815     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
18816 }
18817 
18818 /* x, y, and z have 5.5 words. Result in z. Borrow bit is lost. */
18819 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
18820 static inline
mpfq_fixmp_5_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)18821 void mpfq_fixmp_5_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
18822 {
18823     __asm__ __volatile__(
18824         "movq    %[z], %%rdi\n"
18825         "movq    %[x], %%rsi\n"
18826         "movq    %[y], %%rdx\n"
18827         "movq    0(%%rsi), %%rax\n"
18828         "subq    0(%%rdx), %%rax\n"
18829         "movq    %%rax, 0(%%rdi)\n"
18830         "movq    8(%%rsi), %%rax\n"
18831         "sbbq    8(%%rdx), %%rax\n"
18832         "movq    %%rax, 8(%%rdi)\n"
18833         "movq    16(%%rsi), %%rax\n"
18834         "sbbq    16(%%rdx), %%rax\n"
18835         "movq    %%rax, 16(%%rdi)\n"
18836         "movq    24(%%rsi), %%rax\n"
18837         "sbbq    24(%%rdx), %%rax\n"
18838         "movq    %%rax, 24(%%rdi)\n"
18839         "movq    32(%%rsi), %%rax\n"
18840         "sbbq    32(%%rdx), %%rax\n"
18841         "movq    %%rax, 32(%%rdi)\n"
18842         "movq    40(%%rsi), %%rax\n"
18843         "sbbq    40(%%rdx), %%rax\n"
18844         "movq    %%rax, 40(%%rdi)\n"
18845     :
18846     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
18847     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
18848 }
18849 
18850 /* x has 5.5 words, z has 7.
18851  * Put (z+x*c) in z. Return carry bit. */
18852 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
18853 static inline
mpfq_fixmp_5_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18854 mp_limb_t mpfq_fixmp_5_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18855 {
18856     mp_limb_t carry;
18857     __asm__ __volatile__(
18858         "movq    %[z], %%rdi\n"
18859         "movq    %[x], %%rsi\n"
18860         "movq    0(%%rsi), %%rax\n"
18861         "mulq    %[mult]\n"
18862         "addq    %%rax, 0(%%rdi)\n"
18863         "movq    8(%%rsi), %%rax\n"
18864         "adcq    $0, %%rdx\n"
18865         "movq    %%rdx, %%rcx\n"
18866         "mulq    %[mult]\n"
18867         "addq    %%rax, %%rcx\n"
18868         "adcq    $0, %%rdx\n"
18869         "movq    16(%%rsi), %%rax\n"
18870         "addq    %%rcx, 8(%%rdi)\n"
18871         "adcq    $0, %%rdx\n"
18872         "movq    %%rdx, %%rcx\n"
18873         "mulq    %[mult]\n"
18874         "addq    %%rax, %%rcx\n"
18875         "adcq    $0, %%rdx\n"
18876         "movq    24(%%rsi), %%rax\n"
18877         "addq    %%rcx, 16(%%rdi)\n"
18878         "adcq    $0, %%rdx\n"
18879         "movq    %%rdx, %%rcx\n"
18880         "mulq    %[mult]\n"
18881         "addq    %%rax, %%rcx\n"
18882         "adcq    $0, %%rdx\n"
18883         "movq    32(%%rsi), %%rax\n"
18884         "addq    %%rcx, 24(%%rdi)\n"
18885         "adcq    $0, %%rdx\n"
18886         "movq    %%rdx, %%rcx\n"
18887         "mulq    %[mult]\n"
18888         "addq    %%rax, %%rcx\n"
18889         "adcq    $0, %%rdx\n"
18890         "movq    40(%%rsi), %%rax\n"
18891         "addq    %%rcx, 32(%%rdi)\n"
18892         "adcq    $0, %%rdx\n"
18893         "movq    %%rdx, %%rcx\n"
18894         "mulq    %[mult]\n"
18895         "addq    %%rax, %%rcx\n"
18896         "adcq    $0, %%rdx\n"
18897         "addq    %%rcx, 40(%%rdi)\n"
18898         "adcq    $0, %%rdx\n"
18899         "xorq    %%rcx, %%rcx\n"
18900         "addq    %%rdx, 48(%%rdi)\n"
18901         "adcq    $0, %%rcx\n"
18902         "movq    %%rcx, %[carry]\n"
18903     : [carry]"=g"(carry), [z] "+m" (z)
18904     : [mult] "r" (c), [x] "m" (x)
18905     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18906     return carry;
18907 }
18908 
18909 /* x has 5.5 words, z has 7.
18910  * Put (z+x*c) in z. Carry bit is lost. */
18911 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
18912 static inline
mpfq_fixmp_5_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18913 void mpfq_fixmp_5_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18914 {
18915     __asm__ __volatile__(
18916         "movq    %[z], %%rdi\n"
18917         "movq    %[x], %%rsi\n"
18918         "movq    0(%%rsi), %%rax\n"
18919         "mulq    %[mult]\n"
18920         "addq    %%rax, 0(%%rdi)\n"
18921         "movq    8(%%rsi), %%rax\n"
18922         "adcq    $0, %%rdx\n"
18923         "movq    %%rdx, %%rcx\n"
18924         "mulq    %[mult]\n"
18925         "addq    %%rax, %%rcx\n"
18926         "adcq    $0, %%rdx\n"
18927         "movq    16(%%rsi), %%rax\n"
18928         "addq    %%rcx, 8(%%rdi)\n"
18929         "adcq    $0, %%rdx\n"
18930         "movq    %%rdx, %%rcx\n"
18931         "mulq    %[mult]\n"
18932         "addq    %%rax, %%rcx\n"
18933         "adcq    $0, %%rdx\n"
18934         "movq    24(%%rsi), %%rax\n"
18935         "addq    %%rcx, 16(%%rdi)\n"
18936         "adcq    $0, %%rdx\n"
18937         "movq    %%rdx, %%rcx\n"
18938         "mulq    %[mult]\n"
18939         "addq    %%rax, %%rcx\n"
18940         "adcq    $0, %%rdx\n"
18941         "movq    32(%%rsi), %%rax\n"
18942         "addq    %%rcx, 24(%%rdi)\n"
18943         "adcq    $0, %%rdx\n"
18944         "movq    %%rdx, %%rcx\n"
18945         "mulq    %[mult]\n"
18946         "addq    %%rax, %%rcx\n"
18947         "adcq    $0, %%rdx\n"
18948         "movq    40(%%rsi), %%rax\n"
18949         "addq    %%rcx, 32(%%rdi)\n"
18950         "adcq    $0, %%rdx\n"
18951         "movq    %%rdx, %%rcx\n"
18952         "mulq    %[mult]\n"
18953         "addq    %%rax, %%rcx\n"
18954         "adcq    $0, %%rdx\n"
18955         "addq    %%rcx, 40(%%rdi)\n"
18956         "adcq    $0, %%rdx\n"
18957         "addq    %%rdx, 48(%%rdi)\n"
18958     : [z] "+m" (z)
18959     : [mult] "r" (c), [x] "m" (x)
18960     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
18961 }
18962 
18963 /* x has 5.5 words, z has 6.
18964  * Put (z+x*c) in z. Return carry word. */
18965 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
18966 static inline
mpfq_fixmp_5_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)18967 mp_limb_t mpfq_fixmp_5_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
18968 {
18969     mp_limb_t carry;
18970     __asm__ __volatile__(
18971         "movq    %[z], %%rdi\n"
18972         "movq    %[x], %%rsi\n"
18973         "movq    0(%%rsi), %%rax\n"
18974         "mulq    %[mult]\n"
18975         "addq    %%rax, 0(%%rdi)\n"
18976         "movq    8(%%rsi), %%rax\n"
18977         "adcq    $0, %%rdx\n"
18978         "movq    %%rdx, %%rcx\n"
18979         "mulq    %[mult]\n"
18980         "addq    %%rax, %%rcx\n"
18981         "adcq    $0, %%rdx\n"
18982         "movq    16(%%rsi), %%rax\n"
18983         "addq    %%rcx, 8(%%rdi)\n"
18984         "adcq    $0, %%rdx\n"
18985         "movq    %%rdx, %%rcx\n"
18986         "mulq    %[mult]\n"
18987         "addq    %%rax, %%rcx\n"
18988         "adcq    $0, %%rdx\n"
18989         "movq    24(%%rsi), %%rax\n"
18990         "addq    %%rcx, 16(%%rdi)\n"
18991         "adcq    $0, %%rdx\n"
18992         "movq    %%rdx, %%rcx\n"
18993         "mulq    %[mult]\n"
18994         "addq    %%rax, %%rcx\n"
18995         "adcq    $0, %%rdx\n"
18996         "movq    32(%%rsi), %%rax\n"
18997         "addq    %%rcx, 24(%%rdi)\n"
18998         "adcq    $0, %%rdx\n"
18999         "movq    %%rdx, %%rcx\n"
19000         "mulq    %[mult]\n"
19001         "addq    %%rax, %%rcx\n"
19002         "adcq    $0, %%rdx\n"
19003         "movq    40(%%rsi), %%rax\n"
19004         "addq    %%rcx, 32(%%rdi)\n"
19005         "adcq    $0, %%rdx\n"
19006         "movq    %%rdx, %%rcx\n"
19007         "mulq    %[mult]\n"
19008         "addq    %%rax, %%rcx\n"
19009         "adcq    $0, %%rdx\n"
19010         "addq    %%rcx, 40(%%rdi)\n"
19011         "adcq    $0, %%rdx\n"
19012         "movq    %%rdx, %[carry]\n"
19013     : [carry]"=g"(carry), [z] "+m" (z)
19014     : [mult] "r" (c), [x] "m" (x)
19015     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19016     return carry;
19017 }
19018 
19019 /* x and y have 5.5 words, z has 11. Put x*y in z. */
19020 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
19021 static inline
mpfq_fixmp_5_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)19022 void mpfq_fixmp_5_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
19023 {
19024     __asm__ __volatile__(
19025         "### x*y[0]\n"
19026         "movq    %2, %%r8\n"
19027         "movq    %0, %%rdi\n"
19028         "movq    0(%%r8), %%r9\n"
19029         "movq    %1, %%rsi\n"
19030         "movq    0(%%rsi), %%rax\n"
19031         "mulq    %%r9\n"
19032         "movq    %%rax, 0(%%rdi)\n"
19033         "movq    8(%%rsi), %%rax\n"
19034         "movq    %%rdx, %%rcx\n"
19035         "mulq    %%r9\n"
19036         "addq    %%rax, %%rcx\n"
19037         "adcq    $0, %%rdx\n"
19038         "movq    16(%%rsi), %%rax\n"
19039         "movq    %%rcx, 8(%%rdi)\n"
19040         "movq    %%rdx, %%rcx\n"
19041         "mulq    %%r9\n"
19042         "addq    %%rax, %%rcx\n"
19043         "adcq    $0, %%rdx\n"
19044         "movq    24(%%rsi), %%rax\n"
19045         "movq    %%rcx, 16(%%rdi)\n"
19046         "movq    %%rdx, %%rcx\n"
19047         "mulq    %%r9\n"
19048         "addq    %%rax, %%rcx\n"
19049         "adcq    $0, %%rdx\n"
19050         "movq    32(%%rsi), %%rax\n"
19051         "movq    %%rcx, 24(%%rdi)\n"
19052         "movq    %%rdx, %%rcx\n"
19053         "mulq    %%r9\n"
19054         "addq    %%rax, %%rcx\n"
19055         "adcq    $0, %%rdx\n"
19056         "movq    40(%%rsi), %%rax\n"
19057         "movq    %%rcx, 32(%%rdi)\n"
19058         "movq    %%rdx, %%rcx\n"
19059         "mulq    %%r9\n"
19060         "addq    %%rax, %%rcx\n"
19061         "adcq    $0, %%rdx\n"
19062         "movq    %%rcx, 40(%%rdi)\n"
19063         "movq    %%rdx, 48(%%rdi)\n"
19064         "movq    $0, 56(%%rdi)\n"
19065         "movq    $0, 64(%%rdi)\n"
19066         "movq    $0, 72(%%rdi)\n"
19067         "movq    $0, 80(%%rdi)\n"
19068         "### x*y[1]\n"
19069         "movq    8(%%r8), %%r9\n"
19070         "movq    0(%%rsi), %%rax\n"
19071         "mulq    %%r9\n"
19072         "addq    %%rax, 8(%%rdi)\n"
19073         "movq    8(%%rsi), %%rax\n"
19074         "adcq    $0, %%rdx\n"
19075         "movq    %%rdx, %%rcx\n"
19076         "mulq    %%r9\n"
19077         "addq    %%rax, %%rcx\n"
19078         "adcq    $0, %%rdx\n"
19079         "movq    16(%%rsi), %%rax\n"
19080         "addq    %%rcx, 16(%%rdi)\n"
19081         "adcq    $0, %%rdx\n"
19082         "movq    %%rdx, %%rcx\n"
19083         "mulq    %%r9\n"
19084         "addq    %%rax, %%rcx\n"
19085         "adcq    $0, %%rdx\n"
19086         "movq    24(%%rsi), %%rax\n"
19087         "addq    %%rcx, 24(%%rdi)\n"
19088         "adcq    $0, %%rdx\n"
19089         "movq    %%rdx, %%rcx\n"
19090         "mulq    %%r9\n"
19091         "addq    %%rax, %%rcx\n"
19092         "adcq    $0, %%rdx\n"
19093         "movq    32(%%rsi), %%rax\n"
19094         "addq    %%rcx, 32(%%rdi)\n"
19095         "adcq    $0, %%rdx\n"
19096         "movq    %%rdx, %%rcx\n"
19097         "mulq    %%r9\n"
19098         "addq    %%rax, %%rcx\n"
19099         "adcq    $0, %%rdx\n"
19100         "movq    40(%%rsi), %%rax\n"
19101         "addq    %%rcx, 40(%%rdi)\n"
19102         "adcq    $0, %%rdx\n"
19103         "movq    %%rdx, %%rcx\n"
19104         "mulq    %%r9\n"
19105         "addq    %%rax, %%rcx\n"
19106         "adcq    $0, %%rdx\n"
19107         "addq    %%rcx, 48(%%rdi)\n"
19108         "adcq    $0, %%rdx\n"
19109         "movq    %%rdx, 56(%%rdi)\n"
19110         "### x*y[2]\n"
19111         "movq    16(%%r8), %%r9\n"
19112         "movq    0(%%rsi), %%rax\n"
19113         "mulq    %%r9\n"
19114         "addq    %%rax, 16(%%rdi)\n"
19115         "movq    8(%%rsi), %%rax\n"
19116         "adcq    $0, %%rdx\n"
19117         "movq    %%rdx, %%rcx\n"
19118         "mulq    %%r9\n"
19119         "addq    %%rax, %%rcx\n"
19120         "adcq    $0, %%rdx\n"
19121         "movq    16(%%rsi), %%rax\n"
19122         "addq    %%rcx, 24(%%rdi)\n"
19123         "adcq    $0, %%rdx\n"
19124         "movq    %%rdx, %%rcx\n"
19125         "mulq    %%r9\n"
19126         "addq    %%rax, %%rcx\n"
19127         "adcq    $0, %%rdx\n"
19128         "movq    24(%%rsi), %%rax\n"
19129         "addq    %%rcx, 32(%%rdi)\n"
19130         "adcq    $0, %%rdx\n"
19131         "movq    %%rdx, %%rcx\n"
19132         "mulq    %%r9\n"
19133         "addq    %%rax, %%rcx\n"
19134         "adcq    $0, %%rdx\n"
19135         "movq    32(%%rsi), %%rax\n"
19136         "addq    %%rcx, 40(%%rdi)\n"
19137         "adcq    $0, %%rdx\n"
19138         "movq    %%rdx, %%rcx\n"
19139         "mulq    %%r9\n"
19140         "addq    %%rax, %%rcx\n"
19141         "adcq    $0, %%rdx\n"
19142         "movq    40(%%rsi), %%rax\n"
19143         "addq    %%rcx, 48(%%rdi)\n"
19144         "adcq    $0, %%rdx\n"
19145         "movq    %%rdx, %%rcx\n"
19146         "mulq    %%r9\n"
19147         "addq    %%rax, %%rcx\n"
19148         "adcq    $0, %%rdx\n"
19149         "addq    %%rcx, 56(%%rdi)\n"
19150         "adcq    $0, %%rdx\n"
19151         "movq    %%rdx, 64(%%rdi)\n"
19152         "### x*y[3]\n"
19153         "movq    24(%%r8), %%r9\n"
19154         "movq    0(%%rsi), %%rax\n"
19155         "mulq    %%r9\n"
19156         "addq    %%rax, 24(%%rdi)\n"
19157         "movq    8(%%rsi), %%rax\n"
19158         "adcq    $0, %%rdx\n"
19159         "movq    %%rdx, %%rcx\n"
19160         "mulq    %%r9\n"
19161         "addq    %%rax, %%rcx\n"
19162         "adcq    $0, %%rdx\n"
19163         "movq    16(%%rsi), %%rax\n"
19164         "addq    %%rcx, 32(%%rdi)\n"
19165         "adcq    $0, %%rdx\n"
19166         "movq    %%rdx, %%rcx\n"
19167         "mulq    %%r9\n"
19168         "addq    %%rax, %%rcx\n"
19169         "adcq    $0, %%rdx\n"
19170         "movq    24(%%rsi), %%rax\n"
19171         "addq    %%rcx, 40(%%rdi)\n"
19172         "adcq    $0, %%rdx\n"
19173         "movq    %%rdx, %%rcx\n"
19174         "mulq    %%r9\n"
19175         "addq    %%rax, %%rcx\n"
19176         "adcq    $0, %%rdx\n"
19177         "movq    32(%%rsi), %%rax\n"
19178         "addq    %%rcx, 48(%%rdi)\n"
19179         "adcq    $0, %%rdx\n"
19180         "movq    %%rdx, %%rcx\n"
19181         "mulq    %%r9\n"
19182         "addq    %%rax, %%rcx\n"
19183         "adcq    $0, %%rdx\n"
19184         "movq    40(%%rsi), %%rax\n"
19185         "addq    %%rcx, 56(%%rdi)\n"
19186         "adcq    $0, %%rdx\n"
19187         "movq    %%rdx, %%rcx\n"
19188         "mulq    %%r9\n"
19189         "addq    %%rax, %%rcx\n"
19190         "adcq    $0, %%rdx\n"
19191         "addq    %%rcx, 64(%%rdi)\n"
19192         "adcq    $0, %%rdx\n"
19193         "movq    %%rdx, 72(%%rdi)\n"
19194         "### x*y[4]\n"
19195         "movq    32(%%r8), %%r9\n"
19196         "movq    0(%%rsi), %%rax\n"
19197         "mulq    %%r9\n"
19198         "addq    %%rax, 32(%%rdi)\n"
19199         "movq    8(%%rsi), %%rax\n"
19200         "adcq    $0, %%rdx\n"
19201         "movq    %%rdx, %%rcx\n"
19202         "mulq    %%r9\n"
19203         "addq    %%rax, %%rcx\n"
19204         "adcq    $0, %%rdx\n"
19205         "movq    16(%%rsi), %%rax\n"
19206         "addq    %%rcx, 40(%%rdi)\n"
19207         "adcq    $0, %%rdx\n"
19208         "movq    %%rdx, %%rcx\n"
19209         "mulq    %%r9\n"
19210         "addq    %%rax, %%rcx\n"
19211         "adcq    $0, %%rdx\n"
19212         "movq    24(%%rsi), %%rax\n"
19213         "addq    %%rcx, 48(%%rdi)\n"
19214         "adcq    $0, %%rdx\n"
19215         "movq    %%rdx, %%rcx\n"
19216         "mulq    %%r9\n"
19217         "addq    %%rax, %%rcx\n"
19218         "adcq    $0, %%rdx\n"
19219         "movq    32(%%rsi), %%rax\n"
19220         "addq    %%rcx, 56(%%rdi)\n"
19221         "adcq    $0, %%rdx\n"
19222         "movq    %%rdx, %%rcx\n"
19223         "mulq    %%r9\n"
19224         "addq    %%rax, %%rcx\n"
19225         "adcq    $0, %%rdx\n"
19226         "movq    40(%%rsi), %%rax\n"
19227         "addq    %%rcx, 64(%%rdi)\n"
19228         "adcq    $0, %%rdx\n"
19229         "movq    %%rdx, %%rcx\n"
19230         "mulq    %%r9\n"
19231         "addq    %%rax, %%rcx\n"
19232         "adcq    $0, %%rdx\n"
19233         "addq    %%rcx, 72(%%rdi)\n"
19234         "adcq    $0, %%rdx\n"
19235         "movq    %%rdx, 80(%%rdi)\n"
19236         "### x*y[5]\n"
19237         "movq    40(%%r8), %%r9\n"
19238         "movq    0(%%rsi), %%rax\n"
19239         "mulq    %%r9\n"
19240         "addq    %%rax, 40(%%rdi)\n"
19241         "movq    8(%%rsi), %%rax\n"
19242         "adcq    $0, %%rdx\n"
19243         "movq    %%rdx, %%rcx\n"
19244         "mulq    %%r9\n"
19245         "addq    %%rax, %%rcx\n"
19246         "adcq    $0, %%rdx\n"
19247         "movq    16(%%rsi), %%rax\n"
19248         "addq    %%rcx, 48(%%rdi)\n"
19249         "adcq    $0, %%rdx\n"
19250         "movq    %%rdx, %%rcx\n"
19251         "mulq    %%r9\n"
19252         "addq    %%rax, %%rcx\n"
19253         "adcq    $0, %%rdx\n"
19254         "movq    24(%%rsi), %%rax\n"
19255         "addq    %%rcx, 56(%%rdi)\n"
19256         "adcq    $0, %%rdx\n"
19257         "movq    %%rdx, %%rcx\n"
19258         "mulq    %%r9\n"
19259         "addq    %%rax, %%rcx\n"
19260         "adcq    $0, %%rdx\n"
19261         "movq    32(%%rsi), %%rax\n"
19262         "addq    %%rcx, 64(%%rdi)\n"
19263         "adcq    $0, %%rdx\n"
19264         "movq    %%rdx, %%rcx\n"
19265         "mulq    %%r9\n"
19266         "addq    %%rax, %%rcx\n"
19267         "adcq    $0, %%rdx\n"
19268         "movq    40(%%rsi), %%rax\n"
19269         "addq    %%rcx, 72(%%rdi)\n"
19270         "adcq    $0, %%rdx\n"
19271         "movq    %%rdx, %%rcx\n"
19272         "mulq    %%r9\n"
19273         "addq    %%rax, %%rcx\n"
19274         "adcq    $0, %%rdx\n"
19275         "addq    %%rcx, 80(%%rdi)\n"
19276       : "+m" (z)
19277       : "m" (x), "m" (y)
19278       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
19279 }
19280 
19281 /* x has 5.5 words, z has 11. Put x*y in z. */
19282 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
19283 static inline
mpfq_fixmp_5_5_sqr(mp_limb_t * z,const mp_limb_t * x)19284 void mpfq_fixmp_5_5_sqr(mp_limb_t * z, const mp_limb_t * x)
19285 {
19286     mpfq_fixmp_5_5_mul(z, x, x);
19287 }
19288 
19289 /* x has 5.5 words, z has 7. Put x*y in z. */
19290 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
19291 static inline
mpfq_fixmp_5_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)19292 void mpfq_fixmp_5_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
19293 {
19294     __asm__ __volatile__(
19295         "movq    %[z], %%rdi\n"
19296         "movq    %[x], %%rsi\n"
19297         "movq    0(%%rsi), %%rax\n"
19298         "mulq    %[mult]\n"
19299         "movq    %%rax, 0(%%rdi)\n"
19300         "movq    8(%%rsi), %%rax\n"
19301         "movq    %%rdx, %%rcx\n"
19302         "mulq    %[mult]\n"
19303         "addq    %%rax, %%rcx\n"
19304         "adcq    $0, %%rdx\n"
19305         "movq    16(%%rsi), %%rax\n"
19306         "movq    %%rcx, 8(%%rdi)\n"
19307         "movq    %%rdx, %%rcx\n"
19308         "mulq    %[mult]\n"
19309         "addq    %%rax, %%rcx\n"
19310         "adcq    $0, %%rdx\n"
19311         "movq    24(%%rsi), %%rax\n"
19312         "movq    %%rcx, 16(%%rdi)\n"
19313         "movq    %%rdx, %%rcx\n"
19314         "mulq    %[mult]\n"
19315         "addq    %%rax, %%rcx\n"
19316         "adcq    $0, %%rdx\n"
19317         "movq    32(%%rsi), %%rax\n"
19318         "movq    %%rcx, 24(%%rdi)\n"
19319         "movq    %%rdx, %%rcx\n"
19320         "mulq    %[mult]\n"
19321         "addq    %%rax, %%rcx\n"
19322         "adcq    $0, %%rdx\n"
19323         "movq    40(%%rsi), %%rax\n"
19324         "movq    %%rcx, 32(%%rdi)\n"
19325         "movq    %%rdx, %%rcx\n"
19326         "mulq    %[mult]\n"
19327         "addq    %%rax, %%rcx\n"
19328         "adcq    $0, %%rdx\n"
19329         "movq    %%rcx, 40(%%rdi)\n"
19330         "movq    %%rdx, 48(%%rdi)\n"
19331     :
19332     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
19333     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19334 }
19335 
19336 /* x has 5.5 words, z has 6. c is 0.5 word.
19337  * Put (z+x*c) in z. Return carry bit. */
19338 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
19339 static inline
mpfq_fixmp_5_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)19340 mp_limb_t mpfq_fixmp_5_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
19341 {
19342     mp_limb_t carry;
19343     __asm__ __volatile__(
19344         "movq    %[z], %%rdi\n"
19345         "movq    %[x], %%rsi\n"
19346         "movq    0(%%rsi), %%rax\n"
19347         "mulq    %[mult]\n"
19348         "addq    %%rax, 0(%%rdi)\n"
19349         "movq    8(%%rsi), %%rax\n"
19350         "adcq    $0, %%rdx\n"
19351         "movq    %%rdx, %%rcx\n"
19352         "mulq    %[mult]\n"
19353         "addq    %%rax, %%rcx\n"
19354         "adcq    $0, %%rdx\n"
19355         "movq    16(%%rsi), %%rax\n"
19356         "addq    %%rcx, 8(%%rdi)\n"
19357         "adcq    $0, %%rdx\n"
19358         "movq    %%rdx, %%rcx\n"
19359         "mulq    %[mult]\n"
19360         "addq    %%rax, %%rcx\n"
19361         "adcq    $0, %%rdx\n"
19362         "movq    24(%%rsi), %%rax\n"
19363         "addq    %%rcx, 16(%%rdi)\n"
19364         "adcq    $0, %%rdx\n"
19365         "movq    %%rdx, %%rcx\n"
19366         "mulq    %[mult]\n"
19367         "addq    %%rax, %%rcx\n"
19368         "adcq    $0, %%rdx\n"
19369         "movq    32(%%rsi), %%rax\n"
19370         "addq    %%rcx, 24(%%rdi)\n"
19371         "adcq    $0, %%rdx\n"
19372         "movq    %%rdx, %%rcx\n"
19373         "mulq    %[mult]\n"
19374         "addq    %%rax, %%rcx\n"
19375         "adcq    $0, %%rdx\n"
19376         "movq    40(%%rsi), %%rax\n"
19377         "addq    %%rcx, 32(%%rdi)\n"
19378         "adcq    $0, %%rdx\n"
19379         "movq    %%rdx, %%rcx\n"
19380         "imulq    %[mult], %%rax\n"
19381         "xorq    %%rdx, %%rdx\n"
19382         "addq    %%rcx, %%rax\n"
19383         "adcq    $0, %%rdx\n"
19384         "addq    %%rax, 40(%%rdi)\n"
19385         "adcq    $0, %%rdx\n"
19386         "movq    %%rdx, %[carry]\n"
19387     : [carry]"=g"(carry), [z] "+m" (z)
19388     : [mult] "r" (c), [x] "m" (x)
19389     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19390     return carry;
19391 }
19392 
19393 /* x has 5.5 words, z has 6. c is 0.5 word.
19394  * Put (z+x*c) in z. Carry bit is lost. */
19395 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
19396 static inline
mpfq_fixmp_5_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)19397 void mpfq_fixmp_5_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
19398 {
19399     __asm__ __volatile__(
19400         "movq    %[z], %%rdi\n"
19401         "movq    %[x], %%rsi\n"
19402         "movq    0(%%rsi), %%rax\n"
19403         "mulq    %[mult]\n"
19404         "addq    %%rax, 0(%%rdi)\n"
19405         "movq    8(%%rsi), %%rax\n"
19406         "adcq    $0, %%rdx\n"
19407         "movq    %%rdx, %%rcx\n"
19408         "mulq    %[mult]\n"
19409         "addq    %%rax, %%rcx\n"
19410         "adcq    $0, %%rdx\n"
19411         "movq    16(%%rsi), %%rax\n"
19412         "addq    %%rcx, 8(%%rdi)\n"
19413         "adcq    $0, %%rdx\n"
19414         "movq    %%rdx, %%rcx\n"
19415         "mulq    %[mult]\n"
19416         "addq    %%rax, %%rcx\n"
19417         "adcq    $0, %%rdx\n"
19418         "movq    24(%%rsi), %%rax\n"
19419         "addq    %%rcx, 16(%%rdi)\n"
19420         "adcq    $0, %%rdx\n"
19421         "movq    %%rdx, %%rcx\n"
19422         "mulq    %[mult]\n"
19423         "addq    %%rax, %%rcx\n"
19424         "adcq    $0, %%rdx\n"
19425         "movq    32(%%rsi), %%rax\n"
19426         "addq    %%rcx, 24(%%rdi)\n"
19427         "adcq    $0, %%rdx\n"
19428         "movq    %%rdx, %%rcx\n"
19429         "mulq    %[mult]\n"
19430         "addq    %%rax, %%rcx\n"
19431         "adcq    $0, %%rdx\n"
19432         "movq    40(%%rsi), %%rax\n"
19433         "addq    %%rcx, 32(%%rdi)\n"
19434         "adcq    $0, %%rdx\n"
19435         "movq    %%rdx, %%rcx\n"
19436         "imulq    %[mult], %%rax\n"
19437         "addq    %%rcx, %%rax\n"
19438         "addq    %%rax, 40(%%rdi)\n"
19439     : [z] "+m" (z)
19440     : [mult] "r" (c), [x] "m" (x)
19441     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19442 }
19443 
19444 /* x has 5.5 words, z has 6. c is 0.5 word.
19445  * Put (x*c) in z. No carry. */
19446 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
19447 static inline
mpfq_fixmp_5_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)19448 void mpfq_fixmp_5_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
19449 {
19450     __asm__ __volatile__(
19451         "movq    %[z], %%rdi\n"
19452         "movq    %[x], %%rsi\n"
19453         "movq    0(%%rsi), %%rax\n"
19454         "mulq    %[mult]\n"
19455         "movq    %%rax, 0(%%rdi)\n"
19456         "movq    8(%%rsi), %%rax\n"
19457         "movq    %%rdx, %%rcx\n"
19458         "mulq    %[mult]\n"
19459         "addq    %%rax, %%rcx\n"
19460         "adcq    $0, %%rdx\n"
19461         "movq    16(%%rsi), %%rax\n"
19462         "movq    %%rcx, 8(%%rdi)\n"
19463         "movq    %%rdx, %%rcx\n"
19464         "mulq    %[mult]\n"
19465         "addq    %%rax, %%rcx\n"
19466         "adcq    $0, %%rdx\n"
19467         "movq    24(%%rsi), %%rax\n"
19468         "movq    %%rcx, 16(%%rdi)\n"
19469         "movq    %%rdx, %%rcx\n"
19470         "mulq    %[mult]\n"
19471         "addq    %%rax, %%rcx\n"
19472         "adcq    $0, %%rdx\n"
19473         "movq    32(%%rsi), %%rax\n"
19474         "movq    %%rcx, 24(%%rdi)\n"
19475         "movq    %%rdx, %%rcx\n"
19476         "mulq    %[mult]\n"
19477         "addq    %%rax, %%rcx\n"
19478         "adcq    $0, %%rdx\n"
19479         "movq    40(%%rsi), %%rax\n"
19480         "movq    %%rcx, 32(%%rdi)\n"
19481         "movq    %%rdx, %%rcx\n"
19482         "imulq    %[mult], %%rax\n"
19483         "addq    %%rcx, %%rax\n"
19484         "movq    %%rax, 40(%%rdi)\n"
19485     :
19486     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
19487     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19488 }
19489 
19490 /* x, y, and z have 6.5 words. Result in z. Return carry bit */
19491 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
19492 static inline
mpfq_fixmp_6_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)19493 mp_limb_t mpfq_fixmp_6_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
19494 {
19495     mp_limb_t carry;
19496     __asm__ __volatile__(
19497         "movq    %[z], %%rdi\n"
19498         "movq    %[x], %%rsi\n"
19499         "movq    %[y], %%rdx\n"
19500         "movq    0(%%rsi), %%rax\n"
19501         "addq    0(%%rdx), %%rax\n"
19502         "movq    %%rax, 0(%%rdi)\n"
19503         "movq    8(%%rsi), %%rax\n"
19504         "adcq    8(%%rdx), %%rax\n"
19505         "movq    %%rax, 8(%%rdi)\n"
19506         "movq    16(%%rsi), %%rax\n"
19507         "adcq    16(%%rdx), %%rax\n"
19508         "movq    %%rax, 16(%%rdi)\n"
19509         "movq    24(%%rsi), %%rax\n"
19510         "adcq    24(%%rdx), %%rax\n"
19511         "movq    %%rax, 24(%%rdi)\n"
19512         "movq    32(%%rsi), %%rax\n"
19513         "adcq    32(%%rdx), %%rax\n"
19514         "movq    %%rax, 32(%%rdi)\n"
19515         "movq    40(%%rsi), %%rax\n"
19516         "adcq    40(%%rdx), %%rax\n"
19517         "movq    %%rax, 40(%%rdi)\n"
19518         "movq    48(%%rsi), %%rax\n"
19519         "adcq    48(%%rdx), %%rax\n"
19520         "movq    %%rax, 48(%%rdi)\n"
19521         "movq $0, %%rax\n"
19522         "adcq $0, %%rax\n"
19523     : "=&a"(carry)
19524     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
19525     : "%rdx", "%rsi", "%rdi", "memory");
19526     return carry;
19527 }
19528 
19529 /* x, y, and z have 6.5 words. Result in z. Return borrow bit */
19530 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
19531 static inline
mpfq_fixmp_6_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)19532 mp_limb_t mpfq_fixmp_6_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
19533 {
19534     mp_limb_t carry;
19535     __asm__ __volatile__(
19536         "movq    %[z], %%rdi\n"
19537         "movq    %[x], %%rsi\n"
19538         "movq    %[y], %%rdx\n"
19539         "movq    0(%%rsi), %%rax\n"
19540         "subq    0(%%rdx), %%rax\n"
19541         "movq    %%rax, 0(%%rdi)\n"
19542         "movq    8(%%rsi), %%rax\n"
19543         "sbbq    8(%%rdx), %%rax\n"
19544         "movq    %%rax, 8(%%rdi)\n"
19545         "movq    16(%%rsi), %%rax\n"
19546         "sbbq    16(%%rdx), %%rax\n"
19547         "movq    %%rax, 16(%%rdi)\n"
19548         "movq    24(%%rsi), %%rax\n"
19549         "sbbq    24(%%rdx), %%rax\n"
19550         "movq    %%rax, 24(%%rdi)\n"
19551         "movq    32(%%rsi), %%rax\n"
19552         "sbbq    32(%%rdx), %%rax\n"
19553         "movq    %%rax, 32(%%rdi)\n"
19554         "movq    40(%%rsi), %%rax\n"
19555         "sbbq    40(%%rdx), %%rax\n"
19556         "movq    %%rax, 40(%%rdi)\n"
19557         "movq    48(%%rsi), %%rax\n"
19558         "sbbq    48(%%rdx), %%rax\n"
19559         "movq    %%rax, 48(%%rdi)\n"
19560         "movq $0, %%rax\n"
19561         "adcq $0, %%rax\n"
19562     : "=&a"(carry)
19563     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
19564     : "%rdx", "%rsi", "%rdi", "memory");
19565     return carry;
19566 }
19567 
19568 /* x, y, and z have 6.5 words. Result in z. Carry bit is lost. */
19569 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
19570 static inline
mpfq_fixmp_6_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)19571 void mpfq_fixmp_6_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
19572 {
19573     __asm__ __volatile__(
19574         "movq    %[z], %%rdi\n"
19575         "movq    %[x], %%rsi\n"
19576         "movq    %[y], %%rdx\n"
19577         "movq    0(%%rsi), %%rax\n"
19578         "addq    0(%%rdx), %%rax\n"
19579         "movq    %%rax, 0(%%rdi)\n"
19580         "movq    8(%%rsi), %%rax\n"
19581         "adcq    8(%%rdx), %%rax\n"
19582         "movq    %%rax, 8(%%rdi)\n"
19583         "movq    16(%%rsi), %%rax\n"
19584         "adcq    16(%%rdx), %%rax\n"
19585         "movq    %%rax, 16(%%rdi)\n"
19586         "movq    24(%%rsi), %%rax\n"
19587         "adcq    24(%%rdx), %%rax\n"
19588         "movq    %%rax, 24(%%rdi)\n"
19589         "movq    32(%%rsi), %%rax\n"
19590         "adcq    32(%%rdx), %%rax\n"
19591         "movq    %%rax, 32(%%rdi)\n"
19592         "movq    40(%%rsi), %%rax\n"
19593         "adcq    40(%%rdx), %%rax\n"
19594         "movq    %%rax, 40(%%rdi)\n"
19595         "movq    48(%%rsi), %%rax\n"
19596         "adcq    48(%%rdx), %%rax\n"
19597         "movq    %%rax, 48(%%rdi)\n"
19598     :
19599     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
19600     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
19601 }
19602 
19603 /* x, y, and z have 6.5 words. Result in z. Borrow bit is lost. */
19604 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
19605 static inline
mpfq_fixmp_6_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)19606 void mpfq_fixmp_6_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
19607 {
19608     __asm__ __volatile__(
19609         "movq    %[z], %%rdi\n"
19610         "movq    %[x], %%rsi\n"
19611         "movq    %[y], %%rdx\n"
19612         "movq    0(%%rsi), %%rax\n"
19613         "subq    0(%%rdx), %%rax\n"
19614         "movq    %%rax, 0(%%rdi)\n"
19615         "movq    8(%%rsi), %%rax\n"
19616         "sbbq    8(%%rdx), %%rax\n"
19617         "movq    %%rax, 8(%%rdi)\n"
19618         "movq    16(%%rsi), %%rax\n"
19619         "sbbq    16(%%rdx), %%rax\n"
19620         "movq    %%rax, 16(%%rdi)\n"
19621         "movq    24(%%rsi), %%rax\n"
19622         "sbbq    24(%%rdx), %%rax\n"
19623         "movq    %%rax, 24(%%rdi)\n"
19624         "movq    32(%%rsi), %%rax\n"
19625         "sbbq    32(%%rdx), %%rax\n"
19626         "movq    %%rax, 32(%%rdi)\n"
19627         "movq    40(%%rsi), %%rax\n"
19628         "sbbq    40(%%rdx), %%rax\n"
19629         "movq    %%rax, 40(%%rdi)\n"
19630         "movq    48(%%rsi), %%rax\n"
19631         "sbbq    48(%%rdx), %%rax\n"
19632         "movq    %%rax, 48(%%rdi)\n"
19633     :
19634     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
19635     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
19636 }
19637 
19638 /* x has 6.5 words, z has 8.
19639  * Put (z+x*c) in z. Return carry bit. */
19640 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
19641 static inline
mpfq_fixmp_6_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)19642 mp_limb_t mpfq_fixmp_6_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
19643 {
19644     mp_limb_t carry;
19645     __asm__ __volatile__(
19646         "movq    %[z], %%rdi\n"
19647         "movq    %[x], %%rsi\n"
19648         "movq    0(%%rsi), %%rax\n"
19649         "mulq    %[mult]\n"
19650         "addq    %%rax, 0(%%rdi)\n"
19651         "movq    8(%%rsi), %%rax\n"
19652         "adcq    $0, %%rdx\n"
19653         "movq    %%rdx, %%rcx\n"
19654         "mulq    %[mult]\n"
19655         "addq    %%rax, %%rcx\n"
19656         "adcq    $0, %%rdx\n"
19657         "movq    16(%%rsi), %%rax\n"
19658         "addq    %%rcx, 8(%%rdi)\n"
19659         "adcq    $0, %%rdx\n"
19660         "movq    %%rdx, %%rcx\n"
19661         "mulq    %[mult]\n"
19662         "addq    %%rax, %%rcx\n"
19663         "adcq    $0, %%rdx\n"
19664         "movq    24(%%rsi), %%rax\n"
19665         "addq    %%rcx, 16(%%rdi)\n"
19666         "adcq    $0, %%rdx\n"
19667         "movq    %%rdx, %%rcx\n"
19668         "mulq    %[mult]\n"
19669         "addq    %%rax, %%rcx\n"
19670         "adcq    $0, %%rdx\n"
19671         "movq    32(%%rsi), %%rax\n"
19672         "addq    %%rcx, 24(%%rdi)\n"
19673         "adcq    $0, %%rdx\n"
19674         "movq    %%rdx, %%rcx\n"
19675         "mulq    %[mult]\n"
19676         "addq    %%rax, %%rcx\n"
19677         "adcq    $0, %%rdx\n"
19678         "movq    40(%%rsi), %%rax\n"
19679         "addq    %%rcx, 32(%%rdi)\n"
19680         "adcq    $0, %%rdx\n"
19681         "movq    %%rdx, %%rcx\n"
19682         "mulq    %[mult]\n"
19683         "addq    %%rax, %%rcx\n"
19684         "adcq    $0, %%rdx\n"
19685         "movq    48(%%rsi), %%rax\n"
19686         "addq    %%rcx, 40(%%rdi)\n"
19687         "adcq    $0, %%rdx\n"
19688         "movq    %%rdx, %%rcx\n"
19689         "mulq    %[mult]\n"
19690         "addq    %%rax, %%rcx\n"
19691         "adcq    $0, %%rdx\n"
19692         "addq    %%rcx, 48(%%rdi)\n"
19693         "adcq    $0, %%rdx\n"
19694         "xorq    %%rcx, %%rcx\n"
19695         "addq    %%rdx, 56(%%rdi)\n"
19696         "adcq    $0, %%rcx\n"
19697         "movq    %%rcx, %[carry]\n"
19698     : [carry]"=g"(carry), [z] "+m" (z)
19699     : [mult] "r" (c), [x] "m" (x)
19700     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19701     return carry;
19702 }
19703 
19704 /* x has 6.5 words, z has 8.
19705  * Put (z+x*c) in z. Carry bit is lost. */
19706 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
19707 static inline
mpfq_fixmp_6_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)19708 void mpfq_fixmp_6_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
19709 {
19710     __asm__ __volatile__(
19711         "movq    %[z], %%rdi\n"
19712         "movq    %[x], %%rsi\n"
19713         "movq    0(%%rsi), %%rax\n"
19714         "mulq    %[mult]\n"
19715         "addq    %%rax, 0(%%rdi)\n"
19716         "movq    8(%%rsi), %%rax\n"
19717         "adcq    $0, %%rdx\n"
19718         "movq    %%rdx, %%rcx\n"
19719         "mulq    %[mult]\n"
19720         "addq    %%rax, %%rcx\n"
19721         "adcq    $0, %%rdx\n"
19722         "movq    16(%%rsi), %%rax\n"
19723         "addq    %%rcx, 8(%%rdi)\n"
19724         "adcq    $0, %%rdx\n"
19725         "movq    %%rdx, %%rcx\n"
19726         "mulq    %[mult]\n"
19727         "addq    %%rax, %%rcx\n"
19728         "adcq    $0, %%rdx\n"
19729         "movq    24(%%rsi), %%rax\n"
19730         "addq    %%rcx, 16(%%rdi)\n"
19731         "adcq    $0, %%rdx\n"
19732         "movq    %%rdx, %%rcx\n"
19733         "mulq    %[mult]\n"
19734         "addq    %%rax, %%rcx\n"
19735         "adcq    $0, %%rdx\n"
19736         "movq    32(%%rsi), %%rax\n"
19737         "addq    %%rcx, 24(%%rdi)\n"
19738         "adcq    $0, %%rdx\n"
19739         "movq    %%rdx, %%rcx\n"
19740         "mulq    %[mult]\n"
19741         "addq    %%rax, %%rcx\n"
19742         "adcq    $0, %%rdx\n"
19743         "movq    40(%%rsi), %%rax\n"
19744         "addq    %%rcx, 32(%%rdi)\n"
19745         "adcq    $0, %%rdx\n"
19746         "movq    %%rdx, %%rcx\n"
19747         "mulq    %[mult]\n"
19748         "addq    %%rax, %%rcx\n"
19749         "adcq    $0, %%rdx\n"
19750         "movq    48(%%rsi), %%rax\n"
19751         "addq    %%rcx, 40(%%rdi)\n"
19752         "adcq    $0, %%rdx\n"
19753         "movq    %%rdx, %%rcx\n"
19754         "mulq    %[mult]\n"
19755         "addq    %%rax, %%rcx\n"
19756         "adcq    $0, %%rdx\n"
19757         "addq    %%rcx, 48(%%rdi)\n"
19758         "adcq    $0, %%rdx\n"
19759         "addq    %%rdx, 56(%%rdi)\n"
19760     : [z] "+m" (z)
19761     : [mult] "r" (c), [x] "m" (x)
19762     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19763 }
19764 
19765 /* x has 6.5 words, z has 7.
19766  * Put (z+x*c) in z. Return carry word. */
19767 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
19768 static inline
mpfq_fixmp_6_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)19769 mp_limb_t mpfq_fixmp_6_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
19770 {
19771     mp_limb_t carry;
19772     __asm__ __volatile__(
19773         "movq    %[z], %%rdi\n"
19774         "movq    %[x], %%rsi\n"
19775         "movq    0(%%rsi), %%rax\n"
19776         "mulq    %[mult]\n"
19777         "addq    %%rax, 0(%%rdi)\n"
19778         "movq    8(%%rsi), %%rax\n"
19779         "adcq    $0, %%rdx\n"
19780         "movq    %%rdx, %%rcx\n"
19781         "mulq    %[mult]\n"
19782         "addq    %%rax, %%rcx\n"
19783         "adcq    $0, %%rdx\n"
19784         "movq    16(%%rsi), %%rax\n"
19785         "addq    %%rcx, 8(%%rdi)\n"
19786         "adcq    $0, %%rdx\n"
19787         "movq    %%rdx, %%rcx\n"
19788         "mulq    %[mult]\n"
19789         "addq    %%rax, %%rcx\n"
19790         "adcq    $0, %%rdx\n"
19791         "movq    24(%%rsi), %%rax\n"
19792         "addq    %%rcx, 16(%%rdi)\n"
19793         "adcq    $0, %%rdx\n"
19794         "movq    %%rdx, %%rcx\n"
19795         "mulq    %[mult]\n"
19796         "addq    %%rax, %%rcx\n"
19797         "adcq    $0, %%rdx\n"
19798         "movq    32(%%rsi), %%rax\n"
19799         "addq    %%rcx, 24(%%rdi)\n"
19800         "adcq    $0, %%rdx\n"
19801         "movq    %%rdx, %%rcx\n"
19802         "mulq    %[mult]\n"
19803         "addq    %%rax, %%rcx\n"
19804         "adcq    $0, %%rdx\n"
19805         "movq    40(%%rsi), %%rax\n"
19806         "addq    %%rcx, 32(%%rdi)\n"
19807         "adcq    $0, %%rdx\n"
19808         "movq    %%rdx, %%rcx\n"
19809         "mulq    %[mult]\n"
19810         "addq    %%rax, %%rcx\n"
19811         "adcq    $0, %%rdx\n"
19812         "movq    48(%%rsi), %%rax\n"
19813         "addq    %%rcx, 40(%%rdi)\n"
19814         "adcq    $0, %%rdx\n"
19815         "movq    %%rdx, %%rcx\n"
19816         "mulq    %[mult]\n"
19817         "addq    %%rax, %%rcx\n"
19818         "adcq    $0, %%rdx\n"
19819         "addq    %%rcx, 48(%%rdi)\n"
19820         "adcq    $0, %%rdx\n"
19821         "movq    %%rdx, %[carry]\n"
19822     : [carry]"=g"(carry), [z] "+m" (z)
19823     : [mult] "r" (c), [x] "m" (x)
19824     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
19825     return carry;
19826 }
19827 
19828 /* x and y have 6.5 words, z has 13. Put x*y in z. */
19829 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
19830 static inline
mpfq_fixmp_6_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)19831 void mpfq_fixmp_6_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
19832 {
19833     __asm__ __volatile__(
19834         "### x*y[0]\n"
19835         "movq    %2, %%r8\n"
19836         "movq    %0, %%rdi\n"
19837         "movq    0(%%r8), %%r9\n"
19838         "movq    %1, %%rsi\n"
19839         "movq    0(%%rsi), %%rax\n"
19840         "mulq    %%r9\n"
19841         "movq    %%rax, 0(%%rdi)\n"
19842         "movq    8(%%rsi), %%rax\n"
19843         "movq    %%rdx, %%rcx\n"
19844         "mulq    %%r9\n"
19845         "addq    %%rax, %%rcx\n"
19846         "adcq    $0, %%rdx\n"
19847         "movq    16(%%rsi), %%rax\n"
19848         "movq    %%rcx, 8(%%rdi)\n"
19849         "movq    %%rdx, %%rcx\n"
19850         "mulq    %%r9\n"
19851         "addq    %%rax, %%rcx\n"
19852         "adcq    $0, %%rdx\n"
19853         "movq    24(%%rsi), %%rax\n"
19854         "movq    %%rcx, 16(%%rdi)\n"
19855         "movq    %%rdx, %%rcx\n"
19856         "mulq    %%r9\n"
19857         "addq    %%rax, %%rcx\n"
19858         "adcq    $0, %%rdx\n"
19859         "movq    32(%%rsi), %%rax\n"
19860         "movq    %%rcx, 24(%%rdi)\n"
19861         "movq    %%rdx, %%rcx\n"
19862         "mulq    %%r9\n"
19863         "addq    %%rax, %%rcx\n"
19864         "adcq    $0, %%rdx\n"
19865         "movq    40(%%rsi), %%rax\n"
19866         "movq    %%rcx, 32(%%rdi)\n"
19867         "movq    %%rdx, %%rcx\n"
19868         "mulq    %%r9\n"
19869         "addq    %%rax, %%rcx\n"
19870         "adcq    $0, %%rdx\n"
19871         "movq    48(%%rsi), %%rax\n"
19872         "movq    %%rcx, 40(%%rdi)\n"
19873         "movq    %%rdx, %%rcx\n"
19874         "mulq    %%r9\n"
19875         "addq    %%rax, %%rcx\n"
19876         "adcq    $0, %%rdx\n"
19877         "movq    %%rcx, 48(%%rdi)\n"
19878         "movq    %%rdx, 56(%%rdi)\n"
19879         "movq    $0, 64(%%rdi)\n"
19880         "movq    $0, 72(%%rdi)\n"
19881         "movq    $0, 80(%%rdi)\n"
19882         "movq    $0, 88(%%rdi)\n"
19883         "movq    $0, 96(%%rdi)\n"
19884         "### x*y[1]\n"
19885         "movq    8(%%r8), %%r9\n"
19886         "movq    0(%%rsi), %%rax\n"
19887         "mulq    %%r9\n"
19888         "addq    %%rax, 8(%%rdi)\n"
19889         "movq    8(%%rsi), %%rax\n"
19890         "adcq    $0, %%rdx\n"
19891         "movq    %%rdx, %%rcx\n"
19892         "mulq    %%r9\n"
19893         "addq    %%rax, %%rcx\n"
19894         "adcq    $0, %%rdx\n"
19895         "movq    16(%%rsi), %%rax\n"
19896         "addq    %%rcx, 16(%%rdi)\n"
19897         "adcq    $0, %%rdx\n"
19898         "movq    %%rdx, %%rcx\n"
19899         "mulq    %%r9\n"
19900         "addq    %%rax, %%rcx\n"
19901         "adcq    $0, %%rdx\n"
19902         "movq    24(%%rsi), %%rax\n"
19903         "addq    %%rcx, 24(%%rdi)\n"
19904         "adcq    $0, %%rdx\n"
19905         "movq    %%rdx, %%rcx\n"
19906         "mulq    %%r9\n"
19907         "addq    %%rax, %%rcx\n"
19908         "adcq    $0, %%rdx\n"
19909         "movq    32(%%rsi), %%rax\n"
19910         "addq    %%rcx, 32(%%rdi)\n"
19911         "adcq    $0, %%rdx\n"
19912         "movq    %%rdx, %%rcx\n"
19913         "mulq    %%r9\n"
19914         "addq    %%rax, %%rcx\n"
19915         "adcq    $0, %%rdx\n"
19916         "movq    40(%%rsi), %%rax\n"
19917         "addq    %%rcx, 40(%%rdi)\n"
19918         "adcq    $0, %%rdx\n"
19919         "movq    %%rdx, %%rcx\n"
19920         "mulq    %%r9\n"
19921         "addq    %%rax, %%rcx\n"
19922         "adcq    $0, %%rdx\n"
19923         "movq    48(%%rsi), %%rax\n"
19924         "addq    %%rcx, 48(%%rdi)\n"
19925         "adcq    $0, %%rdx\n"
19926         "movq    %%rdx, %%rcx\n"
19927         "mulq    %%r9\n"
19928         "addq    %%rax, %%rcx\n"
19929         "adcq    $0, %%rdx\n"
19930         "addq    %%rcx, 56(%%rdi)\n"
19931         "adcq    $0, %%rdx\n"
19932         "movq    %%rdx, 64(%%rdi)\n"
19933         "### x*y[2]\n"
19934         "movq    16(%%r8), %%r9\n"
19935         "movq    0(%%rsi), %%rax\n"
19936         "mulq    %%r9\n"
19937         "addq    %%rax, 16(%%rdi)\n"
19938         "movq    8(%%rsi), %%rax\n"
19939         "adcq    $0, %%rdx\n"
19940         "movq    %%rdx, %%rcx\n"
19941         "mulq    %%r9\n"
19942         "addq    %%rax, %%rcx\n"
19943         "adcq    $0, %%rdx\n"
19944         "movq    16(%%rsi), %%rax\n"
19945         "addq    %%rcx, 24(%%rdi)\n"
19946         "adcq    $0, %%rdx\n"
19947         "movq    %%rdx, %%rcx\n"
19948         "mulq    %%r9\n"
19949         "addq    %%rax, %%rcx\n"
19950         "adcq    $0, %%rdx\n"
19951         "movq    24(%%rsi), %%rax\n"
19952         "addq    %%rcx, 32(%%rdi)\n"
19953         "adcq    $0, %%rdx\n"
19954         "movq    %%rdx, %%rcx\n"
19955         "mulq    %%r9\n"
19956         "addq    %%rax, %%rcx\n"
19957         "adcq    $0, %%rdx\n"
19958         "movq    32(%%rsi), %%rax\n"
19959         "addq    %%rcx, 40(%%rdi)\n"
19960         "adcq    $0, %%rdx\n"
19961         "movq    %%rdx, %%rcx\n"
19962         "mulq    %%r9\n"
19963         "addq    %%rax, %%rcx\n"
19964         "adcq    $0, %%rdx\n"
19965         "movq    40(%%rsi), %%rax\n"
19966         "addq    %%rcx, 48(%%rdi)\n"
19967         "adcq    $0, %%rdx\n"
19968         "movq    %%rdx, %%rcx\n"
19969         "mulq    %%r9\n"
19970         "addq    %%rax, %%rcx\n"
19971         "adcq    $0, %%rdx\n"
19972         "movq    48(%%rsi), %%rax\n"
19973         "addq    %%rcx, 56(%%rdi)\n"
19974         "adcq    $0, %%rdx\n"
19975         "movq    %%rdx, %%rcx\n"
19976         "mulq    %%r9\n"
19977         "addq    %%rax, %%rcx\n"
19978         "adcq    $0, %%rdx\n"
19979         "addq    %%rcx, 64(%%rdi)\n"
19980         "adcq    $0, %%rdx\n"
19981         "movq    %%rdx, 72(%%rdi)\n"
19982         "### x*y[3]\n"
19983         "movq    24(%%r8), %%r9\n"
19984         "movq    0(%%rsi), %%rax\n"
19985         "mulq    %%r9\n"
19986         "addq    %%rax, 24(%%rdi)\n"
19987         "movq    8(%%rsi), %%rax\n"
19988         "adcq    $0, %%rdx\n"
19989         "movq    %%rdx, %%rcx\n"
19990         "mulq    %%r9\n"
19991         "addq    %%rax, %%rcx\n"
19992         "adcq    $0, %%rdx\n"
19993         "movq    16(%%rsi), %%rax\n"
19994         "addq    %%rcx, 32(%%rdi)\n"
19995         "adcq    $0, %%rdx\n"
19996         "movq    %%rdx, %%rcx\n"
19997         "mulq    %%r9\n"
19998         "addq    %%rax, %%rcx\n"
19999         "adcq    $0, %%rdx\n"
20000         "movq    24(%%rsi), %%rax\n"
20001         "addq    %%rcx, 40(%%rdi)\n"
20002         "adcq    $0, %%rdx\n"
20003         "movq    %%rdx, %%rcx\n"
20004         "mulq    %%r9\n"
20005         "addq    %%rax, %%rcx\n"
20006         "adcq    $0, %%rdx\n"
20007         "movq    32(%%rsi), %%rax\n"
20008         "addq    %%rcx, 48(%%rdi)\n"
20009         "adcq    $0, %%rdx\n"
20010         "movq    %%rdx, %%rcx\n"
20011         "mulq    %%r9\n"
20012         "addq    %%rax, %%rcx\n"
20013         "adcq    $0, %%rdx\n"
20014         "movq    40(%%rsi), %%rax\n"
20015         "addq    %%rcx, 56(%%rdi)\n"
20016         "adcq    $0, %%rdx\n"
20017         "movq    %%rdx, %%rcx\n"
20018         "mulq    %%r9\n"
20019         "addq    %%rax, %%rcx\n"
20020         "adcq    $0, %%rdx\n"
20021         "movq    48(%%rsi), %%rax\n"
20022         "addq    %%rcx, 64(%%rdi)\n"
20023         "adcq    $0, %%rdx\n"
20024         "movq    %%rdx, %%rcx\n"
20025         "mulq    %%r9\n"
20026         "addq    %%rax, %%rcx\n"
20027         "adcq    $0, %%rdx\n"
20028         "addq    %%rcx, 72(%%rdi)\n"
20029         "adcq    $0, %%rdx\n"
20030         "movq    %%rdx, 80(%%rdi)\n"
20031         "### x*y[4]\n"
20032         "movq    32(%%r8), %%r9\n"
20033         "movq    0(%%rsi), %%rax\n"
20034         "mulq    %%r9\n"
20035         "addq    %%rax, 32(%%rdi)\n"
20036         "movq    8(%%rsi), %%rax\n"
20037         "adcq    $0, %%rdx\n"
20038         "movq    %%rdx, %%rcx\n"
20039         "mulq    %%r9\n"
20040         "addq    %%rax, %%rcx\n"
20041         "adcq    $0, %%rdx\n"
20042         "movq    16(%%rsi), %%rax\n"
20043         "addq    %%rcx, 40(%%rdi)\n"
20044         "adcq    $0, %%rdx\n"
20045         "movq    %%rdx, %%rcx\n"
20046         "mulq    %%r9\n"
20047         "addq    %%rax, %%rcx\n"
20048         "adcq    $0, %%rdx\n"
20049         "movq    24(%%rsi), %%rax\n"
20050         "addq    %%rcx, 48(%%rdi)\n"
20051         "adcq    $0, %%rdx\n"
20052         "movq    %%rdx, %%rcx\n"
20053         "mulq    %%r9\n"
20054         "addq    %%rax, %%rcx\n"
20055         "adcq    $0, %%rdx\n"
20056         "movq    32(%%rsi), %%rax\n"
20057         "addq    %%rcx, 56(%%rdi)\n"
20058         "adcq    $0, %%rdx\n"
20059         "movq    %%rdx, %%rcx\n"
20060         "mulq    %%r9\n"
20061         "addq    %%rax, %%rcx\n"
20062         "adcq    $0, %%rdx\n"
20063         "movq    40(%%rsi), %%rax\n"
20064         "addq    %%rcx, 64(%%rdi)\n"
20065         "adcq    $0, %%rdx\n"
20066         "movq    %%rdx, %%rcx\n"
20067         "mulq    %%r9\n"
20068         "addq    %%rax, %%rcx\n"
20069         "adcq    $0, %%rdx\n"
20070         "movq    48(%%rsi), %%rax\n"
20071         "addq    %%rcx, 72(%%rdi)\n"
20072         "adcq    $0, %%rdx\n"
20073         "movq    %%rdx, %%rcx\n"
20074         "mulq    %%r9\n"
20075         "addq    %%rax, %%rcx\n"
20076         "adcq    $0, %%rdx\n"
20077         "addq    %%rcx, 80(%%rdi)\n"
20078         "adcq    $0, %%rdx\n"
20079         "movq    %%rdx, 88(%%rdi)\n"
20080         "### x*y[5]\n"
20081         "movq    40(%%r8), %%r9\n"
20082         "movq    0(%%rsi), %%rax\n"
20083         "mulq    %%r9\n"
20084         "addq    %%rax, 40(%%rdi)\n"
20085         "movq    8(%%rsi), %%rax\n"
20086         "adcq    $0, %%rdx\n"
20087         "movq    %%rdx, %%rcx\n"
20088         "mulq    %%r9\n"
20089         "addq    %%rax, %%rcx\n"
20090         "adcq    $0, %%rdx\n"
20091         "movq    16(%%rsi), %%rax\n"
20092         "addq    %%rcx, 48(%%rdi)\n"
20093         "adcq    $0, %%rdx\n"
20094         "movq    %%rdx, %%rcx\n"
20095         "mulq    %%r9\n"
20096         "addq    %%rax, %%rcx\n"
20097         "adcq    $0, %%rdx\n"
20098         "movq    24(%%rsi), %%rax\n"
20099         "addq    %%rcx, 56(%%rdi)\n"
20100         "adcq    $0, %%rdx\n"
20101         "movq    %%rdx, %%rcx\n"
20102         "mulq    %%r9\n"
20103         "addq    %%rax, %%rcx\n"
20104         "adcq    $0, %%rdx\n"
20105         "movq    32(%%rsi), %%rax\n"
20106         "addq    %%rcx, 64(%%rdi)\n"
20107         "adcq    $0, %%rdx\n"
20108         "movq    %%rdx, %%rcx\n"
20109         "mulq    %%r9\n"
20110         "addq    %%rax, %%rcx\n"
20111         "adcq    $0, %%rdx\n"
20112         "movq    40(%%rsi), %%rax\n"
20113         "addq    %%rcx, 72(%%rdi)\n"
20114         "adcq    $0, %%rdx\n"
20115         "movq    %%rdx, %%rcx\n"
20116         "mulq    %%r9\n"
20117         "addq    %%rax, %%rcx\n"
20118         "adcq    $0, %%rdx\n"
20119         "movq    48(%%rsi), %%rax\n"
20120         "addq    %%rcx, 80(%%rdi)\n"
20121         "adcq    $0, %%rdx\n"
20122         "movq    %%rdx, %%rcx\n"
20123         "mulq    %%r9\n"
20124         "addq    %%rax, %%rcx\n"
20125         "adcq    $0, %%rdx\n"
20126         "addq    %%rcx, 88(%%rdi)\n"
20127         "adcq    $0, %%rdx\n"
20128         "movq    %%rdx, 96(%%rdi)\n"
20129         "### x*y[6]\n"
20130         "movq    48(%%r8), %%r9\n"
20131         "movq    0(%%rsi), %%rax\n"
20132         "mulq    %%r9\n"
20133         "addq    %%rax, 48(%%rdi)\n"
20134         "movq    8(%%rsi), %%rax\n"
20135         "adcq    $0, %%rdx\n"
20136         "movq    %%rdx, %%rcx\n"
20137         "mulq    %%r9\n"
20138         "addq    %%rax, %%rcx\n"
20139         "adcq    $0, %%rdx\n"
20140         "movq    16(%%rsi), %%rax\n"
20141         "addq    %%rcx, 56(%%rdi)\n"
20142         "adcq    $0, %%rdx\n"
20143         "movq    %%rdx, %%rcx\n"
20144         "mulq    %%r9\n"
20145         "addq    %%rax, %%rcx\n"
20146         "adcq    $0, %%rdx\n"
20147         "movq    24(%%rsi), %%rax\n"
20148         "addq    %%rcx, 64(%%rdi)\n"
20149         "adcq    $0, %%rdx\n"
20150         "movq    %%rdx, %%rcx\n"
20151         "mulq    %%r9\n"
20152         "addq    %%rax, %%rcx\n"
20153         "adcq    $0, %%rdx\n"
20154         "movq    32(%%rsi), %%rax\n"
20155         "addq    %%rcx, 72(%%rdi)\n"
20156         "adcq    $0, %%rdx\n"
20157         "movq    %%rdx, %%rcx\n"
20158         "mulq    %%r9\n"
20159         "addq    %%rax, %%rcx\n"
20160         "adcq    $0, %%rdx\n"
20161         "movq    40(%%rsi), %%rax\n"
20162         "addq    %%rcx, 80(%%rdi)\n"
20163         "adcq    $0, %%rdx\n"
20164         "movq    %%rdx, %%rcx\n"
20165         "mulq    %%r9\n"
20166         "addq    %%rax, %%rcx\n"
20167         "adcq    $0, %%rdx\n"
20168         "movq    48(%%rsi), %%rax\n"
20169         "addq    %%rcx, 88(%%rdi)\n"
20170         "adcq    $0, %%rdx\n"
20171         "movq    %%rdx, %%rcx\n"
20172         "mulq    %%r9\n"
20173         "addq    %%rax, %%rcx\n"
20174         "adcq    $0, %%rdx\n"
20175         "addq    %%rcx, 96(%%rdi)\n"
20176       : "+m" (z)
20177       : "m" (x), "m" (y)
20178       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
20179 }
20180 
20181 /* x has 6.5 words, z has 13. Put x*y in z. */
20182 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
20183 static inline
mpfq_fixmp_6_5_sqr(mp_limb_t * z,const mp_limb_t * x)20184 void mpfq_fixmp_6_5_sqr(mp_limb_t * z, const mp_limb_t * x)
20185 {
20186     mpfq_fixmp_6_5_mul(z, x, x);
20187 }
20188 
20189 /* x has 6.5 words, z has 8. Put x*y in z. */
20190 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
20191 static inline
mpfq_fixmp_6_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)20192 void mpfq_fixmp_6_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
20193 {
20194     __asm__ __volatile__(
20195         "movq    %[z], %%rdi\n"
20196         "movq    %[x], %%rsi\n"
20197         "movq    0(%%rsi), %%rax\n"
20198         "mulq    %[mult]\n"
20199         "movq    %%rax, 0(%%rdi)\n"
20200         "movq    8(%%rsi), %%rax\n"
20201         "movq    %%rdx, %%rcx\n"
20202         "mulq    %[mult]\n"
20203         "addq    %%rax, %%rcx\n"
20204         "adcq    $0, %%rdx\n"
20205         "movq    16(%%rsi), %%rax\n"
20206         "movq    %%rcx, 8(%%rdi)\n"
20207         "movq    %%rdx, %%rcx\n"
20208         "mulq    %[mult]\n"
20209         "addq    %%rax, %%rcx\n"
20210         "adcq    $0, %%rdx\n"
20211         "movq    24(%%rsi), %%rax\n"
20212         "movq    %%rcx, 16(%%rdi)\n"
20213         "movq    %%rdx, %%rcx\n"
20214         "mulq    %[mult]\n"
20215         "addq    %%rax, %%rcx\n"
20216         "adcq    $0, %%rdx\n"
20217         "movq    32(%%rsi), %%rax\n"
20218         "movq    %%rcx, 24(%%rdi)\n"
20219         "movq    %%rdx, %%rcx\n"
20220         "mulq    %[mult]\n"
20221         "addq    %%rax, %%rcx\n"
20222         "adcq    $0, %%rdx\n"
20223         "movq    40(%%rsi), %%rax\n"
20224         "movq    %%rcx, 32(%%rdi)\n"
20225         "movq    %%rdx, %%rcx\n"
20226         "mulq    %[mult]\n"
20227         "addq    %%rax, %%rcx\n"
20228         "adcq    $0, %%rdx\n"
20229         "movq    48(%%rsi), %%rax\n"
20230         "movq    %%rcx, 40(%%rdi)\n"
20231         "movq    %%rdx, %%rcx\n"
20232         "mulq    %[mult]\n"
20233         "addq    %%rax, %%rcx\n"
20234         "adcq    $0, %%rdx\n"
20235         "movq    %%rcx, 48(%%rdi)\n"
20236         "movq    %%rdx, 56(%%rdi)\n"
20237     :
20238     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
20239     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
20240 }
20241 
20242 /* x has 6.5 words, z has 7. c is 0.5 word.
20243  * Put (z+x*c) in z. Return carry bit. */
20244 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
20245 static inline
mpfq_fixmp_6_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)20246 mp_limb_t mpfq_fixmp_6_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
20247 {
20248     mp_limb_t carry;
20249     __asm__ __volatile__(
20250         "movq    %[z], %%rdi\n"
20251         "movq    %[x], %%rsi\n"
20252         "movq    0(%%rsi), %%rax\n"
20253         "mulq    %[mult]\n"
20254         "addq    %%rax, 0(%%rdi)\n"
20255         "movq    8(%%rsi), %%rax\n"
20256         "adcq    $0, %%rdx\n"
20257         "movq    %%rdx, %%rcx\n"
20258         "mulq    %[mult]\n"
20259         "addq    %%rax, %%rcx\n"
20260         "adcq    $0, %%rdx\n"
20261         "movq    16(%%rsi), %%rax\n"
20262         "addq    %%rcx, 8(%%rdi)\n"
20263         "adcq    $0, %%rdx\n"
20264         "movq    %%rdx, %%rcx\n"
20265         "mulq    %[mult]\n"
20266         "addq    %%rax, %%rcx\n"
20267         "adcq    $0, %%rdx\n"
20268         "movq    24(%%rsi), %%rax\n"
20269         "addq    %%rcx, 16(%%rdi)\n"
20270         "adcq    $0, %%rdx\n"
20271         "movq    %%rdx, %%rcx\n"
20272         "mulq    %[mult]\n"
20273         "addq    %%rax, %%rcx\n"
20274         "adcq    $0, %%rdx\n"
20275         "movq    32(%%rsi), %%rax\n"
20276         "addq    %%rcx, 24(%%rdi)\n"
20277         "adcq    $0, %%rdx\n"
20278         "movq    %%rdx, %%rcx\n"
20279         "mulq    %[mult]\n"
20280         "addq    %%rax, %%rcx\n"
20281         "adcq    $0, %%rdx\n"
20282         "movq    40(%%rsi), %%rax\n"
20283         "addq    %%rcx, 32(%%rdi)\n"
20284         "adcq    $0, %%rdx\n"
20285         "movq    %%rdx, %%rcx\n"
20286         "mulq    %[mult]\n"
20287         "addq    %%rax, %%rcx\n"
20288         "adcq    $0, %%rdx\n"
20289         "movq    48(%%rsi), %%rax\n"
20290         "addq    %%rcx, 40(%%rdi)\n"
20291         "adcq    $0, %%rdx\n"
20292         "movq    %%rdx, %%rcx\n"
20293         "imulq    %[mult], %%rax\n"
20294         "xorq    %%rdx, %%rdx\n"
20295         "addq    %%rcx, %%rax\n"
20296         "adcq    $0, %%rdx\n"
20297         "addq    %%rax, 48(%%rdi)\n"
20298         "adcq    $0, %%rdx\n"
20299         "movq    %%rdx, %[carry]\n"
20300     : [carry]"=g"(carry), [z] "+m" (z)
20301     : [mult] "r" (c), [x] "m" (x)
20302     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
20303     return carry;
20304 }
20305 
20306 /* x has 6.5 words, z has 7. c is 0.5 word.
20307  * Put (z+x*c) in z. Carry bit is lost. */
20308 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
20309 static inline
mpfq_fixmp_6_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)20310 void mpfq_fixmp_6_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
20311 {
20312     __asm__ __volatile__(
20313         "movq    %[z], %%rdi\n"
20314         "movq    %[x], %%rsi\n"
20315         "movq    0(%%rsi), %%rax\n"
20316         "mulq    %[mult]\n"
20317         "addq    %%rax, 0(%%rdi)\n"
20318         "movq    8(%%rsi), %%rax\n"
20319         "adcq    $0, %%rdx\n"
20320         "movq    %%rdx, %%rcx\n"
20321         "mulq    %[mult]\n"
20322         "addq    %%rax, %%rcx\n"
20323         "adcq    $0, %%rdx\n"
20324         "movq    16(%%rsi), %%rax\n"
20325         "addq    %%rcx, 8(%%rdi)\n"
20326         "adcq    $0, %%rdx\n"
20327         "movq    %%rdx, %%rcx\n"
20328         "mulq    %[mult]\n"
20329         "addq    %%rax, %%rcx\n"
20330         "adcq    $0, %%rdx\n"
20331         "movq    24(%%rsi), %%rax\n"
20332         "addq    %%rcx, 16(%%rdi)\n"
20333         "adcq    $0, %%rdx\n"
20334         "movq    %%rdx, %%rcx\n"
20335         "mulq    %[mult]\n"
20336         "addq    %%rax, %%rcx\n"
20337         "adcq    $0, %%rdx\n"
20338         "movq    32(%%rsi), %%rax\n"
20339         "addq    %%rcx, 24(%%rdi)\n"
20340         "adcq    $0, %%rdx\n"
20341         "movq    %%rdx, %%rcx\n"
20342         "mulq    %[mult]\n"
20343         "addq    %%rax, %%rcx\n"
20344         "adcq    $0, %%rdx\n"
20345         "movq    40(%%rsi), %%rax\n"
20346         "addq    %%rcx, 32(%%rdi)\n"
20347         "adcq    $0, %%rdx\n"
20348         "movq    %%rdx, %%rcx\n"
20349         "mulq    %[mult]\n"
20350         "addq    %%rax, %%rcx\n"
20351         "adcq    $0, %%rdx\n"
20352         "movq    48(%%rsi), %%rax\n"
20353         "addq    %%rcx, 40(%%rdi)\n"
20354         "adcq    $0, %%rdx\n"
20355         "movq    %%rdx, %%rcx\n"
20356         "imulq    %[mult], %%rax\n"
20357         "addq    %%rcx, %%rax\n"
20358         "addq    %%rax, 48(%%rdi)\n"
20359     : [z] "+m" (z)
20360     : [mult] "r" (c), [x] "m" (x)
20361     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
20362 }
20363 
20364 /* x has 6.5 words, z has 7. c is 0.5 word.
20365  * Put (x*c) in z. No carry. */
20366 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
20367 static inline
mpfq_fixmp_6_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)20368 void mpfq_fixmp_6_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
20369 {
20370     __asm__ __volatile__(
20371         "movq    %[z], %%rdi\n"
20372         "movq    %[x], %%rsi\n"
20373         "movq    0(%%rsi), %%rax\n"
20374         "mulq    %[mult]\n"
20375         "movq    %%rax, 0(%%rdi)\n"
20376         "movq    8(%%rsi), %%rax\n"
20377         "movq    %%rdx, %%rcx\n"
20378         "mulq    %[mult]\n"
20379         "addq    %%rax, %%rcx\n"
20380         "adcq    $0, %%rdx\n"
20381         "movq    16(%%rsi), %%rax\n"
20382         "movq    %%rcx, 8(%%rdi)\n"
20383         "movq    %%rdx, %%rcx\n"
20384         "mulq    %[mult]\n"
20385         "addq    %%rax, %%rcx\n"
20386         "adcq    $0, %%rdx\n"
20387         "movq    24(%%rsi), %%rax\n"
20388         "movq    %%rcx, 16(%%rdi)\n"
20389         "movq    %%rdx, %%rcx\n"
20390         "mulq    %[mult]\n"
20391         "addq    %%rax, %%rcx\n"
20392         "adcq    $0, %%rdx\n"
20393         "movq    32(%%rsi), %%rax\n"
20394         "movq    %%rcx, 24(%%rdi)\n"
20395         "movq    %%rdx, %%rcx\n"
20396         "mulq    %[mult]\n"
20397         "addq    %%rax, %%rcx\n"
20398         "adcq    $0, %%rdx\n"
20399         "movq    40(%%rsi), %%rax\n"
20400         "movq    %%rcx, 32(%%rdi)\n"
20401         "movq    %%rdx, %%rcx\n"
20402         "mulq    %[mult]\n"
20403         "addq    %%rax, %%rcx\n"
20404         "adcq    $0, %%rdx\n"
20405         "movq    48(%%rsi), %%rax\n"
20406         "movq    %%rcx, 40(%%rdi)\n"
20407         "movq    %%rdx, %%rcx\n"
20408         "imulq    %[mult], %%rax\n"
20409         "addq    %%rcx, %%rax\n"
20410         "movq    %%rax, 48(%%rdi)\n"
20411     :
20412     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
20413     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
20414 }
20415 
20416 /* x, y, and z have 7.5 words. Result in z. Return carry bit */
20417 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
20418 static inline
mpfq_fixmp_7_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)20419 mp_limb_t mpfq_fixmp_7_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
20420 {
20421     mp_limb_t carry;
20422     __asm__ __volatile__(
20423         "movq    %[z], %%rdi\n"
20424         "movq    %[x], %%rsi\n"
20425         "movq    %[y], %%rdx\n"
20426         "movq    0(%%rsi), %%rax\n"
20427         "addq    0(%%rdx), %%rax\n"
20428         "movq    %%rax, 0(%%rdi)\n"
20429         "movq    8(%%rsi), %%rax\n"
20430         "adcq    8(%%rdx), %%rax\n"
20431         "movq    %%rax, 8(%%rdi)\n"
20432         "movq    16(%%rsi), %%rax\n"
20433         "adcq    16(%%rdx), %%rax\n"
20434         "movq    %%rax, 16(%%rdi)\n"
20435         "movq    24(%%rsi), %%rax\n"
20436         "adcq    24(%%rdx), %%rax\n"
20437         "movq    %%rax, 24(%%rdi)\n"
20438         "movq    32(%%rsi), %%rax\n"
20439         "adcq    32(%%rdx), %%rax\n"
20440         "movq    %%rax, 32(%%rdi)\n"
20441         "movq    40(%%rsi), %%rax\n"
20442         "adcq    40(%%rdx), %%rax\n"
20443         "movq    %%rax, 40(%%rdi)\n"
20444         "movq    48(%%rsi), %%rax\n"
20445         "adcq    48(%%rdx), %%rax\n"
20446         "movq    %%rax, 48(%%rdi)\n"
20447         "movq    56(%%rsi), %%rax\n"
20448         "adcq    56(%%rdx), %%rax\n"
20449         "movq    %%rax, 56(%%rdi)\n"
20450         "movq $0, %%rax\n"
20451         "adcq $0, %%rax\n"
20452     : "=&a"(carry)
20453     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
20454     : "%rdx", "%rsi", "%rdi", "memory");
20455     return carry;
20456 }
20457 
20458 /* x, y, and z have 7.5 words. Result in z. Return borrow bit */
20459 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
20460 static inline
mpfq_fixmp_7_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)20461 mp_limb_t mpfq_fixmp_7_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
20462 {
20463     mp_limb_t carry;
20464     __asm__ __volatile__(
20465         "movq    %[z], %%rdi\n"
20466         "movq    %[x], %%rsi\n"
20467         "movq    %[y], %%rdx\n"
20468         "movq    0(%%rsi), %%rax\n"
20469         "subq    0(%%rdx), %%rax\n"
20470         "movq    %%rax, 0(%%rdi)\n"
20471         "movq    8(%%rsi), %%rax\n"
20472         "sbbq    8(%%rdx), %%rax\n"
20473         "movq    %%rax, 8(%%rdi)\n"
20474         "movq    16(%%rsi), %%rax\n"
20475         "sbbq    16(%%rdx), %%rax\n"
20476         "movq    %%rax, 16(%%rdi)\n"
20477         "movq    24(%%rsi), %%rax\n"
20478         "sbbq    24(%%rdx), %%rax\n"
20479         "movq    %%rax, 24(%%rdi)\n"
20480         "movq    32(%%rsi), %%rax\n"
20481         "sbbq    32(%%rdx), %%rax\n"
20482         "movq    %%rax, 32(%%rdi)\n"
20483         "movq    40(%%rsi), %%rax\n"
20484         "sbbq    40(%%rdx), %%rax\n"
20485         "movq    %%rax, 40(%%rdi)\n"
20486         "movq    48(%%rsi), %%rax\n"
20487         "sbbq    48(%%rdx), %%rax\n"
20488         "movq    %%rax, 48(%%rdi)\n"
20489         "movq    56(%%rsi), %%rax\n"
20490         "sbbq    56(%%rdx), %%rax\n"
20491         "movq    %%rax, 56(%%rdi)\n"
20492         "movq $0, %%rax\n"
20493         "adcq $0, %%rax\n"
20494     : "=&a"(carry)
20495     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
20496     : "%rdx", "%rsi", "%rdi", "memory");
20497     return carry;
20498 }
20499 
20500 /* x, y, and z have 7.5 words. Result in z. Carry bit is lost. */
20501 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
20502 static inline
mpfq_fixmp_7_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)20503 void mpfq_fixmp_7_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
20504 {
20505     __asm__ __volatile__(
20506         "movq    %[z], %%rdi\n"
20507         "movq    %[x], %%rsi\n"
20508         "movq    %[y], %%rdx\n"
20509         "movq    0(%%rsi), %%rax\n"
20510         "addq    0(%%rdx), %%rax\n"
20511         "movq    %%rax, 0(%%rdi)\n"
20512         "movq    8(%%rsi), %%rax\n"
20513         "adcq    8(%%rdx), %%rax\n"
20514         "movq    %%rax, 8(%%rdi)\n"
20515         "movq    16(%%rsi), %%rax\n"
20516         "adcq    16(%%rdx), %%rax\n"
20517         "movq    %%rax, 16(%%rdi)\n"
20518         "movq    24(%%rsi), %%rax\n"
20519         "adcq    24(%%rdx), %%rax\n"
20520         "movq    %%rax, 24(%%rdi)\n"
20521         "movq    32(%%rsi), %%rax\n"
20522         "adcq    32(%%rdx), %%rax\n"
20523         "movq    %%rax, 32(%%rdi)\n"
20524         "movq    40(%%rsi), %%rax\n"
20525         "adcq    40(%%rdx), %%rax\n"
20526         "movq    %%rax, 40(%%rdi)\n"
20527         "movq    48(%%rsi), %%rax\n"
20528         "adcq    48(%%rdx), %%rax\n"
20529         "movq    %%rax, 48(%%rdi)\n"
20530         "movq    56(%%rsi), %%rax\n"
20531         "adcq    56(%%rdx), %%rax\n"
20532         "movq    %%rax, 56(%%rdi)\n"
20533     :
20534     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
20535     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
20536 }
20537 
20538 /* x, y, and z have 7.5 words. Result in z. Borrow bit is lost. */
20539 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
20540 static inline
mpfq_fixmp_7_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)20541 void mpfq_fixmp_7_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
20542 {
20543     __asm__ __volatile__(
20544         "movq    %[z], %%rdi\n"
20545         "movq    %[x], %%rsi\n"
20546         "movq    %[y], %%rdx\n"
20547         "movq    0(%%rsi), %%rax\n"
20548         "subq    0(%%rdx), %%rax\n"
20549         "movq    %%rax, 0(%%rdi)\n"
20550         "movq    8(%%rsi), %%rax\n"
20551         "sbbq    8(%%rdx), %%rax\n"
20552         "movq    %%rax, 8(%%rdi)\n"
20553         "movq    16(%%rsi), %%rax\n"
20554         "sbbq    16(%%rdx), %%rax\n"
20555         "movq    %%rax, 16(%%rdi)\n"
20556         "movq    24(%%rsi), %%rax\n"
20557         "sbbq    24(%%rdx), %%rax\n"
20558         "movq    %%rax, 24(%%rdi)\n"
20559         "movq    32(%%rsi), %%rax\n"
20560         "sbbq    32(%%rdx), %%rax\n"
20561         "movq    %%rax, 32(%%rdi)\n"
20562         "movq    40(%%rsi), %%rax\n"
20563         "sbbq    40(%%rdx), %%rax\n"
20564         "movq    %%rax, 40(%%rdi)\n"
20565         "movq    48(%%rsi), %%rax\n"
20566         "sbbq    48(%%rdx), %%rax\n"
20567         "movq    %%rax, 48(%%rdi)\n"
20568         "movq    56(%%rsi), %%rax\n"
20569         "sbbq    56(%%rdx), %%rax\n"
20570         "movq    %%rax, 56(%%rdi)\n"
20571     :
20572     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
20573     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
20574 }
20575 
20576 /* x has 7.5 words, z has 9.
20577  * Put (z+x*c) in z. Return carry bit. */
20578 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
20579 static inline
mpfq_fixmp_7_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)20580 mp_limb_t mpfq_fixmp_7_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
20581 {
20582     mp_limb_t carry;
20583     __asm__ __volatile__(
20584         "movq    %[z], %%rdi\n"
20585         "movq    %[x], %%rsi\n"
20586         "movq    0(%%rsi), %%rax\n"
20587         "mulq    %[mult]\n"
20588         "addq    %%rax, 0(%%rdi)\n"
20589         "movq    8(%%rsi), %%rax\n"
20590         "adcq    $0, %%rdx\n"
20591         "movq    %%rdx, %%rcx\n"
20592         "mulq    %[mult]\n"
20593         "addq    %%rax, %%rcx\n"
20594         "adcq    $0, %%rdx\n"
20595         "movq    16(%%rsi), %%rax\n"
20596         "addq    %%rcx, 8(%%rdi)\n"
20597         "adcq    $0, %%rdx\n"
20598         "movq    %%rdx, %%rcx\n"
20599         "mulq    %[mult]\n"
20600         "addq    %%rax, %%rcx\n"
20601         "adcq    $0, %%rdx\n"
20602         "movq    24(%%rsi), %%rax\n"
20603         "addq    %%rcx, 16(%%rdi)\n"
20604         "adcq    $0, %%rdx\n"
20605         "movq    %%rdx, %%rcx\n"
20606         "mulq    %[mult]\n"
20607         "addq    %%rax, %%rcx\n"
20608         "adcq    $0, %%rdx\n"
20609         "movq    32(%%rsi), %%rax\n"
20610         "addq    %%rcx, 24(%%rdi)\n"
20611         "adcq    $0, %%rdx\n"
20612         "movq    %%rdx, %%rcx\n"
20613         "mulq    %[mult]\n"
20614         "addq    %%rax, %%rcx\n"
20615         "adcq    $0, %%rdx\n"
20616         "movq    40(%%rsi), %%rax\n"
20617         "addq    %%rcx, 32(%%rdi)\n"
20618         "adcq    $0, %%rdx\n"
20619         "movq    %%rdx, %%rcx\n"
20620         "mulq    %[mult]\n"
20621         "addq    %%rax, %%rcx\n"
20622         "adcq    $0, %%rdx\n"
20623         "movq    48(%%rsi), %%rax\n"
20624         "addq    %%rcx, 40(%%rdi)\n"
20625         "adcq    $0, %%rdx\n"
20626         "movq    %%rdx, %%rcx\n"
20627         "mulq    %[mult]\n"
20628         "addq    %%rax, %%rcx\n"
20629         "adcq    $0, %%rdx\n"
20630         "movq    56(%%rsi), %%rax\n"
20631         "addq    %%rcx, 48(%%rdi)\n"
20632         "adcq    $0, %%rdx\n"
20633         "movq    %%rdx, %%rcx\n"
20634         "mulq    %[mult]\n"
20635         "addq    %%rax, %%rcx\n"
20636         "adcq    $0, %%rdx\n"
20637         "addq    %%rcx, 56(%%rdi)\n"
20638         "adcq    $0, %%rdx\n"
20639         "xorq    %%rcx, %%rcx\n"
20640         "addq    %%rdx, 64(%%rdi)\n"
20641         "adcq    $0, %%rcx\n"
20642         "movq    %%rcx, %[carry]\n"
20643     : [carry]"=g"(carry), [z] "+m" (z)
20644     : [mult] "r" (c), [x] "m" (x)
20645     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
20646     return carry;
20647 }
20648 
20649 /* x has 7.5 words, z has 9.
20650  * Put (z+x*c) in z. Carry bit is lost. */
20651 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
20652 static inline
mpfq_fixmp_7_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)20653 void mpfq_fixmp_7_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
20654 {
20655     __asm__ __volatile__(
20656         "movq    %[z], %%rdi\n"
20657         "movq    %[x], %%rsi\n"
20658         "movq    0(%%rsi), %%rax\n"
20659         "mulq    %[mult]\n"
20660         "addq    %%rax, 0(%%rdi)\n"
20661         "movq    8(%%rsi), %%rax\n"
20662         "adcq    $0, %%rdx\n"
20663         "movq    %%rdx, %%rcx\n"
20664         "mulq    %[mult]\n"
20665         "addq    %%rax, %%rcx\n"
20666         "adcq    $0, %%rdx\n"
20667         "movq    16(%%rsi), %%rax\n"
20668         "addq    %%rcx, 8(%%rdi)\n"
20669         "adcq    $0, %%rdx\n"
20670         "movq    %%rdx, %%rcx\n"
20671         "mulq    %[mult]\n"
20672         "addq    %%rax, %%rcx\n"
20673         "adcq    $0, %%rdx\n"
20674         "movq    24(%%rsi), %%rax\n"
20675         "addq    %%rcx, 16(%%rdi)\n"
20676         "adcq    $0, %%rdx\n"
20677         "movq    %%rdx, %%rcx\n"
20678         "mulq    %[mult]\n"
20679         "addq    %%rax, %%rcx\n"
20680         "adcq    $0, %%rdx\n"
20681         "movq    32(%%rsi), %%rax\n"
20682         "addq    %%rcx, 24(%%rdi)\n"
20683         "adcq    $0, %%rdx\n"
20684         "movq    %%rdx, %%rcx\n"
20685         "mulq    %[mult]\n"
20686         "addq    %%rax, %%rcx\n"
20687         "adcq    $0, %%rdx\n"
20688         "movq    40(%%rsi), %%rax\n"
20689         "addq    %%rcx, 32(%%rdi)\n"
20690         "adcq    $0, %%rdx\n"
20691         "movq    %%rdx, %%rcx\n"
20692         "mulq    %[mult]\n"
20693         "addq    %%rax, %%rcx\n"
20694         "adcq    $0, %%rdx\n"
20695         "movq    48(%%rsi), %%rax\n"
20696         "addq    %%rcx, 40(%%rdi)\n"
20697         "adcq    $0, %%rdx\n"
20698         "movq    %%rdx, %%rcx\n"
20699         "mulq    %[mult]\n"
20700         "addq    %%rax, %%rcx\n"
20701         "adcq    $0, %%rdx\n"
20702         "movq    56(%%rsi), %%rax\n"
20703         "addq    %%rcx, 48(%%rdi)\n"
20704         "adcq    $0, %%rdx\n"
20705         "movq    %%rdx, %%rcx\n"
20706         "mulq    %[mult]\n"
20707         "addq    %%rax, %%rcx\n"
20708         "adcq    $0, %%rdx\n"
20709         "addq    %%rcx, 56(%%rdi)\n"
20710         "adcq    $0, %%rdx\n"
20711         "addq    %%rdx, 64(%%rdi)\n"
20712     : [z] "+m" (z)
20713     : [mult] "r" (c), [x] "m" (x)
20714     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
20715 }
20716 
20717 /* x has 7.5 words, z has 8.
20718  * Put (z+x*c) in z. Return carry word. */
20719 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
20720 static inline
mpfq_fixmp_7_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)20721 mp_limb_t mpfq_fixmp_7_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
20722 {
20723     mp_limb_t carry;
20724     __asm__ __volatile__(
20725         "movq    %[z], %%rdi\n"
20726         "movq    %[x], %%rsi\n"
20727         "movq    0(%%rsi), %%rax\n"
20728         "mulq    %[mult]\n"
20729         "addq    %%rax, 0(%%rdi)\n"
20730         "movq    8(%%rsi), %%rax\n"
20731         "adcq    $0, %%rdx\n"
20732         "movq    %%rdx, %%rcx\n"
20733         "mulq    %[mult]\n"
20734         "addq    %%rax, %%rcx\n"
20735         "adcq    $0, %%rdx\n"
20736         "movq    16(%%rsi), %%rax\n"
20737         "addq    %%rcx, 8(%%rdi)\n"
20738         "adcq    $0, %%rdx\n"
20739         "movq    %%rdx, %%rcx\n"
20740         "mulq    %[mult]\n"
20741         "addq    %%rax, %%rcx\n"
20742         "adcq    $0, %%rdx\n"
20743         "movq    24(%%rsi), %%rax\n"
20744         "addq    %%rcx, 16(%%rdi)\n"
20745         "adcq    $0, %%rdx\n"
20746         "movq    %%rdx, %%rcx\n"
20747         "mulq    %[mult]\n"
20748         "addq    %%rax, %%rcx\n"
20749         "adcq    $0, %%rdx\n"
20750         "movq    32(%%rsi), %%rax\n"
20751         "addq    %%rcx, 24(%%rdi)\n"
20752         "adcq    $0, %%rdx\n"
20753         "movq    %%rdx, %%rcx\n"
20754         "mulq    %[mult]\n"
20755         "addq    %%rax, %%rcx\n"
20756         "adcq    $0, %%rdx\n"
20757         "movq    40(%%rsi), %%rax\n"
20758         "addq    %%rcx, 32(%%rdi)\n"
20759         "adcq    $0, %%rdx\n"
20760         "movq    %%rdx, %%rcx\n"
20761         "mulq    %[mult]\n"
20762         "addq    %%rax, %%rcx\n"
20763         "adcq    $0, %%rdx\n"
20764         "movq    48(%%rsi), %%rax\n"
20765         "addq    %%rcx, 40(%%rdi)\n"
20766         "adcq    $0, %%rdx\n"
20767         "movq    %%rdx, %%rcx\n"
20768         "mulq    %[mult]\n"
20769         "addq    %%rax, %%rcx\n"
20770         "adcq    $0, %%rdx\n"
20771         "movq    56(%%rsi), %%rax\n"
20772         "addq    %%rcx, 48(%%rdi)\n"
20773         "adcq    $0, %%rdx\n"
20774         "movq    %%rdx, %%rcx\n"
20775         "mulq    %[mult]\n"
20776         "addq    %%rax, %%rcx\n"
20777         "adcq    $0, %%rdx\n"
20778         "addq    %%rcx, 56(%%rdi)\n"
20779         "adcq    $0, %%rdx\n"
20780         "movq    %%rdx, %[carry]\n"
20781     : [carry]"=g"(carry), [z] "+m" (z)
20782     : [mult] "r" (c), [x] "m" (x)
20783     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
20784     return carry;
20785 }
20786 
20787 /* x and y have 7.5 words, z has 15. Put x*y in z. */
20788 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
20789 static inline
mpfq_fixmp_7_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)20790 void mpfq_fixmp_7_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
20791 {
20792     __asm__ __volatile__(
20793         "### x*y[0]\n"
20794         "movq    %2, %%r8\n"
20795         "movq    %0, %%rdi\n"
20796         "movq    0(%%r8), %%r9\n"
20797         "movq    %1, %%rsi\n"
20798         "movq    0(%%rsi), %%rax\n"
20799         "mulq    %%r9\n"
20800         "movq    %%rax, 0(%%rdi)\n"
20801         "movq    8(%%rsi), %%rax\n"
20802         "movq    %%rdx, %%rcx\n"
20803         "mulq    %%r9\n"
20804         "addq    %%rax, %%rcx\n"
20805         "adcq    $0, %%rdx\n"
20806         "movq    16(%%rsi), %%rax\n"
20807         "movq    %%rcx, 8(%%rdi)\n"
20808         "movq    %%rdx, %%rcx\n"
20809         "mulq    %%r9\n"
20810         "addq    %%rax, %%rcx\n"
20811         "adcq    $0, %%rdx\n"
20812         "movq    24(%%rsi), %%rax\n"
20813         "movq    %%rcx, 16(%%rdi)\n"
20814         "movq    %%rdx, %%rcx\n"
20815         "mulq    %%r9\n"
20816         "addq    %%rax, %%rcx\n"
20817         "adcq    $0, %%rdx\n"
20818         "movq    32(%%rsi), %%rax\n"
20819         "movq    %%rcx, 24(%%rdi)\n"
20820         "movq    %%rdx, %%rcx\n"
20821         "mulq    %%r9\n"
20822         "addq    %%rax, %%rcx\n"
20823         "adcq    $0, %%rdx\n"
20824         "movq    40(%%rsi), %%rax\n"
20825         "movq    %%rcx, 32(%%rdi)\n"
20826         "movq    %%rdx, %%rcx\n"
20827         "mulq    %%r9\n"
20828         "addq    %%rax, %%rcx\n"
20829         "adcq    $0, %%rdx\n"
20830         "movq    48(%%rsi), %%rax\n"
20831         "movq    %%rcx, 40(%%rdi)\n"
20832         "movq    %%rdx, %%rcx\n"
20833         "mulq    %%r9\n"
20834         "addq    %%rax, %%rcx\n"
20835         "adcq    $0, %%rdx\n"
20836         "movq    56(%%rsi), %%rax\n"
20837         "movq    %%rcx, 48(%%rdi)\n"
20838         "movq    %%rdx, %%rcx\n"
20839         "mulq    %%r9\n"
20840         "addq    %%rax, %%rcx\n"
20841         "adcq    $0, %%rdx\n"
20842         "movq    %%rcx, 56(%%rdi)\n"
20843         "movq    %%rdx, 64(%%rdi)\n"
20844         "movq    $0, 72(%%rdi)\n"
20845         "movq    $0, 80(%%rdi)\n"
20846         "movq    $0, 88(%%rdi)\n"
20847         "movq    $0, 96(%%rdi)\n"
20848         "movq    $0, 104(%%rdi)\n"
20849         "movq    $0, 112(%%rdi)\n"
20850         "### x*y[1]\n"
20851         "movq    8(%%r8), %%r9\n"
20852         "movq    0(%%rsi), %%rax\n"
20853         "mulq    %%r9\n"
20854         "addq    %%rax, 8(%%rdi)\n"
20855         "movq    8(%%rsi), %%rax\n"
20856         "adcq    $0, %%rdx\n"
20857         "movq    %%rdx, %%rcx\n"
20858         "mulq    %%r9\n"
20859         "addq    %%rax, %%rcx\n"
20860         "adcq    $0, %%rdx\n"
20861         "movq    16(%%rsi), %%rax\n"
20862         "addq    %%rcx, 16(%%rdi)\n"
20863         "adcq    $0, %%rdx\n"
20864         "movq    %%rdx, %%rcx\n"
20865         "mulq    %%r9\n"
20866         "addq    %%rax, %%rcx\n"
20867         "adcq    $0, %%rdx\n"
20868         "movq    24(%%rsi), %%rax\n"
20869         "addq    %%rcx, 24(%%rdi)\n"
20870         "adcq    $0, %%rdx\n"
20871         "movq    %%rdx, %%rcx\n"
20872         "mulq    %%r9\n"
20873         "addq    %%rax, %%rcx\n"
20874         "adcq    $0, %%rdx\n"
20875         "movq    32(%%rsi), %%rax\n"
20876         "addq    %%rcx, 32(%%rdi)\n"
20877         "adcq    $0, %%rdx\n"
20878         "movq    %%rdx, %%rcx\n"
20879         "mulq    %%r9\n"
20880         "addq    %%rax, %%rcx\n"
20881         "adcq    $0, %%rdx\n"
20882         "movq    40(%%rsi), %%rax\n"
20883         "addq    %%rcx, 40(%%rdi)\n"
20884         "adcq    $0, %%rdx\n"
20885         "movq    %%rdx, %%rcx\n"
20886         "mulq    %%r9\n"
20887         "addq    %%rax, %%rcx\n"
20888         "adcq    $0, %%rdx\n"
20889         "movq    48(%%rsi), %%rax\n"
20890         "addq    %%rcx, 48(%%rdi)\n"
20891         "adcq    $0, %%rdx\n"
20892         "movq    %%rdx, %%rcx\n"
20893         "mulq    %%r9\n"
20894         "addq    %%rax, %%rcx\n"
20895         "adcq    $0, %%rdx\n"
20896         "movq    56(%%rsi), %%rax\n"
20897         "addq    %%rcx, 56(%%rdi)\n"
20898         "adcq    $0, %%rdx\n"
20899         "movq    %%rdx, %%rcx\n"
20900         "mulq    %%r9\n"
20901         "addq    %%rax, %%rcx\n"
20902         "adcq    $0, %%rdx\n"
20903         "addq    %%rcx, 64(%%rdi)\n"
20904         "adcq    $0, %%rdx\n"
20905         "movq    %%rdx, 72(%%rdi)\n"
20906         "### x*y[2]\n"
20907         "movq    16(%%r8), %%r9\n"
20908         "movq    0(%%rsi), %%rax\n"
20909         "mulq    %%r9\n"
20910         "addq    %%rax, 16(%%rdi)\n"
20911         "movq    8(%%rsi), %%rax\n"
20912         "adcq    $0, %%rdx\n"
20913         "movq    %%rdx, %%rcx\n"
20914         "mulq    %%r9\n"
20915         "addq    %%rax, %%rcx\n"
20916         "adcq    $0, %%rdx\n"
20917         "movq    16(%%rsi), %%rax\n"
20918         "addq    %%rcx, 24(%%rdi)\n"
20919         "adcq    $0, %%rdx\n"
20920         "movq    %%rdx, %%rcx\n"
20921         "mulq    %%r9\n"
20922         "addq    %%rax, %%rcx\n"
20923         "adcq    $0, %%rdx\n"
20924         "movq    24(%%rsi), %%rax\n"
20925         "addq    %%rcx, 32(%%rdi)\n"
20926         "adcq    $0, %%rdx\n"
20927         "movq    %%rdx, %%rcx\n"
20928         "mulq    %%r9\n"
20929         "addq    %%rax, %%rcx\n"
20930         "adcq    $0, %%rdx\n"
20931         "movq    32(%%rsi), %%rax\n"
20932         "addq    %%rcx, 40(%%rdi)\n"
20933         "adcq    $0, %%rdx\n"
20934         "movq    %%rdx, %%rcx\n"
20935         "mulq    %%r9\n"
20936         "addq    %%rax, %%rcx\n"
20937         "adcq    $0, %%rdx\n"
20938         "movq    40(%%rsi), %%rax\n"
20939         "addq    %%rcx, 48(%%rdi)\n"
20940         "adcq    $0, %%rdx\n"
20941         "movq    %%rdx, %%rcx\n"
20942         "mulq    %%r9\n"
20943         "addq    %%rax, %%rcx\n"
20944         "adcq    $0, %%rdx\n"
20945         "movq    48(%%rsi), %%rax\n"
20946         "addq    %%rcx, 56(%%rdi)\n"
20947         "adcq    $0, %%rdx\n"
20948         "movq    %%rdx, %%rcx\n"
20949         "mulq    %%r9\n"
20950         "addq    %%rax, %%rcx\n"
20951         "adcq    $0, %%rdx\n"
20952         "movq    56(%%rsi), %%rax\n"
20953         "addq    %%rcx, 64(%%rdi)\n"
20954         "adcq    $0, %%rdx\n"
20955         "movq    %%rdx, %%rcx\n"
20956         "mulq    %%r9\n"
20957         "addq    %%rax, %%rcx\n"
20958         "adcq    $0, %%rdx\n"
20959         "addq    %%rcx, 72(%%rdi)\n"
20960         "adcq    $0, %%rdx\n"
20961         "movq    %%rdx, 80(%%rdi)\n"
20962         "### x*y[3]\n"
20963         "movq    24(%%r8), %%r9\n"
20964         "movq    0(%%rsi), %%rax\n"
20965         "mulq    %%r9\n"
20966         "addq    %%rax, 24(%%rdi)\n"
20967         "movq    8(%%rsi), %%rax\n"
20968         "adcq    $0, %%rdx\n"
20969         "movq    %%rdx, %%rcx\n"
20970         "mulq    %%r9\n"
20971         "addq    %%rax, %%rcx\n"
20972         "adcq    $0, %%rdx\n"
20973         "movq    16(%%rsi), %%rax\n"
20974         "addq    %%rcx, 32(%%rdi)\n"
20975         "adcq    $0, %%rdx\n"
20976         "movq    %%rdx, %%rcx\n"
20977         "mulq    %%r9\n"
20978         "addq    %%rax, %%rcx\n"
20979         "adcq    $0, %%rdx\n"
20980         "movq    24(%%rsi), %%rax\n"
20981         "addq    %%rcx, 40(%%rdi)\n"
20982         "adcq    $0, %%rdx\n"
20983         "movq    %%rdx, %%rcx\n"
20984         "mulq    %%r9\n"
20985         "addq    %%rax, %%rcx\n"
20986         "adcq    $0, %%rdx\n"
20987         "movq    32(%%rsi), %%rax\n"
20988         "addq    %%rcx, 48(%%rdi)\n"
20989         "adcq    $0, %%rdx\n"
20990         "movq    %%rdx, %%rcx\n"
20991         "mulq    %%r9\n"
20992         "addq    %%rax, %%rcx\n"
20993         "adcq    $0, %%rdx\n"
20994         "movq    40(%%rsi), %%rax\n"
20995         "addq    %%rcx, 56(%%rdi)\n"
20996         "adcq    $0, %%rdx\n"
20997         "movq    %%rdx, %%rcx\n"
20998         "mulq    %%r9\n"
20999         "addq    %%rax, %%rcx\n"
21000         "adcq    $0, %%rdx\n"
21001         "movq    48(%%rsi), %%rax\n"
21002         "addq    %%rcx, 64(%%rdi)\n"
21003         "adcq    $0, %%rdx\n"
21004         "movq    %%rdx, %%rcx\n"
21005         "mulq    %%r9\n"
21006         "addq    %%rax, %%rcx\n"
21007         "adcq    $0, %%rdx\n"
21008         "movq    56(%%rsi), %%rax\n"
21009         "addq    %%rcx, 72(%%rdi)\n"
21010         "adcq    $0, %%rdx\n"
21011         "movq    %%rdx, %%rcx\n"
21012         "mulq    %%r9\n"
21013         "addq    %%rax, %%rcx\n"
21014         "adcq    $0, %%rdx\n"
21015         "addq    %%rcx, 80(%%rdi)\n"
21016         "adcq    $0, %%rdx\n"
21017         "movq    %%rdx, 88(%%rdi)\n"
21018         "### x*y[4]\n"
21019         "movq    32(%%r8), %%r9\n"
21020         "movq    0(%%rsi), %%rax\n"
21021         "mulq    %%r9\n"
21022         "addq    %%rax, 32(%%rdi)\n"
21023         "movq    8(%%rsi), %%rax\n"
21024         "adcq    $0, %%rdx\n"
21025         "movq    %%rdx, %%rcx\n"
21026         "mulq    %%r9\n"
21027         "addq    %%rax, %%rcx\n"
21028         "adcq    $0, %%rdx\n"
21029         "movq    16(%%rsi), %%rax\n"
21030         "addq    %%rcx, 40(%%rdi)\n"
21031         "adcq    $0, %%rdx\n"
21032         "movq    %%rdx, %%rcx\n"
21033         "mulq    %%r9\n"
21034         "addq    %%rax, %%rcx\n"
21035         "adcq    $0, %%rdx\n"
21036         "movq    24(%%rsi), %%rax\n"
21037         "addq    %%rcx, 48(%%rdi)\n"
21038         "adcq    $0, %%rdx\n"
21039         "movq    %%rdx, %%rcx\n"
21040         "mulq    %%r9\n"
21041         "addq    %%rax, %%rcx\n"
21042         "adcq    $0, %%rdx\n"
21043         "movq    32(%%rsi), %%rax\n"
21044         "addq    %%rcx, 56(%%rdi)\n"
21045         "adcq    $0, %%rdx\n"
21046         "movq    %%rdx, %%rcx\n"
21047         "mulq    %%r9\n"
21048         "addq    %%rax, %%rcx\n"
21049         "adcq    $0, %%rdx\n"
21050         "movq    40(%%rsi), %%rax\n"
21051         "addq    %%rcx, 64(%%rdi)\n"
21052         "adcq    $0, %%rdx\n"
21053         "movq    %%rdx, %%rcx\n"
21054         "mulq    %%r9\n"
21055         "addq    %%rax, %%rcx\n"
21056         "adcq    $0, %%rdx\n"
21057         "movq    48(%%rsi), %%rax\n"
21058         "addq    %%rcx, 72(%%rdi)\n"
21059         "adcq    $0, %%rdx\n"
21060         "movq    %%rdx, %%rcx\n"
21061         "mulq    %%r9\n"
21062         "addq    %%rax, %%rcx\n"
21063         "adcq    $0, %%rdx\n"
21064         "movq    56(%%rsi), %%rax\n"
21065         "addq    %%rcx, 80(%%rdi)\n"
21066         "adcq    $0, %%rdx\n"
21067         "movq    %%rdx, %%rcx\n"
21068         "mulq    %%r9\n"
21069         "addq    %%rax, %%rcx\n"
21070         "adcq    $0, %%rdx\n"
21071         "addq    %%rcx, 88(%%rdi)\n"
21072         "adcq    $0, %%rdx\n"
21073         "movq    %%rdx, 96(%%rdi)\n"
21074         "### x*y[5]\n"
21075         "movq    40(%%r8), %%r9\n"
21076         "movq    0(%%rsi), %%rax\n"
21077         "mulq    %%r9\n"
21078         "addq    %%rax, 40(%%rdi)\n"
21079         "movq    8(%%rsi), %%rax\n"
21080         "adcq    $0, %%rdx\n"
21081         "movq    %%rdx, %%rcx\n"
21082         "mulq    %%r9\n"
21083         "addq    %%rax, %%rcx\n"
21084         "adcq    $0, %%rdx\n"
21085         "movq    16(%%rsi), %%rax\n"
21086         "addq    %%rcx, 48(%%rdi)\n"
21087         "adcq    $0, %%rdx\n"
21088         "movq    %%rdx, %%rcx\n"
21089         "mulq    %%r9\n"
21090         "addq    %%rax, %%rcx\n"
21091         "adcq    $0, %%rdx\n"
21092         "movq    24(%%rsi), %%rax\n"
21093         "addq    %%rcx, 56(%%rdi)\n"
21094         "adcq    $0, %%rdx\n"
21095         "movq    %%rdx, %%rcx\n"
21096         "mulq    %%r9\n"
21097         "addq    %%rax, %%rcx\n"
21098         "adcq    $0, %%rdx\n"
21099         "movq    32(%%rsi), %%rax\n"
21100         "addq    %%rcx, 64(%%rdi)\n"
21101         "adcq    $0, %%rdx\n"
21102         "movq    %%rdx, %%rcx\n"
21103         "mulq    %%r9\n"
21104         "addq    %%rax, %%rcx\n"
21105         "adcq    $0, %%rdx\n"
21106         "movq    40(%%rsi), %%rax\n"
21107         "addq    %%rcx, 72(%%rdi)\n"
21108         "adcq    $0, %%rdx\n"
21109         "movq    %%rdx, %%rcx\n"
21110         "mulq    %%r9\n"
21111         "addq    %%rax, %%rcx\n"
21112         "adcq    $0, %%rdx\n"
21113         "movq    48(%%rsi), %%rax\n"
21114         "addq    %%rcx, 80(%%rdi)\n"
21115         "adcq    $0, %%rdx\n"
21116         "movq    %%rdx, %%rcx\n"
21117         "mulq    %%r9\n"
21118         "addq    %%rax, %%rcx\n"
21119         "adcq    $0, %%rdx\n"
21120         "movq    56(%%rsi), %%rax\n"
21121         "addq    %%rcx, 88(%%rdi)\n"
21122         "adcq    $0, %%rdx\n"
21123         "movq    %%rdx, %%rcx\n"
21124         "mulq    %%r9\n"
21125         "addq    %%rax, %%rcx\n"
21126         "adcq    $0, %%rdx\n"
21127         "addq    %%rcx, 96(%%rdi)\n"
21128         "adcq    $0, %%rdx\n"
21129         "movq    %%rdx, 104(%%rdi)\n"
21130         "### x*y[6]\n"
21131         "movq    48(%%r8), %%r9\n"
21132         "movq    0(%%rsi), %%rax\n"
21133         "mulq    %%r9\n"
21134         "addq    %%rax, 48(%%rdi)\n"
21135         "movq    8(%%rsi), %%rax\n"
21136         "adcq    $0, %%rdx\n"
21137         "movq    %%rdx, %%rcx\n"
21138         "mulq    %%r9\n"
21139         "addq    %%rax, %%rcx\n"
21140         "adcq    $0, %%rdx\n"
21141         "movq    16(%%rsi), %%rax\n"
21142         "addq    %%rcx, 56(%%rdi)\n"
21143         "adcq    $0, %%rdx\n"
21144         "movq    %%rdx, %%rcx\n"
21145         "mulq    %%r9\n"
21146         "addq    %%rax, %%rcx\n"
21147         "adcq    $0, %%rdx\n"
21148         "movq    24(%%rsi), %%rax\n"
21149         "addq    %%rcx, 64(%%rdi)\n"
21150         "adcq    $0, %%rdx\n"
21151         "movq    %%rdx, %%rcx\n"
21152         "mulq    %%r9\n"
21153         "addq    %%rax, %%rcx\n"
21154         "adcq    $0, %%rdx\n"
21155         "movq    32(%%rsi), %%rax\n"
21156         "addq    %%rcx, 72(%%rdi)\n"
21157         "adcq    $0, %%rdx\n"
21158         "movq    %%rdx, %%rcx\n"
21159         "mulq    %%r9\n"
21160         "addq    %%rax, %%rcx\n"
21161         "adcq    $0, %%rdx\n"
21162         "movq    40(%%rsi), %%rax\n"
21163         "addq    %%rcx, 80(%%rdi)\n"
21164         "adcq    $0, %%rdx\n"
21165         "movq    %%rdx, %%rcx\n"
21166         "mulq    %%r9\n"
21167         "addq    %%rax, %%rcx\n"
21168         "adcq    $0, %%rdx\n"
21169         "movq    48(%%rsi), %%rax\n"
21170         "addq    %%rcx, 88(%%rdi)\n"
21171         "adcq    $0, %%rdx\n"
21172         "movq    %%rdx, %%rcx\n"
21173         "mulq    %%r9\n"
21174         "addq    %%rax, %%rcx\n"
21175         "adcq    $0, %%rdx\n"
21176         "movq    56(%%rsi), %%rax\n"
21177         "addq    %%rcx, 96(%%rdi)\n"
21178         "adcq    $0, %%rdx\n"
21179         "movq    %%rdx, %%rcx\n"
21180         "mulq    %%r9\n"
21181         "addq    %%rax, %%rcx\n"
21182         "adcq    $0, %%rdx\n"
21183         "addq    %%rcx, 104(%%rdi)\n"
21184         "adcq    $0, %%rdx\n"
21185         "movq    %%rdx, 112(%%rdi)\n"
21186         "### x*y[7]\n"
21187         "movq    56(%%r8), %%r9\n"
21188         "movq    0(%%rsi), %%rax\n"
21189         "mulq    %%r9\n"
21190         "addq    %%rax, 56(%%rdi)\n"
21191         "movq    8(%%rsi), %%rax\n"
21192         "adcq    $0, %%rdx\n"
21193         "movq    %%rdx, %%rcx\n"
21194         "mulq    %%r9\n"
21195         "addq    %%rax, %%rcx\n"
21196         "adcq    $0, %%rdx\n"
21197         "movq    16(%%rsi), %%rax\n"
21198         "addq    %%rcx, 64(%%rdi)\n"
21199         "adcq    $0, %%rdx\n"
21200         "movq    %%rdx, %%rcx\n"
21201         "mulq    %%r9\n"
21202         "addq    %%rax, %%rcx\n"
21203         "adcq    $0, %%rdx\n"
21204         "movq    24(%%rsi), %%rax\n"
21205         "addq    %%rcx, 72(%%rdi)\n"
21206         "adcq    $0, %%rdx\n"
21207         "movq    %%rdx, %%rcx\n"
21208         "mulq    %%r9\n"
21209         "addq    %%rax, %%rcx\n"
21210         "adcq    $0, %%rdx\n"
21211         "movq    32(%%rsi), %%rax\n"
21212         "addq    %%rcx, 80(%%rdi)\n"
21213         "adcq    $0, %%rdx\n"
21214         "movq    %%rdx, %%rcx\n"
21215         "mulq    %%r9\n"
21216         "addq    %%rax, %%rcx\n"
21217         "adcq    $0, %%rdx\n"
21218         "movq    40(%%rsi), %%rax\n"
21219         "addq    %%rcx, 88(%%rdi)\n"
21220         "adcq    $0, %%rdx\n"
21221         "movq    %%rdx, %%rcx\n"
21222         "mulq    %%r9\n"
21223         "addq    %%rax, %%rcx\n"
21224         "adcq    $0, %%rdx\n"
21225         "movq    48(%%rsi), %%rax\n"
21226         "addq    %%rcx, 96(%%rdi)\n"
21227         "adcq    $0, %%rdx\n"
21228         "movq    %%rdx, %%rcx\n"
21229         "mulq    %%r9\n"
21230         "addq    %%rax, %%rcx\n"
21231         "adcq    $0, %%rdx\n"
21232         "movq    56(%%rsi), %%rax\n"
21233         "addq    %%rcx, 104(%%rdi)\n"
21234         "adcq    $0, %%rdx\n"
21235         "movq    %%rdx, %%rcx\n"
21236         "mulq    %%r9\n"
21237         "addq    %%rax, %%rcx\n"
21238         "adcq    $0, %%rdx\n"
21239         "addq    %%rcx, 112(%%rdi)\n"
21240       : "+m" (z)
21241       : "m" (x), "m" (y)
21242       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
21243 }
21244 
21245 /* x has 7.5 words, z has 15. Put x*y in z. */
21246 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
21247 static inline
mpfq_fixmp_7_5_sqr(mp_limb_t * z,const mp_limb_t * x)21248 void mpfq_fixmp_7_5_sqr(mp_limb_t * z, const mp_limb_t * x)
21249 {
21250     mpfq_fixmp_7_5_mul(z, x, x);
21251 }
21252 
21253 /* x has 7.5 words, z has 9. Put x*y in z. */
21254 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
21255 static inline
mpfq_fixmp_7_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)21256 void mpfq_fixmp_7_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
21257 {
21258     __asm__ __volatile__(
21259         "movq    %[z], %%rdi\n"
21260         "movq    %[x], %%rsi\n"
21261         "movq    0(%%rsi), %%rax\n"
21262         "mulq    %[mult]\n"
21263         "movq    %%rax, 0(%%rdi)\n"
21264         "movq    8(%%rsi), %%rax\n"
21265         "movq    %%rdx, %%rcx\n"
21266         "mulq    %[mult]\n"
21267         "addq    %%rax, %%rcx\n"
21268         "adcq    $0, %%rdx\n"
21269         "movq    16(%%rsi), %%rax\n"
21270         "movq    %%rcx, 8(%%rdi)\n"
21271         "movq    %%rdx, %%rcx\n"
21272         "mulq    %[mult]\n"
21273         "addq    %%rax, %%rcx\n"
21274         "adcq    $0, %%rdx\n"
21275         "movq    24(%%rsi), %%rax\n"
21276         "movq    %%rcx, 16(%%rdi)\n"
21277         "movq    %%rdx, %%rcx\n"
21278         "mulq    %[mult]\n"
21279         "addq    %%rax, %%rcx\n"
21280         "adcq    $0, %%rdx\n"
21281         "movq    32(%%rsi), %%rax\n"
21282         "movq    %%rcx, 24(%%rdi)\n"
21283         "movq    %%rdx, %%rcx\n"
21284         "mulq    %[mult]\n"
21285         "addq    %%rax, %%rcx\n"
21286         "adcq    $0, %%rdx\n"
21287         "movq    40(%%rsi), %%rax\n"
21288         "movq    %%rcx, 32(%%rdi)\n"
21289         "movq    %%rdx, %%rcx\n"
21290         "mulq    %[mult]\n"
21291         "addq    %%rax, %%rcx\n"
21292         "adcq    $0, %%rdx\n"
21293         "movq    48(%%rsi), %%rax\n"
21294         "movq    %%rcx, 40(%%rdi)\n"
21295         "movq    %%rdx, %%rcx\n"
21296         "mulq    %[mult]\n"
21297         "addq    %%rax, %%rcx\n"
21298         "adcq    $0, %%rdx\n"
21299         "movq    56(%%rsi), %%rax\n"
21300         "movq    %%rcx, 48(%%rdi)\n"
21301         "movq    %%rdx, %%rcx\n"
21302         "mulq    %[mult]\n"
21303         "addq    %%rax, %%rcx\n"
21304         "adcq    $0, %%rdx\n"
21305         "movq    %%rcx, 56(%%rdi)\n"
21306         "movq    %%rdx, 64(%%rdi)\n"
21307     :
21308     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
21309     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
21310 }
21311 
21312 /* x has 7.5 words, z has 8. c is 0.5 word.
21313  * Put (z+x*c) in z. Return carry bit. */
21314 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
21315 static inline
mpfq_fixmp_7_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)21316 mp_limb_t mpfq_fixmp_7_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
21317 {
21318     mp_limb_t carry;
21319     __asm__ __volatile__(
21320         "movq    %[z], %%rdi\n"
21321         "movq    %[x], %%rsi\n"
21322         "movq    0(%%rsi), %%rax\n"
21323         "mulq    %[mult]\n"
21324         "addq    %%rax, 0(%%rdi)\n"
21325         "movq    8(%%rsi), %%rax\n"
21326         "adcq    $0, %%rdx\n"
21327         "movq    %%rdx, %%rcx\n"
21328         "mulq    %[mult]\n"
21329         "addq    %%rax, %%rcx\n"
21330         "adcq    $0, %%rdx\n"
21331         "movq    16(%%rsi), %%rax\n"
21332         "addq    %%rcx, 8(%%rdi)\n"
21333         "adcq    $0, %%rdx\n"
21334         "movq    %%rdx, %%rcx\n"
21335         "mulq    %[mult]\n"
21336         "addq    %%rax, %%rcx\n"
21337         "adcq    $0, %%rdx\n"
21338         "movq    24(%%rsi), %%rax\n"
21339         "addq    %%rcx, 16(%%rdi)\n"
21340         "adcq    $0, %%rdx\n"
21341         "movq    %%rdx, %%rcx\n"
21342         "mulq    %[mult]\n"
21343         "addq    %%rax, %%rcx\n"
21344         "adcq    $0, %%rdx\n"
21345         "movq    32(%%rsi), %%rax\n"
21346         "addq    %%rcx, 24(%%rdi)\n"
21347         "adcq    $0, %%rdx\n"
21348         "movq    %%rdx, %%rcx\n"
21349         "mulq    %[mult]\n"
21350         "addq    %%rax, %%rcx\n"
21351         "adcq    $0, %%rdx\n"
21352         "movq    40(%%rsi), %%rax\n"
21353         "addq    %%rcx, 32(%%rdi)\n"
21354         "adcq    $0, %%rdx\n"
21355         "movq    %%rdx, %%rcx\n"
21356         "mulq    %[mult]\n"
21357         "addq    %%rax, %%rcx\n"
21358         "adcq    $0, %%rdx\n"
21359         "movq    48(%%rsi), %%rax\n"
21360         "addq    %%rcx, 40(%%rdi)\n"
21361         "adcq    $0, %%rdx\n"
21362         "movq    %%rdx, %%rcx\n"
21363         "mulq    %[mult]\n"
21364         "addq    %%rax, %%rcx\n"
21365         "adcq    $0, %%rdx\n"
21366         "movq    56(%%rsi), %%rax\n"
21367         "addq    %%rcx, 48(%%rdi)\n"
21368         "adcq    $0, %%rdx\n"
21369         "movq    %%rdx, %%rcx\n"
21370         "imulq    %[mult], %%rax\n"
21371         "xorq    %%rdx, %%rdx\n"
21372         "addq    %%rcx, %%rax\n"
21373         "adcq    $0, %%rdx\n"
21374         "addq    %%rax, 56(%%rdi)\n"
21375         "adcq    $0, %%rdx\n"
21376         "movq    %%rdx, %[carry]\n"
21377     : [carry]"=g"(carry), [z] "+m" (z)
21378     : [mult] "r" (c), [x] "m" (x)
21379     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
21380     return carry;
21381 }
21382 
21383 /* x has 7.5 words, z has 8. c is 0.5 word.
21384  * Put (z+x*c) in z. Carry bit is lost. */
21385 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
21386 static inline
mpfq_fixmp_7_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)21387 void mpfq_fixmp_7_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
21388 {
21389     __asm__ __volatile__(
21390         "movq    %[z], %%rdi\n"
21391         "movq    %[x], %%rsi\n"
21392         "movq    0(%%rsi), %%rax\n"
21393         "mulq    %[mult]\n"
21394         "addq    %%rax, 0(%%rdi)\n"
21395         "movq    8(%%rsi), %%rax\n"
21396         "adcq    $0, %%rdx\n"
21397         "movq    %%rdx, %%rcx\n"
21398         "mulq    %[mult]\n"
21399         "addq    %%rax, %%rcx\n"
21400         "adcq    $0, %%rdx\n"
21401         "movq    16(%%rsi), %%rax\n"
21402         "addq    %%rcx, 8(%%rdi)\n"
21403         "adcq    $0, %%rdx\n"
21404         "movq    %%rdx, %%rcx\n"
21405         "mulq    %[mult]\n"
21406         "addq    %%rax, %%rcx\n"
21407         "adcq    $0, %%rdx\n"
21408         "movq    24(%%rsi), %%rax\n"
21409         "addq    %%rcx, 16(%%rdi)\n"
21410         "adcq    $0, %%rdx\n"
21411         "movq    %%rdx, %%rcx\n"
21412         "mulq    %[mult]\n"
21413         "addq    %%rax, %%rcx\n"
21414         "adcq    $0, %%rdx\n"
21415         "movq    32(%%rsi), %%rax\n"
21416         "addq    %%rcx, 24(%%rdi)\n"
21417         "adcq    $0, %%rdx\n"
21418         "movq    %%rdx, %%rcx\n"
21419         "mulq    %[mult]\n"
21420         "addq    %%rax, %%rcx\n"
21421         "adcq    $0, %%rdx\n"
21422         "movq    40(%%rsi), %%rax\n"
21423         "addq    %%rcx, 32(%%rdi)\n"
21424         "adcq    $0, %%rdx\n"
21425         "movq    %%rdx, %%rcx\n"
21426         "mulq    %[mult]\n"
21427         "addq    %%rax, %%rcx\n"
21428         "adcq    $0, %%rdx\n"
21429         "movq    48(%%rsi), %%rax\n"
21430         "addq    %%rcx, 40(%%rdi)\n"
21431         "adcq    $0, %%rdx\n"
21432         "movq    %%rdx, %%rcx\n"
21433         "mulq    %[mult]\n"
21434         "addq    %%rax, %%rcx\n"
21435         "adcq    $0, %%rdx\n"
21436         "movq    56(%%rsi), %%rax\n"
21437         "addq    %%rcx, 48(%%rdi)\n"
21438         "adcq    $0, %%rdx\n"
21439         "movq    %%rdx, %%rcx\n"
21440         "imulq    %[mult], %%rax\n"
21441         "addq    %%rcx, %%rax\n"
21442         "addq    %%rax, 56(%%rdi)\n"
21443     : [z] "+m" (z)
21444     : [mult] "r" (c), [x] "m" (x)
21445     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
21446 }
21447 
21448 /* x has 7.5 words, z has 8. c is 0.5 word.
21449  * Put (x*c) in z. No carry. */
21450 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
21451 static inline
mpfq_fixmp_7_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)21452 void mpfq_fixmp_7_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
21453 {
21454     __asm__ __volatile__(
21455         "movq    %[z], %%rdi\n"
21456         "movq    %[x], %%rsi\n"
21457         "movq    0(%%rsi), %%rax\n"
21458         "mulq    %[mult]\n"
21459         "movq    %%rax, 0(%%rdi)\n"
21460         "movq    8(%%rsi), %%rax\n"
21461         "movq    %%rdx, %%rcx\n"
21462         "mulq    %[mult]\n"
21463         "addq    %%rax, %%rcx\n"
21464         "adcq    $0, %%rdx\n"
21465         "movq    16(%%rsi), %%rax\n"
21466         "movq    %%rcx, 8(%%rdi)\n"
21467         "movq    %%rdx, %%rcx\n"
21468         "mulq    %[mult]\n"
21469         "addq    %%rax, %%rcx\n"
21470         "adcq    $0, %%rdx\n"
21471         "movq    24(%%rsi), %%rax\n"
21472         "movq    %%rcx, 16(%%rdi)\n"
21473         "movq    %%rdx, %%rcx\n"
21474         "mulq    %[mult]\n"
21475         "addq    %%rax, %%rcx\n"
21476         "adcq    $0, %%rdx\n"
21477         "movq    32(%%rsi), %%rax\n"
21478         "movq    %%rcx, 24(%%rdi)\n"
21479         "movq    %%rdx, %%rcx\n"
21480         "mulq    %[mult]\n"
21481         "addq    %%rax, %%rcx\n"
21482         "adcq    $0, %%rdx\n"
21483         "movq    40(%%rsi), %%rax\n"
21484         "movq    %%rcx, 32(%%rdi)\n"
21485         "movq    %%rdx, %%rcx\n"
21486         "mulq    %[mult]\n"
21487         "addq    %%rax, %%rcx\n"
21488         "adcq    $0, %%rdx\n"
21489         "movq    48(%%rsi), %%rax\n"
21490         "movq    %%rcx, 40(%%rdi)\n"
21491         "movq    %%rdx, %%rcx\n"
21492         "mulq    %[mult]\n"
21493         "addq    %%rax, %%rcx\n"
21494         "adcq    $0, %%rdx\n"
21495         "movq    56(%%rsi), %%rax\n"
21496         "movq    %%rcx, 48(%%rdi)\n"
21497         "movq    %%rdx, %%rcx\n"
21498         "imulq    %[mult], %%rax\n"
21499         "addq    %%rcx, %%rax\n"
21500         "movq    %%rax, 56(%%rdi)\n"
21501     :
21502     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
21503     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
21504 }
21505 
21506 /* x, y, and z have 8.5 words. Result in z. Return carry bit */
21507 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
21508 static inline
mpfq_fixmp_8_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)21509 mp_limb_t mpfq_fixmp_8_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
21510 {
21511     mp_limb_t carry;
21512     __asm__ __volatile__(
21513         "movq    %[z], %%rdi\n"
21514         "movq    %[x], %%rsi\n"
21515         "movq    %[y], %%rdx\n"
21516         "movq    0(%%rsi), %%rax\n"
21517         "addq    0(%%rdx), %%rax\n"
21518         "movq    %%rax, 0(%%rdi)\n"
21519         "movq    8(%%rsi), %%rax\n"
21520         "adcq    8(%%rdx), %%rax\n"
21521         "movq    %%rax, 8(%%rdi)\n"
21522         "movq    16(%%rsi), %%rax\n"
21523         "adcq    16(%%rdx), %%rax\n"
21524         "movq    %%rax, 16(%%rdi)\n"
21525         "movq    24(%%rsi), %%rax\n"
21526         "adcq    24(%%rdx), %%rax\n"
21527         "movq    %%rax, 24(%%rdi)\n"
21528         "movq    32(%%rsi), %%rax\n"
21529         "adcq    32(%%rdx), %%rax\n"
21530         "movq    %%rax, 32(%%rdi)\n"
21531         "movq    40(%%rsi), %%rax\n"
21532         "adcq    40(%%rdx), %%rax\n"
21533         "movq    %%rax, 40(%%rdi)\n"
21534         "movq    48(%%rsi), %%rax\n"
21535         "adcq    48(%%rdx), %%rax\n"
21536         "movq    %%rax, 48(%%rdi)\n"
21537         "movq    56(%%rsi), %%rax\n"
21538         "adcq    56(%%rdx), %%rax\n"
21539         "movq    %%rax, 56(%%rdi)\n"
21540         "movq    64(%%rsi), %%rax\n"
21541         "adcq    64(%%rdx), %%rax\n"
21542         "movq    %%rax, 64(%%rdi)\n"
21543         "movq $0, %%rax\n"
21544         "adcq $0, %%rax\n"
21545     : "=&a"(carry)
21546     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
21547     : "%rdx", "%rsi", "%rdi", "memory");
21548     return carry;
21549 }
21550 
21551 /* x, y, and z have 8.5 words. Result in z. Return borrow bit */
21552 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
21553 static inline
mpfq_fixmp_8_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)21554 mp_limb_t mpfq_fixmp_8_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
21555 {
21556     mp_limb_t carry;
21557     __asm__ __volatile__(
21558         "movq    %[z], %%rdi\n"
21559         "movq    %[x], %%rsi\n"
21560         "movq    %[y], %%rdx\n"
21561         "movq    0(%%rsi), %%rax\n"
21562         "subq    0(%%rdx), %%rax\n"
21563         "movq    %%rax, 0(%%rdi)\n"
21564         "movq    8(%%rsi), %%rax\n"
21565         "sbbq    8(%%rdx), %%rax\n"
21566         "movq    %%rax, 8(%%rdi)\n"
21567         "movq    16(%%rsi), %%rax\n"
21568         "sbbq    16(%%rdx), %%rax\n"
21569         "movq    %%rax, 16(%%rdi)\n"
21570         "movq    24(%%rsi), %%rax\n"
21571         "sbbq    24(%%rdx), %%rax\n"
21572         "movq    %%rax, 24(%%rdi)\n"
21573         "movq    32(%%rsi), %%rax\n"
21574         "sbbq    32(%%rdx), %%rax\n"
21575         "movq    %%rax, 32(%%rdi)\n"
21576         "movq    40(%%rsi), %%rax\n"
21577         "sbbq    40(%%rdx), %%rax\n"
21578         "movq    %%rax, 40(%%rdi)\n"
21579         "movq    48(%%rsi), %%rax\n"
21580         "sbbq    48(%%rdx), %%rax\n"
21581         "movq    %%rax, 48(%%rdi)\n"
21582         "movq    56(%%rsi), %%rax\n"
21583         "sbbq    56(%%rdx), %%rax\n"
21584         "movq    %%rax, 56(%%rdi)\n"
21585         "movq    64(%%rsi), %%rax\n"
21586         "sbbq    64(%%rdx), %%rax\n"
21587         "movq    %%rax, 64(%%rdi)\n"
21588         "movq $0, %%rax\n"
21589         "adcq $0, %%rax\n"
21590     : "=&a"(carry)
21591     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
21592     : "%rdx", "%rsi", "%rdi", "memory");
21593     return carry;
21594 }
21595 
21596 /* x, y, and z have 8.5 words. Result in z. Carry bit is lost. */
21597 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
21598 static inline
mpfq_fixmp_8_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)21599 void mpfq_fixmp_8_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
21600 {
21601     __asm__ __volatile__(
21602         "movq    %[z], %%rdi\n"
21603         "movq    %[x], %%rsi\n"
21604         "movq    %[y], %%rdx\n"
21605         "movq    0(%%rsi), %%rax\n"
21606         "addq    0(%%rdx), %%rax\n"
21607         "movq    %%rax, 0(%%rdi)\n"
21608         "movq    8(%%rsi), %%rax\n"
21609         "adcq    8(%%rdx), %%rax\n"
21610         "movq    %%rax, 8(%%rdi)\n"
21611         "movq    16(%%rsi), %%rax\n"
21612         "adcq    16(%%rdx), %%rax\n"
21613         "movq    %%rax, 16(%%rdi)\n"
21614         "movq    24(%%rsi), %%rax\n"
21615         "adcq    24(%%rdx), %%rax\n"
21616         "movq    %%rax, 24(%%rdi)\n"
21617         "movq    32(%%rsi), %%rax\n"
21618         "adcq    32(%%rdx), %%rax\n"
21619         "movq    %%rax, 32(%%rdi)\n"
21620         "movq    40(%%rsi), %%rax\n"
21621         "adcq    40(%%rdx), %%rax\n"
21622         "movq    %%rax, 40(%%rdi)\n"
21623         "movq    48(%%rsi), %%rax\n"
21624         "adcq    48(%%rdx), %%rax\n"
21625         "movq    %%rax, 48(%%rdi)\n"
21626         "movq    56(%%rsi), %%rax\n"
21627         "adcq    56(%%rdx), %%rax\n"
21628         "movq    %%rax, 56(%%rdi)\n"
21629         "movq    64(%%rsi), %%rax\n"
21630         "adcq    64(%%rdx), %%rax\n"
21631         "movq    %%rax, 64(%%rdi)\n"
21632     :
21633     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
21634     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
21635 }
21636 
21637 /* x, y, and z have 8.5 words. Result in z. Borrow bit is lost. */
21638 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
21639 static inline
mpfq_fixmp_8_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)21640 void mpfq_fixmp_8_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
21641 {
21642     __asm__ __volatile__(
21643         "movq    %[z], %%rdi\n"
21644         "movq    %[x], %%rsi\n"
21645         "movq    %[y], %%rdx\n"
21646         "movq    0(%%rsi), %%rax\n"
21647         "subq    0(%%rdx), %%rax\n"
21648         "movq    %%rax, 0(%%rdi)\n"
21649         "movq    8(%%rsi), %%rax\n"
21650         "sbbq    8(%%rdx), %%rax\n"
21651         "movq    %%rax, 8(%%rdi)\n"
21652         "movq    16(%%rsi), %%rax\n"
21653         "sbbq    16(%%rdx), %%rax\n"
21654         "movq    %%rax, 16(%%rdi)\n"
21655         "movq    24(%%rsi), %%rax\n"
21656         "sbbq    24(%%rdx), %%rax\n"
21657         "movq    %%rax, 24(%%rdi)\n"
21658         "movq    32(%%rsi), %%rax\n"
21659         "sbbq    32(%%rdx), %%rax\n"
21660         "movq    %%rax, 32(%%rdi)\n"
21661         "movq    40(%%rsi), %%rax\n"
21662         "sbbq    40(%%rdx), %%rax\n"
21663         "movq    %%rax, 40(%%rdi)\n"
21664         "movq    48(%%rsi), %%rax\n"
21665         "sbbq    48(%%rdx), %%rax\n"
21666         "movq    %%rax, 48(%%rdi)\n"
21667         "movq    56(%%rsi), %%rax\n"
21668         "sbbq    56(%%rdx), %%rax\n"
21669         "movq    %%rax, 56(%%rdi)\n"
21670         "movq    64(%%rsi), %%rax\n"
21671         "sbbq    64(%%rdx), %%rax\n"
21672         "movq    %%rax, 64(%%rdi)\n"
21673     :
21674     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
21675     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
21676 }
21677 
21678 /* x has 8.5 words, z has 10.
21679  * Put (z+x*c) in z. Return carry bit. */
21680 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
21681 static inline
mpfq_fixmp_8_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)21682 mp_limb_t mpfq_fixmp_8_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
21683 {
21684     mp_limb_t carry;
21685     __asm__ __volatile__(
21686         "movq    %[z], %%rdi\n"
21687         "movq    %[x], %%rsi\n"
21688         "movq    0(%%rsi), %%rax\n"
21689         "mulq    %[mult]\n"
21690         "addq    %%rax, 0(%%rdi)\n"
21691         "movq    8(%%rsi), %%rax\n"
21692         "adcq    $0, %%rdx\n"
21693         "movq    %%rdx, %%rcx\n"
21694         "mulq    %[mult]\n"
21695         "addq    %%rax, %%rcx\n"
21696         "adcq    $0, %%rdx\n"
21697         "movq    16(%%rsi), %%rax\n"
21698         "addq    %%rcx, 8(%%rdi)\n"
21699         "adcq    $0, %%rdx\n"
21700         "movq    %%rdx, %%rcx\n"
21701         "mulq    %[mult]\n"
21702         "addq    %%rax, %%rcx\n"
21703         "adcq    $0, %%rdx\n"
21704         "movq    24(%%rsi), %%rax\n"
21705         "addq    %%rcx, 16(%%rdi)\n"
21706         "adcq    $0, %%rdx\n"
21707         "movq    %%rdx, %%rcx\n"
21708         "mulq    %[mult]\n"
21709         "addq    %%rax, %%rcx\n"
21710         "adcq    $0, %%rdx\n"
21711         "movq    32(%%rsi), %%rax\n"
21712         "addq    %%rcx, 24(%%rdi)\n"
21713         "adcq    $0, %%rdx\n"
21714         "movq    %%rdx, %%rcx\n"
21715         "mulq    %[mult]\n"
21716         "addq    %%rax, %%rcx\n"
21717         "adcq    $0, %%rdx\n"
21718         "movq    40(%%rsi), %%rax\n"
21719         "addq    %%rcx, 32(%%rdi)\n"
21720         "adcq    $0, %%rdx\n"
21721         "movq    %%rdx, %%rcx\n"
21722         "mulq    %[mult]\n"
21723         "addq    %%rax, %%rcx\n"
21724         "adcq    $0, %%rdx\n"
21725         "movq    48(%%rsi), %%rax\n"
21726         "addq    %%rcx, 40(%%rdi)\n"
21727         "adcq    $0, %%rdx\n"
21728         "movq    %%rdx, %%rcx\n"
21729         "mulq    %[mult]\n"
21730         "addq    %%rax, %%rcx\n"
21731         "adcq    $0, %%rdx\n"
21732         "movq    56(%%rsi), %%rax\n"
21733         "addq    %%rcx, 48(%%rdi)\n"
21734         "adcq    $0, %%rdx\n"
21735         "movq    %%rdx, %%rcx\n"
21736         "mulq    %[mult]\n"
21737         "addq    %%rax, %%rcx\n"
21738         "adcq    $0, %%rdx\n"
21739         "movq    64(%%rsi), %%rax\n"
21740         "addq    %%rcx, 56(%%rdi)\n"
21741         "adcq    $0, %%rdx\n"
21742         "movq    %%rdx, %%rcx\n"
21743         "mulq    %[mult]\n"
21744         "addq    %%rax, %%rcx\n"
21745         "adcq    $0, %%rdx\n"
21746         "addq    %%rcx, 64(%%rdi)\n"
21747         "adcq    $0, %%rdx\n"
21748         "xorq    %%rcx, %%rcx\n"
21749         "addq    %%rdx, 72(%%rdi)\n"
21750         "adcq    $0, %%rcx\n"
21751         "movq    %%rcx, %[carry]\n"
21752     : [carry]"=g"(carry), [z] "+m" (z)
21753     : [mult] "r" (c), [x] "m" (x)
21754     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
21755     return carry;
21756 }
21757 
21758 /* x has 8.5 words, z has 10.
21759  * Put (z+x*c) in z. Carry bit is lost. */
21760 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
21761 static inline
mpfq_fixmp_8_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)21762 void mpfq_fixmp_8_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
21763 {
21764     __asm__ __volatile__(
21765         "movq    %[z], %%rdi\n"
21766         "movq    %[x], %%rsi\n"
21767         "movq    0(%%rsi), %%rax\n"
21768         "mulq    %[mult]\n"
21769         "addq    %%rax, 0(%%rdi)\n"
21770         "movq    8(%%rsi), %%rax\n"
21771         "adcq    $0, %%rdx\n"
21772         "movq    %%rdx, %%rcx\n"
21773         "mulq    %[mult]\n"
21774         "addq    %%rax, %%rcx\n"
21775         "adcq    $0, %%rdx\n"
21776         "movq    16(%%rsi), %%rax\n"
21777         "addq    %%rcx, 8(%%rdi)\n"
21778         "adcq    $0, %%rdx\n"
21779         "movq    %%rdx, %%rcx\n"
21780         "mulq    %[mult]\n"
21781         "addq    %%rax, %%rcx\n"
21782         "adcq    $0, %%rdx\n"
21783         "movq    24(%%rsi), %%rax\n"
21784         "addq    %%rcx, 16(%%rdi)\n"
21785         "adcq    $0, %%rdx\n"
21786         "movq    %%rdx, %%rcx\n"
21787         "mulq    %[mult]\n"
21788         "addq    %%rax, %%rcx\n"
21789         "adcq    $0, %%rdx\n"
21790         "movq    32(%%rsi), %%rax\n"
21791         "addq    %%rcx, 24(%%rdi)\n"
21792         "adcq    $0, %%rdx\n"
21793         "movq    %%rdx, %%rcx\n"
21794         "mulq    %[mult]\n"
21795         "addq    %%rax, %%rcx\n"
21796         "adcq    $0, %%rdx\n"
21797         "movq    40(%%rsi), %%rax\n"
21798         "addq    %%rcx, 32(%%rdi)\n"
21799         "adcq    $0, %%rdx\n"
21800         "movq    %%rdx, %%rcx\n"
21801         "mulq    %[mult]\n"
21802         "addq    %%rax, %%rcx\n"
21803         "adcq    $0, %%rdx\n"
21804         "movq    48(%%rsi), %%rax\n"
21805         "addq    %%rcx, 40(%%rdi)\n"
21806         "adcq    $0, %%rdx\n"
21807         "movq    %%rdx, %%rcx\n"
21808         "mulq    %[mult]\n"
21809         "addq    %%rax, %%rcx\n"
21810         "adcq    $0, %%rdx\n"
21811         "movq    56(%%rsi), %%rax\n"
21812         "addq    %%rcx, 48(%%rdi)\n"
21813         "adcq    $0, %%rdx\n"
21814         "movq    %%rdx, %%rcx\n"
21815         "mulq    %[mult]\n"
21816         "addq    %%rax, %%rcx\n"
21817         "adcq    $0, %%rdx\n"
21818         "movq    64(%%rsi), %%rax\n"
21819         "addq    %%rcx, 56(%%rdi)\n"
21820         "adcq    $0, %%rdx\n"
21821         "movq    %%rdx, %%rcx\n"
21822         "mulq    %[mult]\n"
21823         "addq    %%rax, %%rcx\n"
21824         "adcq    $0, %%rdx\n"
21825         "addq    %%rcx, 64(%%rdi)\n"
21826         "adcq    $0, %%rdx\n"
21827         "addq    %%rdx, 72(%%rdi)\n"
21828     : [z] "+m" (z)
21829     : [mult] "r" (c), [x] "m" (x)
21830     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
21831 }
21832 
21833 /* x has 8.5 words, z has 9.
21834  * Put (z+x*c) in z. Return carry word. */
21835 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
21836 static inline
mpfq_fixmp_8_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)21837 mp_limb_t mpfq_fixmp_8_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
21838 {
21839     mp_limb_t carry;
21840     __asm__ __volatile__(
21841         "movq    %[z], %%rdi\n"
21842         "movq    %[x], %%rsi\n"
21843         "movq    0(%%rsi), %%rax\n"
21844         "mulq    %[mult]\n"
21845         "addq    %%rax, 0(%%rdi)\n"
21846         "movq    8(%%rsi), %%rax\n"
21847         "adcq    $0, %%rdx\n"
21848         "movq    %%rdx, %%rcx\n"
21849         "mulq    %[mult]\n"
21850         "addq    %%rax, %%rcx\n"
21851         "adcq    $0, %%rdx\n"
21852         "movq    16(%%rsi), %%rax\n"
21853         "addq    %%rcx, 8(%%rdi)\n"
21854         "adcq    $0, %%rdx\n"
21855         "movq    %%rdx, %%rcx\n"
21856         "mulq    %[mult]\n"
21857         "addq    %%rax, %%rcx\n"
21858         "adcq    $0, %%rdx\n"
21859         "movq    24(%%rsi), %%rax\n"
21860         "addq    %%rcx, 16(%%rdi)\n"
21861         "adcq    $0, %%rdx\n"
21862         "movq    %%rdx, %%rcx\n"
21863         "mulq    %[mult]\n"
21864         "addq    %%rax, %%rcx\n"
21865         "adcq    $0, %%rdx\n"
21866         "movq    32(%%rsi), %%rax\n"
21867         "addq    %%rcx, 24(%%rdi)\n"
21868         "adcq    $0, %%rdx\n"
21869         "movq    %%rdx, %%rcx\n"
21870         "mulq    %[mult]\n"
21871         "addq    %%rax, %%rcx\n"
21872         "adcq    $0, %%rdx\n"
21873         "movq    40(%%rsi), %%rax\n"
21874         "addq    %%rcx, 32(%%rdi)\n"
21875         "adcq    $0, %%rdx\n"
21876         "movq    %%rdx, %%rcx\n"
21877         "mulq    %[mult]\n"
21878         "addq    %%rax, %%rcx\n"
21879         "adcq    $0, %%rdx\n"
21880         "movq    48(%%rsi), %%rax\n"
21881         "addq    %%rcx, 40(%%rdi)\n"
21882         "adcq    $0, %%rdx\n"
21883         "movq    %%rdx, %%rcx\n"
21884         "mulq    %[mult]\n"
21885         "addq    %%rax, %%rcx\n"
21886         "adcq    $0, %%rdx\n"
21887         "movq    56(%%rsi), %%rax\n"
21888         "addq    %%rcx, 48(%%rdi)\n"
21889         "adcq    $0, %%rdx\n"
21890         "movq    %%rdx, %%rcx\n"
21891         "mulq    %[mult]\n"
21892         "addq    %%rax, %%rcx\n"
21893         "adcq    $0, %%rdx\n"
21894         "movq    64(%%rsi), %%rax\n"
21895         "addq    %%rcx, 56(%%rdi)\n"
21896         "adcq    $0, %%rdx\n"
21897         "movq    %%rdx, %%rcx\n"
21898         "mulq    %[mult]\n"
21899         "addq    %%rax, %%rcx\n"
21900         "adcq    $0, %%rdx\n"
21901         "addq    %%rcx, 64(%%rdi)\n"
21902         "adcq    $0, %%rdx\n"
21903         "movq    %%rdx, %[carry]\n"
21904     : [carry]"=g"(carry), [z] "+m" (z)
21905     : [mult] "r" (c), [x] "m" (x)
21906     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
21907     return carry;
21908 }
21909 
21910 /* x and y have 8.5 words, z has 17. Put x*y in z. */
21911 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
21912 static inline
mpfq_fixmp_8_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)21913 void mpfq_fixmp_8_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
21914 {
21915     __asm__ __volatile__(
21916         "### x*y[0]\n"
21917         "movq    %2, %%r8\n"
21918         "movq    %0, %%rdi\n"
21919         "movq    0(%%r8), %%r9\n"
21920         "movq    %1, %%rsi\n"
21921         "movq    0(%%rsi), %%rax\n"
21922         "mulq    %%r9\n"
21923         "movq    %%rax, 0(%%rdi)\n"
21924         "movq    8(%%rsi), %%rax\n"
21925         "movq    %%rdx, %%rcx\n"
21926         "mulq    %%r9\n"
21927         "addq    %%rax, %%rcx\n"
21928         "adcq    $0, %%rdx\n"
21929         "movq    16(%%rsi), %%rax\n"
21930         "movq    %%rcx, 8(%%rdi)\n"
21931         "movq    %%rdx, %%rcx\n"
21932         "mulq    %%r9\n"
21933         "addq    %%rax, %%rcx\n"
21934         "adcq    $0, %%rdx\n"
21935         "movq    24(%%rsi), %%rax\n"
21936         "movq    %%rcx, 16(%%rdi)\n"
21937         "movq    %%rdx, %%rcx\n"
21938         "mulq    %%r9\n"
21939         "addq    %%rax, %%rcx\n"
21940         "adcq    $0, %%rdx\n"
21941         "movq    32(%%rsi), %%rax\n"
21942         "movq    %%rcx, 24(%%rdi)\n"
21943         "movq    %%rdx, %%rcx\n"
21944         "mulq    %%r9\n"
21945         "addq    %%rax, %%rcx\n"
21946         "adcq    $0, %%rdx\n"
21947         "movq    40(%%rsi), %%rax\n"
21948         "movq    %%rcx, 32(%%rdi)\n"
21949         "movq    %%rdx, %%rcx\n"
21950         "mulq    %%r9\n"
21951         "addq    %%rax, %%rcx\n"
21952         "adcq    $0, %%rdx\n"
21953         "movq    48(%%rsi), %%rax\n"
21954         "movq    %%rcx, 40(%%rdi)\n"
21955         "movq    %%rdx, %%rcx\n"
21956         "mulq    %%r9\n"
21957         "addq    %%rax, %%rcx\n"
21958         "adcq    $0, %%rdx\n"
21959         "movq    56(%%rsi), %%rax\n"
21960         "movq    %%rcx, 48(%%rdi)\n"
21961         "movq    %%rdx, %%rcx\n"
21962         "mulq    %%r9\n"
21963         "addq    %%rax, %%rcx\n"
21964         "adcq    $0, %%rdx\n"
21965         "movq    64(%%rsi), %%rax\n"
21966         "movq    %%rcx, 56(%%rdi)\n"
21967         "movq    %%rdx, %%rcx\n"
21968         "mulq    %%r9\n"
21969         "addq    %%rax, %%rcx\n"
21970         "adcq    $0, %%rdx\n"
21971         "movq    %%rcx, 64(%%rdi)\n"
21972         "movq    %%rdx, 72(%%rdi)\n"
21973         "movq    $0, 80(%%rdi)\n"
21974         "movq    $0, 88(%%rdi)\n"
21975         "movq    $0, 96(%%rdi)\n"
21976         "movq    $0, 104(%%rdi)\n"
21977         "movq    $0, 112(%%rdi)\n"
21978         "movq    $0, 120(%%rdi)\n"
21979         "movq    $0, 128(%%rdi)\n"
21980         "### x*y[1]\n"
21981         "movq    8(%%r8), %%r9\n"
21982         "movq    0(%%rsi), %%rax\n"
21983         "mulq    %%r9\n"
21984         "addq    %%rax, 8(%%rdi)\n"
21985         "movq    8(%%rsi), %%rax\n"
21986         "adcq    $0, %%rdx\n"
21987         "movq    %%rdx, %%rcx\n"
21988         "mulq    %%r9\n"
21989         "addq    %%rax, %%rcx\n"
21990         "adcq    $0, %%rdx\n"
21991         "movq    16(%%rsi), %%rax\n"
21992         "addq    %%rcx, 16(%%rdi)\n"
21993         "adcq    $0, %%rdx\n"
21994         "movq    %%rdx, %%rcx\n"
21995         "mulq    %%r9\n"
21996         "addq    %%rax, %%rcx\n"
21997         "adcq    $0, %%rdx\n"
21998         "movq    24(%%rsi), %%rax\n"
21999         "addq    %%rcx, 24(%%rdi)\n"
22000         "adcq    $0, %%rdx\n"
22001         "movq    %%rdx, %%rcx\n"
22002         "mulq    %%r9\n"
22003         "addq    %%rax, %%rcx\n"
22004         "adcq    $0, %%rdx\n"
22005         "movq    32(%%rsi), %%rax\n"
22006         "addq    %%rcx, 32(%%rdi)\n"
22007         "adcq    $0, %%rdx\n"
22008         "movq    %%rdx, %%rcx\n"
22009         "mulq    %%r9\n"
22010         "addq    %%rax, %%rcx\n"
22011         "adcq    $0, %%rdx\n"
22012         "movq    40(%%rsi), %%rax\n"
22013         "addq    %%rcx, 40(%%rdi)\n"
22014         "adcq    $0, %%rdx\n"
22015         "movq    %%rdx, %%rcx\n"
22016         "mulq    %%r9\n"
22017         "addq    %%rax, %%rcx\n"
22018         "adcq    $0, %%rdx\n"
22019         "movq    48(%%rsi), %%rax\n"
22020         "addq    %%rcx, 48(%%rdi)\n"
22021         "adcq    $0, %%rdx\n"
22022         "movq    %%rdx, %%rcx\n"
22023         "mulq    %%r9\n"
22024         "addq    %%rax, %%rcx\n"
22025         "adcq    $0, %%rdx\n"
22026         "movq    56(%%rsi), %%rax\n"
22027         "addq    %%rcx, 56(%%rdi)\n"
22028         "adcq    $0, %%rdx\n"
22029         "movq    %%rdx, %%rcx\n"
22030         "mulq    %%r9\n"
22031         "addq    %%rax, %%rcx\n"
22032         "adcq    $0, %%rdx\n"
22033         "movq    64(%%rsi), %%rax\n"
22034         "addq    %%rcx, 64(%%rdi)\n"
22035         "adcq    $0, %%rdx\n"
22036         "movq    %%rdx, %%rcx\n"
22037         "mulq    %%r9\n"
22038         "addq    %%rax, %%rcx\n"
22039         "adcq    $0, %%rdx\n"
22040         "addq    %%rcx, 72(%%rdi)\n"
22041         "adcq    $0, %%rdx\n"
22042         "movq    %%rdx, 80(%%rdi)\n"
22043         "### x*y[2]\n"
22044         "movq    16(%%r8), %%r9\n"
22045         "movq    0(%%rsi), %%rax\n"
22046         "mulq    %%r9\n"
22047         "addq    %%rax, 16(%%rdi)\n"
22048         "movq    8(%%rsi), %%rax\n"
22049         "adcq    $0, %%rdx\n"
22050         "movq    %%rdx, %%rcx\n"
22051         "mulq    %%r9\n"
22052         "addq    %%rax, %%rcx\n"
22053         "adcq    $0, %%rdx\n"
22054         "movq    16(%%rsi), %%rax\n"
22055         "addq    %%rcx, 24(%%rdi)\n"
22056         "adcq    $0, %%rdx\n"
22057         "movq    %%rdx, %%rcx\n"
22058         "mulq    %%r9\n"
22059         "addq    %%rax, %%rcx\n"
22060         "adcq    $0, %%rdx\n"
22061         "movq    24(%%rsi), %%rax\n"
22062         "addq    %%rcx, 32(%%rdi)\n"
22063         "adcq    $0, %%rdx\n"
22064         "movq    %%rdx, %%rcx\n"
22065         "mulq    %%r9\n"
22066         "addq    %%rax, %%rcx\n"
22067         "adcq    $0, %%rdx\n"
22068         "movq    32(%%rsi), %%rax\n"
22069         "addq    %%rcx, 40(%%rdi)\n"
22070         "adcq    $0, %%rdx\n"
22071         "movq    %%rdx, %%rcx\n"
22072         "mulq    %%r9\n"
22073         "addq    %%rax, %%rcx\n"
22074         "adcq    $0, %%rdx\n"
22075         "movq    40(%%rsi), %%rax\n"
22076         "addq    %%rcx, 48(%%rdi)\n"
22077         "adcq    $0, %%rdx\n"
22078         "movq    %%rdx, %%rcx\n"
22079         "mulq    %%r9\n"
22080         "addq    %%rax, %%rcx\n"
22081         "adcq    $0, %%rdx\n"
22082         "movq    48(%%rsi), %%rax\n"
22083         "addq    %%rcx, 56(%%rdi)\n"
22084         "adcq    $0, %%rdx\n"
22085         "movq    %%rdx, %%rcx\n"
22086         "mulq    %%r9\n"
22087         "addq    %%rax, %%rcx\n"
22088         "adcq    $0, %%rdx\n"
22089         "movq    56(%%rsi), %%rax\n"
22090         "addq    %%rcx, 64(%%rdi)\n"
22091         "adcq    $0, %%rdx\n"
22092         "movq    %%rdx, %%rcx\n"
22093         "mulq    %%r9\n"
22094         "addq    %%rax, %%rcx\n"
22095         "adcq    $0, %%rdx\n"
22096         "movq    64(%%rsi), %%rax\n"
22097         "addq    %%rcx, 72(%%rdi)\n"
22098         "adcq    $0, %%rdx\n"
22099         "movq    %%rdx, %%rcx\n"
22100         "mulq    %%r9\n"
22101         "addq    %%rax, %%rcx\n"
22102         "adcq    $0, %%rdx\n"
22103         "addq    %%rcx, 80(%%rdi)\n"
22104         "adcq    $0, %%rdx\n"
22105         "movq    %%rdx, 88(%%rdi)\n"
22106         "### x*y[3]\n"
22107         "movq    24(%%r8), %%r9\n"
22108         "movq    0(%%rsi), %%rax\n"
22109         "mulq    %%r9\n"
22110         "addq    %%rax, 24(%%rdi)\n"
22111         "movq    8(%%rsi), %%rax\n"
22112         "adcq    $0, %%rdx\n"
22113         "movq    %%rdx, %%rcx\n"
22114         "mulq    %%r9\n"
22115         "addq    %%rax, %%rcx\n"
22116         "adcq    $0, %%rdx\n"
22117         "movq    16(%%rsi), %%rax\n"
22118         "addq    %%rcx, 32(%%rdi)\n"
22119         "adcq    $0, %%rdx\n"
22120         "movq    %%rdx, %%rcx\n"
22121         "mulq    %%r9\n"
22122         "addq    %%rax, %%rcx\n"
22123         "adcq    $0, %%rdx\n"
22124         "movq    24(%%rsi), %%rax\n"
22125         "addq    %%rcx, 40(%%rdi)\n"
22126         "adcq    $0, %%rdx\n"
22127         "movq    %%rdx, %%rcx\n"
22128         "mulq    %%r9\n"
22129         "addq    %%rax, %%rcx\n"
22130         "adcq    $0, %%rdx\n"
22131         "movq    32(%%rsi), %%rax\n"
22132         "addq    %%rcx, 48(%%rdi)\n"
22133         "adcq    $0, %%rdx\n"
22134         "movq    %%rdx, %%rcx\n"
22135         "mulq    %%r9\n"
22136         "addq    %%rax, %%rcx\n"
22137         "adcq    $0, %%rdx\n"
22138         "movq    40(%%rsi), %%rax\n"
22139         "addq    %%rcx, 56(%%rdi)\n"
22140         "adcq    $0, %%rdx\n"
22141         "movq    %%rdx, %%rcx\n"
22142         "mulq    %%r9\n"
22143         "addq    %%rax, %%rcx\n"
22144         "adcq    $0, %%rdx\n"
22145         "movq    48(%%rsi), %%rax\n"
22146         "addq    %%rcx, 64(%%rdi)\n"
22147         "adcq    $0, %%rdx\n"
22148         "movq    %%rdx, %%rcx\n"
22149         "mulq    %%r9\n"
22150         "addq    %%rax, %%rcx\n"
22151         "adcq    $0, %%rdx\n"
22152         "movq    56(%%rsi), %%rax\n"
22153         "addq    %%rcx, 72(%%rdi)\n"
22154         "adcq    $0, %%rdx\n"
22155         "movq    %%rdx, %%rcx\n"
22156         "mulq    %%r9\n"
22157         "addq    %%rax, %%rcx\n"
22158         "adcq    $0, %%rdx\n"
22159         "movq    64(%%rsi), %%rax\n"
22160         "addq    %%rcx, 80(%%rdi)\n"
22161         "adcq    $0, %%rdx\n"
22162         "movq    %%rdx, %%rcx\n"
22163         "mulq    %%r9\n"
22164         "addq    %%rax, %%rcx\n"
22165         "adcq    $0, %%rdx\n"
22166         "addq    %%rcx, 88(%%rdi)\n"
22167         "adcq    $0, %%rdx\n"
22168         "movq    %%rdx, 96(%%rdi)\n"
22169         "### x*y[4]\n"
22170         "movq    32(%%r8), %%r9\n"
22171         "movq    0(%%rsi), %%rax\n"
22172         "mulq    %%r9\n"
22173         "addq    %%rax, 32(%%rdi)\n"
22174         "movq    8(%%rsi), %%rax\n"
22175         "adcq    $0, %%rdx\n"
22176         "movq    %%rdx, %%rcx\n"
22177         "mulq    %%r9\n"
22178         "addq    %%rax, %%rcx\n"
22179         "adcq    $0, %%rdx\n"
22180         "movq    16(%%rsi), %%rax\n"
22181         "addq    %%rcx, 40(%%rdi)\n"
22182         "adcq    $0, %%rdx\n"
22183         "movq    %%rdx, %%rcx\n"
22184         "mulq    %%r9\n"
22185         "addq    %%rax, %%rcx\n"
22186         "adcq    $0, %%rdx\n"
22187         "movq    24(%%rsi), %%rax\n"
22188         "addq    %%rcx, 48(%%rdi)\n"
22189         "adcq    $0, %%rdx\n"
22190         "movq    %%rdx, %%rcx\n"
22191         "mulq    %%r9\n"
22192         "addq    %%rax, %%rcx\n"
22193         "adcq    $0, %%rdx\n"
22194         "movq    32(%%rsi), %%rax\n"
22195         "addq    %%rcx, 56(%%rdi)\n"
22196         "adcq    $0, %%rdx\n"
22197         "movq    %%rdx, %%rcx\n"
22198         "mulq    %%r9\n"
22199         "addq    %%rax, %%rcx\n"
22200         "adcq    $0, %%rdx\n"
22201         "movq    40(%%rsi), %%rax\n"
22202         "addq    %%rcx, 64(%%rdi)\n"
22203         "adcq    $0, %%rdx\n"
22204         "movq    %%rdx, %%rcx\n"
22205         "mulq    %%r9\n"
22206         "addq    %%rax, %%rcx\n"
22207         "adcq    $0, %%rdx\n"
22208         "movq    48(%%rsi), %%rax\n"
22209         "addq    %%rcx, 72(%%rdi)\n"
22210         "adcq    $0, %%rdx\n"
22211         "movq    %%rdx, %%rcx\n"
22212         "mulq    %%r9\n"
22213         "addq    %%rax, %%rcx\n"
22214         "adcq    $0, %%rdx\n"
22215         "movq    56(%%rsi), %%rax\n"
22216         "addq    %%rcx, 80(%%rdi)\n"
22217         "adcq    $0, %%rdx\n"
22218         "movq    %%rdx, %%rcx\n"
22219         "mulq    %%r9\n"
22220         "addq    %%rax, %%rcx\n"
22221         "adcq    $0, %%rdx\n"
22222         "movq    64(%%rsi), %%rax\n"
22223         "addq    %%rcx, 88(%%rdi)\n"
22224         "adcq    $0, %%rdx\n"
22225         "movq    %%rdx, %%rcx\n"
22226         "mulq    %%r9\n"
22227         "addq    %%rax, %%rcx\n"
22228         "adcq    $0, %%rdx\n"
22229         "addq    %%rcx, 96(%%rdi)\n"
22230         "adcq    $0, %%rdx\n"
22231         "movq    %%rdx, 104(%%rdi)\n"
22232         "### x*y[5]\n"
22233         "movq    40(%%r8), %%r9\n"
22234         "movq    0(%%rsi), %%rax\n"
22235         "mulq    %%r9\n"
22236         "addq    %%rax, 40(%%rdi)\n"
22237         "movq    8(%%rsi), %%rax\n"
22238         "adcq    $0, %%rdx\n"
22239         "movq    %%rdx, %%rcx\n"
22240         "mulq    %%r9\n"
22241         "addq    %%rax, %%rcx\n"
22242         "adcq    $0, %%rdx\n"
22243         "movq    16(%%rsi), %%rax\n"
22244         "addq    %%rcx, 48(%%rdi)\n"
22245         "adcq    $0, %%rdx\n"
22246         "movq    %%rdx, %%rcx\n"
22247         "mulq    %%r9\n"
22248         "addq    %%rax, %%rcx\n"
22249         "adcq    $0, %%rdx\n"
22250         "movq    24(%%rsi), %%rax\n"
22251         "addq    %%rcx, 56(%%rdi)\n"
22252         "adcq    $0, %%rdx\n"
22253         "movq    %%rdx, %%rcx\n"
22254         "mulq    %%r9\n"
22255         "addq    %%rax, %%rcx\n"
22256         "adcq    $0, %%rdx\n"
22257         "movq    32(%%rsi), %%rax\n"
22258         "addq    %%rcx, 64(%%rdi)\n"
22259         "adcq    $0, %%rdx\n"
22260         "movq    %%rdx, %%rcx\n"
22261         "mulq    %%r9\n"
22262         "addq    %%rax, %%rcx\n"
22263         "adcq    $0, %%rdx\n"
22264         "movq    40(%%rsi), %%rax\n"
22265         "addq    %%rcx, 72(%%rdi)\n"
22266         "adcq    $0, %%rdx\n"
22267         "movq    %%rdx, %%rcx\n"
22268         "mulq    %%r9\n"
22269         "addq    %%rax, %%rcx\n"
22270         "adcq    $0, %%rdx\n"
22271         "movq    48(%%rsi), %%rax\n"
22272         "addq    %%rcx, 80(%%rdi)\n"
22273         "adcq    $0, %%rdx\n"
22274         "movq    %%rdx, %%rcx\n"
22275         "mulq    %%r9\n"
22276         "addq    %%rax, %%rcx\n"
22277         "adcq    $0, %%rdx\n"
22278         "movq    56(%%rsi), %%rax\n"
22279         "addq    %%rcx, 88(%%rdi)\n"
22280         "adcq    $0, %%rdx\n"
22281         "movq    %%rdx, %%rcx\n"
22282         "mulq    %%r9\n"
22283         "addq    %%rax, %%rcx\n"
22284         "adcq    $0, %%rdx\n"
22285         "movq    64(%%rsi), %%rax\n"
22286         "addq    %%rcx, 96(%%rdi)\n"
22287         "adcq    $0, %%rdx\n"
22288         "movq    %%rdx, %%rcx\n"
22289         "mulq    %%r9\n"
22290         "addq    %%rax, %%rcx\n"
22291         "adcq    $0, %%rdx\n"
22292         "addq    %%rcx, 104(%%rdi)\n"
22293         "adcq    $0, %%rdx\n"
22294         "movq    %%rdx, 112(%%rdi)\n"
22295         "### x*y[6]\n"
22296         "movq    48(%%r8), %%r9\n"
22297         "movq    0(%%rsi), %%rax\n"
22298         "mulq    %%r9\n"
22299         "addq    %%rax, 48(%%rdi)\n"
22300         "movq    8(%%rsi), %%rax\n"
22301         "adcq    $0, %%rdx\n"
22302         "movq    %%rdx, %%rcx\n"
22303         "mulq    %%r9\n"
22304         "addq    %%rax, %%rcx\n"
22305         "adcq    $0, %%rdx\n"
22306         "movq    16(%%rsi), %%rax\n"
22307         "addq    %%rcx, 56(%%rdi)\n"
22308         "adcq    $0, %%rdx\n"
22309         "movq    %%rdx, %%rcx\n"
22310         "mulq    %%r9\n"
22311         "addq    %%rax, %%rcx\n"
22312         "adcq    $0, %%rdx\n"
22313         "movq    24(%%rsi), %%rax\n"
22314         "addq    %%rcx, 64(%%rdi)\n"
22315         "adcq    $0, %%rdx\n"
22316         "movq    %%rdx, %%rcx\n"
22317         "mulq    %%r9\n"
22318         "addq    %%rax, %%rcx\n"
22319         "adcq    $0, %%rdx\n"
22320         "movq    32(%%rsi), %%rax\n"
22321         "addq    %%rcx, 72(%%rdi)\n"
22322         "adcq    $0, %%rdx\n"
22323         "movq    %%rdx, %%rcx\n"
22324         "mulq    %%r9\n"
22325         "addq    %%rax, %%rcx\n"
22326         "adcq    $0, %%rdx\n"
22327         "movq    40(%%rsi), %%rax\n"
22328         "addq    %%rcx, 80(%%rdi)\n"
22329         "adcq    $0, %%rdx\n"
22330         "movq    %%rdx, %%rcx\n"
22331         "mulq    %%r9\n"
22332         "addq    %%rax, %%rcx\n"
22333         "adcq    $0, %%rdx\n"
22334         "movq    48(%%rsi), %%rax\n"
22335         "addq    %%rcx, 88(%%rdi)\n"
22336         "adcq    $0, %%rdx\n"
22337         "movq    %%rdx, %%rcx\n"
22338         "mulq    %%r9\n"
22339         "addq    %%rax, %%rcx\n"
22340         "adcq    $0, %%rdx\n"
22341         "movq    56(%%rsi), %%rax\n"
22342         "addq    %%rcx, 96(%%rdi)\n"
22343         "adcq    $0, %%rdx\n"
22344         "movq    %%rdx, %%rcx\n"
22345         "mulq    %%r9\n"
22346         "addq    %%rax, %%rcx\n"
22347         "adcq    $0, %%rdx\n"
22348         "movq    64(%%rsi), %%rax\n"
22349         "addq    %%rcx, 104(%%rdi)\n"
22350         "adcq    $0, %%rdx\n"
22351         "movq    %%rdx, %%rcx\n"
22352         "mulq    %%r9\n"
22353         "addq    %%rax, %%rcx\n"
22354         "adcq    $0, %%rdx\n"
22355         "addq    %%rcx, 112(%%rdi)\n"
22356         "adcq    $0, %%rdx\n"
22357         "movq    %%rdx, 120(%%rdi)\n"
22358         "### x*y[7]\n"
22359         "movq    56(%%r8), %%r9\n"
22360         "movq    0(%%rsi), %%rax\n"
22361         "mulq    %%r9\n"
22362         "addq    %%rax, 56(%%rdi)\n"
22363         "movq    8(%%rsi), %%rax\n"
22364         "adcq    $0, %%rdx\n"
22365         "movq    %%rdx, %%rcx\n"
22366         "mulq    %%r9\n"
22367         "addq    %%rax, %%rcx\n"
22368         "adcq    $0, %%rdx\n"
22369         "movq    16(%%rsi), %%rax\n"
22370         "addq    %%rcx, 64(%%rdi)\n"
22371         "adcq    $0, %%rdx\n"
22372         "movq    %%rdx, %%rcx\n"
22373         "mulq    %%r9\n"
22374         "addq    %%rax, %%rcx\n"
22375         "adcq    $0, %%rdx\n"
22376         "movq    24(%%rsi), %%rax\n"
22377         "addq    %%rcx, 72(%%rdi)\n"
22378         "adcq    $0, %%rdx\n"
22379         "movq    %%rdx, %%rcx\n"
22380         "mulq    %%r9\n"
22381         "addq    %%rax, %%rcx\n"
22382         "adcq    $0, %%rdx\n"
22383         "movq    32(%%rsi), %%rax\n"
22384         "addq    %%rcx, 80(%%rdi)\n"
22385         "adcq    $0, %%rdx\n"
22386         "movq    %%rdx, %%rcx\n"
22387         "mulq    %%r9\n"
22388         "addq    %%rax, %%rcx\n"
22389         "adcq    $0, %%rdx\n"
22390         "movq    40(%%rsi), %%rax\n"
22391         "addq    %%rcx, 88(%%rdi)\n"
22392         "adcq    $0, %%rdx\n"
22393         "movq    %%rdx, %%rcx\n"
22394         "mulq    %%r9\n"
22395         "addq    %%rax, %%rcx\n"
22396         "adcq    $0, %%rdx\n"
22397         "movq    48(%%rsi), %%rax\n"
22398         "addq    %%rcx, 96(%%rdi)\n"
22399         "adcq    $0, %%rdx\n"
22400         "movq    %%rdx, %%rcx\n"
22401         "mulq    %%r9\n"
22402         "addq    %%rax, %%rcx\n"
22403         "adcq    $0, %%rdx\n"
22404         "movq    56(%%rsi), %%rax\n"
22405         "addq    %%rcx, 104(%%rdi)\n"
22406         "adcq    $0, %%rdx\n"
22407         "movq    %%rdx, %%rcx\n"
22408         "mulq    %%r9\n"
22409         "addq    %%rax, %%rcx\n"
22410         "adcq    $0, %%rdx\n"
22411         "movq    64(%%rsi), %%rax\n"
22412         "addq    %%rcx, 112(%%rdi)\n"
22413         "adcq    $0, %%rdx\n"
22414         "movq    %%rdx, %%rcx\n"
22415         "mulq    %%r9\n"
22416         "addq    %%rax, %%rcx\n"
22417         "adcq    $0, %%rdx\n"
22418         "addq    %%rcx, 120(%%rdi)\n"
22419         "adcq    $0, %%rdx\n"
22420         "movq    %%rdx, 128(%%rdi)\n"
22421         "### x*y[8]\n"
22422         "movq    64(%%r8), %%r9\n"
22423         "movq    0(%%rsi), %%rax\n"
22424         "mulq    %%r9\n"
22425         "addq    %%rax, 64(%%rdi)\n"
22426         "movq    8(%%rsi), %%rax\n"
22427         "adcq    $0, %%rdx\n"
22428         "movq    %%rdx, %%rcx\n"
22429         "mulq    %%r9\n"
22430         "addq    %%rax, %%rcx\n"
22431         "adcq    $0, %%rdx\n"
22432         "movq    16(%%rsi), %%rax\n"
22433         "addq    %%rcx, 72(%%rdi)\n"
22434         "adcq    $0, %%rdx\n"
22435         "movq    %%rdx, %%rcx\n"
22436         "mulq    %%r9\n"
22437         "addq    %%rax, %%rcx\n"
22438         "adcq    $0, %%rdx\n"
22439         "movq    24(%%rsi), %%rax\n"
22440         "addq    %%rcx, 80(%%rdi)\n"
22441         "adcq    $0, %%rdx\n"
22442         "movq    %%rdx, %%rcx\n"
22443         "mulq    %%r9\n"
22444         "addq    %%rax, %%rcx\n"
22445         "adcq    $0, %%rdx\n"
22446         "movq    32(%%rsi), %%rax\n"
22447         "addq    %%rcx, 88(%%rdi)\n"
22448         "adcq    $0, %%rdx\n"
22449         "movq    %%rdx, %%rcx\n"
22450         "mulq    %%r9\n"
22451         "addq    %%rax, %%rcx\n"
22452         "adcq    $0, %%rdx\n"
22453         "movq    40(%%rsi), %%rax\n"
22454         "addq    %%rcx, 96(%%rdi)\n"
22455         "adcq    $0, %%rdx\n"
22456         "movq    %%rdx, %%rcx\n"
22457         "mulq    %%r9\n"
22458         "addq    %%rax, %%rcx\n"
22459         "adcq    $0, %%rdx\n"
22460         "movq    48(%%rsi), %%rax\n"
22461         "addq    %%rcx, 104(%%rdi)\n"
22462         "adcq    $0, %%rdx\n"
22463         "movq    %%rdx, %%rcx\n"
22464         "mulq    %%r9\n"
22465         "addq    %%rax, %%rcx\n"
22466         "adcq    $0, %%rdx\n"
22467         "movq    56(%%rsi), %%rax\n"
22468         "addq    %%rcx, 112(%%rdi)\n"
22469         "adcq    $0, %%rdx\n"
22470         "movq    %%rdx, %%rcx\n"
22471         "mulq    %%r9\n"
22472         "addq    %%rax, %%rcx\n"
22473         "adcq    $0, %%rdx\n"
22474         "movq    64(%%rsi), %%rax\n"
22475         "addq    %%rcx, 120(%%rdi)\n"
22476         "adcq    $0, %%rdx\n"
22477         "movq    %%rdx, %%rcx\n"
22478         "mulq    %%r9\n"
22479         "addq    %%rax, %%rcx\n"
22480         "adcq    $0, %%rdx\n"
22481         "addq    %%rcx, 128(%%rdi)\n"
22482       : "+m" (z)
22483       : "m" (x), "m" (y)
22484       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
22485 }
22486 
22487 /* x has 8.5 words, z has 17. Put x*y in z. */
22488 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
22489 static inline
mpfq_fixmp_8_5_sqr(mp_limb_t * z,const mp_limb_t * x)22490 void mpfq_fixmp_8_5_sqr(mp_limb_t * z, const mp_limb_t * x)
22491 {
22492     mpfq_fixmp_8_5_mul(z, x, x);
22493 }
22494 
22495 /* x has 8.5 words, z has 10. Put x*y in z. */
22496 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
22497 static inline
mpfq_fixmp_8_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)22498 void mpfq_fixmp_8_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
22499 {
22500     __asm__ __volatile__(
22501         "movq    %[z], %%rdi\n"
22502         "movq    %[x], %%rsi\n"
22503         "movq    0(%%rsi), %%rax\n"
22504         "mulq    %[mult]\n"
22505         "movq    %%rax, 0(%%rdi)\n"
22506         "movq    8(%%rsi), %%rax\n"
22507         "movq    %%rdx, %%rcx\n"
22508         "mulq    %[mult]\n"
22509         "addq    %%rax, %%rcx\n"
22510         "adcq    $0, %%rdx\n"
22511         "movq    16(%%rsi), %%rax\n"
22512         "movq    %%rcx, 8(%%rdi)\n"
22513         "movq    %%rdx, %%rcx\n"
22514         "mulq    %[mult]\n"
22515         "addq    %%rax, %%rcx\n"
22516         "adcq    $0, %%rdx\n"
22517         "movq    24(%%rsi), %%rax\n"
22518         "movq    %%rcx, 16(%%rdi)\n"
22519         "movq    %%rdx, %%rcx\n"
22520         "mulq    %[mult]\n"
22521         "addq    %%rax, %%rcx\n"
22522         "adcq    $0, %%rdx\n"
22523         "movq    32(%%rsi), %%rax\n"
22524         "movq    %%rcx, 24(%%rdi)\n"
22525         "movq    %%rdx, %%rcx\n"
22526         "mulq    %[mult]\n"
22527         "addq    %%rax, %%rcx\n"
22528         "adcq    $0, %%rdx\n"
22529         "movq    40(%%rsi), %%rax\n"
22530         "movq    %%rcx, 32(%%rdi)\n"
22531         "movq    %%rdx, %%rcx\n"
22532         "mulq    %[mult]\n"
22533         "addq    %%rax, %%rcx\n"
22534         "adcq    $0, %%rdx\n"
22535         "movq    48(%%rsi), %%rax\n"
22536         "movq    %%rcx, 40(%%rdi)\n"
22537         "movq    %%rdx, %%rcx\n"
22538         "mulq    %[mult]\n"
22539         "addq    %%rax, %%rcx\n"
22540         "adcq    $0, %%rdx\n"
22541         "movq    56(%%rsi), %%rax\n"
22542         "movq    %%rcx, 48(%%rdi)\n"
22543         "movq    %%rdx, %%rcx\n"
22544         "mulq    %[mult]\n"
22545         "addq    %%rax, %%rcx\n"
22546         "adcq    $0, %%rdx\n"
22547         "movq    64(%%rsi), %%rax\n"
22548         "movq    %%rcx, 56(%%rdi)\n"
22549         "movq    %%rdx, %%rcx\n"
22550         "mulq    %[mult]\n"
22551         "addq    %%rax, %%rcx\n"
22552         "adcq    $0, %%rdx\n"
22553         "movq    %%rcx, 64(%%rdi)\n"
22554         "movq    %%rdx, 72(%%rdi)\n"
22555     :
22556     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
22557     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
22558 }
22559 
22560 /* x has 8.5 words, z has 9. c is 0.5 word.
22561  * Put (z+x*c) in z. Return carry bit. */
22562 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
22563 static inline
mpfq_fixmp_8_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)22564 mp_limb_t mpfq_fixmp_8_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
22565 {
22566     mp_limb_t carry;
22567     __asm__ __volatile__(
22568         "movq    %[z], %%rdi\n"
22569         "movq    %[x], %%rsi\n"
22570         "movq    0(%%rsi), %%rax\n"
22571         "mulq    %[mult]\n"
22572         "addq    %%rax, 0(%%rdi)\n"
22573         "movq    8(%%rsi), %%rax\n"
22574         "adcq    $0, %%rdx\n"
22575         "movq    %%rdx, %%rcx\n"
22576         "mulq    %[mult]\n"
22577         "addq    %%rax, %%rcx\n"
22578         "adcq    $0, %%rdx\n"
22579         "movq    16(%%rsi), %%rax\n"
22580         "addq    %%rcx, 8(%%rdi)\n"
22581         "adcq    $0, %%rdx\n"
22582         "movq    %%rdx, %%rcx\n"
22583         "mulq    %[mult]\n"
22584         "addq    %%rax, %%rcx\n"
22585         "adcq    $0, %%rdx\n"
22586         "movq    24(%%rsi), %%rax\n"
22587         "addq    %%rcx, 16(%%rdi)\n"
22588         "adcq    $0, %%rdx\n"
22589         "movq    %%rdx, %%rcx\n"
22590         "mulq    %[mult]\n"
22591         "addq    %%rax, %%rcx\n"
22592         "adcq    $0, %%rdx\n"
22593         "movq    32(%%rsi), %%rax\n"
22594         "addq    %%rcx, 24(%%rdi)\n"
22595         "adcq    $0, %%rdx\n"
22596         "movq    %%rdx, %%rcx\n"
22597         "mulq    %[mult]\n"
22598         "addq    %%rax, %%rcx\n"
22599         "adcq    $0, %%rdx\n"
22600         "movq    40(%%rsi), %%rax\n"
22601         "addq    %%rcx, 32(%%rdi)\n"
22602         "adcq    $0, %%rdx\n"
22603         "movq    %%rdx, %%rcx\n"
22604         "mulq    %[mult]\n"
22605         "addq    %%rax, %%rcx\n"
22606         "adcq    $0, %%rdx\n"
22607         "movq    48(%%rsi), %%rax\n"
22608         "addq    %%rcx, 40(%%rdi)\n"
22609         "adcq    $0, %%rdx\n"
22610         "movq    %%rdx, %%rcx\n"
22611         "mulq    %[mult]\n"
22612         "addq    %%rax, %%rcx\n"
22613         "adcq    $0, %%rdx\n"
22614         "movq    56(%%rsi), %%rax\n"
22615         "addq    %%rcx, 48(%%rdi)\n"
22616         "adcq    $0, %%rdx\n"
22617         "movq    %%rdx, %%rcx\n"
22618         "mulq    %[mult]\n"
22619         "addq    %%rax, %%rcx\n"
22620         "adcq    $0, %%rdx\n"
22621         "movq    64(%%rsi), %%rax\n"
22622         "addq    %%rcx, 56(%%rdi)\n"
22623         "adcq    $0, %%rdx\n"
22624         "movq    %%rdx, %%rcx\n"
22625         "imulq    %[mult], %%rax\n"
22626         "xorq    %%rdx, %%rdx\n"
22627         "addq    %%rcx, %%rax\n"
22628         "adcq    $0, %%rdx\n"
22629         "addq    %%rax, 64(%%rdi)\n"
22630         "adcq    $0, %%rdx\n"
22631         "movq    %%rdx, %[carry]\n"
22632     : [carry]"=g"(carry), [z] "+m" (z)
22633     : [mult] "r" (c), [x] "m" (x)
22634     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
22635     return carry;
22636 }
22637 
22638 /* x has 8.5 words, z has 9. c is 0.5 word.
22639  * Put (z+x*c) in z. Carry bit is lost. */
22640 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
22641 static inline
mpfq_fixmp_8_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)22642 void mpfq_fixmp_8_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
22643 {
22644     __asm__ __volatile__(
22645         "movq    %[z], %%rdi\n"
22646         "movq    %[x], %%rsi\n"
22647         "movq    0(%%rsi), %%rax\n"
22648         "mulq    %[mult]\n"
22649         "addq    %%rax, 0(%%rdi)\n"
22650         "movq    8(%%rsi), %%rax\n"
22651         "adcq    $0, %%rdx\n"
22652         "movq    %%rdx, %%rcx\n"
22653         "mulq    %[mult]\n"
22654         "addq    %%rax, %%rcx\n"
22655         "adcq    $0, %%rdx\n"
22656         "movq    16(%%rsi), %%rax\n"
22657         "addq    %%rcx, 8(%%rdi)\n"
22658         "adcq    $0, %%rdx\n"
22659         "movq    %%rdx, %%rcx\n"
22660         "mulq    %[mult]\n"
22661         "addq    %%rax, %%rcx\n"
22662         "adcq    $0, %%rdx\n"
22663         "movq    24(%%rsi), %%rax\n"
22664         "addq    %%rcx, 16(%%rdi)\n"
22665         "adcq    $0, %%rdx\n"
22666         "movq    %%rdx, %%rcx\n"
22667         "mulq    %[mult]\n"
22668         "addq    %%rax, %%rcx\n"
22669         "adcq    $0, %%rdx\n"
22670         "movq    32(%%rsi), %%rax\n"
22671         "addq    %%rcx, 24(%%rdi)\n"
22672         "adcq    $0, %%rdx\n"
22673         "movq    %%rdx, %%rcx\n"
22674         "mulq    %[mult]\n"
22675         "addq    %%rax, %%rcx\n"
22676         "adcq    $0, %%rdx\n"
22677         "movq    40(%%rsi), %%rax\n"
22678         "addq    %%rcx, 32(%%rdi)\n"
22679         "adcq    $0, %%rdx\n"
22680         "movq    %%rdx, %%rcx\n"
22681         "mulq    %[mult]\n"
22682         "addq    %%rax, %%rcx\n"
22683         "adcq    $0, %%rdx\n"
22684         "movq    48(%%rsi), %%rax\n"
22685         "addq    %%rcx, 40(%%rdi)\n"
22686         "adcq    $0, %%rdx\n"
22687         "movq    %%rdx, %%rcx\n"
22688         "mulq    %[mult]\n"
22689         "addq    %%rax, %%rcx\n"
22690         "adcq    $0, %%rdx\n"
22691         "movq    56(%%rsi), %%rax\n"
22692         "addq    %%rcx, 48(%%rdi)\n"
22693         "adcq    $0, %%rdx\n"
22694         "movq    %%rdx, %%rcx\n"
22695         "mulq    %[mult]\n"
22696         "addq    %%rax, %%rcx\n"
22697         "adcq    $0, %%rdx\n"
22698         "movq    64(%%rsi), %%rax\n"
22699         "addq    %%rcx, 56(%%rdi)\n"
22700         "adcq    $0, %%rdx\n"
22701         "movq    %%rdx, %%rcx\n"
22702         "imulq    %[mult], %%rax\n"
22703         "addq    %%rcx, %%rax\n"
22704         "addq    %%rax, 64(%%rdi)\n"
22705     : [z] "+m" (z)
22706     : [mult] "r" (c), [x] "m" (x)
22707     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
22708 }
22709 
22710 /* x has 8.5 words, z has 9. c is 0.5 word.
22711  * Put (x*c) in z. No carry. */
22712 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
22713 static inline
mpfq_fixmp_8_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)22714 void mpfq_fixmp_8_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
22715 {
22716     __asm__ __volatile__(
22717         "movq    %[z], %%rdi\n"
22718         "movq    %[x], %%rsi\n"
22719         "movq    0(%%rsi), %%rax\n"
22720         "mulq    %[mult]\n"
22721         "movq    %%rax, 0(%%rdi)\n"
22722         "movq    8(%%rsi), %%rax\n"
22723         "movq    %%rdx, %%rcx\n"
22724         "mulq    %[mult]\n"
22725         "addq    %%rax, %%rcx\n"
22726         "adcq    $0, %%rdx\n"
22727         "movq    16(%%rsi), %%rax\n"
22728         "movq    %%rcx, 8(%%rdi)\n"
22729         "movq    %%rdx, %%rcx\n"
22730         "mulq    %[mult]\n"
22731         "addq    %%rax, %%rcx\n"
22732         "adcq    $0, %%rdx\n"
22733         "movq    24(%%rsi), %%rax\n"
22734         "movq    %%rcx, 16(%%rdi)\n"
22735         "movq    %%rdx, %%rcx\n"
22736         "mulq    %[mult]\n"
22737         "addq    %%rax, %%rcx\n"
22738         "adcq    $0, %%rdx\n"
22739         "movq    32(%%rsi), %%rax\n"
22740         "movq    %%rcx, 24(%%rdi)\n"
22741         "movq    %%rdx, %%rcx\n"
22742         "mulq    %[mult]\n"
22743         "addq    %%rax, %%rcx\n"
22744         "adcq    $0, %%rdx\n"
22745         "movq    40(%%rsi), %%rax\n"
22746         "movq    %%rcx, 32(%%rdi)\n"
22747         "movq    %%rdx, %%rcx\n"
22748         "mulq    %[mult]\n"
22749         "addq    %%rax, %%rcx\n"
22750         "adcq    $0, %%rdx\n"
22751         "movq    48(%%rsi), %%rax\n"
22752         "movq    %%rcx, 40(%%rdi)\n"
22753         "movq    %%rdx, %%rcx\n"
22754         "mulq    %[mult]\n"
22755         "addq    %%rax, %%rcx\n"
22756         "adcq    $0, %%rdx\n"
22757         "movq    56(%%rsi), %%rax\n"
22758         "movq    %%rcx, 48(%%rdi)\n"
22759         "movq    %%rdx, %%rcx\n"
22760         "mulq    %[mult]\n"
22761         "addq    %%rax, %%rcx\n"
22762         "adcq    $0, %%rdx\n"
22763         "movq    64(%%rsi), %%rax\n"
22764         "movq    %%rcx, 56(%%rdi)\n"
22765         "movq    %%rdx, %%rcx\n"
22766         "imulq    %[mult], %%rax\n"
22767         "addq    %%rcx, %%rax\n"
22768         "movq    %%rax, 64(%%rdi)\n"
22769     :
22770     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
22771     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
22772 }
22773 
22774 /* x, y, and z have 9.5 words. Result in z. Return carry bit */
22775 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
22776 static inline
mpfq_fixmp_9_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)22777 mp_limb_t mpfq_fixmp_9_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
22778 {
22779     mp_limb_t carry;
22780     __asm__ __volatile__(
22781         "movq    %[z], %%rdi\n"
22782         "movq    %[x], %%rsi\n"
22783         "movq    %[y], %%rdx\n"
22784         "movq    0(%%rsi), %%rax\n"
22785         "addq    0(%%rdx), %%rax\n"
22786         "movq    %%rax, 0(%%rdi)\n"
22787         "movq    8(%%rsi), %%rax\n"
22788         "adcq    8(%%rdx), %%rax\n"
22789         "movq    %%rax, 8(%%rdi)\n"
22790         "movq    16(%%rsi), %%rax\n"
22791         "adcq    16(%%rdx), %%rax\n"
22792         "movq    %%rax, 16(%%rdi)\n"
22793         "movq    24(%%rsi), %%rax\n"
22794         "adcq    24(%%rdx), %%rax\n"
22795         "movq    %%rax, 24(%%rdi)\n"
22796         "movq    32(%%rsi), %%rax\n"
22797         "adcq    32(%%rdx), %%rax\n"
22798         "movq    %%rax, 32(%%rdi)\n"
22799         "movq    40(%%rsi), %%rax\n"
22800         "adcq    40(%%rdx), %%rax\n"
22801         "movq    %%rax, 40(%%rdi)\n"
22802         "movq    48(%%rsi), %%rax\n"
22803         "adcq    48(%%rdx), %%rax\n"
22804         "movq    %%rax, 48(%%rdi)\n"
22805         "movq    56(%%rsi), %%rax\n"
22806         "adcq    56(%%rdx), %%rax\n"
22807         "movq    %%rax, 56(%%rdi)\n"
22808         "movq    64(%%rsi), %%rax\n"
22809         "adcq    64(%%rdx), %%rax\n"
22810         "movq    %%rax, 64(%%rdi)\n"
22811         "movq    72(%%rsi), %%rax\n"
22812         "adcq    72(%%rdx), %%rax\n"
22813         "movq    %%rax, 72(%%rdi)\n"
22814         "movq $0, %%rax\n"
22815         "adcq $0, %%rax\n"
22816     : "=&a"(carry)
22817     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
22818     : "%rdx", "%rsi", "%rdi", "memory");
22819     return carry;
22820 }
22821 
22822 /* x, y, and z have 9.5 words. Result in z. Return borrow bit */
22823 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
22824 static inline
mpfq_fixmp_9_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)22825 mp_limb_t mpfq_fixmp_9_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
22826 {
22827     mp_limb_t carry;
22828     __asm__ __volatile__(
22829         "movq    %[z], %%rdi\n"
22830         "movq    %[x], %%rsi\n"
22831         "movq    %[y], %%rdx\n"
22832         "movq    0(%%rsi), %%rax\n"
22833         "subq    0(%%rdx), %%rax\n"
22834         "movq    %%rax, 0(%%rdi)\n"
22835         "movq    8(%%rsi), %%rax\n"
22836         "sbbq    8(%%rdx), %%rax\n"
22837         "movq    %%rax, 8(%%rdi)\n"
22838         "movq    16(%%rsi), %%rax\n"
22839         "sbbq    16(%%rdx), %%rax\n"
22840         "movq    %%rax, 16(%%rdi)\n"
22841         "movq    24(%%rsi), %%rax\n"
22842         "sbbq    24(%%rdx), %%rax\n"
22843         "movq    %%rax, 24(%%rdi)\n"
22844         "movq    32(%%rsi), %%rax\n"
22845         "sbbq    32(%%rdx), %%rax\n"
22846         "movq    %%rax, 32(%%rdi)\n"
22847         "movq    40(%%rsi), %%rax\n"
22848         "sbbq    40(%%rdx), %%rax\n"
22849         "movq    %%rax, 40(%%rdi)\n"
22850         "movq    48(%%rsi), %%rax\n"
22851         "sbbq    48(%%rdx), %%rax\n"
22852         "movq    %%rax, 48(%%rdi)\n"
22853         "movq    56(%%rsi), %%rax\n"
22854         "sbbq    56(%%rdx), %%rax\n"
22855         "movq    %%rax, 56(%%rdi)\n"
22856         "movq    64(%%rsi), %%rax\n"
22857         "sbbq    64(%%rdx), %%rax\n"
22858         "movq    %%rax, 64(%%rdi)\n"
22859         "movq    72(%%rsi), %%rax\n"
22860         "sbbq    72(%%rdx), %%rax\n"
22861         "movq    %%rax, 72(%%rdi)\n"
22862         "movq $0, %%rax\n"
22863         "adcq $0, %%rax\n"
22864     : "=&a"(carry)
22865     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
22866     : "%rdx", "%rsi", "%rdi", "memory");
22867     return carry;
22868 }
22869 
22870 /* x, y, and z have 9.5 words. Result in z. Carry bit is lost. */
22871 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
22872 static inline
mpfq_fixmp_9_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)22873 void mpfq_fixmp_9_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
22874 {
22875     __asm__ __volatile__(
22876         "movq    %[z], %%rdi\n"
22877         "movq    %[x], %%rsi\n"
22878         "movq    %[y], %%rdx\n"
22879         "movq    0(%%rsi), %%rax\n"
22880         "addq    0(%%rdx), %%rax\n"
22881         "movq    %%rax, 0(%%rdi)\n"
22882         "movq    8(%%rsi), %%rax\n"
22883         "adcq    8(%%rdx), %%rax\n"
22884         "movq    %%rax, 8(%%rdi)\n"
22885         "movq    16(%%rsi), %%rax\n"
22886         "adcq    16(%%rdx), %%rax\n"
22887         "movq    %%rax, 16(%%rdi)\n"
22888         "movq    24(%%rsi), %%rax\n"
22889         "adcq    24(%%rdx), %%rax\n"
22890         "movq    %%rax, 24(%%rdi)\n"
22891         "movq    32(%%rsi), %%rax\n"
22892         "adcq    32(%%rdx), %%rax\n"
22893         "movq    %%rax, 32(%%rdi)\n"
22894         "movq    40(%%rsi), %%rax\n"
22895         "adcq    40(%%rdx), %%rax\n"
22896         "movq    %%rax, 40(%%rdi)\n"
22897         "movq    48(%%rsi), %%rax\n"
22898         "adcq    48(%%rdx), %%rax\n"
22899         "movq    %%rax, 48(%%rdi)\n"
22900         "movq    56(%%rsi), %%rax\n"
22901         "adcq    56(%%rdx), %%rax\n"
22902         "movq    %%rax, 56(%%rdi)\n"
22903         "movq    64(%%rsi), %%rax\n"
22904         "adcq    64(%%rdx), %%rax\n"
22905         "movq    %%rax, 64(%%rdi)\n"
22906         "movq    72(%%rsi), %%rax\n"
22907         "adcq    72(%%rdx), %%rax\n"
22908         "movq    %%rax, 72(%%rdi)\n"
22909     :
22910     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
22911     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
22912 }
22913 
22914 /* x, y, and z have 9.5 words. Result in z. Borrow bit is lost. */
22915 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
22916 static inline
mpfq_fixmp_9_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)22917 void mpfq_fixmp_9_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
22918 {
22919     __asm__ __volatile__(
22920         "movq    %[z], %%rdi\n"
22921         "movq    %[x], %%rsi\n"
22922         "movq    %[y], %%rdx\n"
22923         "movq    0(%%rsi), %%rax\n"
22924         "subq    0(%%rdx), %%rax\n"
22925         "movq    %%rax, 0(%%rdi)\n"
22926         "movq    8(%%rsi), %%rax\n"
22927         "sbbq    8(%%rdx), %%rax\n"
22928         "movq    %%rax, 8(%%rdi)\n"
22929         "movq    16(%%rsi), %%rax\n"
22930         "sbbq    16(%%rdx), %%rax\n"
22931         "movq    %%rax, 16(%%rdi)\n"
22932         "movq    24(%%rsi), %%rax\n"
22933         "sbbq    24(%%rdx), %%rax\n"
22934         "movq    %%rax, 24(%%rdi)\n"
22935         "movq    32(%%rsi), %%rax\n"
22936         "sbbq    32(%%rdx), %%rax\n"
22937         "movq    %%rax, 32(%%rdi)\n"
22938         "movq    40(%%rsi), %%rax\n"
22939         "sbbq    40(%%rdx), %%rax\n"
22940         "movq    %%rax, 40(%%rdi)\n"
22941         "movq    48(%%rsi), %%rax\n"
22942         "sbbq    48(%%rdx), %%rax\n"
22943         "movq    %%rax, 48(%%rdi)\n"
22944         "movq    56(%%rsi), %%rax\n"
22945         "sbbq    56(%%rdx), %%rax\n"
22946         "movq    %%rax, 56(%%rdi)\n"
22947         "movq    64(%%rsi), %%rax\n"
22948         "sbbq    64(%%rdx), %%rax\n"
22949         "movq    %%rax, 64(%%rdi)\n"
22950         "movq    72(%%rsi), %%rax\n"
22951         "sbbq    72(%%rdx), %%rax\n"
22952         "movq    %%rax, 72(%%rdi)\n"
22953     :
22954     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
22955     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
22956 }
22957 
22958 /* x has 9.5 words, z has 11.
22959  * Put (z+x*c) in z. Return carry bit. */
22960 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
22961 static inline
mpfq_fixmp_9_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)22962 mp_limb_t mpfq_fixmp_9_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
22963 {
22964     mp_limb_t carry;
22965     __asm__ __volatile__(
22966         "movq    %[z], %%rdi\n"
22967         "movq    %[x], %%rsi\n"
22968         "movq    0(%%rsi), %%rax\n"
22969         "mulq    %[mult]\n"
22970         "addq    %%rax, 0(%%rdi)\n"
22971         "movq    8(%%rsi), %%rax\n"
22972         "adcq    $0, %%rdx\n"
22973         "movq    %%rdx, %%rcx\n"
22974         "mulq    %[mult]\n"
22975         "addq    %%rax, %%rcx\n"
22976         "adcq    $0, %%rdx\n"
22977         "movq    16(%%rsi), %%rax\n"
22978         "addq    %%rcx, 8(%%rdi)\n"
22979         "adcq    $0, %%rdx\n"
22980         "movq    %%rdx, %%rcx\n"
22981         "mulq    %[mult]\n"
22982         "addq    %%rax, %%rcx\n"
22983         "adcq    $0, %%rdx\n"
22984         "movq    24(%%rsi), %%rax\n"
22985         "addq    %%rcx, 16(%%rdi)\n"
22986         "adcq    $0, %%rdx\n"
22987         "movq    %%rdx, %%rcx\n"
22988         "mulq    %[mult]\n"
22989         "addq    %%rax, %%rcx\n"
22990         "adcq    $0, %%rdx\n"
22991         "movq    32(%%rsi), %%rax\n"
22992         "addq    %%rcx, 24(%%rdi)\n"
22993         "adcq    $0, %%rdx\n"
22994         "movq    %%rdx, %%rcx\n"
22995         "mulq    %[mult]\n"
22996         "addq    %%rax, %%rcx\n"
22997         "adcq    $0, %%rdx\n"
22998         "movq    40(%%rsi), %%rax\n"
22999         "addq    %%rcx, 32(%%rdi)\n"
23000         "adcq    $0, %%rdx\n"
23001         "movq    %%rdx, %%rcx\n"
23002         "mulq    %[mult]\n"
23003         "addq    %%rax, %%rcx\n"
23004         "adcq    $0, %%rdx\n"
23005         "movq    48(%%rsi), %%rax\n"
23006         "addq    %%rcx, 40(%%rdi)\n"
23007         "adcq    $0, %%rdx\n"
23008         "movq    %%rdx, %%rcx\n"
23009         "mulq    %[mult]\n"
23010         "addq    %%rax, %%rcx\n"
23011         "adcq    $0, %%rdx\n"
23012         "movq    56(%%rsi), %%rax\n"
23013         "addq    %%rcx, 48(%%rdi)\n"
23014         "adcq    $0, %%rdx\n"
23015         "movq    %%rdx, %%rcx\n"
23016         "mulq    %[mult]\n"
23017         "addq    %%rax, %%rcx\n"
23018         "adcq    $0, %%rdx\n"
23019         "movq    64(%%rsi), %%rax\n"
23020         "addq    %%rcx, 56(%%rdi)\n"
23021         "adcq    $0, %%rdx\n"
23022         "movq    %%rdx, %%rcx\n"
23023         "mulq    %[mult]\n"
23024         "addq    %%rax, %%rcx\n"
23025         "adcq    $0, %%rdx\n"
23026         "movq    72(%%rsi), %%rax\n"
23027         "addq    %%rcx, 64(%%rdi)\n"
23028         "adcq    $0, %%rdx\n"
23029         "movq    %%rdx, %%rcx\n"
23030         "mulq    %[mult]\n"
23031         "addq    %%rax, %%rcx\n"
23032         "adcq    $0, %%rdx\n"
23033         "addq    %%rcx, 72(%%rdi)\n"
23034         "adcq    $0, %%rdx\n"
23035         "xorq    %%rcx, %%rcx\n"
23036         "addq    %%rdx, 80(%%rdi)\n"
23037         "adcq    $0, %%rcx\n"
23038         "movq    %%rcx, %[carry]\n"
23039     : [carry]"=g"(carry), [z] "+m" (z)
23040     : [mult] "r" (c), [x] "m" (x)
23041     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
23042     return carry;
23043 }
23044 
23045 /* x has 9.5 words, z has 11.
23046  * Put (z+x*c) in z. Carry bit is lost. */
23047 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
23048 static inline
mpfq_fixmp_9_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)23049 void mpfq_fixmp_9_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
23050 {
23051     __asm__ __volatile__(
23052         "movq    %[z], %%rdi\n"
23053         "movq    %[x], %%rsi\n"
23054         "movq    0(%%rsi), %%rax\n"
23055         "mulq    %[mult]\n"
23056         "addq    %%rax, 0(%%rdi)\n"
23057         "movq    8(%%rsi), %%rax\n"
23058         "adcq    $0, %%rdx\n"
23059         "movq    %%rdx, %%rcx\n"
23060         "mulq    %[mult]\n"
23061         "addq    %%rax, %%rcx\n"
23062         "adcq    $0, %%rdx\n"
23063         "movq    16(%%rsi), %%rax\n"
23064         "addq    %%rcx, 8(%%rdi)\n"
23065         "adcq    $0, %%rdx\n"
23066         "movq    %%rdx, %%rcx\n"
23067         "mulq    %[mult]\n"
23068         "addq    %%rax, %%rcx\n"
23069         "adcq    $0, %%rdx\n"
23070         "movq    24(%%rsi), %%rax\n"
23071         "addq    %%rcx, 16(%%rdi)\n"
23072         "adcq    $0, %%rdx\n"
23073         "movq    %%rdx, %%rcx\n"
23074         "mulq    %[mult]\n"
23075         "addq    %%rax, %%rcx\n"
23076         "adcq    $0, %%rdx\n"
23077         "movq    32(%%rsi), %%rax\n"
23078         "addq    %%rcx, 24(%%rdi)\n"
23079         "adcq    $0, %%rdx\n"
23080         "movq    %%rdx, %%rcx\n"
23081         "mulq    %[mult]\n"
23082         "addq    %%rax, %%rcx\n"
23083         "adcq    $0, %%rdx\n"
23084         "movq    40(%%rsi), %%rax\n"
23085         "addq    %%rcx, 32(%%rdi)\n"
23086         "adcq    $0, %%rdx\n"
23087         "movq    %%rdx, %%rcx\n"
23088         "mulq    %[mult]\n"
23089         "addq    %%rax, %%rcx\n"
23090         "adcq    $0, %%rdx\n"
23091         "movq    48(%%rsi), %%rax\n"
23092         "addq    %%rcx, 40(%%rdi)\n"
23093         "adcq    $0, %%rdx\n"
23094         "movq    %%rdx, %%rcx\n"
23095         "mulq    %[mult]\n"
23096         "addq    %%rax, %%rcx\n"
23097         "adcq    $0, %%rdx\n"
23098         "movq    56(%%rsi), %%rax\n"
23099         "addq    %%rcx, 48(%%rdi)\n"
23100         "adcq    $0, %%rdx\n"
23101         "movq    %%rdx, %%rcx\n"
23102         "mulq    %[mult]\n"
23103         "addq    %%rax, %%rcx\n"
23104         "adcq    $0, %%rdx\n"
23105         "movq    64(%%rsi), %%rax\n"
23106         "addq    %%rcx, 56(%%rdi)\n"
23107         "adcq    $0, %%rdx\n"
23108         "movq    %%rdx, %%rcx\n"
23109         "mulq    %[mult]\n"
23110         "addq    %%rax, %%rcx\n"
23111         "adcq    $0, %%rdx\n"
23112         "movq    72(%%rsi), %%rax\n"
23113         "addq    %%rcx, 64(%%rdi)\n"
23114         "adcq    $0, %%rdx\n"
23115         "movq    %%rdx, %%rcx\n"
23116         "mulq    %[mult]\n"
23117         "addq    %%rax, %%rcx\n"
23118         "adcq    $0, %%rdx\n"
23119         "addq    %%rcx, 72(%%rdi)\n"
23120         "adcq    $0, %%rdx\n"
23121         "addq    %%rdx, 80(%%rdi)\n"
23122     : [z] "+m" (z)
23123     : [mult] "r" (c), [x] "m" (x)
23124     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
23125 }
23126 
23127 /* x has 9.5 words, z has 10.
23128  * Put (z+x*c) in z. Return carry word. */
23129 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
23130 static inline
mpfq_fixmp_9_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)23131 mp_limb_t mpfq_fixmp_9_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
23132 {
23133     mp_limb_t carry;
23134     __asm__ __volatile__(
23135         "movq    %[z], %%rdi\n"
23136         "movq    %[x], %%rsi\n"
23137         "movq    0(%%rsi), %%rax\n"
23138         "mulq    %[mult]\n"
23139         "addq    %%rax, 0(%%rdi)\n"
23140         "movq    8(%%rsi), %%rax\n"
23141         "adcq    $0, %%rdx\n"
23142         "movq    %%rdx, %%rcx\n"
23143         "mulq    %[mult]\n"
23144         "addq    %%rax, %%rcx\n"
23145         "adcq    $0, %%rdx\n"
23146         "movq    16(%%rsi), %%rax\n"
23147         "addq    %%rcx, 8(%%rdi)\n"
23148         "adcq    $0, %%rdx\n"
23149         "movq    %%rdx, %%rcx\n"
23150         "mulq    %[mult]\n"
23151         "addq    %%rax, %%rcx\n"
23152         "adcq    $0, %%rdx\n"
23153         "movq    24(%%rsi), %%rax\n"
23154         "addq    %%rcx, 16(%%rdi)\n"
23155         "adcq    $0, %%rdx\n"
23156         "movq    %%rdx, %%rcx\n"
23157         "mulq    %[mult]\n"
23158         "addq    %%rax, %%rcx\n"
23159         "adcq    $0, %%rdx\n"
23160         "movq    32(%%rsi), %%rax\n"
23161         "addq    %%rcx, 24(%%rdi)\n"
23162         "adcq    $0, %%rdx\n"
23163         "movq    %%rdx, %%rcx\n"
23164         "mulq    %[mult]\n"
23165         "addq    %%rax, %%rcx\n"
23166         "adcq    $0, %%rdx\n"
23167         "movq    40(%%rsi), %%rax\n"
23168         "addq    %%rcx, 32(%%rdi)\n"
23169         "adcq    $0, %%rdx\n"
23170         "movq    %%rdx, %%rcx\n"
23171         "mulq    %[mult]\n"
23172         "addq    %%rax, %%rcx\n"
23173         "adcq    $0, %%rdx\n"
23174         "movq    48(%%rsi), %%rax\n"
23175         "addq    %%rcx, 40(%%rdi)\n"
23176         "adcq    $0, %%rdx\n"
23177         "movq    %%rdx, %%rcx\n"
23178         "mulq    %[mult]\n"
23179         "addq    %%rax, %%rcx\n"
23180         "adcq    $0, %%rdx\n"
23181         "movq    56(%%rsi), %%rax\n"
23182         "addq    %%rcx, 48(%%rdi)\n"
23183         "adcq    $0, %%rdx\n"
23184         "movq    %%rdx, %%rcx\n"
23185         "mulq    %[mult]\n"
23186         "addq    %%rax, %%rcx\n"
23187         "adcq    $0, %%rdx\n"
23188         "movq    64(%%rsi), %%rax\n"
23189         "addq    %%rcx, 56(%%rdi)\n"
23190         "adcq    $0, %%rdx\n"
23191         "movq    %%rdx, %%rcx\n"
23192         "mulq    %[mult]\n"
23193         "addq    %%rax, %%rcx\n"
23194         "adcq    $0, %%rdx\n"
23195         "movq    72(%%rsi), %%rax\n"
23196         "addq    %%rcx, 64(%%rdi)\n"
23197         "adcq    $0, %%rdx\n"
23198         "movq    %%rdx, %%rcx\n"
23199         "mulq    %[mult]\n"
23200         "addq    %%rax, %%rcx\n"
23201         "adcq    $0, %%rdx\n"
23202         "addq    %%rcx, 72(%%rdi)\n"
23203         "adcq    $0, %%rdx\n"
23204         "movq    %%rdx, %[carry]\n"
23205     : [carry]"=g"(carry), [z] "+m" (z)
23206     : [mult] "r" (c), [x] "m" (x)
23207     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
23208     return carry;
23209 }
23210 
23211 /* x and y have 9.5 words, z has 19. Put x*y in z. */
23212 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
23213 static inline
mpfq_fixmp_9_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)23214 void mpfq_fixmp_9_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
23215 {
23216     __asm__ __volatile__(
23217         "### x*y[0]\n"
23218         "movq    %2, %%r8\n"
23219         "movq    %0, %%rdi\n"
23220         "movq    0(%%r8), %%r9\n"
23221         "movq    %1, %%rsi\n"
23222         "movq    0(%%rsi), %%rax\n"
23223         "mulq    %%r9\n"
23224         "movq    %%rax, 0(%%rdi)\n"
23225         "movq    8(%%rsi), %%rax\n"
23226         "movq    %%rdx, %%rcx\n"
23227         "mulq    %%r9\n"
23228         "addq    %%rax, %%rcx\n"
23229         "adcq    $0, %%rdx\n"
23230         "movq    16(%%rsi), %%rax\n"
23231         "movq    %%rcx, 8(%%rdi)\n"
23232         "movq    %%rdx, %%rcx\n"
23233         "mulq    %%r9\n"
23234         "addq    %%rax, %%rcx\n"
23235         "adcq    $0, %%rdx\n"
23236         "movq    24(%%rsi), %%rax\n"
23237         "movq    %%rcx, 16(%%rdi)\n"
23238         "movq    %%rdx, %%rcx\n"
23239         "mulq    %%r9\n"
23240         "addq    %%rax, %%rcx\n"
23241         "adcq    $0, %%rdx\n"
23242         "movq    32(%%rsi), %%rax\n"
23243         "movq    %%rcx, 24(%%rdi)\n"
23244         "movq    %%rdx, %%rcx\n"
23245         "mulq    %%r9\n"
23246         "addq    %%rax, %%rcx\n"
23247         "adcq    $0, %%rdx\n"
23248         "movq    40(%%rsi), %%rax\n"
23249         "movq    %%rcx, 32(%%rdi)\n"
23250         "movq    %%rdx, %%rcx\n"
23251         "mulq    %%r9\n"
23252         "addq    %%rax, %%rcx\n"
23253         "adcq    $0, %%rdx\n"
23254         "movq    48(%%rsi), %%rax\n"
23255         "movq    %%rcx, 40(%%rdi)\n"
23256         "movq    %%rdx, %%rcx\n"
23257         "mulq    %%r9\n"
23258         "addq    %%rax, %%rcx\n"
23259         "adcq    $0, %%rdx\n"
23260         "movq    56(%%rsi), %%rax\n"
23261         "movq    %%rcx, 48(%%rdi)\n"
23262         "movq    %%rdx, %%rcx\n"
23263         "mulq    %%r9\n"
23264         "addq    %%rax, %%rcx\n"
23265         "adcq    $0, %%rdx\n"
23266         "movq    64(%%rsi), %%rax\n"
23267         "movq    %%rcx, 56(%%rdi)\n"
23268         "movq    %%rdx, %%rcx\n"
23269         "mulq    %%r9\n"
23270         "addq    %%rax, %%rcx\n"
23271         "adcq    $0, %%rdx\n"
23272         "movq    72(%%rsi), %%rax\n"
23273         "movq    %%rcx, 64(%%rdi)\n"
23274         "movq    %%rdx, %%rcx\n"
23275         "mulq    %%r9\n"
23276         "addq    %%rax, %%rcx\n"
23277         "adcq    $0, %%rdx\n"
23278         "movq    %%rcx, 72(%%rdi)\n"
23279         "movq    %%rdx, 80(%%rdi)\n"
23280         "movq    $0, 88(%%rdi)\n"
23281         "movq    $0, 96(%%rdi)\n"
23282         "movq    $0, 104(%%rdi)\n"
23283         "movq    $0, 112(%%rdi)\n"
23284         "movq    $0, 120(%%rdi)\n"
23285         "movq    $0, 128(%%rdi)\n"
23286         "movq    $0, 136(%%rdi)\n"
23287         "movq    $0, 144(%%rdi)\n"
23288         "### x*y[1]\n"
23289         "movq    8(%%r8), %%r9\n"
23290         "movq    0(%%rsi), %%rax\n"
23291         "mulq    %%r9\n"
23292         "addq    %%rax, 8(%%rdi)\n"
23293         "movq    8(%%rsi), %%rax\n"
23294         "adcq    $0, %%rdx\n"
23295         "movq    %%rdx, %%rcx\n"
23296         "mulq    %%r9\n"
23297         "addq    %%rax, %%rcx\n"
23298         "adcq    $0, %%rdx\n"
23299         "movq    16(%%rsi), %%rax\n"
23300         "addq    %%rcx, 16(%%rdi)\n"
23301         "adcq    $0, %%rdx\n"
23302         "movq    %%rdx, %%rcx\n"
23303         "mulq    %%r9\n"
23304         "addq    %%rax, %%rcx\n"
23305         "adcq    $0, %%rdx\n"
23306         "movq    24(%%rsi), %%rax\n"
23307         "addq    %%rcx, 24(%%rdi)\n"
23308         "adcq    $0, %%rdx\n"
23309         "movq    %%rdx, %%rcx\n"
23310         "mulq    %%r9\n"
23311         "addq    %%rax, %%rcx\n"
23312         "adcq    $0, %%rdx\n"
23313         "movq    32(%%rsi), %%rax\n"
23314         "addq    %%rcx, 32(%%rdi)\n"
23315         "adcq    $0, %%rdx\n"
23316         "movq    %%rdx, %%rcx\n"
23317         "mulq    %%r9\n"
23318         "addq    %%rax, %%rcx\n"
23319         "adcq    $0, %%rdx\n"
23320         "movq    40(%%rsi), %%rax\n"
23321         "addq    %%rcx, 40(%%rdi)\n"
23322         "adcq    $0, %%rdx\n"
23323         "movq    %%rdx, %%rcx\n"
23324         "mulq    %%r9\n"
23325         "addq    %%rax, %%rcx\n"
23326         "adcq    $0, %%rdx\n"
23327         "movq    48(%%rsi), %%rax\n"
23328         "addq    %%rcx, 48(%%rdi)\n"
23329         "adcq    $0, %%rdx\n"
23330         "movq    %%rdx, %%rcx\n"
23331         "mulq    %%r9\n"
23332         "addq    %%rax, %%rcx\n"
23333         "adcq    $0, %%rdx\n"
23334         "movq    56(%%rsi), %%rax\n"
23335         "addq    %%rcx, 56(%%rdi)\n"
23336         "adcq    $0, %%rdx\n"
23337         "movq    %%rdx, %%rcx\n"
23338         "mulq    %%r9\n"
23339         "addq    %%rax, %%rcx\n"
23340         "adcq    $0, %%rdx\n"
23341         "movq    64(%%rsi), %%rax\n"
23342         "addq    %%rcx, 64(%%rdi)\n"
23343         "adcq    $0, %%rdx\n"
23344         "movq    %%rdx, %%rcx\n"
23345         "mulq    %%r9\n"
23346         "addq    %%rax, %%rcx\n"
23347         "adcq    $0, %%rdx\n"
23348         "movq    72(%%rsi), %%rax\n"
23349         "addq    %%rcx, 72(%%rdi)\n"
23350         "adcq    $0, %%rdx\n"
23351         "movq    %%rdx, %%rcx\n"
23352         "mulq    %%r9\n"
23353         "addq    %%rax, %%rcx\n"
23354         "adcq    $0, %%rdx\n"
23355         "addq    %%rcx, 80(%%rdi)\n"
23356         "adcq    $0, %%rdx\n"
23357         "movq    %%rdx, 88(%%rdi)\n"
23358         "### x*y[2]\n"
23359         "movq    16(%%r8), %%r9\n"
23360         "movq    0(%%rsi), %%rax\n"
23361         "mulq    %%r9\n"
23362         "addq    %%rax, 16(%%rdi)\n"
23363         "movq    8(%%rsi), %%rax\n"
23364         "adcq    $0, %%rdx\n"
23365         "movq    %%rdx, %%rcx\n"
23366         "mulq    %%r9\n"
23367         "addq    %%rax, %%rcx\n"
23368         "adcq    $0, %%rdx\n"
23369         "movq    16(%%rsi), %%rax\n"
23370         "addq    %%rcx, 24(%%rdi)\n"
23371         "adcq    $0, %%rdx\n"
23372         "movq    %%rdx, %%rcx\n"
23373         "mulq    %%r9\n"
23374         "addq    %%rax, %%rcx\n"
23375         "adcq    $0, %%rdx\n"
23376         "movq    24(%%rsi), %%rax\n"
23377         "addq    %%rcx, 32(%%rdi)\n"
23378         "adcq    $0, %%rdx\n"
23379         "movq    %%rdx, %%rcx\n"
23380         "mulq    %%r9\n"
23381         "addq    %%rax, %%rcx\n"
23382         "adcq    $0, %%rdx\n"
23383         "movq    32(%%rsi), %%rax\n"
23384         "addq    %%rcx, 40(%%rdi)\n"
23385         "adcq    $0, %%rdx\n"
23386         "movq    %%rdx, %%rcx\n"
23387         "mulq    %%r9\n"
23388         "addq    %%rax, %%rcx\n"
23389         "adcq    $0, %%rdx\n"
23390         "movq    40(%%rsi), %%rax\n"
23391         "addq    %%rcx, 48(%%rdi)\n"
23392         "adcq    $0, %%rdx\n"
23393         "movq    %%rdx, %%rcx\n"
23394         "mulq    %%r9\n"
23395         "addq    %%rax, %%rcx\n"
23396         "adcq    $0, %%rdx\n"
23397         "movq    48(%%rsi), %%rax\n"
23398         "addq    %%rcx, 56(%%rdi)\n"
23399         "adcq    $0, %%rdx\n"
23400         "movq    %%rdx, %%rcx\n"
23401         "mulq    %%r9\n"
23402         "addq    %%rax, %%rcx\n"
23403         "adcq    $0, %%rdx\n"
23404         "movq    56(%%rsi), %%rax\n"
23405         "addq    %%rcx, 64(%%rdi)\n"
23406         "adcq    $0, %%rdx\n"
23407         "movq    %%rdx, %%rcx\n"
23408         "mulq    %%r9\n"
23409         "addq    %%rax, %%rcx\n"
23410         "adcq    $0, %%rdx\n"
23411         "movq    64(%%rsi), %%rax\n"
23412         "addq    %%rcx, 72(%%rdi)\n"
23413         "adcq    $0, %%rdx\n"
23414         "movq    %%rdx, %%rcx\n"
23415         "mulq    %%r9\n"
23416         "addq    %%rax, %%rcx\n"
23417         "adcq    $0, %%rdx\n"
23418         "movq    72(%%rsi), %%rax\n"
23419         "addq    %%rcx, 80(%%rdi)\n"
23420         "adcq    $0, %%rdx\n"
23421         "movq    %%rdx, %%rcx\n"
23422         "mulq    %%r9\n"
23423         "addq    %%rax, %%rcx\n"
23424         "adcq    $0, %%rdx\n"
23425         "addq    %%rcx, 88(%%rdi)\n"
23426         "adcq    $0, %%rdx\n"
23427         "movq    %%rdx, 96(%%rdi)\n"
23428         "### x*y[3]\n"
23429         "movq    24(%%r8), %%r9\n"
23430         "movq    0(%%rsi), %%rax\n"
23431         "mulq    %%r9\n"
23432         "addq    %%rax, 24(%%rdi)\n"
23433         "movq    8(%%rsi), %%rax\n"
23434         "adcq    $0, %%rdx\n"
23435         "movq    %%rdx, %%rcx\n"
23436         "mulq    %%r9\n"
23437         "addq    %%rax, %%rcx\n"
23438         "adcq    $0, %%rdx\n"
23439         "movq    16(%%rsi), %%rax\n"
23440         "addq    %%rcx, 32(%%rdi)\n"
23441         "adcq    $0, %%rdx\n"
23442         "movq    %%rdx, %%rcx\n"
23443         "mulq    %%r9\n"
23444         "addq    %%rax, %%rcx\n"
23445         "adcq    $0, %%rdx\n"
23446         "movq    24(%%rsi), %%rax\n"
23447         "addq    %%rcx, 40(%%rdi)\n"
23448         "adcq    $0, %%rdx\n"
23449         "movq    %%rdx, %%rcx\n"
23450         "mulq    %%r9\n"
23451         "addq    %%rax, %%rcx\n"
23452         "adcq    $0, %%rdx\n"
23453         "movq    32(%%rsi), %%rax\n"
23454         "addq    %%rcx, 48(%%rdi)\n"
23455         "adcq    $0, %%rdx\n"
23456         "movq    %%rdx, %%rcx\n"
23457         "mulq    %%r9\n"
23458         "addq    %%rax, %%rcx\n"
23459         "adcq    $0, %%rdx\n"
23460         "movq    40(%%rsi), %%rax\n"
23461         "addq    %%rcx, 56(%%rdi)\n"
23462         "adcq    $0, %%rdx\n"
23463         "movq    %%rdx, %%rcx\n"
23464         "mulq    %%r9\n"
23465         "addq    %%rax, %%rcx\n"
23466         "adcq    $0, %%rdx\n"
23467         "movq    48(%%rsi), %%rax\n"
23468         "addq    %%rcx, 64(%%rdi)\n"
23469         "adcq    $0, %%rdx\n"
23470         "movq    %%rdx, %%rcx\n"
23471         "mulq    %%r9\n"
23472         "addq    %%rax, %%rcx\n"
23473         "adcq    $0, %%rdx\n"
23474         "movq    56(%%rsi), %%rax\n"
23475         "addq    %%rcx, 72(%%rdi)\n"
23476         "adcq    $0, %%rdx\n"
23477         "movq    %%rdx, %%rcx\n"
23478         "mulq    %%r9\n"
23479         "addq    %%rax, %%rcx\n"
23480         "adcq    $0, %%rdx\n"
23481         "movq    64(%%rsi), %%rax\n"
23482         "addq    %%rcx, 80(%%rdi)\n"
23483         "adcq    $0, %%rdx\n"
23484         "movq    %%rdx, %%rcx\n"
23485         "mulq    %%r9\n"
23486         "addq    %%rax, %%rcx\n"
23487         "adcq    $0, %%rdx\n"
23488         "movq    72(%%rsi), %%rax\n"
23489         "addq    %%rcx, 88(%%rdi)\n"
23490         "adcq    $0, %%rdx\n"
23491         "movq    %%rdx, %%rcx\n"
23492         "mulq    %%r9\n"
23493         "addq    %%rax, %%rcx\n"
23494         "adcq    $0, %%rdx\n"
23495         "addq    %%rcx, 96(%%rdi)\n"
23496         "adcq    $0, %%rdx\n"
23497         "movq    %%rdx, 104(%%rdi)\n"
23498         "### x*y[4]\n"
23499         "movq    32(%%r8), %%r9\n"
23500         "movq    0(%%rsi), %%rax\n"
23501         "mulq    %%r9\n"
23502         "addq    %%rax, 32(%%rdi)\n"
23503         "movq    8(%%rsi), %%rax\n"
23504         "adcq    $0, %%rdx\n"
23505         "movq    %%rdx, %%rcx\n"
23506         "mulq    %%r9\n"
23507         "addq    %%rax, %%rcx\n"
23508         "adcq    $0, %%rdx\n"
23509         "movq    16(%%rsi), %%rax\n"
23510         "addq    %%rcx, 40(%%rdi)\n"
23511         "adcq    $0, %%rdx\n"
23512         "movq    %%rdx, %%rcx\n"
23513         "mulq    %%r9\n"
23514         "addq    %%rax, %%rcx\n"
23515         "adcq    $0, %%rdx\n"
23516         "movq    24(%%rsi), %%rax\n"
23517         "addq    %%rcx, 48(%%rdi)\n"
23518         "adcq    $0, %%rdx\n"
23519         "movq    %%rdx, %%rcx\n"
23520         "mulq    %%r9\n"
23521         "addq    %%rax, %%rcx\n"
23522         "adcq    $0, %%rdx\n"
23523         "movq    32(%%rsi), %%rax\n"
23524         "addq    %%rcx, 56(%%rdi)\n"
23525         "adcq    $0, %%rdx\n"
23526         "movq    %%rdx, %%rcx\n"
23527         "mulq    %%r9\n"
23528         "addq    %%rax, %%rcx\n"
23529         "adcq    $0, %%rdx\n"
23530         "movq    40(%%rsi), %%rax\n"
23531         "addq    %%rcx, 64(%%rdi)\n"
23532         "adcq    $0, %%rdx\n"
23533         "movq    %%rdx, %%rcx\n"
23534         "mulq    %%r9\n"
23535         "addq    %%rax, %%rcx\n"
23536         "adcq    $0, %%rdx\n"
23537         "movq    48(%%rsi), %%rax\n"
23538         "addq    %%rcx, 72(%%rdi)\n"
23539         "adcq    $0, %%rdx\n"
23540         "movq    %%rdx, %%rcx\n"
23541         "mulq    %%r9\n"
23542         "addq    %%rax, %%rcx\n"
23543         "adcq    $0, %%rdx\n"
23544         "movq    56(%%rsi), %%rax\n"
23545         "addq    %%rcx, 80(%%rdi)\n"
23546         "adcq    $0, %%rdx\n"
23547         "movq    %%rdx, %%rcx\n"
23548         "mulq    %%r9\n"
23549         "addq    %%rax, %%rcx\n"
23550         "adcq    $0, %%rdx\n"
23551         "movq    64(%%rsi), %%rax\n"
23552         "addq    %%rcx, 88(%%rdi)\n"
23553         "adcq    $0, %%rdx\n"
23554         "movq    %%rdx, %%rcx\n"
23555         "mulq    %%r9\n"
23556         "addq    %%rax, %%rcx\n"
23557         "adcq    $0, %%rdx\n"
23558         "movq    72(%%rsi), %%rax\n"
23559         "addq    %%rcx, 96(%%rdi)\n"
23560         "adcq    $0, %%rdx\n"
23561         "movq    %%rdx, %%rcx\n"
23562         "mulq    %%r9\n"
23563         "addq    %%rax, %%rcx\n"
23564         "adcq    $0, %%rdx\n"
23565         "addq    %%rcx, 104(%%rdi)\n"
23566         "adcq    $0, %%rdx\n"
23567         "movq    %%rdx, 112(%%rdi)\n"
23568         "### x*y[5]\n"
23569         "movq    40(%%r8), %%r9\n"
23570         "movq    0(%%rsi), %%rax\n"
23571         "mulq    %%r9\n"
23572         "addq    %%rax, 40(%%rdi)\n"
23573         "movq    8(%%rsi), %%rax\n"
23574         "adcq    $0, %%rdx\n"
23575         "movq    %%rdx, %%rcx\n"
23576         "mulq    %%r9\n"
23577         "addq    %%rax, %%rcx\n"
23578         "adcq    $0, %%rdx\n"
23579         "movq    16(%%rsi), %%rax\n"
23580         "addq    %%rcx, 48(%%rdi)\n"
23581         "adcq    $0, %%rdx\n"
23582         "movq    %%rdx, %%rcx\n"
23583         "mulq    %%r9\n"
23584         "addq    %%rax, %%rcx\n"
23585         "adcq    $0, %%rdx\n"
23586         "movq    24(%%rsi), %%rax\n"
23587         "addq    %%rcx, 56(%%rdi)\n"
23588         "adcq    $0, %%rdx\n"
23589         "movq    %%rdx, %%rcx\n"
23590         "mulq    %%r9\n"
23591         "addq    %%rax, %%rcx\n"
23592         "adcq    $0, %%rdx\n"
23593         "movq    32(%%rsi), %%rax\n"
23594         "addq    %%rcx, 64(%%rdi)\n"
23595         "adcq    $0, %%rdx\n"
23596         "movq    %%rdx, %%rcx\n"
23597         "mulq    %%r9\n"
23598         "addq    %%rax, %%rcx\n"
23599         "adcq    $0, %%rdx\n"
23600         "movq    40(%%rsi), %%rax\n"
23601         "addq    %%rcx, 72(%%rdi)\n"
23602         "adcq    $0, %%rdx\n"
23603         "movq    %%rdx, %%rcx\n"
23604         "mulq    %%r9\n"
23605         "addq    %%rax, %%rcx\n"
23606         "adcq    $0, %%rdx\n"
23607         "movq    48(%%rsi), %%rax\n"
23608         "addq    %%rcx, 80(%%rdi)\n"
23609         "adcq    $0, %%rdx\n"
23610         "movq    %%rdx, %%rcx\n"
23611         "mulq    %%r9\n"
23612         "addq    %%rax, %%rcx\n"
23613         "adcq    $0, %%rdx\n"
23614         "movq    56(%%rsi), %%rax\n"
23615         "addq    %%rcx, 88(%%rdi)\n"
23616         "adcq    $0, %%rdx\n"
23617         "movq    %%rdx, %%rcx\n"
23618         "mulq    %%r9\n"
23619         "addq    %%rax, %%rcx\n"
23620         "adcq    $0, %%rdx\n"
23621         "movq    64(%%rsi), %%rax\n"
23622         "addq    %%rcx, 96(%%rdi)\n"
23623         "adcq    $0, %%rdx\n"
23624         "movq    %%rdx, %%rcx\n"
23625         "mulq    %%r9\n"
23626         "addq    %%rax, %%rcx\n"
23627         "adcq    $0, %%rdx\n"
23628         "movq    72(%%rsi), %%rax\n"
23629         "addq    %%rcx, 104(%%rdi)\n"
23630         "adcq    $0, %%rdx\n"
23631         "movq    %%rdx, %%rcx\n"
23632         "mulq    %%r9\n"
23633         "addq    %%rax, %%rcx\n"
23634         "adcq    $0, %%rdx\n"
23635         "addq    %%rcx, 112(%%rdi)\n"
23636         "adcq    $0, %%rdx\n"
23637         "movq    %%rdx, 120(%%rdi)\n"
23638         "### x*y[6]\n"
23639         "movq    48(%%r8), %%r9\n"
23640         "movq    0(%%rsi), %%rax\n"
23641         "mulq    %%r9\n"
23642         "addq    %%rax, 48(%%rdi)\n"
23643         "movq    8(%%rsi), %%rax\n"
23644         "adcq    $0, %%rdx\n"
23645         "movq    %%rdx, %%rcx\n"
23646         "mulq    %%r9\n"
23647         "addq    %%rax, %%rcx\n"
23648         "adcq    $0, %%rdx\n"
23649         "movq    16(%%rsi), %%rax\n"
23650         "addq    %%rcx, 56(%%rdi)\n"
23651         "adcq    $0, %%rdx\n"
23652         "movq    %%rdx, %%rcx\n"
23653         "mulq    %%r9\n"
23654         "addq    %%rax, %%rcx\n"
23655         "adcq    $0, %%rdx\n"
23656         "movq    24(%%rsi), %%rax\n"
23657         "addq    %%rcx, 64(%%rdi)\n"
23658         "adcq    $0, %%rdx\n"
23659         "movq    %%rdx, %%rcx\n"
23660         "mulq    %%r9\n"
23661         "addq    %%rax, %%rcx\n"
23662         "adcq    $0, %%rdx\n"
23663         "movq    32(%%rsi), %%rax\n"
23664         "addq    %%rcx, 72(%%rdi)\n"
23665         "adcq    $0, %%rdx\n"
23666         "movq    %%rdx, %%rcx\n"
23667         "mulq    %%r9\n"
23668         "addq    %%rax, %%rcx\n"
23669         "adcq    $0, %%rdx\n"
23670         "movq    40(%%rsi), %%rax\n"
23671         "addq    %%rcx, 80(%%rdi)\n"
23672         "adcq    $0, %%rdx\n"
23673         "movq    %%rdx, %%rcx\n"
23674         "mulq    %%r9\n"
23675         "addq    %%rax, %%rcx\n"
23676         "adcq    $0, %%rdx\n"
23677         "movq    48(%%rsi), %%rax\n"
23678         "addq    %%rcx, 88(%%rdi)\n"
23679         "adcq    $0, %%rdx\n"
23680         "movq    %%rdx, %%rcx\n"
23681         "mulq    %%r9\n"
23682         "addq    %%rax, %%rcx\n"
23683         "adcq    $0, %%rdx\n"
23684         "movq    56(%%rsi), %%rax\n"
23685         "addq    %%rcx, 96(%%rdi)\n"
23686         "adcq    $0, %%rdx\n"
23687         "movq    %%rdx, %%rcx\n"
23688         "mulq    %%r9\n"
23689         "addq    %%rax, %%rcx\n"
23690         "adcq    $0, %%rdx\n"
23691         "movq    64(%%rsi), %%rax\n"
23692         "addq    %%rcx, 104(%%rdi)\n"
23693         "adcq    $0, %%rdx\n"
23694         "movq    %%rdx, %%rcx\n"
23695         "mulq    %%r9\n"
23696         "addq    %%rax, %%rcx\n"
23697         "adcq    $0, %%rdx\n"
23698         "movq    72(%%rsi), %%rax\n"
23699         "addq    %%rcx, 112(%%rdi)\n"
23700         "adcq    $0, %%rdx\n"
23701         "movq    %%rdx, %%rcx\n"
23702         "mulq    %%r9\n"
23703         "addq    %%rax, %%rcx\n"
23704         "adcq    $0, %%rdx\n"
23705         "addq    %%rcx, 120(%%rdi)\n"
23706         "adcq    $0, %%rdx\n"
23707         "movq    %%rdx, 128(%%rdi)\n"
23708         "### x*y[7]\n"
23709         "movq    56(%%r8), %%r9\n"
23710         "movq    0(%%rsi), %%rax\n"
23711         "mulq    %%r9\n"
23712         "addq    %%rax, 56(%%rdi)\n"
23713         "movq    8(%%rsi), %%rax\n"
23714         "adcq    $0, %%rdx\n"
23715         "movq    %%rdx, %%rcx\n"
23716         "mulq    %%r9\n"
23717         "addq    %%rax, %%rcx\n"
23718         "adcq    $0, %%rdx\n"
23719         "movq    16(%%rsi), %%rax\n"
23720         "addq    %%rcx, 64(%%rdi)\n"
23721         "adcq    $0, %%rdx\n"
23722         "movq    %%rdx, %%rcx\n"
23723         "mulq    %%r9\n"
23724         "addq    %%rax, %%rcx\n"
23725         "adcq    $0, %%rdx\n"
23726         "movq    24(%%rsi), %%rax\n"
23727         "addq    %%rcx, 72(%%rdi)\n"
23728         "adcq    $0, %%rdx\n"
23729         "movq    %%rdx, %%rcx\n"
23730         "mulq    %%r9\n"
23731         "addq    %%rax, %%rcx\n"
23732         "adcq    $0, %%rdx\n"
23733         "movq    32(%%rsi), %%rax\n"
23734         "addq    %%rcx, 80(%%rdi)\n"
23735         "adcq    $0, %%rdx\n"
23736         "movq    %%rdx, %%rcx\n"
23737         "mulq    %%r9\n"
23738         "addq    %%rax, %%rcx\n"
23739         "adcq    $0, %%rdx\n"
23740         "movq    40(%%rsi), %%rax\n"
23741         "addq    %%rcx, 88(%%rdi)\n"
23742         "adcq    $0, %%rdx\n"
23743         "movq    %%rdx, %%rcx\n"
23744         "mulq    %%r9\n"
23745         "addq    %%rax, %%rcx\n"
23746         "adcq    $0, %%rdx\n"
23747         "movq    48(%%rsi), %%rax\n"
23748         "addq    %%rcx, 96(%%rdi)\n"
23749         "adcq    $0, %%rdx\n"
23750         "movq    %%rdx, %%rcx\n"
23751         "mulq    %%r9\n"
23752         "addq    %%rax, %%rcx\n"
23753         "adcq    $0, %%rdx\n"
23754         "movq    56(%%rsi), %%rax\n"
23755         "addq    %%rcx, 104(%%rdi)\n"
23756         "adcq    $0, %%rdx\n"
23757         "movq    %%rdx, %%rcx\n"
23758         "mulq    %%r9\n"
23759         "addq    %%rax, %%rcx\n"
23760         "adcq    $0, %%rdx\n"
23761         "movq    64(%%rsi), %%rax\n"
23762         "addq    %%rcx, 112(%%rdi)\n"
23763         "adcq    $0, %%rdx\n"
23764         "movq    %%rdx, %%rcx\n"
23765         "mulq    %%r9\n"
23766         "addq    %%rax, %%rcx\n"
23767         "adcq    $0, %%rdx\n"
23768         "movq    72(%%rsi), %%rax\n"
23769         "addq    %%rcx, 120(%%rdi)\n"
23770         "adcq    $0, %%rdx\n"
23771         "movq    %%rdx, %%rcx\n"
23772         "mulq    %%r9\n"
23773         "addq    %%rax, %%rcx\n"
23774         "adcq    $0, %%rdx\n"
23775         "addq    %%rcx, 128(%%rdi)\n"
23776         "adcq    $0, %%rdx\n"
23777         "movq    %%rdx, 136(%%rdi)\n"
23778         "### x*y[8]\n"
23779         "movq    64(%%r8), %%r9\n"
23780         "movq    0(%%rsi), %%rax\n"
23781         "mulq    %%r9\n"
23782         "addq    %%rax, 64(%%rdi)\n"
23783         "movq    8(%%rsi), %%rax\n"
23784         "adcq    $0, %%rdx\n"
23785         "movq    %%rdx, %%rcx\n"
23786         "mulq    %%r9\n"
23787         "addq    %%rax, %%rcx\n"
23788         "adcq    $0, %%rdx\n"
23789         "movq    16(%%rsi), %%rax\n"
23790         "addq    %%rcx, 72(%%rdi)\n"
23791         "adcq    $0, %%rdx\n"
23792         "movq    %%rdx, %%rcx\n"
23793         "mulq    %%r9\n"
23794         "addq    %%rax, %%rcx\n"
23795         "adcq    $0, %%rdx\n"
23796         "movq    24(%%rsi), %%rax\n"
23797         "addq    %%rcx, 80(%%rdi)\n"
23798         "adcq    $0, %%rdx\n"
23799         "movq    %%rdx, %%rcx\n"
23800         "mulq    %%r9\n"
23801         "addq    %%rax, %%rcx\n"
23802         "adcq    $0, %%rdx\n"
23803         "movq    32(%%rsi), %%rax\n"
23804         "addq    %%rcx, 88(%%rdi)\n"
23805         "adcq    $0, %%rdx\n"
23806         "movq    %%rdx, %%rcx\n"
23807         "mulq    %%r9\n"
23808         "addq    %%rax, %%rcx\n"
23809         "adcq    $0, %%rdx\n"
23810         "movq    40(%%rsi), %%rax\n"
23811         "addq    %%rcx, 96(%%rdi)\n"
23812         "adcq    $0, %%rdx\n"
23813         "movq    %%rdx, %%rcx\n"
23814         "mulq    %%r9\n"
23815         "addq    %%rax, %%rcx\n"
23816         "adcq    $0, %%rdx\n"
23817         "movq    48(%%rsi), %%rax\n"
23818         "addq    %%rcx, 104(%%rdi)\n"
23819         "adcq    $0, %%rdx\n"
23820         "movq    %%rdx, %%rcx\n"
23821         "mulq    %%r9\n"
23822         "addq    %%rax, %%rcx\n"
23823         "adcq    $0, %%rdx\n"
23824         "movq    56(%%rsi), %%rax\n"
23825         "addq    %%rcx, 112(%%rdi)\n"
23826         "adcq    $0, %%rdx\n"
23827         "movq    %%rdx, %%rcx\n"
23828         "mulq    %%r9\n"
23829         "addq    %%rax, %%rcx\n"
23830         "adcq    $0, %%rdx\n"
23831         "movq    64(%%rsi), %%rax\n"
23832         "addq    %%rcx, 120(%%rdi)\n"
23833         "adcq    $0, %%rdx\n"
23834         "movq    %%rdx, %%rcx\n"
23835         "mulq    %%r9\n"
23836         "addq    %%rax, %%rcx\n"
23837         "adcq    $0, %%rdx\n"
23838         "movq    72(%%rsi), %%rax\n"
23839         "addq    %%rcx, 128(%%rdi)\n"
23840         "adcq    $0, %%rdx\n"
23841         "movq    %%rdx, %%rcx\n"
23842         "mulq    %%r9\n"
23843         "addq    %%rax, %%rcx\n"
23844         "adcq    $0, %%rdx\n"
23845         "addq    %%rcx, 136(%%rdi)\n"
23846         "adcq    $0, %%rdx\n"
23847         "movq    %%rdx, 144(%%rdi)\n"
23848         "### x*y[9]\n"
23849         "movq    72(%%r8), %%r9\n"
23850         "movq    0(%%rsi), %%rax\n"
23851         "mulq    %%r9\n"
23852         "addq    %%rax, 72(%%rdi)\n"
23853         "movq    8(%%rsi), %%rax\n"
23854         "adcq    $0, %%rdx\n"
23855         "movq    %%rdx, %%rcx\n"
23856         "mulq    %%r9\n"
23857         "addq    %%rax, %%rcx\n"
23858         "adcq    $0, %%rdx\n"
23859         "movq    16(%%rsi), %%rax\n"
23860         "addq    %%rcx, 80(%%rdi)\n"
23861         "adcq    $0, %%rdx\n"
23862         "movq    %%rdx, %%rcx\n"
23863         "mulq    %%r9\n"
23864         "addq    %%rax, %%rcx\n"
23865         "adcq    $0, %%rdx\n"
23866         "movq    24(%%rsi), %%rax\n"
23867         "addq    %%rcx, 88(%%rdi)\n"
23868         "adcq    $0, %%rdx\n"
23869         "movq    %%rdx, %%rcx\n"
23870         "mulq    %%r9\n"
23871         "addq    %%rax, %%rcx\n"
23872         "adcq    $0, %%rdx\n"
23873         "movq    32(%%rsi), %%rax\n"
23874         "addq    %%rcx, 96(%%rdi)\n"
23875         "adcq    $0, %%rdx\n"
23876         "movq    %%rdx, %%rcx\n"
23877         "mulq    %%r9\n"
23878         "addq    %%rax, %%rcx\n"
23879         "adcq    $0, %%rdx\n"
23880         "movq    40(%%rsi), %%rax\n"
23881         "addq    %%rcx, 104(%%rdi)\n"
23882         "adcq    $0, %%rdx\n"
23883         "movq    %%rdx, %%rcx\n"
23884         "mulq    %%r9\n"
23885         "addq    %%rax, %%rcx\n"
23886         "adcq    $0, %%rdx\n"
23887         "movq    48(%%rsi), %%rax\n"
23888         "addq    %%rcx, 112(%%rdi)\n"
23889         "adcq    $0, %%rdx\n"
23890         "movq    %%rdx, %%rcx\n"
23891         "mulq    %%r9\n"
23892         "addq    %%rax, %%rcx\n"
23893         "adcq    $0, %%rdx\n"
23894         "movq    56(%%rsi), %%rax\n"
23895         "addq    %%rcx, 120(%%rdi)\n"
23896         "adcq    $0, %%rdx\n"
23897         "movq    %%rdx, %%rcx\n"
23898         "mulq    %%r9\n"
23899         "addq    %%rax, %%rcx\n"
23900         "adcq    $0, %%rdx\n"
23901         "movq    64(%%rsi), %%rax\n"
23902         "addq    %%rcx, 128(%%rdi)\n"
23903         "adcq    $0, %%rdx\n"
23904         "movq    %%rdx, %%rcx\n"
23905         "mulq    %%r9\n"
23906         "addq    %%rax, %%rcx\n"
23907         "adcq    $0, %%rdx\n"
23908         "movq    72(%%rsi), %%rax\n"
23909         "addq    %%rcx, 136(%%rdi)\n"
23910         "adcq    $0, %%rdx\n"
23911         "movq    %%rdx, %%rcx\n"
23912         "mulq    %%r9\n"
23913         "addq    %%rax, %%rcx\n"
23914         "adcq    $0, %%rdx\n"
23915         "addq    %%rcx, 144(%%rdi)\n"
23916       : "+m" (z)
23917       : "m" (x), "m" (y)
23918       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
23919 }
23920 
23921 /* x has 9.5 words, z has 19. Put x*y in z. */
23922 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
23923 static inline
mpfq_fixmp_9_5_sqr(mp_limb_t * z,const mp_limb_t * x)23924 void mpfq_fixmp_9_5_sqr(mp_limb_t * z, const mp_limb_t * x)
23925 {
23926     mpfq_fixmp_9_5_mul(z, x, x);
23927 }
23928 
23929 /* x has 9.5 words, z has 11. Put x*y in z. */
23930 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
23931 static inline
mpfq_fixmp_9_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)23932 void mpfq_fixmp_9_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
23933 {
23934     __asm__ __volatile__(
23935         "movq    %[z], %%rdi\n"
23936         "movq    %[x], %%rsi\n"
23937         "movq    0(%%rsi), %%rax\n"
23938         "mulq    %[mult]\n"
23939         "movq    %%rax, 0(%%rdi)\n"
23940         "movq    8(%%rsi), %%rax\n"
23941         "movq    %%rdx, %%rcx\n"
23942         "mulq    %[mult]\n"
23943         "addq    %%rax, %%rcx\n"
23944         "adcq    $0, %%rdx\n"
23945         "movq    16(%%rsi), %%rax\n"
23946         "movq    %%rcx, 8(%%rdi)\n"
23947         "movq    %%rdx, %%rcx\n"
23948         "mulq    %[mult]\n"
23949         "addq    %%rax, %%rcx\n"
23950         "adcq    $0, %%rdx\n"
23951         "movq    24(%%rsi), %%rax\n"
23952         "movq    %%rcx, 16(%%rdi)\n"
23953         "movq    %%rdx, %%rcx\n"
23954         "mulq    %[mult]\n"
23955         "addq    %%rax, %%rcx\n"
23956         "adcq    $0, %%rdx\n"
23957         "movq    32(%%rsi), %%rax\n"
23958         "movq    %%rcx, 24(%%rdi)\n"
23959         "movq    %%rdx, %%rcx\n"
23960         "mulq    %[mult]\n"
23961         "addq    %%rax, %%rcx\n"
23962         "adcq    $0, %%rdx\n"
23963         "movq    40(%%rsi), %%rax\n"
23964         "movq    %%rcx, 32(%%rdi)\n"
23965         "movq    %%rdx, %%rcx\n"
23966         "mulq    %[mult]\n"
23967         "addq    %%rax, %%rcx\n"
23968         "adcq    $0, %%rdx\n"
23969         "movq    48(%%rsi), %%rax\n"
23970         "movq    %%rcx, 40(%%rdi)\n"
23971         "movq    %%rdx, %%rcx\n"
23972         "mulq    %[mult]\n"
23973         "addq    %%rax, %%rcx\n"
23974         "adcq    $0, %%rdx\n"
23975         "movq    56(%%rsi), %%rax\n"
23976         "movq    %%rcx, 48(%%rdi)\n"
23977         "movq    %%rdx, %%rcx\n"
23978         "mulq    %[mult]\n"
23979         "addq    %%rax, %%rcx\n"
23980         "adcq    $0, %%rdx\n"
23981         "movq    64(%%rsi), %%rax\n"
23982         "movq    %%rcx, 56(%%rdi)\n"
23983         "movq    %%rdx, %%rcx\n"
23984         "mulq    %[mult]\n"
23985         "addq    %%rax, %%rcx\n"
23986         "adcq    $0, %%rdx\n"
23987         "movq    72(%%rsi), %%rax\n"
23988         "movq    %%rcx, 64(%%rdi)\n"
23989         "movq    %%rdx, %%rcx\n"
23990         "mulq    %[mult]\n"
23991         "addq    %%rax, %%rcx\n"
23992         "adcq    $0, %%rdx\n"
23993         "movq    %%rcx, 72(%%rdi)\n"
23994         "movq    %%rdx, 80(%%rdi)\n"
23995     :
23996     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
23997     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
23998 }
23999 
24000 /* x has 9.5 words, z has 10. c is 0.5 word.
24001  * Put (z+x*c) in z. Return carry bit. */
24002 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
24003 static inline
mpfq_fixmp_9_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)24004 mp_limb_t mpfq_fixmp_9_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
24005 {
24006     mp_limb_t carry;
24007     __asm__ __volatile__(
24008         "movq    %[z], %%rdi\n"
24009         "movq    %[x], %%rsi\n"
24010         "movq    0(%%rsi), %%rax\n"
24011         "mulq    %[mult]\n"
24012         "addq    %%rax, 0(%%rdi)\n"
24013         "movq    8(%%rsi), %%rax\n"
24014         "adcq    $0, %%rdx\n"
24015         "movq    %%rdx, %%rcx\n"
24016         "mulq    %[mult]\n"
24017         "addq    %%rax, %%rcx\n"
24018         "adcq    $0, %%rdx\n"
24019         "movq    16(%%rsi), %%rax\n"
24020         "addq    %%rcx, 8(%%rdi)\n"
24021         "adcq    $0, %%rdx\n"
24022         "movq    %%rdx, %%rcx\n"
24023         "mulq    %[mult]\n"
24024         "addq    %%rax, %%rcx\n"
24025         "adcq    $0, %%rdx\n"
24026         "movq    24(%%rsi), %%rax\n"
24027         "addq    %%rcx, 16(%%rdi)\n"
24028         "adcq    $0, %%rdx\n"
24029         "movq    %%rdx, %%rcx\n"
24030         "mulq    %[mult]\n"
24031         "addq    %%rax, %%rcx\n"
24032         "adcq    $0, %%rdx\n"
24033         "movq    32(%%rsi), %%rax\n"
24034         "addq    %%rcx, 24(%%rdi)\n"
24035         "adcq    $0, %%rdx\n"
24036         "movq    %%rdx, %%rcx\n"
24037         "mulq    %[mult]\n"
24038         "addq    %%rax, %%rcx\n"
24039         "adcq    $0, %%rdx\n"
24040         "movq    40(%%rsi), %%rax\n"
24041         "addq    %%rcx, 32(%%rdi)\n"
24042         "adcq    $0, %%rdx\n"
24043         "movq    %%rdx, %%rcx\n"
24044         "mulq    %[mult]\n"
24045         "addq    %%rax, %%rcx\n"
24046         "adcq    $0, %%rdx\n"
24047         "movq    48(%%rsi), %%rax\n"
24048         "addq    %%rcx, 40(%%rdi)\n"
24049         "adcq    $0, %%rdx\n"
24050         "movq    %%rdx, %%rcx\n"
24051         "mulq    %[mult]\n"
24052         "addq    %%rax, %%rcx\n"
24053         "adcq    $0, %%rdx\n"
24054         "movq    56(%%rsi), %%rax\n"
24055         "addq    %%rcx, 48(%%rdi)\n"
24056         "adcq    $0, %%rdx\n"
24057         "movq    %%rdx, %%rcx\n"
24058         "mulq    %[mult]\n"
24059         "addq    %%rax, %%rcx\n"
24060         "adcq    $0, %%rdx\n"
24061         "movq    64(%%rsi), %%rax\n"
24062         "addq    %%rcx, 56(%%rdi)\n"
24063         "adcq    $0, %%rdx\n"
24064         "movq    %%rdx, %%rcx\n"
24065         "mulq    %[mult]\n"
24066         "addq    %%rax, %%rcx\n"
24067         "adcq    $0, %%rdx\n"
24068         "movq    72(%%rsi), %%rax\n"
24069         "addq    %%rcx, 64(%%rdi)\n"
24070         "adcq    $0, %%rdx\n"
24071         "movq    %%rdx, %%rcx\n"
24072         "imulq    %[mult], %%rax\n"
24073         "xorq    %%rdx, %%rdx\n"
24074         "addq    %%rcx, %%rax\n"
24075         "adcq    $0, %%rdx\n"
24076         "addq    %%rax, 72(%%rdi)\n"
24077         "adcq    $0, %%rdx\n"
24078         "movq    %%rdx, %[carry]\n"
24079     : [carry]"=g"(carry), [z] "+m" (z)
24080     : [mult] "r" (c), [x] "m" (x)
24081     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
24082     return carry;
24083 }
24084 
24085 /* x has 9.5 words, z has 10. c is 0.5 word.
24086  * Put (z+x*c) in z. Carry bit is lost. */
24087 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
24088 static inline
mpfq_fixmp_9_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)24089 void mpfq_fixmp_9_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
24090 {
24091     __asm__ __volatile__(
24092         "movq    %[z], %%rdi\n"
24093         "movq    %[x], %%rsi\n"
24094         "movq    0(%%rsi), %%rax\n"
24095         "mulq    %[mult]\n"
24096         "addq    %%rax, 0(%%rdi)\n"
24097         "movq    8(%%rsi), %%rax\n"
24098         "adcq    $0, %%rdx\n"
24099         "movq    %%rdx, %%rcx\n"
24100         "mulq    %[mult]\n"
24101         "addq    %%rax, %%rcx\n"
24102         "adcq    $0, %%rdx\n"
24103         "movq    16(%%rsi), %%rax\n"
24104         "addq    %%rcx, 8(%%rdi)\n"
24105         "adcq    $0, %%rdx\n"
24106         "movq    %%rdx, %%rcx\n"
24107         "mulq    %[mult]\n"
24108         "addq    %%rax, %%rcx\n"
24109         "adcq    $0, %%rdx\n"
24110         "movq    24(%%rsi), %%rax\n"
24111         "addq    %%rcx, 16(%%rdi)\n"
24112         "adcq    $0, %%rdx\n"
24113         "movq    %%rdx, %%rcx\n"
24114         "mulq    %[mult]\n"
24115         "addq    %%rax, %%rcx\n"
24116         "adcq    $0, %%rdx\n"
24117         "movq    32(%%rsi), %%rax\n"
24118         "addq    %%rcx, 24(%%rdi)\n"
24119         "adcq    $0, %%rdx\n"
24120         "movq    %%rdx, %%rcx\n"
24121         "mulq    %[mult]\n"
24122         "addq    %%rax, %%rcx\n"
24123         "adcq    $0, %%rdx\n"
24124         "movq    40(%%rsi), %%rax\n"
24125         "addq    %%rcx, 32(%%rdi)\n"
24126         "adcq    $0, %%rdx\n"
24127         "movq    %%rdx, %%rcx\n"
24128         "mulq    %[mult]\n"
24129         "addq    %%rax, %%rcx\n"
24130         "adcq    $0, %%rdx\n"
24131         "movq    48(%%rsi), %%rax\n"
24132         "addq    %%rcx, 40(%%rdi)\n"
24133         "adcq    $0, %%rdx\n"
24134         "movq    %%rdx, %%rcx\n"
24135         "mulq    %[mult]\n"
24136         "addq    %%rax, %%rcx\n"
24137         "adcq    $0, %%rdx\n"
24138         "movq    56(%%rsi), %%rax\n"
24139         "addq    %%rcx, 48(%%rdi)\n"
24140         "adcq    $0, %%rdx\n"
24141         "movq    %%rdx, %%rcx\n"
24142         "mulq    %[mult]\n"
24143         "addq    %%rax, %%rcx\n"
24144         "adcq    $0, %%rdx\n"
24145         "movq    64(%%rsi), %%rax\n"
24146         "addq    %%rcx, 56(%%rdi)\n"
24147         "adcq    $0, %%rdx\n"
24148         "movq    %%rdx, %%rcx\n"
24149         "mulq    %[mult]\n"
24150         "addq    %%rax, %%rcx\n"
24151         "adcq    $0, %%rdx\n"
24152         "movq    72(%%rsi), %%rax\n"
24153         "addq    %%rcx, 64(%%rdi)\n"
24154         "adcq    $0, %%rdx\n"
24155         "movq    %%rdx, %%rcx\n"
24156         "imulq    %[mult], %%rax\n"
24157         "addq    %%rcx, %%rax\n"
24158         "addq    %%rax, 72(%%rdi)\n"
24159     : [z] "+m" (z)
24160     : [mult] "r" (c), [x] "m" (x)
24161     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
24162 }
24163 
24164 /* x has 9.5 words, z has 10. c is 0.5 word.
24165  * Put (x*c) in z. No carry. */
24166 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
24167 static inline
mpfq_fixmp_9_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)24168 void mpfq_fixmp_9_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
24169 {
24170     __asm__ __volatile__(
24171         "movq    %[z], %%rdi\n"
24172         "movq    %[x], %%rsi\n"
24173         "movq    0(%%rsi), %%rax\n"
24174         "mulq    %[mult]\n"
24175         "movq    %%rax, 0(%%rdi)\n"
24176         "movq    8(%%rsi), %%rax\n"
24177         "movq    %%rdx, %%rcx\n"
24178         "mulq    %[mult]\n"
24179         "addq    %%rax, %%rcx\n"
24180         "adcq    $0, %%rdx\n"
24181         "movq    16(%%rsi), %%rax\n"
24182         "movq    %%rcx, 8(%%rdi)\n"
24183         "movq    %%rdx, %%rcx\n"
24184         "mulq    %[mult]\n"
24185         "addq    %%rax, %%rcx\n"
24186         "adcq    $0, %%rdx\n"
24187         "movq    24(%%rsi), %%rax\n"
24188         "movq    %%rcx, 16(%%rdi)\n"
24189         "movq    %%rdx, %%rcx\n"
24190         "mulq    %[mult]\n"
24191         "addq    %%rax, %%rcx\n"
24192         "adcq    $0, %%rdx\n"
24193         "movq    32(%%rsi), %%rax\n"
24194         "movq    %%rcx, 24(%%rdi)\n"
24195         "movq    %%rdx, %%rcx\n"
24196         "mulq    %[mult]\n"
24197         "addq    %%rax, %%rcx\n"
24198         "adcq    $0, %%rdx\n"
24199         "movq    40(%%rsi), %%rax\n"
24200         "movq    %%rcx, 32(%%rdi)\n"
24201         "movq    %%rdx, %%rcx\n"
24202         "mulq    %[mult]\n"
24203         "addq    %%rax, %%rcx\n"
24204         "adcq    $0, %%rdx\n"
24205         "movq    48(%%rsi), %%rax\n"
24206         "movq    %%rcx, 40(%%rdi)\n"
24207         "movq    %%rdx, %%rcx\n"
24208         "mulq    %[mult]\n"
24209         "addq    %%rax, %%rcx\n"
24210         "adcq    $0, %%rdx\n"
24211         "movq    56(%%rsi), %%rax\n"
24212         "movq    %%rcx, 48(%%rdi)\n"
24213         "movq    %%rdx, %%rcx\n"
24214         "mulq    %[mult]\n"
24215         "addq    %%rax, %%rcx\n"
24216         "adcq    $0, %%rdx\n"
24217         "movq    64(%%rsi), %%rax\n"
24218         "movq    %%rcx, 56(%%rdi)\n"
24219         "movq    %%rdx, %%rcx\n"
24220         "mulq    %[mult]\n"
24221         "addq    %%rax, %%rcx\n"
24222         "adcq    $0, %%rdx\n"
24223         "movq    72(%%rsi), %%rax\n"
24224         "movq    %%rcx, 64(%%rdi)\n"
24225         "movq    %%rdx, %%rcx\n"
24226         "imulq    %[mult], %%rax\n"
24227         "addq    %%rcx, %%rax\n"
24228         "movq    %%rax, 72(%%rdi)\n"
24229     :
24230     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
24231     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
24232 }
24233 
24234 /* x, y, and z have 10.5 words. Result in z. Return carry bit */
24235 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
24236 static inline
mpfq_fixmp_10_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)24237 mp_limb_t mpfq_fixmp_10_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
24238 {
24239     mp_limb_t carry;
24240     __asm__ __volatile__(
24241         "movq    %[z], %%rdi\n"
24242         "movq    %[x], %%rsi\n"
24243         "movq    %[y], %%rdx\n"
24244         "movq    0(%%rsi), %%rax\n"
24245         "addq    0(%%rdx), %%rax\n"
24246         "movq    %%rax, 0(%%rdi)\n"
24247         "movq    8(%%rsi), %%rax\n"
24248         "adcq    8(%%rdx), %%rax\n"
24249         "movq    %%rax, 8(%%rdi)\n"
24250         "movq    16(%%rsi), %%rax\n"
24251         "adcq    16(%%rdx), %%rax\n"
24252         "movq    %%rax, 16(%%rdi)\n"
24253         "movq    24(%%rsi), %%rax\n"
24254         "adcq    24(%%rdx), %%rax\n"
24255         "movq    %%rax, 24(%%rdi)\n"
24256         "movq    32(%%rsi), %%rax\n"
24257         "adcq    32(%%rdx), %%rax\n"
24258         "movq    %%rax, 32(%%rdi)\n"
24259         "movq    40(%%rsi), %%rax\n"
24260         "adcq    40(%%rdx), %%rax\n"
24261         "movq    %%rax, 40(%%rdi)\n"
24262         "movq    48(%%rsi), %%rax\n"
24263         "adcq    48(%%rdx), %%rax\n"
24264         "movq    %%rax, 48(%%rdi)\n"
24265         "movq    56(%%rsi), %%rax\n"
24266         "adcq    56(%%rdx), %%rax\n"
24267         "movq    %%rax, 56(%%rdi)\n"
24268         "movq    64(%%rsi), %%rax\n"
24269         "adcq    64(%%rdx), %%rax\n"
24270         "movq    %%rax, 64(%%rdi)\n"
24271         "movq    72(%%rsi), %%rax\n"
24272         "adcq    72(%%rdx), %%rax\n"
24273         "movq    %%rax, 72(%%rdi)\n"
24274         "movq    80(%%rsi), %%rax\n"
24275         "adcq    80(%%rdx), %%rax\n"
24276         "movq    %%rax, 80(%%rdi)\n"
24277         "movq $0, %%rax\n"
24278         "adcq $0, %%rax\n"
24279     : "=&a"(carry)
24280     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
24281     : "%rdx", "%rsi", "%rdi", "memory");
24282     return carry;
24283 }
24284 
24285 /* x, y, and z have 10.5 words. Result in z. Return borrow bit */
24286 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
24287 static inline
mpfq_fixmp_10_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)24288 mp_limb_t mpfq_fixmp_10_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
24289 {
24290     mp_limb_t carry;
24291     __asm__ __volatile__(
24292         "movq    %[z], %%rdi\n"
24293         "movq    %[x], %%rsi\n"
24294         "movq    %[y], %%rdx\n"
24295         "movq    0(%%rsi), %%rax\n"
24296         "subq    0(%%rdx), %%rax\n"
24297         "movq    %%rax, 0(%%rdi)\n"
24298         "movq    8(%%rsi), %%rax\n"
24299         "sbbq    8(%%rdx), %%rax\n"
24300         "movq    %%rax, 8(%%rdi)\n"
24301         "movq    16(%%rsi), %%rax\n"
24302         "sbbq    16(%%rdx), %%rax\n"
24303         "movq    %%rax, 16(%%rdi)\n"
24304         "movq    24(%%rsi), %%rax\n"
24305         "sbbq    24(%%rdx), %%rax\n"
24306         "movq    %%rax, 24(%%rdi)\n"
24307         "movq    32(%%rsi), %%rax\n"
24308         "sbbq    32(%%rdx), %%rax\n"
24309         "movq    %%rax, 32(%%rdi)\n"
24310         "movq    40(%%rsi), %%rax\n"
24311         "sbbq    40(%%rdx), %%rax\n"
24312         "movq    %%rax, 40(%%rdi)\n"
24313         "movq    48(%%rsi), %%rax\n"
24314         "sbbq    48(%%rdx), %%rax\n"
24315         "movq    %%rax, 48(%%rdi)\n"
24316         "movq    56(%%rsi), %%rax\n"
24317         "sbbq    56(%%rdx), %%rax\n"
24318         "movq    %%rax, 56(%%rdi)\n"
24319         "movq    64(%%rsi), %%rax\n"
24320         "sbbq    64(%%rdx), %%rax\n"
24321         "movq    %%rax, 64(%%rdi)\n"
24322         "movq    72(%%rsi), %%rax\n"
24323         "sbbq    72(%%rdx), %%rax\n"
24324         "movq    %%rax, 72(%%rdi)\n"
24325         "movq    80(%%rsi), %%rax\n"
24326         "sbbq    80(%%rdx), %%rax\n"
24327         "movq    %%rax, 80(%%rdi)\n"
24328         "movq $0, %%rax\n"
24329         "adcq $0, %%rax\n"
24330     : "=&a"(carry)
24331     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
24332     : "%rdx", "%rsi", "%rdi", "memory");
24333     return carry;
24334 }
24335 
24336 /* x, y, and z have 10.5 words. Result in z. Carry bit is lost. */
24337 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
24338 static inline
mpfq_fixmp_10_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)24339 void mpfq_fixmp_10_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
24340 {
24341     __asm__ __volatile__(
24342         "movq    %[z], %%rdi\n"
24343         "movq    %[x], %%rsi\n"
24344         "movq    %[y], %%rdx\n"
24345         "movq    0(%%rsi), %%rax\n"
24346         "addq    0(%%rdx), %%rax\n"
24347         "movq    %%rax, 0(%%rdi)\n"
24348         "movq    8(%%rsi), %%rax\n"
24349         "adcq    8(%%rdx), %%rax\n"
24350         "movq    %%rax, 8(%%rdi)\n"
24351         "movq    16(%%rsi), %%rax\n"
24352         "adcq    16(%%rdx), %%rax\n"
24353         "movq    %%rax, 16(%%rdi)\n"
24354         "movq    24(%%rsi), %%rax\n"
24355         "adcq    24(%%rdx), %%rax\n"
24356         "movq    %%rax, 24(%%rdi)\n"
24357         "movq    32(%%rsi), %%rax\n"
24358         "adcq    32(%%rdx), %%rax\n"
24359         "movq    %%rax, 32(%%rdi)\n"
24360         "movq    40(%%rsi), %%rax\n"
24361         "adcq    40(%%rdx), %%rax\n"
24362         "movq    %%rax, 40(%%rdi)\n"
24363         "movq    48(%%rsi), %%rax\n"
24364         "adcq    48(%%rdx), %%rax\n"
24365         "movq    %%rax, 48(%%rdi)\n"
24366         "movq    56(%%rsi), %%rax\n"
24367         "adcq    56(%%rdx), %%rax\n"
24368         "movq    %%rax, 56(%%rdi)\n"
24369         "movq    64(%%rsi), %%rax\n"
24370         "adcq    64(%%rdx), %%rax\n"
24371         "movq    %%rax, 64(%%rdi)\n"
24372         "movq    72(%%rsi), %%rax\n"
24373         "adcq    72(%%rdx), %%rax\n"
24374         "movq    %%rax, 72(%%rdi)\n"
24375         "movq    80(%%rsi), %%rax\n"
24376         "adcq    80(%%rdx), %%rax\n"
24377         "movq    %%rax, 80(%%rdi)\n"
24378     :
24379     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
24380     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
24381 }
24382 
24383 /* x, y, and z have 10.5 words. Result in z. Borrow bit is lost. */
24384 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
24385 static inline
mpfq_fixmp_10_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)24386 void mpfq_fixmp_10_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
24387 {
24388     __asm__ __volatile__(
24389         "movq    %[z], %%rdi\n"
24390         "movq    %[x], %%rsi\n"
24391         "movq    %[y], %%rdx\n"
24392         "movq    0(%%rsi), %%rax\n"
24393         "subq    0(%%rdx), %%rax\n"
24394         "movq    %%rax, 0(%%rdi)\n"
24395         "movq    8(%%rsi), %%rax\n"
24396         "sbbq    8(%%rdx), %%rax\n"
24397         "movq    %%rax, 8(%%rdi)\n"
24398         "movq    16(%%rsi), %%rax\n"
24399         "sbbq    16(%%rdx), %%rax\n"
24400         "movq    %%rax, 16(%%rdi)\n"
24401         "movq    24(%%rsi), %%rax\n"
24402         "sbbq    24(%%rdx), %%rax\n"
24403         "movq    %%rax, 24(%%rdi)\n"
24404         "movq    32(%%rsi), %%rax\n"
24405         "sbbq    32(%%rdx), %%rax\n"
24406         "movq    %%rax, 32(%%rdi)\n"
24407         "movq    40(%%rsi), %%rax\n"
24408         "sbbq    40(%%rdx), %%rax\n"
24409         "movq    %%rax, 40(%%rdi)\n"
24410         "movq    48(%%rsi), %%rax\n"
24411         "sbbq    48(%%rdx), %%rax\n"
24412         "movq    %%rax, 48(%%rdi)\n"
24413         "movq    56(%%rsi), %%rax\n"
24414         "sbbq    56(%%rdx), %%rax\n"
24415         "movq    %%rax, 56(%%rdi)\n"
24416         "movq    64(%%rsi), %%rax\n"
24417         "sbbq    64(%%rdx), %%rax\n"
24418         "movq    %%rax, 64(%%rdi)\n"
24419         "movq    72(%%rsi), %%rax\n"
24420         "sbbq    72(%%rdx), %%rax\n"
24421         "movq    %%rax, 72(%%rdi)\n"
24422         "movq    80(%%rsi), %%rax\n"
24423         "sbbq    80(%%rdx), %%rax\n"
24424         "movq    %%rax, 80(%%rdi)\n"
24425     :
24426     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
24427     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
24428 }
24429 
24430 /* x has 10.5 words, z has 12.
24431  * Put (z+x*c) in z. Return carry bit. */
24432 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
24433 static inline
mpfq_fixmp_10_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)24434 mp_limb_t mpfq_fixmp_10_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
24435 {
24436     mp_limb_t carry;
24437     __asm__ __volatile__(
24438         "movq    %[z], %%rdi\n"
24439         "movq    %[x], %%rsi\n"
24440         "movq    0(%%rsi), %%rax\n"
24441         "mulq    %[mult]\n"
24442         "addq    %%rax, 0(%%rdi)\n"
24443         "movq    8(%%rsi), %%rax\n"
24444         "adcq    $0, %%rdx\n"
24445         "movq    %%rdx, %%rcx\n"
24446         "mulq    %[mult]\n"
24447         "addq    %%rax, %%rcx\n"
24448         "adcq    $0, %%rdx\n"
24449         "movq    16(%%rsi), %%rax\n"
24450         "addq    %%rcx, 8(%%rdi)\n"
24451         "adcq    $0, %%rdx\n"
24452         "movq    %%rdx, %%rcx\n"
24453         "mulq    %[mult]\n"
24454         "addq    %%rax, %%rcx\n"
24455         "adcq    $0, %%rdx\n"
24456         "movq    24(%%rsi), %%rax\n"
24457         "addq    %%rcx, 16(%%rdi)\n"
24458         "adcq    $0, %%rdx\n"
24459         "movq    %%rdx, %%rcx\n"
24460         "mulq    %[mult]\n"
24461         "addq    %%rax, %%rcx\n"
24462         "adcq    $0, %%rdx\n"
24463         "movq    32(%%rsi), %%rax\n"
24464         "addq    %%rcx, 24(%%rdi)\n"
24465         "adcq    $0, %%rdx\n"
24466         "movq    %%rdx, %%rcx\n"
24467         "mulq    %[mult]\n"
24468         "addq    %%rax, %%rcx\n"
24469         "adcq    $0, %%rdx\n"
24470         "movq    40(%%rsi), %%rax\n"
24471         "addq    %%rcx, 32(%%rdi)\n"
24472         "adcq    $0, %%rdx\n"
24473         "movq    %%rdx, %%rcx\n"
24474         "mulq    %[mult]\n"
24475         "addq    %%rax, %%rcx\n"
24476         "adcq    $0, %%rdx\n"
24477         "movq    48(%%rsi), %%rax\n"
24478         "addq    %%rcx, 40(%%rdi)\n"
24479         "adcq    $0, %%rdx\n"
24480         "movq    %%rdx, %%rcx\n"
24481         "mulq    %[mult]\n"
24482         "addq    %%rax, %%rcx\n"
24483         "adcq    $0, %%rdx\n"
24484         "movq    56(%%rsi), %%rax\n"
24485         "addq    %%rcx, 48(%%rdi)\n"
24486         "adcq    $0, %%rdx\n"
24487         "movq    %%rdx, %%rcx\n"
24488         "mulq    %[mult]\n"
24489         "addq    %%rax, %%rcx\n"
24490         "adcq    $0, %%rdx\n"
24491         "movq    64(%%rsi), %%rax\n"
24492         "addq    %%rcx, 56(%%rdi)\n"
24493         "adcq    $0, %%rdx\n"
24494         "movq    %%rdx, %%rcx\n"
24495         "mulq    %[mult]\n"
24496         "addq    %%rax, %%rcx\n"
24497         "adcq    $0, %%rdx\n"
24498         "movq    72(%%rsi), %%rax\n"
24499         "addq    %%rcx, 64(%%rdi)\n"
24500         "adcq    $0, %%rdx\n"
24501         "movq    %%rdx, %%rcx\n"
24502         "mulq    %[mult]\n"
24503         "addq    %%rax, %%rcx\n"
24504         "adcq    $0, %%rdx\n"
24505         "movq    80(%%rsi), %%rax\n"
24506         "addq    %%rcx, 72(%%rdi)\n"
24507         "adcq    $0, %%rdx\n"
24508         "movq    %%rdx, %%rcx\n"
24509         "mulq    %[mult]\n"
24510         "addq    %%rax, %%rcx\n"
24511         "adcq    $0, %%rdx\n"
24512         "addq    %%rcx, 80(%%rdi)\n"
24513         "adcq    $0, %%rdx\n"
24514         "xorq    %%rcx, %%rcx\n"
24515         "addq    %%rdx, 88(%%rdi)\n"
24516         "adcq    $0, %%rcx\n"
24517         "movq    %%rcx, %[carry]\n"
24518     : [carry]"=g"(carry), [z] "+m" (z)
24519     : [mult] "r" (c), [x] "m" (x)
24520     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
24521     return carry;
24522 }
24523 
24524 /* x has 10.5 words, z has 12.
24525  * Put (z+x*c) in z. Carry bit is lost. */
24526 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
24527 static inline
mpfq_fixmp_10_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)24528 void mpfq_fixmp_10_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
24529 {
24530     __asm__ __volatile__(
24531         "movq    %[z], %%rdi\n"
24532         "movq    %[x], %%rsi\n"
24533         "movq    0(%%rsi), %%rax\n"
24534         "mulq    %[mult]\n"
24535         "addq    %%rax, 0(%%rdi)\n"
24536         "movq    8(%%rsi), %%rax\n"
24537         "adcq    $0, %%rdx\n"
24538         "movq    %%rdx, %%rcx\n"
24539         "mulq    %[mult]\n"
24540         "addq    %%rax, %%rcx\n"
24541         "adcq    $0, %%rdx\n"
24542         "movq    16(%%rsi), %%rax\n"
24543         "addq    %%rcx, 8(%%rdi)\n"
24544         "adcq    $0, %%rdx\n"
24545         "movq    %%rdx, %%rcx\n"
24546         "mulq    %[mult]\n"
24547         "addq    %%rax, %%rcx\n"
24548         "adcq    $0, %%rdx\n"
24549         "movq    24(%%rsi), %%rax\n"
24550         "addq    %%rcx, 16(%%rdi)\n"
24551         "adcq    $0, %%rdx\n"
24552         "movq    %%rdx, %%rcx\n"
24553         "mulq    %[mult]\n"
24554         "addq    %%rax, %%rcx\n"
24555         "adcq    $0, %%rdx\n"
24556         "movq    32(%%rsi), %%rax\n"
24557         "addq    %%rcx, 24(%%rdi)\n"
24558         "adcq    $0, %%rdx\n"
24559         "movq    %%rdx, %%rcx\n"
24560         "mulq    %[mult]\n"
24561         "addq    %%rax, %%rcx\n"
24562         "adcq    $0, %%rdx\n"
24563         "movq    40(%%rsi), %%rax\n"
24564         "addq    %%rcx, 32(%%rdi)\n"
24565         "adcq    $0, %%rdx\n"
24566         "movq    %%rdx, %%rcx\n"
24567         "mulq    %[mult]\n"
24568         "addq    %%rax, %%rcx\n"
24569         "adcq    $0, %%rdx\n"
24570         "movq    48(%%rsi), %%rax\n"
24571         "addq    %%rcx, 40(%%rdi)\n"
24572         "adcq    $0, %%rdx\n"
24573         "movq    %%rdx, %%rcx\n"
24574         "mulq    %[mult]\n"
24575         "addq    %%rax, %%rcx\n"
24576         "adcq    $0, %%rdx\n"
24577         "movq    56(%%rsi), %%rax\n"
24578         "addq    %%rcx, 48(%%rdi)\n"
24579         "adcq    $0, %%rdx\n"
24580         "movq    %%rdx, %%rcx\n"
24581         "mulq    %[mult]\n"
24582         "addq    %%rax, %%rcx\n"
24583         "adcq    $0, %%rdx\n"
24584         "movq    64(%%rsi), %%rax\n"
24585         "addq    %%rcx, 56(%%rdi)\n"
24586         "adcq    $0, %%rdx\n"
24587         "movq    %%rdx, %%rcx\n"
24588         "mulq    %[mult]\n"
24589         "addq    %%rax, %%rcx\n"
24590         "adcq    $0, %%rdx\n"
24591         "movq    72(%%rsi), %%rax\n"
24592         "addq    %%rcx, 64(%%rdi)\n"
24593         "adcq    $0, %%rdx\n"
24594         "movq    %%rdx, %%rcx\n"
24595         "mulq    %[mult]\n"
24596         "addq    %%rax, %%rcx\n"
24597         "adcq    $0, %%rdx\n"
24598         "movq    80(%%rsi), %%rax\n"
24599         "addq    %%rcx, 72(%%rdi)\n"
24600         "adcq    $0, %%rdx\n"
24601         "movq    %%rdx, %%rcx\n"
24602         "mulq    %[mult]\n"
24603         "addq    %%rax, %%rcx\n"
24604         "adcq    $0, %%rdx\n"
24605         "addq    %%rcx, 80(%%rdi)\n"
24606         "adcq    $0, %%rdx\n"
24607         "addq    %%rdx, 88(%%rdi)\n"
24608     : [z] "+m" (z)
24609     : [mult] "r" (c), [x] "m" (x)
24610     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
24611 }
24612 
24613 /* x has 10.5 words, z has 11.
24614  * Put (z+x*c) in z. Return carry word. */
24615 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
24616 static inline
mpfq_fixmp_10_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)24617 mp_limb_t mpfq_fixmp_10_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
24618 {
24619     mp_limb_t carry;
24620     __asm__ __volatile__(
24621         "movq    %[z], %%rdi\n"
24622         "movq    %[x], %%rsi\n"
24623         "movq    0(%%rsi), %%rax\n"
24624         "mulq    %[mult]\n"
24625         "addq    %%rax, 0(%%rdi)\n"
24626         "movq    8(%%rsi), %%rax\n"
24627         "adcq    $0, %%rdx\n"
24628         "movq    %%rdx, %%rcx\n"
24629         "mulq    %[mult]\n"
24630         "addq    %%rax, %%rcx\n"
24631         "adcq    $0, %%rdx\n"
24632         "movq    16(%%rsi), %%rax\n"
24633         "addq    %%rcx, 8(%%rdi)\n"
24634         "adcq    $0, %%rdx\n"
24635         "movq    %%rdx, %%rcx\n"
24636         "mulq    %[mult]\n"
24637         "addq    %%rax, %%rcx\n"
24638         "adcq    $0, %%rdx\n"
24639         "movq    24(%%rsi), %%rax\n"
24640         "addq    %%rcx, 16(%%rdi)\n"
24641         "adcq    $0, %%rdx\n"
24642         "movq    %%rdx, %%rcx\n"
24643         "mulq    %[mult]\n"
24644         "addq    %%rax, %%rcx\n"
24645         "adcq    $0, %%rdx\n"
24646         "movq    32(%%rsi), %%rax\n"
24647         "addq    %%rcx, 24(%%rdi)\n"
24648         "adcq    $0, %%rdx\n"
24649         "movq    %%rdx, %%rcx\n"
24650         "mulq    %[mult]\n"
24651         "addq    %%rax, %%rcx\n"
24652         "adcq    $0, %%rdx\n"
24653         "movq    40(%%rsi), %%rax\n"
24654         "addq    %%rcx, 32(%%rdi)\n"
24655         "adcq    $0, %%rdx\n"
24656         "movq    %%rdx, %%rcx\n"
24657         "mulq    %[mult]\n"
24658         "addq    %%rax, %%rcx\n"
24659         "adcq    $0, %%rdx\n"
24660         "movq    48(%%rsi), %%rax\n"
24661         "addq    %%rcx, 40(%%rdi)\n"
24662         "adcq    $0, %%rdx\n"
24663         "movq    %%rdx, %%rcx\n"
24664         "mulq    %[mult]\n"
24665         "addq    %%rax, %%rcx\n"
24666         "adcq    $0, %%rdx\n"
24667         "movq    56(%%rsi), %%rax\n"
24668         "addq    %%rcx, 48(%%rdi)\n"
24669         "adcq    $0, %%rdx\n"
24670         "movq    %%rdx, %%rcx\n"
24671         "mulq    %[mult]\n"
24672         "addq    %%rax, %%rcx\n"
24673         "adcq    $0, %%rdx\n"
24674         "movq    64(%%rsi), %%rax\n"
24675         "addq    %%rcx, 56(%%rdi)\n"
24676         "adcq    $0, %%rdx\n"
24677         "movq    %%rdx, %%rcx\n"
24678         "mulq    %[mult]\n"
24679         "addq    %%rax, %%rcx\n"
24680         "adcq    $0, %%rdx\n"
24681         "movq    72(%%rsi), %%rax\n"
24682         "addq    %%rcx, 64(%%rdi)\n"
24683         "adcq    $0, %%rdx\n"
24684         "movq    %%rdx, %%rcx\n"
24685         "mulq    %[mult]\n"
24686         "addq    %%rax, %%rcx\n"
24687         "adcq    $0, %%rdx\n"
24688         "movq    80(%%rsi), %%rax\n"
24689         "addq    %%rcx, 72(%%rdi)\n"
24690         "adcq    $0, %%rdx\n"
24691         "movq    %%rdx, %%rcx\n"
24692         "mulq    %[mult]\n"
24693         "addq    %%rax, %%rcx\n"
24694         "adcq    $0, %%rdx\n"
24695         "addq    %%rcx, 80(%%rdi)\n"
24696         "adcq    $0, %%rdx\n"
24697         "movq    %%rdx, %[carry]\n"
24698     : [carry]"=g"(carry), [z] "+m" (z)
24699     : [mult] "r" (c), [x] "m" (x)
24700     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
24701     return carry;
24702 }
24703 
24704 /* x and y have 10.5 words, z has 21. Put x*y in z. */
24705 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
24706 static inline
mpfq_fixmp_10_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)24707 void mpfq_fixmp_10_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
24708 {
24709     __asm__ __volatile__(
24710         "### x*y[0]\n"
24711         "movq    %2, %%r8\n"
24712         "movq    %0, %%rdi\n"
24713         "movq    0(%%r8), %%r9\n"
24714         "movq    %1, %%rsi\n"
24715         "movq    0(%%rsi), %%rax\n"
24716         "mulq    %%r9\n"
24717         "movq    %%rax, 0(%%rdi)\n"
24718         "movq    8(%%rsi), %%rax\n"
24719         "movq    %%rdx, %%rcx\n"
24720         "mulq    %%r9\n"
24721         "addq    %%rax, %%rcx\n"
24722         "adcq    $0, %%rdx\n"
24723         "movq    16(%%rsi), %%rax\n"
24724         "movq    %%rcx, 8(%%rdi)\n"
24725         "movq    %%rdx, %%rcx\n"
24726         "mulq    %%r9\n"
24727         "addq    %%rax, %%rcx\n"
24728         "adcq    $0, %%rdx\n"
24729         "movq    24(%%rsi), %%rax\n"
24730         "movq    %%rcx, 16(%%rdi)\n"
24731         "movq    %%rdx, %%rcx\n"
24732         "mulq    %%r9\n"
24733         "addq    %%rax, %%rcx\n"
24734         "adcq    $0, %%rdx\n"
24735         "movq    32(%%rsi), %%rax\n"
24736         "movq    %%rcx, 24(%%rdi)\n"
24737         "movq    %%rdx, %%rcx\n"
24738         "mulq    %%r9\n"
24739         "addq    %%rax, %%rcx\n"
24740         "adcq    $0, %%rdx\n"
24741         "movq    40(%%rsi), %%rax\n"
24742         "movq    %%rcx, 32(%%rdi)\n"
24743         "movq    %%rdx, %%rcx\n"
24744         "mulq    %%r9\n"
24745         "addq    %%rax, %%rcx\n"
24746         "adcq    $0, %%rdx\n"
24747         "movq    48(%%rsi), %%rax\n"
24748         "movq    %%rcx, 40(%%rdi)\n"
24749         "movq    %%rdx, %%rcx\n"
24750         "mulq    %%r9\n"
24751         "addq    %%rax, %%rcx\n"
24752         "adcq    $0, %%rdx\n"
24753         "movq    56(%%rsi), %%rax\n"
24754         "movq    %%rcx, 48(%%rdi)\n"
24755         "movq    %%rdx, %%rcx\n"
24756         "mulq    %%r9\n"
24757         "addq    %%rax, %%rcx\n"
24758         "adcq    $0, %%rdx\n"
24759         "movq    64(%%rsi), %%rax\n"
24760         "movq    %%rcx, 56(%%rdi)\n"
24761         "movq    %%rdx, %%rcx\n"
24762         "mulq    %%r9\n"
24763         "addq    %%rax, %%rcx\n"
24764         "adcq    $0, %%rdx\n"
24765         "movq    72(%%rsi), %%rax\n"
24766         "movq    %%rcx, 64(%%rdi)\n"
24767         "movq    %%rdx, %%rcx\n"
24768         "mulq    %%r9\n"
24769         "addq    %%rax, %%rcx\n"
24770         "adcq    $0, %%rdx\n"
24771         "movq    80(%%rsi), %%rax\n"
24772         "movq    %%rcx, 72(%%rdi)\n"
24773         "movq    %%rdx, %%rcx\n"
24774         "mulq    %%r9\n"
24775         "addq    %%rax, %%rcx\n"
24776         "adcq    $0, %%rdx\n"
24777         "movq    %%rcx, 80(%%rdi)\n"
24778         "movq    %%rdx, 88(%%rdi)\n"
24779         "movq    $0, 96(%%rdi)\n"
24780         "movq    $0, 104(%%rdi)\n"
24781         "movq    $0, 112(%%rdi)\n"
24782         "movq    $0, 120(%%rdi)\n"
24783         "movq    $0, 128(%%rdi)\n"
24784         "movq    $0, 136(%%rdi)\n"
24785         "movq    $0, 144(%%rdi)\n"
24786         "movq    $0, 152(%%rdi)\n"
24787         "movq    $0, 160(%%rdi)\n"
24788         "### x*y[1]\n"
24789         "movq    8(%%r8), %%r9\n"
24790         "movq    0(%%rsi), %%rax\n"
24791         "mulq    %%r9\n"
24792         "addq    %%rax, 8(%%rdi)\n"
24793         "movq    8(%%rsi), %%rax\n"
24794         "adcq    $0, %%rdx\n"
24795         "movq    %%rdx, %%rcx\n"
24796         "mulq    %%r9\n"
24797         "addq    %%rax, %%rcx\n"
24798         "adcq    $0, %%rdx\n"
24799         "movq    16(%%rsi), %%rax\n"
24800         "addq    %%rcx, 16(%%rdi)\n"
24801         "adcq    $0, %%rdx\n"
24802         "movq    %%rdx, %%rcx\n"
24803         "mulq    %%r9\n"
24804         "addq    %%rax, %%rcx\n"
24805         "adcq    $0, %%rdx\n"
24806         "movq    24(%%rsi), %%rax\n"
24807         "addq    %%rcx, 24(%%rdi)\n"
24808         "adcq    $0, %%rdx\n"
24809         "movq    %%rdx, %%rcx\n"
24810         "mulq    %%r9\n"
24811         "addq    %%rax, %%rcx\n"
24812         "adcq    $0, %%rdx\n"
24813         "movq    32(%%rsi), %%rax\n"
24814         "addq    %%rcx, 32(%%rdi)\n"
24815         "adcq    $0, %%rdx\n"
24816         "movq    %%rdx, %%rcx\n"
24817         "mulq    %%r9\n"
24818         "addq    %%rax, %%rcx\n"
24819         "adcq    $0, %%rdx\n"
24820         "movq    40(%%rsi), %%rax\n"
24821         "addq    %%rcx, 40(%%rdi)\n"
24822         "adcq    $0, %%rdx\n"
24823         "movq    %%rdx, %%rcx\n"
24824         "mulq    %%r9\n"
24825         "addq    %%rax, %%rcx\n"
24826         "adcq    $0, %%rdx\n"
24827         "movq    48(%%rsi), %%rax\n"
24828         "addq    %%rcx, 48(%%rdi)\n"
24829         "adcq    $0, %%rdx\n"
24830         "movq    %%rdx, %%rcx\n"
24831         "mulq    %%r9\n"
24832         "addq    %%rax, %%rcx\n"
24833         "adcq    $0, %%rdx\n"
24834         "movq    56(%%rsi), %%rax\n"
24835         "addq    %%rcx, 56(%%rdi)\n"
24836         "adcq    $0, %%rdx\n"
24837         "movq    %%rdx, %%rcx\n"
24838         "mulq    %%r9\n"
24839         "addq    %%rax, %%rcx\n"
24840         "adcq    $0, %%rdx\n"
24841         "movq    64(%%rsi), %%rax\n"
24842         "addq    %%rcx, 64(%%rdi)\n"
24843         "adcq    $0, %%rdx\n"
24844         "movq    %%rdx, %%rcx\n"
24845         "mulq    %%r9\n"
24846         "addq    %%rax, %%rcx\n"
24847         "adcq    $0, %%rdx\n"
24848         "movq    72(%%rsi), %%rax\n"
24849         "addq    %%rcx, 72(%%rdi)\n"
24850         "adcq    $0, %%rdx\n"
24851         "movq    %%rdx, %%rcx\n"
24852         "mulq    %%r9\n"
24853         "addq    %%rax, %%rcx\n"
24854         "adcq    $0, %%rdx\n"
24855         "movq    80(%%rsi), %%rax\n"
24856         "addq    %%rcx, 80(%%rdi)\n"
24857         "adcq    $0, %%rdx\n"
24858         "movq    %%rdx, %%rcx\n"
24859         "mulq    %%r9\n"
24860         "addq    %%rax, %%rcx\n"
24861         "adcq    $0, %%rdx\n"
24862         "addq    %%rcx, 88(%%rdi)\n"
24863         "adcq    $0, %%rdx\n"
24864         "movq    %%rdx, 96(%%rdi)\n"
24865         "### x*y[2]\n"
24866         "movq    16(%%r8), %%r9\n"
24867         "movq    0(%%rsi), %%rax\n"
24868         "mulq    %%r9\n"
24869         "addq    %%rax, 16(%%rdi)\n"
24870         "movq    8(%%rsi), %%rax\n"
24871         "adcq    $0, %%rdx\n"
24872         "movq    %%rdx, %%rcx\n"
24873         "mulq    %%r9\n"
24874         "addq    %%rax, %%rcx\n"
24875         "adcq    $0, %%rdx\n"
24876         "movq    16(%%rsi), %%rax\n"
24877         "addq    %%rcx, 24(%%rdi)\n"
24878         "adcq    $0, %%rdx\n"
24879         "movq    %%rdx, %%rcx\n"
24880         "mulq    %%r9\n"
24881         "addq    %%rax, %%rcx\n"
24882         "adcq    $0, %%rdx\n"
24883         "movq    24(%%rsi), %%rax\n"
24884         "addq    %%rcx, 32(%%rdi)\n"
24885         "adcq    $0, %%rdx\n"
24886         "movq    %%rdx, %%rcx\n"
24887         "mulq    %%r9\n"
24888         "addq    %%rax, %%rcx\n"
24889         "adcq    $0, %%rdx\n"
24890         "movq    32(%%rsi), %%rax\n"
24891         "addq    %%rcx, 40(%%rdi)\n"
24892         "adcq    $0, %%rdx\n"
24893         "movq    %%rdx, %%rcx\n"
24894         "mulq    %%r9\n"
24895         "addq    %%rax, %%rcx\n"
24896         "adcq    $0, %%rdx\n"
24897         "movq    40(%%rsi), %%rax\n"
24898         "addq    %%rcx, 48(%%rdi)\n"
24899         "adcq    $0, %%rdx\n"
24900         "movq    %%rdx, %%rcx\n"
24901         "mulq    %%r9\n"
24902         "addq    %%rax, %%rcx\n"
24903         "adcq    $0, %%rdx\n"
24904         "movq    48(%%rsi), %%rax\n"
24905         "addq    %%rcx, 56(%%rdi)\n"
24906         "adcq    $0, %%rdx\n"
24907         "movq    %%rdx, %%rcx\n"
24908         "mulq    %%r9\n"
24909         "addq    %%rax, %%rcx\n"
24910         "adcq    $0, %%rdx\n"
24911         "movq    56(%%rsi), %%rax\n"
24912         "addq    %%rcx, 64(%%rdi)\n"
24913         "adcq    $0, %%rdx\n"
24914         "movq    %%rdx, %%rcx\n"
24915         "mulq    %%r9\n"
24916         "addq    %%rax, %%rcx\n"
24917         "adcq    $0, %%rdx\n"
24918         "movq    64(%%rsi), %%rax\n"
24919         "addq    %%rcx, 72(%%rdi)\n"
24920         "adcq    $0, %%rdx\n"
24921         "movq    %%rdx, %%rcx\n"
24922         "mulq    %%r9\n"
24923         "addq    %%rax, %%rcx\n"
24924         "adcq    $0, %%rdx\n"
24925         "movq    72(%%rsi), %%rax\n"
24926         "addq    %%rcx, 80(%%rdi)\n"
24927         "adcq    $0, %%rdx\n"
24928         "movq    %%rdx, %%rcx\n"
24929         "mulq    %%r9\n"
24930         "addq    %%rax, %%rcx\n"
24931         "adcq    $0, %%rdx\n"
24932         "movq    80(%%rsi), %%rax\n"
24933         "addq    %%rcx, 88(%%rdi)\n"
24934         "adcq    $0, %%rdx\n"
24935         "movq    %%rdx, %%rcx\n"
24936         "mulq    %%r9\n"
24937         "addq    %%rax, %%rcx\n"
24938         "adcq    $0, %%rdx\n"
24939         "addq    %%rcx, 96(%%rdi)\n"
24940         "adcq    $0, %%rdx\n"
24941         "movq    %%rdx, 104(%%rdi)\n"
24942         "### x*y[3]\n"
24943         "movq    24(%%r8), %%r9\n"
24944         "movq    0(%%rsi), %%rax\n"
24945         "mulq    %%r9\n"
24946         "addq    %%rax, 24(%%rdi)\n"
24947         "movq    8(%%rsi), %%rax\n"
24948         "adcq    $0, %%rdx\n"
24949         "movq    %%rdx, %%rcx\n"
24950         "mulq    %%r9\n"
24951         "addq    %%rax, %%rcx\n"
24952         "adcq    $0, %%rdx\n"
24953         "movq    16(%%rsi), %%rax\n"
24954         "addq    %%rcx, 32(%%rdi)\n"
24955         "adcq    $0, %%rdx\n"
24956         "movq    %%rdx, %%rcx\n"
24957         "mulq    %%r9\n"
24958         "addq    %%rax, %%rcx\n"
24959         "adcq    $0, %%rdx\n"
24960         "movq    24(%%rsi), %%rax\n"
24961         "addq    %%rcx, 40(%%rdi)\n"
24962         "adcq    $0, %%rdx\n"
24963         "movq    %%rdx, %%rcx\n"
24964         "mulq    %%r9\n"
24965         "addq    %%rax, %%rcx\n"
24966         "adcq    $0, %%rdx\n"
24967         "movq    32(%%rsi), %%rax\n"
24968         "addq    %%rcx, 48(%%rdi)\n"
24969         "adcq    $0, %%rdx\n"
24970         "movq    %%rdx, %%rcx\n"
24971         "mulq    %%r9\n"
24972         "addq    %%rax, %%rcx\n"
24973         "adcq    $0, %%rdx\n"
24974         "movq    40(%%rsi), %%rax\n"
24975         "addq    %%rcx, 56(%%rdi)\n"
24976         "adcq    $0, %%rdx\n"
24977         "movq    %%rdx, %%rcx\n"
24978         "mulq    %%r9\n"
24979         "addq    %%rax, %%rcx\n"
24980         "adcq    $0, %%rdx\n"
24981         "movq    48(%%rsi), %%rax\n"
24982         "addq    %%rcx, 64(%%rdi)\n"
24983         "adcq    $0, %%rdx\n"
24984         "movq    %%rdx, %%rcx\n"
24985         "mulq    %%r9\n"
24986         "addq    %%rax, %%rcx\n"
24987         "adcq    $0, %%rdx\n"
24988         "movq    56(%%rsi), %%rax\n"
24989         "addq    %%rcx, 72(%%rdi)\n"
24990         "adcq    $0, %%rdx\n"
24991         "movq    %%rdx, %%rcx\n"
24992         "mulq    %%r9\n"
24993         "addq    %%rax, %%rcx\n"
24994         "adcq    $0, %%rdx\n"
24995         "movq    64(%%rsi), %%rax\n"
24996         "addq    %%rcx, 80(%%rdi)\n"
24997         "adcq    $0, %%rdx\n"
24998         "movq    %%rdx, %%rcx\n"
24999         "mulq    %%r9\n"
25000         "addq    %%rax, %%rcx\n"
25001         "adcq    $0, %%rdx\n"
25002         "movq    72(%%rsi), %%rax\n"
25003         "addq    %%rcx, 88(%%rdi)\n"
25004         "adcq    $0, %%rdx\n"
25005         "movq    %%rdx, %%rcx\n"
25006         "mulq    %%r9\n"
25007         "addq    %%rax, %%rcx\n"
25008         "adcq    $0, %%rdx\n"
25009         "movq    80(%%rsi), %%rax\n"
25010         "addq    %%rcx, 96(%%rdi)\n"
25011         "adcq    $0, %%rdx\n"
25012         "movq    %%rdx, %%rcx\n"
25013         "mulq    %%r9\n"
25014         "addq    %%rax, %%rcx\n"
25015         "adcq    $0, %%rdx\n"
25016         "addq    %%rcx, 104(%%rdi)\n"
25017         "adcq    $0, %%rdx\n"
25018         "movq    %%rdx, 112(%%rdi)\n"
25019         "### x*y[4]\n"
25020         "movq    32(%%r8), %%r9\n"
25021         "movq    0(%%rsi), %%rax\n"
25022         "mulq    %%r9\n"
25023         "addq    %%rax, 32(%%rdi)\n"
25024         "movq    8(%%rsi), %%rax\n"
25025         "adcq    $0, %%rdx\n"
25026         "movq    %%rdx, %%rcx\n"
25027         "mulq    %%r9\n"
25028         "addq    %%rax, %%rcx\n"
25029         "adcq    $0, %%rdx\n"
25030         "movq    16(%%rsi), %%rax\n"
25031         "addq    %%rcx, 40(%%rdi)\n"
25032         "adcq    $0, %%rdx\n"
25033         "movq    %%rdx, %%rcx\n"
25034         "mulq    %%r9\n"
25035         "addq    %%rax, %%rcx\n"
25036         "adcq    $0, %%rdx\n"
25037         "movq    24(%%rsi), %%rax\n"
25038         "addq    %%rcx, 48(%%rdi)\n"
25039         "adcq    $0, %%rdx\n"
25040         "movq    %%rdx, %%rcx\n"
25041         "mulq    %%r9\n"
25042         "addq    %%rax, %%rcx\n"
25043         "adcq    $0, %%rdx\n"
25044         "movq    32(%%rsi), %%rax\n"
25045         "addq    %%rcx, 56(%%rdi)\n"
25046         "adcq    $0, %%rdx\n"
25047         "movq    %%rdx, %%rcx\n"
25048         "mulq    %%r9\n"
25049         "addq    %%rax, %%rcx\n"
25050         "adcq    $0, %%rdx\n"
25051         "movq    40(%%rsi), %%rax\n"
25052         "addq    %%rcx, 64(%%rdi)\n"
25053         "adcq    $0, %%rdx\n"
25054         "movq    %%rdx, %%rcx\n"
25055         "mulq    %%r9\n"
25056         "addq    %%rax, %%rcx\n"
25057         "adcq    $0, %%rdx\n"
25058         "movq    48(%%rsi), %%rax\n"
25059         "addq    %%rcx, 72(%%rdi)\n"
25060         "adcq    $0, %%rdx\n"
25061         "movq    %%rdx, %%rcx\n"
25062         "mulq    %%r9\n"
25063         "addq    %%rax, %%rcx\n"
25064         "adcq    $0, %%rdx\n"
25065         "movq    56(%%rsi), %%rax\n"
25066         "addq    %%rcx, 80(%%rdi)\n"
25067         "adcq    $0, %%rdx\n"
25068         "movq    %%rdx, %%rcx\n"
25069         "mulq    %%r9\n"
25070         "addq    %%rax, %%rcx\n"
25071         "adcq    $0, %%rdx\n"
25072         "movq    64(%%rsi), %%rax\n"
25073         "addq    %%rcx, 88(%%rdi)\n"
25074         "adcq    $0, %%rdx\n"
25075         "movq    %%rdx, %%rcx\n"
25076         "mulq    %%r9\n"
25077         "addq    %%rax, %%rcx\n"
25078         "adcq    $0, %%rdx\n"
25079         "movq    72(%%rsi), %%rax\n"
25080         "addq    %%rcx, 96(%%rdi)\n"
25081         "adcq    $0, %%rdx\n"
25082         "movq    %%rdx, %%rcx\n"
25083         "mulq    %%r9\n"
25084         "addq    %%rax, %%rcx\n"
25085         "adcq    $0, %%rdx\n"
25086         "movq    80(%%rsi), %%rax\n"
25087         "addq    %%rcx, 104(%%rdi)\n"
25088         "adcq    $0, %%rdx\n"
25089         "movq    %%rdx, %%rcx\n"
25090         "mulq    %%r9\n"
25091         "addq    %%rax, %%rcx\n"
25092         "adcq    $0, %%rdx\n"
25093         "addq    %%rcx, 112(%%rdi)\n"
25094         "adcq    $0, %%rdx\n"
25095         "movq    %%rdx, 120(%%rdi)\n"
25096         "### x*y[5]\n"
25097         "movq    40(%%r8), %%r9\n"
25098         "movq    0(%%rsi), %%rax\n"
25099         "mulq    %%r9\n"
25100         "addq    %%rax, 40(%%rdi)\n"
25101         "movq    8(%%rsi), %%rax\n"
25102         "adcq    $0, %%rdx\n"
25103         "movq    %%rdx, %%rcx\n"
25104         "mulq    %%r9\n"
25105         "addq    %%rax, %%rcx\n"
25106         "adcq    $0, %%rdx\n"
25107         "movq    16(%%rsi), %%rax\n"
25108         "addq    %%rcx, 48(%%rdi)\n"
25109         "adcq    $0, %%rdx\n"
25110         "movq    %%rdx, %%rcx\n"
25111         "mulq    %%r9\n"
25112         "addq    %%rax, %%rcx\n"
25113         "adcq    $0, %%rdx\n"
25114         "movq    24(%%rsi), %%rax\n"
25115         "addq    %%rcx, 56(%%rdi)\n"
25116         "adcq    $0, %%rdx\n"
25117         "movq    %%rdx, %%rcx\n"
25118         "mulq    %%r9\n"
25119         "addq    %%rax, %%rcx\n"
25120         "adcq    $0, %%rdx\n"
25121         "movq    32(%%rsi), %%rax\n"
25122         "addq    %%rcx, 64(%%rdi)\n"
25123         "adcq    $0, %%rdx\n"
25124         "movq    %%rdx, %%rcx\n"
25125         "mulq    %%r9\n"
25126         "addq    %%rax, %%rcx\n"
25127         "adcq    $0, %%rdx\n"
25128         "movq    40(%%rsi), %%rax\n"
25129         "addq    %%rcx, 72(%%rdi)\n"
25130         "adcq    $0, %%rdx\n"
25131         "movq    %%rdx, %%rcx\n"
25132         "mulq    %%r9\n"
25133         "addq    %%rax, %%rcx\n"
25134         "adcq    $0, %%rdx\n"
25135         "movq    48(%%rsi), %%rax\n"
25136         "addq    %%rcx, 80(%%rdi)\n"
25137         "adcq    $0, %%rdx\n"
25138         "movq    %%rdx, %%rcx\n"
25139         "mulq    %%r9\n"
25140         "addq    %%rax, %%rcx\n"
25141         "adcq    $0, %%rdx\n"
25142         "movq    56(%%rsi), %%rax\n"
25143         "addq    %%rcx, 88(%%rdi)\n"
25144         "adcq    $0, %%rdx\n"
25145         "movq    %%rdx, %%rcx\n"
25146         "mulq    %%r9\n"
25147         "addq    %%rax, %%rcx\n"
25148         "adcq    $0, %%rdx\n"
25149         "movq    64(%%rsi), %%rax\n"
25150         "addq    %%rcx, 96(%%rdi)\n"
25151         "adcq    $0, %%rdx\n"
25152         "movq    %%rdx, %%rcx\n"
25153         "mulq    %%r9\n"
25154         "addq    %%rax, %%rcx\n"
25155         "adcq    $0, %%rdx\n"
25156         "movq    72(%%rsi), %%rax\n"
25157         "addq    %%rcx, 104(%%rdi)\n"
25158         "adcq    $0, %%rdx\n"
25159         "movq    %%rdx, %%rcx\n"
25160         "mulq    %%r9\n"
25161         "addq    %%rax, %%rcx\n"
25162         "adcq    $0, %%rdx\n"
25163         "movq    80(%%rsi), %%rax\n"
25164         "addq    %%rcx, 112(%%rdi)\n"
25165         "adcq    $0, %%rdx\n"
25166         "movq    %%rdx, %%rcx\n"
25167         "mulq    %%r9\n"
25168         "addq    %%rax, %%rcx\n"
25169         "adcq    $0, %%rdx\n"
25170         "addq    %%rcx, 120(%%rdi)\n"
25171         "adcq    $0, %%rdx\n"
25172         "movq    %%rdx, 128(%%rdi)\n"
25173         "### x*y[6]\n"
25174         "movq    48(%%r8), %%r9\n"
25175         "movq    0(%%rsi), %%rax\n"
25176         "mulq    %%r9\n"
25177         "addq    %%rax, 48(%%rdi)\n"
25178         "movq    8(%%rsi), %%rax\n"
25179         "adcq    $0, %%rdx\n"
25180         "movq    %%rdx, %%rcx\n"
25181         "mulq    %%r9\n"
25182         "addq    %%rax, %%rcx\n"
25183         "adcq    $0, %%rdx\n"
25184         "movq    16(%%rsi), %%rax\n"
25185         "addq    %%rcx, 56(%%rdi)\n"
25186         "adcq    $0, %%rdx\n"
25187         "movq    %%rdx, %%rcx\n"
25188         "mulq    %%r9\n"
25189         "addq    %%rax, %%rcx\n"
25190         "adcq    $0, %%rdx\n"
25191         "movq    24(%%rsi), %%rax\n"
25192         "addq    %%rcx, 64(%%rdi)\n"
25193         "adcq    $0, %%rdx\n"
25194         "movq    %%rdx, %%rcx\n"
25195         "mulq    %%r9\n"
25196         "addq    %%rax, %%rcx\n"
25197         "adcq    $0, %%rdx\n"
25198         "movq    32(%%rsi), %%rax\n"
25199         "addq    %%rcx, 72(%%rdi)\n"
25200         "adcq    $0, %%rdx\n"
25201         "movq    %%rdx, %%rcx\n"
25202         "mulq    %%r9\n"
25203         "addq    %%rax, %%rcx\n"
25204         "adcq    $0, %%rdx\n"
25205         "movq    40(%%rsi), %%rax\n"
25206         "addq    %%rcx, 80(%%rdi)\n"
25207         "adcq    $0, %%rdx\n"
25208         "movq    %%rdx, %%rcx\n"
25209         "mulq    %%r9\n"
25210         "addq    %%rax, %%rcx\n"
25211         "adcq    $0, %%rdx\n"
25212         "movq    48(%%rsi), %%rax\n"
25213         "addq    %%rcx, 88(%%rdi)\n"
25214         "adcq    $0, %%rdx\n"
25215         "movq    %%rdx, %%rcx\n"
25216         "mulq    %%r9\n"
25217         "addq    %%rax, %%rcx\n"
25218         "adcq    $0, %%rdx\n"
25219         "movq    56(%%rsi), %%rax\n"
25220         "addq    %%rcx, 96(%%rdi)\n"
25221         "adcq    $0, %%rdx\n"
25222         "movq    %%rdx, %%rcx\n"
25223         "mulq    %%r9\n"
25224         "addq    %%rax, %%rcx\n"
25225         "adcq    $0, %%rdx\n"
25226         "movq    64(%%rsi), %%rax\n"
25227         "addq    %%rcx, 104(%%rdi)\n"
25228         "adcq    $0, %%rdx\n"
25229         "movq    %%rdx, %%rcx\n"
25230         "mulq    %%r9\n"
25231         "addq    %%rax, %%rcx\n"
25232         "adcq    $0, %%rdx\n"
25233         "movq    72(%%rsi), %%rax\n"
25234         "addq    %%rcx, 112(%%rdi)\n"
25235         "adcq    $0, %%rdx\n"
25236         "movq    %%rdx, %%rcx\n"
25237         "mulq    %%r9\n"
25238         "addq    %%rax, %%rcx\n"
25239         "adcq    $0, %%rdx\n"
25240         "movq    80(%%rsi), %%rax\n"
25241         "addq    %%rcx, 120(%%rdi)\n"
25242         "adcq    $0, %%rdx\n"
25243         "movq    %%rdx, %%rcx\n"
25244         "mulq    %%r9\n"
25245         "addq    %%rax, %%rcx\n"
25246         "adcq    $0, %%rdx\n"
25247         "addq    %%rcx, 128(%%rdi)\n"
25248         "adcq    $0, %%rdx\n"
25249         "movq    %%rdx, 136(%%rdi)\n"
25250         "### x*y[7]\n"
25251         "movq    56(%%r8), %%r9\n"
25252         "movq    0(%%rsi), %%rax\n"
25253         "mulq    %%r9\n"
25254         "addq    %%rax, 56(%%rdi)\n"
25255         "movq    8(%%rsi), %%rax\n"
25256         "adcq    $0, %%rdx\n"
25257         "movq    %%rdx, %%rcx\n"
25258         "mulq    %%r9\n"
25259         "addq    %%rax, %%rcx\n"
25260         "adcq    $0, %%rdx\n"
25261         "movq    16(%%rsi), %%rax\n"
25262         "addq    %%rcx, 64(%%rdi)\n"
25263         "adcq    $0, %%rdx\n"
25264         "movq    %%rdx, %%rcx\n"
25265         "mulq    %%r9\n"
25266         "addq    %%rax, %%rcx\n"
25267         "adcq    $0, %%rdx\n"
25268         "movq    24(%%rsi), %%rax\n"
25269         "addq    %%rcx, 72(%%rdi)\n"
25270         "adcq    $0, %%rdx\n"
25271         "movq    %%rdx, %%rcx\n"
25272         "mulq    %%r9\n"
25273         "addq    %%rax, %%rcx\n"
25274         "adcq    $0, %%rdx\n"
25275         "movq    32(%%rsi), %%rax\n"
25276         "addq    %%rcx, 80(%%rdi)\n"
25277         "adcq    $0, %%rdx\n"
25278         "movq    %%rdx, %%rcx\n"
25279         "mulq    %%r9\n"
25280         "addq    %%rax, %%rcx\n"
25281         "adcq    $0, %%rdx\n"
25282         "movq    40(%%rsi), %%rax\n"
25283         "addq    %%rcx, 88(%%rdi)\n"
25284         "adcq    $0, %%rdx\n"
25285         "movq    %%rdx, %%rcx\n"
25286         "mulq    %%r9\n"
25287         "addq    %%rax, %%rcx\n"
25288         "adcq    $0, %%rdx\n"
25289         "movq    48(%%rsi), %%rax\n"
25290         "addq    %%rcx, 96(%%rdi)\n"
25291         "adcq    $0, %%rdx\n"
25292         "movq    %%rdx, %%rcx\n"
25293         "mulq    %%r9\n"
25294         "addq    %%rax, %%rcx\n"
25295         "adcq    $0, %%rdx\n"
25296         "movq    56(%%rsi), %%rax\n"
25297         "addq    %%rcx, 104(%%rdi)\n"
25298         "adcq    $0, %%rdx\n"
25299         "movq    %%rdx, %%rcx\n"
25300         "mulq    %%r9\n"
25301         "addq    %%rax, %%rcx\n"
25302         "adcq    $0, %%rdx\n"
25303         "movq    64(%%rsi), %%rax\n"
25304         "addq    %%rcx, 112(%%rdi)\n"
25305         "adcq    $0, %%rdx\n"
25306         "movq    %%rdx, %%rcx\n"
25307         "mulq    %%r9\n"
25308         "addq    %%rax, %%rcx\n"
25309         "adcq    $0, %%rdx\n"
25310         "movq    72(%%rsi), %%rax\n"
25311         "addq    %%rcx, 120(%%rdi)\n"
25312         "adcq    $0, %%rdx\n"
25313         "movq    %%rdx, %%rcx\n"
25314         "mulq    %%r9\n"
25315         "addq    %%rax, %%rcx\n"
25316         "adcq    $0, %%rdx\n"
25317         "movq    80(%%rsi), %%rax\n"
25318         "addq    %%rcx, 128(%%rdi)\n"
25319         "adcq    $0, %%rdx\n"
25320         "movq    %%rdx, %%rcx\n"
25321         "mulq    %%r9\n"
25322         "addq    %%rax, %%rcx\n"
25323         "adcq    $0, %%rdx\n"
25324         "addq    %%rcx, 136(%%rdi)\n"
25325         "adcq    $0, %%rdx\n"
25326         "movq    %%rdx, 144(%%rdi)\n"
25327         "### x*y[8]\n"
25328         "movq    64(%%r8), %%r9\n"
25329         "movq    0(%%rsi), %%rax\n"
25330         "mulq    %%r9\n"
25331         "addq    %%rax, 64(%%rdi)\n"
25332         "movq    8(%%rsi), %%rax\n"
25333         "adcq    $0, %%rdx\n"
25334         "movq    %%rdx, %%rcx\n"
25335         "mulq    %%r9\n"
25336         "addq    %%rax, %%rcx\n"
25337         "adcq    $0, %%rdx\n"
25338         "movq    16(%%rsi), %%rax\n"
25339         "addq    %%rcx, 72(%%rdi)\n"
25340         "adcq    $0, %%rdx\n"
25341         "movq    %%rdx, %%rcx\n"
25342         "mulq    %%r9\n"
25343         "addq    %%rax, %%rcx\n"
25344         "adcq    $0, %%rdx\n"
25345         "movq    24(%%rsi), %%rax\n"
25346         "addq    %%rcx, 80(%%rdi)\n"
25347         "adcq    $0, %%rdx\n"
25348         "movq    %%rdx, %%rcx\n"
25349         "mulq    %%r9\n"
25350         "addq    %%rax, %%rcx\n"
25351         "adcq    $0, %%rdx\n"
25352         "movq    32(%%rsi), %%rax\n"
25353         "addq    %%rcx, 88(%%rdi)\n"
25354         "adcq    $0, %%rdx\n"
25355         "movq    %%rdx, %%rcx\n"
25356         "mulq    %%r9\n"
25357         "addq    %%rax, %%rcx\n"
25358         "adcq    $0, %%rdx\n"
25359         "movq    40(%%rsi), %%rax\n"
25360         "addq    %%rcx, 96(%%rdi)\n"
25361         "adcq    $0, %%rdx\n"
25362         "movq    %%rdx, %%rcx\n"
25363         "mulq    %%r9\n"
25364         "addq    %%rax, %%rcx\n"
25365         "adcq    $0, %%rdx\n"
25366         "movq    48(%%rsi), %%rax\n"
25367         "addq    %%rcx, 104(%%rdi)\n"
25368         "adcq    $0, %%rdx\n"
25369         "movq    %%rdx, %%rcx\n"
25370         "mulq    %%r9\n"
25371         "addq    %%rax, %%rcx\n"
25372         "adcq    $0, %%rdx\n"
25373         "movq    56(%%rsi), %%rax\n"
25374         "addq    %%rcx, 112(%%rdi)\n"
25375         "adcq    $0, %%rdx\n"
25376         "movq    %%rdx, %%rcx\n"
25377         "mulq    %%r9\n"
25378         "addq    %%rax, %%rcx\n"
25379         "adcq    $0, %%rdx\n"
25380         "movq    64(%%rsi), %%rax\n"
25381         "addq    %%rcx, 120(%%rdi)\n"
25382         "adcq    $0, %%rdx\n"
25383         "movq    %%rdx, %%rcx\n"
25384         "mulq    %%r9\n"
25385         "addq    %%rax, %%rcx\n"
25386         "adcq    $0, %%rdx\n"
25387         "movq    72(%%rsi), %%rax\n"
25388         "addq    %%rcx, 128(%%rdi)\n"
25389         "adcq    $0, %%rdx\n"
25390         "movq    %%rdx, %%rcx\n"
25391         "mulq    %%r9\n"
25392         "addq    %%rax, %%rcx\n"
25393         "adcq    $0, %%rdx\n"
25394         "movq    80(%%rsi), %%rax\n"
25395         "addq    %%rcx, 136(%%rdi)\n"
25396         "adcq    $0, %%rdx\n"
25397         "movq    %%rdx, %%rcx\n"
25398         "mulq    %%r9\n"
25399         "addq    %%rax, %%rcx\n"
25400         "adcq    $0, %%rdx\n"
25401         "addq    %%rcx, 144(%%rdi)\n"
25402         "adcq    $0, %%rdx\n"
25403         "movq    %%rdx, 152(%%rdi)\n"
25404         "### x*y[9]\n"
25405         "movq    72(%%r8), %%r9\n"
25406         "movq    0(%%rsi), %%rax\n"
25407         "mulq    %%r9\n"
25408         "addq    %%rax, 72(%%rdi)\n"
25409         "movq    8(%%rsi), %%rax\n"
25410         "adcq    $0, %%rdx\n"
25411         "movq    %%rdx, %%rcx\n"
25412         "mulq    %%r9\n"
25413         "addq    %%rax, %%rcx\n"
25414         "adcq    $0, %%rdx\n"
25415         "movq    16(%%rsi), %%rax\n"
25416         "addq    %%rcx, 80(%%rdi)\n"
25417         "adcq    $0, %%rdx\n"
25418         "movq    %%rdx, %%rcx\n"
25419         "mulq    %%r9\n"
25420         "addq    %%rax, %%rcx\n"
25421         "adcq    $0, %%rdx\n"
25422         "movq    24(%%rsi), %%rax\n"
25423         "addq    %%rcx, 88(%%rdi)\n"
25424         "adcq    $0, %%rdx\n"
25425         "movq    %%rdx, %%rcx\n"
25426         "mulq    %%r9\n"
25427         "addq    %%rax, %%rcx\n"
25428         "adcq    $0, %%rdx\n"
25429         "movq    32(%%rsi), %%rax\n"
25430         "addq    %%rcx, 96(%%rdi)\n"
25431         "adcq    $0, %%rdx\n"
25432         "movq    %%rdx, %%rcx\n"
25433         "mulq    %%r9\n"
25434         "addq    %%rax, %%rcx\n"
25435         "adcq    $0, %%rdx\n"
25436         "movq    40(%%rsi), %%rax\n"
25437         "addq    %%rcx, 104(%%rdi)\n"
25438         "adcq    $0, %%rdx\n"
25439         "movq    %%rdx, %%rcx\n"
25440         "mulq    %%r9\n"
25441         "addq    %%rax, %%rcx\n"
25442         "adcq    $0, %%rdx\n"
25443         "movq    48(%%rsi), %%rax\n"
25444         "addq    %%rcx, 112(%%rdi)\n"
25445         "adcq    $0, %%rdx\n"
25446         "movq    %%rdx, %%rcx\n"
25447         "mulq    %%r9\n"
25448         "addq    %%rax, %%rcx\n"
25449         "adcq    $0, %%rdx\n"
25450         "movq    56(%%rsi), %%rax\n"
25451         "addq    %%rcx, 120(%%rdi)\n"
25452         "adcq    $0, %%rdx\n"
25453         "movq    %%rdx, %%rcx\n"
25454         "mulq    %%r9\n"
25455         "addq    %%rax, %%rcx\n"
25456         "adcq    $0, %%rdx\n"
25457         "movq    64(%%rsi), %%rax\n"
25458         "addq    %%rcx, 128(%%rdi)\n"
25459         "adcq    $0, %%rdx\n"
25460         "movq    %%rdx, %%rcx\n"
25461         "mulq    %%r9\n"
25462         "addq    %%rax, %%rcx\n"
25463         "adcq    $0, %%rdx\n"
25464         "movq    72(%%rsi), %%rax\n"
25465         "addq    %%rcx, 136(%%rdi)\n"
25466         "adcq    $0, %%rdx\n"
25467         "movq    %%rdx, %%rcx\n"
25468         "mulq    %%r9\n"
25469         "addq    %%rax, %%rcx\n"
25470         "adcq    $0, %%rdx\n"
25471         "movq    80(%%rsi), %%rax\n"
25472         "addq    %%rcx, 144(%%rdi)\n"
25473         "adcq    $0, %%rdx\n"
25474         "movq    %%rdx, %%rcx\n"
25475         "mulq    %%r9\n"
25476         "addq    %%rax, %%rcx\n"
25477         "adcq    $0, %%rdx\n"
25478         "addq    %%rcx, 152(%%rdi)\n"
25479         "adcq    $0, %%rdx\n"
25480         "movq    %%rdx, 160(%%rdi)\n"
25481         "### x*y[10]\n"
25482         "movq    80(%%r8), %%r9\n"
25483         "movq    0(%%rsi), %%rax\n"
25484         "mulq    %%r9\n"
25485         "addq    %%rax, 80(%%rdi)\n"
25486         "movq    8(%%rsi), %%rax\n"
25487         "adcq    $0, %%rdx\n"
25488         "movq    %%rdx, %%rcx\n"
25489         "mulq    %%r9\n"
25490         "addq    %%rax, %%rcx\n"
25491         "adcq    $0, %%rdx\n"
25492         "movq    16(%%rsi), %%rax\n"
25493         "addq    %%rcx, 88(%%rdi)\n"
25494         "adcq    $0, %%rdx\n"
25495         "movq    %%rdx, %%rcx\n"
25496         "mulq    %%r9\n"
25497         "addq    %%rax, %%rcx\n"
25498         "adcq    $0, %%rdx\n"
25499         "movq    24(%%rsi), %%rax\n"
25500         "addq    %%rcx, 96(%%rdi)\n"
25501         "adcq    $0, %%rdx\n"
25502         "movq    %%rdx, %%rcx\n"
25503         "mulq    %%r9\n"
25504         "addq    %%rax, %%rcx\n"
25505         "adcq    $0, %%rdx\n"
25506         "movq    32(%%rsi), %%rax\n"
25507         "addq    %%rcx, 104(%%rdi)\n"
25508         "adcq    $0, %%rdx\n"
25509         "movq    %%rdx, %%rcx\n"
25510         "mulq    %%r9\n"
25511         "addq    %%rax, %%rcx\n"
25512         "adcq    $0, %%rdx\n"
25513         "movq    40(%%rsi), %%rax\n"
25514         "addq    %%rcx, 112(%%rdi)\n"
25515         "adcq    $0, %%rdx\n"
25516         "movq    %%rdx, %%rcx\n"
25517         "mulq    %%r9\n"
25518         "addq    %%rax, %%rcx\n"
25519         "adcq    $0, %%rdx\n"
25520         "movq    48(%%rsi), %%rax\n"
25521         "addq    %%rcx, 120(%%rdi)\n"
25522         "adcq    $0, %%rdx\n"
25523         "movq    %%rdx, %%rcx\n"
25524         "mulq    %%r9\n"
25525         "addq    %%rax, %%rcx\n"
25526         "adcq    $0, %%rdx\n"
25527         "movq    56(%%rsi), %%rax\n"
25528         "addq    %%rcx, 128(%%rdi)\n"
25529         "adcq    $0, %%rdx\n"
25530         "movq    %%rdx, %%rcx\n"
25531         "mulq    %%r9\n"
25532         "addq    %%rax, %%rcx\n"
25533         "adcq    $0, %%rdx\n"
25534         "movq    64(%%rsi), %%rax\n"
25535         "addq    %%rcx, 136(%%rdi)\n"
25536         "adcq    $0, %%rdx\n"
25537         "movq    %%rdx, %%rcx\n"
25538         "mulq    %%r9\n"
25539         "addq    %%rax, %%rcx\n"
25540         "adcq    $0, %%rdx\n"
25541         "movq    72(%%rsi), %%rax\n"
25542         "addq    %%rcx, 144(%%rdi)\n"
25543         "adcq    $0, %%rdx\n"
25544         "movq    %%rdx, %%rcx\n"
25545         "mulq    %%r9\n"
25546         "addq    %%rax, %%rcx\n"
25547         "adcq    $0, %%rdx\n"
25548         "movq    80(%%rsi), %%rax\n"
25549         "addq    %%rcx, 152(%%rdi)\n"
25550         "adcq    $0, %%rdx\n"
25551         "movq    %%rdx, %%rcx\n"
25552         "mulq    %%r9\n"
25553         "addq    %%rax, %%rcx\n"
25554         "adcq    $0, %%rdx\n"
25555         "addq    %%rcx, 160(%%rdi)\n"
25556       : "+m" (z)
25557       : "m" (x), "m" (y)
25558       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
25559 }
25560 
25561 /* x has 10.5 words, z has 21. Put x*y in z. */
25562 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
25563 static inline
mpfq_fixmp_10_5_sqr(mp_limb_t * z,const mp_limb_t * x)25564 void mpfq_fixmp_10_5_sqr(mp_limb_t * z, const mp_limb_t * x)
25565 {
25566     mpfq_fixmp_10_5_mul(z, x, x);
25567 }
25568 
25569 /* x has 10.5 words, z has 12. Put x*y in z. */
25570 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
25571 static inline
mpfq_fixmp_10_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)25572 void mpfq_fixmp_10_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
25573 {
25574     __asm__ __volatile__(
25575         "movq    %[z], %%rdi\n"
25576         "movq    %[x], %%rsi\n"
25577         "movq    0(%%rsi), %%rax\n"
25578         "mulq    %[mult]\n"
25579         "movq    %%rax, 0(%%rdi)\n"
25580         "movq    8(%%rsi), %%rax\n"
25581         "movq    %%rdx, %%rcx\n"
25582         "mulq    %[mult]\n"
25583         "addq    %%rax, %%rcx\n"
25584         "adcq    $0, %%rdx\n"
25585         "movq    16(%%rsi), %%rax\n"
25586         "movq    %%rcx, 8(%%rdi)\n"
25587         "movq    %%rdx, %%rcx\n"
25588         "mulq    %[mult]\n"
25589         "addq    %%rax, %%rcx\n"
25590         "adcq    $0, %%rdx\n"
25591         "movq    24(%%rsi), %%rax\n"
25592         "movq    %%rcx, 16(%%rdi)\n"
25593         "movq    %%rdx, %%rcx\n"
25594         "mulq    %[mult]\n"
25595         "addq    %%rax, %%rcx\n"
25596         "adcq    $0, %%rdx\n"
25597         "movq    32(%%rsi), %%rax\n"
25598         "movq    %%rcx, 24(%%rdi)\n"
25599         "movq    %%rdx, %%rcx\n"
25600         "mulq    %[mult]\n"
25601         "addq    %%rax, %%rcx\n"
25602         "adcq    $0, %%rdx\n"
25603         "movq    40(%%rsi), %%rax\n"
25604         "movq    %%rcx, 32(%%rdi)\n"
25605         "movq    %%rdx, %%rcx\n"
25606         "mulq    %[mult]\n"
25607         "addq    %%rax, %%rcx\n"
25608         "adcq    $0, %%rdx\n"
25609         "movq    48(%%rsi), %%rax\n"
25610         "movq    %%rcx, 40(%%rdi)\n"
25611         "movq    %%rdx, %%rcx\n"
25612         "mulq    %[mult]\n"
25613         "addq    %%rax, %%rcx\n"
25614         "adcq    $0, %%rdx\n"
25615         "movq    56(%%rsi), %%rax\n"
25616         "movq    %%rcx, 48(%%rdi)\n"
25617         "movq    %%rdx, %%rcx\n"
25618         "mulq    %[mult]\n"
25619         "addq    %%rax, %%rcx\n"
25620         "adcq    $0, %%rdx\n"
25621         "movq    64(%%rsi), %%rax\n"
25622         "movq    %%rcx, 56(%%rdi)\n"
25623         "movq    %%rdx, %%rcx\n"
25624         "mulq    %[mult]\n"
25625         "addq    %%rax, %%rcx\n"
25626         "adcq    $0, %%rdx\n"
25627         "movq    72(%%rsi), %%rax\n"
25628         "movq    %%rcx, 64(%%rdi)\n"
25629         "movq    %%rdx, %%rcx\n"
25630         "mulq    %[mult]\n"
25631         "addq    %%rax, %%rcx\n"
25632         "adcq    $0, %%rdx\n"
25633         "movq    80(%%rsi), %%rax\n"
25634         "movq    %%rcx, 72(%%rdi)\n"
25635         "movq    %%rdx, %%rcx\n"
25636         "mulq    %[mult]\n"
25637         "addq    %%rax, %%rcx\n"
25638         "adcq    $0, %%rdx\n"
25639         "movq    %%rcx, 80(%%rdi)\n"
25640         "movq    %%rdx, 88(%%rdi)\n"
25641     :
25642     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
25643     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
25644 }
25645 
25646 /* x has 10.5 words, z has 11. c is 0.5 word.
25647  * Put (z+x*c) in z. Return carry bit. */
25648 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
25649 static inline
mpfq_fixmp_10_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)25650 mp_limb_t mpfq_fixmp_10_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
25651 {
25652     mp_limb_t carry;
25653     __asm__ __volatile__(
25654         "movq    %[z], %%rdi\n"
25655         "movq    %[x], %%rsi\n"
25656         "movq    0(%%rsi), %%rax\n"
25657         "mulq    %[mult]\n"
25658         "addq    %%rax, 0(%%rdi)\n"
25659         "movq    8(%%rsi), %%rax\n"
25660         "adcq    $0, %%rdx\n"
25661         "movq    %%rdx, %%rcx\n"
25662         "mulq    %[mult]\n"
25663         "addq    %%rax, %%rcx\n"
25664         "adcq    $0, %%rdx\n"
25665         "movq    16(%%rsi), %%rax\n"
25666         "addq    %%rcx, 8(%%rdi)\n"
25667         "adcq    $0, %%rdx\n"
25668         "movq    %%rdx, %%rcx\n"
25669         "mulq    %[mult]\n"
25670         "addq    %%rax, %%rcx\n"
25671         "adcq    $0, %%rdx\n"
25672         "movq    24(%%rsi), %%rax\n"
25673         "addq    %%rcx, 16(%%rdi)\n"
25674         "adcq    $0, %%rdx\n"
25675         "movq    %%rdx, %%rcx\n"
25676         "mulq    %[mult]\n"
25677         "addq    %%rax, %%rcx\n"
25678         "adcq    $0, %%rdx\n"
25679         "movq    32(%%rsi), %%rax\n"
25680         "addq    %%rcx, 24(%%rdi)\n"
25681         "adcq    $0, %%rdx\n"
25682         "movq    %%rdx, %%rcx\n"
25683         "mulq    %[mult]\n"
25684         "addq    %%rax, %%rcx\n"
25685         "adcq    $0, %%rdx\n"
25686         "movq    40(%%rsi), %%rax\n"
25687         "addq    %%rcx, 32(%%rdi)\n"
25688         "adcq    $0, %%rdx\n"
25689         "movq    %%rdx, %%rcx\n"
25690         "mulq    %[mult]\n"
25691         "addq    %%rax, %%rcx\n"
25692         "adcq    $0, %%rdx\n"
25693         "movq    48(%%rsi), %%rax\n"
25694         "addq    %%rcx, 40(%%rdi)\n"
25695         "adcq    $0, %%rdx\n"
25696         "movq    %%rdx, %%rcx\n"
25697         "mulq    %[mult]\n"
25698         "addq    %%rax, %%rcx\n"
25699         "adcq    $0, %%rdx\n"
25700         "movq    56(%%rsi), %%rax\n"
25701         "addq    %%rcx, 48(%%rdi)\n"
25702         "adcq    $0, %%rdx\n"
25703         "movq    %%rdx, %%rcx\n"
25704         "mulq    %[mult]\n"
25705         "addq    %%rax, %%rcx\n"
25706         "adcq    $0, %%rdx\n"
25707         "movq    64(%%rsi), %%rax\n"
25708         "addq    %%rcx, 56(%%rdi)\n"
25709         "adcq    $0, %%rdx\n"
25710         "movq    %%rdx, %%rcx\n"
25711         "mulq    %[mult]\n"
25712         "addq    %%rax, %%rcx\n"
25713         "adcq    $0, %%rdx\n"
25714         "movq    72(%%rsi), %%rax\n"
25715         "addq    %%rcx, 64(%%rdi)\n"
25716         "adcq    $0, %%rdx\n"
25717         "movq    %%rdx, %%rcx\n"
25718         "mulq    %[mult]\n"
25719         "addq    %%rax, %%rcx\n"
25720         "adcq    $0, %%rdx\n"
25721         "movq    80(%%rsi), %%rax\n"
25722         "addq    %%rcx, 72(%%rdi)\n"
25723         "adcq    $0, %%rdx\n"
25724         "movq    %%rdx, %%rcx\n"
25725         "imulq    %[mult], %%rax\n"
25726         "xorq    %%rdx, %%rdx\n"
25727         "addq    %%rcx, %%rax\n"
25728         "adcq    $0, %%rdx\n"
25729         "addq    %%rax, 80(%%rdi)\n"
25730         "adcq    $0, %%rdx\n"
25731         "movq    %%rdx, %[carry]\n"
25732     : [carry]"=g"(carry), [z] "+m" (z)
25733     : [mult] "r" (c), [x] "m" (x)
25734     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
25735     return carry;
25736 }
25737 
25738 /* x has 10.5 words, z has 11. c is 0.5 word.
25739  * Put (z+x*c) in z. Carry bit is lost. */
25740 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
25741 static inline
mpfq_fixmp_10_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)25742 void mpfq_fixmp_10_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
25743 {
25744     __asm__ __volatile__(
25745         "movq    %[z], %%rdi\n"
25746         "movq    %[x], %%rsi\n"
25747         "movq    0(%%rsi), %%rax\n"
25748         "mulq    %[mult]\n"
25749         "addq    %%rax, 0(%%rdi)\n"
25750         "movq    8(%%rsi), %%rax\n"
25751         "adcq    $0, %%rdx\n"
25752         "movq    %%rdx, %%rcx\n"
25753         "mulq    %[mult]\n"
25754         "addq    %%rax, %%rcx\n"
25755         "adcq    $0, %%rdx\n"
25756         "movq    16(%%rsi), %%rax\n"
25757         "addq    %%rcx, 8(%%rdi)\n"
25758         "adcq    $0, %%rdx\n"
25759         "movq    %%rdx, %%rcx\n"
25760         "mulq    %[mult]\n"
25761         "addq    %%rax, %%rcx\n"
25762         "adcq    $0, %%rdx\n"
25763         "movq    24(%%rsi), %%rax\n"
25764         "addq    %%rcx, 16(%%rdi)\n"
25765         "adcq    $0, %%rdx\n"
25766         "movq    %%rdx, %%rcx\n"
25767         "mulq    %[mult]\n"
25768         "addq    %%rax, %%rcx\n"
25769         "adcq    $0, %%rdx\n"
25770         "movq    32(%%rsi), %%rax\n"
25771         "addq    %%rcx, 24(%%rdi)\n"
25772         "adcq    $0, %%rdx\n"
25773         "movq    %%rdx, %%rcx\n"
25774         "mulq    %[mult]\n"
25775         "addq    %%rax, %%rcx\n"
25776         "adcq    $0, %%rdx\n"
25777         "movq    40(%%rsi), %%rax\n"
25778         "addq    %%rcx, 32(%%rdi)\n"
25779         "adcq    $0, %%rdx\n"
25780         "movq    %%rdx, %%rcx\n"
25781         "mulq    %[mult]\n"
25782         "addq    %%rax, %%rcx\n"
25783         "adcq    $0, %%rdx\n"
25784         "movq    48(%%rsi), %%rax\n"
25785         "addq    %%rcx, 40(%%rdi)\n"
25786         "adcq    $0, %%rdx\n"
25787         "movq    %%rdx, %%rcx\n"
25788         "mulq    %[mult]\n"
25789         "addq    %%rax, %%rcx\n"
25790         "adcq    $0, %%rdx\n"
25791         "movq    56(%%rsi), %%rax\n"
25792         "addq    %%rcx, 48(%%rdi)\n"
25793         "adcq    $0, %%rdx\n"
25794         "movq    %%rdx, %%rcx\n"
25795         "mulq    %[mult]\n"
25796         "addq    %%rax, %%rcx\n"
25797         "adcq    $0, %%rdx\n"
25798         "movq    64(%%rsi), %%rax\n"
25799         "addq    %%rcx, 56(%%rdi)\n"
25800         "adcq    $0, %%rdx\n"
25801         "movq    %%rdx, %%rcx\n"
25802         "mulq    %[mult]\n"
25803         "addq    %%rax, %%rcx\n"
25804         "adcq    $0, %%rdx\n"
25805         "movq    72(%%rsi), %%rax\n"
25806         "addq    %%rcx, 64(%%rdi)\n"
25807         "adcq    $0, %%rdx\n"
25808         "movq    %%rdx, %%rcx\n"
25809         "mulq    %[mult]\n"
25810         "addq    %%rax, %%rcx\n"
25811         "adcq    $0, %%rdx\n"
25812         "movq    80(%%rsi), %%rax\n"
25813         "addq    %%rcx, 72(%%rdi)\n"
25814         "adcq    $0, %%rdx\n"
25815         "movq    %%rdx, %%rcx\n"
25816         "imulq    %[mult], %%rax\n"
25817         "addq    %%rcx, %%rax\n"
25818         "addq    %%rax, 80(%%rdi)\n"
25819     : [z] "+m" (z)
25820     : [mult] "r" (c), [x] "m" (x)
25821     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
25822 }
25823 
25824 /* x has 10.5 words, z has 11. c is 0.5 word.
25825  * Put (x*c) in z. No carry. */
25826 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
25827 static inline
mpfq_fixmp_10_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)25828 void mpfq_fixmp_10_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
25829 {
25830     __asm__ __volatile__(
25831         "movq    %[z], %%rdi\n"
25832         "movq    %[x], %%rsi\n"
25833         "movq    0(%%rsi), %%rax\n"
25834         "mulq    %[mult]\n"
25835         "movq    %%rax, 0(%%rdi)\n"
25836         "movq    8(%%rsi), %%rax\n"
25837         "movq    %%rdx, %%rcx\n"
25838         "mulq    %[mult]\n"
25839         "addq    %%rax, %%rcx\n"
25840         "adcq    $0, %%rdx\n"
25841         "movq    16(%%rsi), %%rax\n"
25842         "movq    %%rcx, 8(%%rdi)\n"
25843         "movq    %%rdx, %%rcx\n"
25844         "mulq    %[mult]\n"
25845         "addq    %%rax, %%rcx\n"
25846         "adcq    $0, %%rdx\n"
25847         "movq    24(%%rsi), %%rax\n"
25848         "movq    %%rcx, 16(%%rdi)\n"
25849         "movq    %%rdx, %%rcx\n"
25850         "mulq    %[mult]\n"
25851         "addq    %%rax, %%rcx\n"
25852         "adcq    $0, %%rdx\n"
25853         "movq    32(%%rsi), %%rax\n"
25854         "movq    %%rcx, 24(%%rdi)\n"
25855         "movq    %%rdx, %%rcx\n"
25856         "mulq    %[mult]\n"
25857         "addq    %%rax, %%rcx\n"
25858         "adcq    $0, %%rdx\n"
25859         "movq    40(%%rsi), %%rax\n"
25860         "movq    %%rcx, 32(%%rdi)\n"
25861         "movq    %%rdx, %%rcx\n"
25862         "mulq    %[mult]\n"
25863         "addq    %%rax, %%rcx\n"
25864         "adcq    $0, %%rdx\n"
25865         "movq    48(%%rsi), %%rax\n"
25866         "movq    %%rcx, 40(%%rdi)\n"
25867         "movq    %%rdx, %%rcx\n"
25868         "mulq    %[mult]\n"
25869         "addq    %%rax, %%rcx\n"
25870         "adcq    $0, %%rdx\n"
25871         "movq    56(%%rsi), %%rax\n"
25872         "movq    %%rcx, 48(%%rdi)\n"
25873         "movq    %%rdx, %%rcx\n"
25874         "mulq    %[mult]\n"
25875         "addq    %%rax, %%rcx\n"
25876         "adcq    $0, %%rdx\n"
25877         "movq    64(%%rsi), %%rax\n"
25878         "movq    %%rcx, 56(%%rdi)\n"
25879         "movq    %%rdx, %%rcx\n"
25880         "mulq    %[mult]\n"
25881         "addq    %%rax, %%rcx\n"
25882         "adcq    $0, %%rdx\n"
25883         "movq    72(%%rsi), %%rax\n"
25884         "movq    %%rcx, 64(%%rdi)\n"
25885         "movq    %%rdx, %%rcx\n"
25886         "mulq    %[mult]\n"
25887         "addq    %%rax, %%rcx\n"
25888         "adcq    $0, %%rdx\n"
25889         "movq    80(%%rsi), %%rax\n"
25890         "movq    %%rcx, 72(%%rdi)\n"
25891         "movq    %%rdx, %%rcx\n"
25892         "imulq    %[mult], %%rax\n"
25893         "addq    %%rcx, %%rax\n"
25894         "movq    %%rax, 80(%%rdi)\n"
25895     :
25896     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
25897     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
25898 }
25899 
25900 /* x, y, and z have 11.5 words. Result in z. Return carry bit */
25901 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
25902 static inline
mpfq_fixmp_11_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)25903 mp_limb_t mpfq_fixmp_11_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
25904 {
25905     mp_limb_t carry;
25906     __asm__ __volatile__(
25907         "movq    %[z], %%rdi\n"
25908         "movq    %[x], %%rsi\n"
25909         "movq    %[y], %%rdx\n"
25910         "movq    0(%%rsi), %%rax\n"
25911         "addq    0(%%rdx), %%rax\n"
25912         "movq    %%rax, 0(%%rdi)\n"
25913         "movq    8(%%rsi), %%rax\n"
25914         "adcq    8(%%rdx), %%rax\n"
25915         "movq    %%rax, 8(%%rdi)\n"
25916         "movq    16(%%rsi), %%rax\n"
25917         "adcq    16(%%rdx), %%rax\n"
25918         "movq    %%rax, 16(%%rdi)\n"
25919         "movq    24(%%rsi), %%rax\n"
25920         "adcq    24(%%rdx), %%rax\n"
25921         "movq    %%rax, 24(%%rdi)\n"
25922         "movq    32(%%rsi), %%rax\n"
25923         "adcq    32(%%rdx), %%rax\n"
25924         "movq    %%rax, 32(%%rdi)\n"
25925         "movq    40(%%rsi), %%rax\n"
25926         "adcq    40(%%rdx), %%rax\n"
25927         "movq    %%rax, 40(%%rdi)\n"
25928         "movq    48(%%rsi), %%rax\n"
25929         "adcq    48(%%rdx), %%rax\n"
25930         "movq    %%rax, 48(%%rdi)\n"
25931         "movq    56(%%rsi), %%rax\n"
25932         "adcq    56(%%rdx), %%rax\n"
25933         "movq    %%rax, 56(%%rdi)\n"
25934         "movq    64(%%rsi), %%rax\n"
25935         "adcq    64(%%rdx), %%rax\n"
25936         "movq    %%rax, 64(%%rdi)\n"
25937         "movq    72(%%rsi), %%rax\n"
25938         "adcq    72(%%rdx), %%rax\n"
25939         "movq    %%rax, 72(%%rdi)\n"
25940         "movq    80(%%rsi), %%rax\n"
25941         "adcq    80(%%rdx), %%rax\n"
25942         "movq    %%rax, 80(%%rdi)\n"
25943         "movq    88(%%rsi), %%rax\n"
25944         "adcq    88(%%rdx), %%rax\n"
25945         "movq    %%rax, 88(%%rdi)\n"
25946         "movq $0, %%rax\n"
25947         "adcq $0, %%rax\n"
25948     : "=&a"(carry)
25949     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
25950     : "%rdx", "%rsi", "%rdi", "memory");
25951     return carry;
25952 }
25953 
25954 /* x, y, and z have 11.5 words. Result in z. Return borrow bit */
25955 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
25956 static inline
mpfq_fixmp_11_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)25957 mp_limb_t mpfq_fixmp_11_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
25958 {
25959     mp_limb_t carry;
25960     __asm__ __volatile__(
25961         "movq    %[z], %%rdi\n"
25962         "movq    %[x], %%rsi\n"
25963         "movq    %[y], %%rdx\n"
25964         "movq    0(%%rsi), %%rax\n"
25965         "subq    0(%%rdx), %%rax\n"
25966         "movq    %%rax, 0(%%rdi)\n"
25967         "movq    8(%%rsi), %%rax\n"
25968         "sbbq    8(%%rdx), %%rax\n"
25969         "movq    %%rax, 8(%%rdi)\n"
25970         "movq    16(%%rsi), %%rax\n"
25971         "sbbq    16(%%rdx), %%rax\n"
25972         "movq    %%rax, 16(%%rdi)\n"
25973         "movq    24(%%rsi), %%rax\n"
25974         "sbbq    24(%%rdx), %%rax\n"
25975         "movq    %%rax, 24(%%rdi)\n"
25976         "movq    32(%%rsi), %%rax\n"
25977         "sbbq    32(%%rdx), %%rax\n"
25978         "movq    %%rax, 32(%%rdi)\n"
25979         "movq    40(%%rsi), %%rax\n"
25980         "sbbq    40(%%rdx), %%rax\n"
25981         "movq    %%rax, 40(%%rdi)\n"
25982         "movq    48(%%rsi), %%rax\n"
25983         "sbbq    48(%%rdx), %%rax\n"
25984         "movq    %%rax, 48(%%rdi)\n"
25985         "movq    56(%%rsi), %%rax\n"
25986         "sbbq    56(%%rdx), %%rax\n"
25987         "movq    %%rax, 56(%%rdi)\n"
25988         "movq    64(%%rsi), %%rax\n"
25989         "sbbq    64(%%rdx), %%rax\n"
25990         "movq    %%rax, 64(%%rdi)\n"
25991         "movq    72(%%rsi), %%rax\n"
25992         "sbbq    72(%%rdx), %%rax\n"
25993         "movq    %%rax, 72(%%rdi)\n"
25994         "movq    80(%%rsi), %%rax\n"
25995         "sbbq    80(%%rdx), %%rax\n"
25996         "movq    %%rax, 80(%%rdi)\n"
25997         "movq    88(%%rsi), %%rax\n"
25998         "sbbq    88(%%rdx), %%rax\n"
25999         "movq    %%rax, 88(%%rdi)\n"
26000         "movq $0, %%rax\n"
26001         "adcq $0, %%rax\n"
26002     : "=&a"(carry)
26003     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
26004     : "%rdx", "%rsi", "%rdi", "memory");
26005     return carry;
26006 }
26007 
26008 /* x, y, and z have 11.5 words. Result in z. Carry bit is lost. */
26009 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
26010 static inline
mpfq_fixmp_11_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)26011 void mpfq_fixmp_11_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
26012 {
26013     __asm__ __volatile__(
26014         "movq    %[z], %%rdi\n"
26015         "movq    %[x], %%rsi\n"
26016         "movq    %[y], %%rdx\n"
26017         "movq    0(%%rsi), %%rax\n"
26018         "addq    0(%%rdx), %%rax\n"
26019         "movq    %%rax, 0(%%rdi)\n"
26020         "movq    8(%%rsi), %%rax\n"
26021         "adcq    8(%%rdx), %%rax\n"
26022         "movq    %%rax, 8(%%rdi)\n"
26023         "movq    16(%%rsi), %%rax\n"
26024         "adcq    16(%%rdx), %%rax\n"
26025         "movq    %%rax, 16(%%rdi)\n"
26026         "movq    24(%%rsi), %%rax\n"
26027         "adcq    24(%%rdx), %%rax\n"
26028         "movq    %%rax, 24(%%rdi)\n"
26029         "movq    32(%%rsi), %%rax\n"
26030         "adcq    32(%%rdx), %%rax\n"
26031         "movq    %%rax, 32(%%rdi)\n"
26032         "movq    40(%%rsi), %%rax\n"
26033         "adcq    40(%%rdx), %%rax\n"
26034         "movq    %%rax, 40(%%rdi)\n"
26035         "movq    48(%%rsi), %%rax\n"
26036         "adcq    48(%%rdx), %%rax\n"
26037         "movq    %%rax, 48(%%rdi)\n"
26038         "movq    56(%%rsi), %%rax\n"
26039         "adcq    56(%%rdx), %%rax\n"
26040         "movq    %%rax, 56(%%rdi)\n"
26041         "movq    64(%%rsi), %%rax\n"
26042         "adcq    64(%%rdx), %%rax\n"
26043         "movq    %%rax, 64(%%rdi)\n"
26044         "movq    72(%%rsi), %%rax\n"
26045         "adcq    72(%%rdx), %%rax\n"
26046         "movq    %%rax, 72(%%rdi)\n"
26047         "movq    80(%%rsi), %%rax\n"
26048         "adcq    80(%%rdx), %%rax\n"
26049         "movq    %%rax, 80(%%rdi)\n"
26050         "movq    88(%%rsi), %%rax\n"
26051         "adcq    88(%%rdx), %%rax\n"
26052         "movq    %%rax, 88(%%rdi)\n"
26053     :
26054     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
26055     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
26056 }
26057 
26058 /* x, y, and z have 11.5 words. Result in z. Borrow bit is lost. */
26059 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
26060 static inline
mpfq_fixmp_11_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)26061 void mpfq_fixmp_11_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
26062 {
26063     __asm__ __volatile__(
26064         "movq    %[z], %%rdi\n"
26065         "movq    %[x], %%rsi\n"
26066         "movq    %[y], %%rdx\n"
26067         "movq    0(%%rsi), %%rax\n"
26068         "subq    0(%%rdx), %%rax\n"
26069         "movq    %%rax, 0(%%rdi)\n"
26070         "movq    8(%%rsi), %%rax\n"
26071         "sbbq    8(%%rdx), %%rax\n"
26072         "movq    %%rax, 8(%%rdi)\n"
26073         "movq    16(%%rsi), %%rax\n"
26074         "sbbq    16(%%rdx), %%rax\n"
26075         "movq    %%rax, 16(%%rdi)\n"
26076         "movq    24(%%rsi), %%rax\n"
26077         "sbbq    24(%%rdx), %%rax\n"
26078         "movq    %%rax, 24(%%rdi)\n"
26079         "movq    32(%%rsi), %%rax\n"
26080         "sbbq    32(%%rdx), %%rax\n"
26081         "movq    %%rax, 32(%%rdi)\n"
26082         "movq    40(%%rsi), %%rax\n"
26083         "sbbq    40(%%rdx), %%rax\n"
26084         "movq    %%rax, 40(%%rdi)\n"
26085         "movq    48(%%rsi), %%rax\n"
26086         "sbbq    48(%%rdx), %%rax\n"
26087         "movq    %%rax, 48(%%rdi)\n"
26088         "movq    56(%%rsi), %%rax\n"
26089         "sbbq    56(%%rdx), %%rax\n"
26090         "movq    %%rax, 56(%%rdi)\n"
26091         "movq    64(%%rsi), %%rax\n"
26092         "sbbq    64(%%rdx), %%rax\n"
26093         "movq    %%rax, 64(%%rdi)\n"
26094         "movq    72(%%rsi), %%rax\n"
26095         "sbbq    72(%%rdx), %%rax\n"
26096         "movq    %%rax, 72(%%rdi)\n"
26097         "movq    80(%%rsi), %%rax\n"
26098         "sbbq    80(%%rdx), %%rax\n"
26099         "movq    %%rax, 80(%%rdi)\n"
26100         "movq    88(%%rsi), %%rax\n"
26101         "sbbq    88(%%rdx), %%rax\n"
26102         "movq    %%rax, 88(%%rdi)\n"
26103     :
26104     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
26105     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
26106 }
26107 
26108 /* x has 11.5 words, z has 13.
26109  * Put (z+x*c) in z. Return carry bit. */
26110 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
26111 static inline
mpfq_fixmp_11_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)26112 mp_limb_t mpfq_fixmp_11_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
26113 {
26114     mp_limb_t carry;
26115     __asm__ __volatile__(
26116         "movq    %[z], %%rdi\n"
26117         "movq    %[x], %%rsi\n"
26118         "movq    0(%%rsi), %%rax\n"
26119         "mulq    %[mult]\n"
26120         "addq    %%rax, 0(%%rdi)\n"
26121         "movq    8(%%rsi), %%rax\n"
26122         "adcq    $0, %%rdx\n"
26123         "movq    %%rdx, %%rcx\n"
26124         "mulq    %[mult]\n"
26125         "addq    %%rax, %%rcx\n"
26126         "adcq    $0, %%rdx\n"
26127         "movq    16(%%rsi), %%rax\n"
26128         "addq    %%rcx, 8(%%rdi)\n"
26129         "adcq    $0, %%rdx\n"
26130         "movq    %%rdx, %%rcx\n"
26131         "mulq    %[mult]\n"
26132         "addq    %%rax, %%rcx\n"
26133         "adcq    $0, %%rdx\n"
26134         "movq    24(%%rsi), %%rax\n"
26135         "addq    %%rcx, 16(%%rdi)\n"
26136         "adcq    $0, %%rdx\n"
26137         "movq    %%rdx, %%rcx\n"
26138         "mulq    %[mult]\n"
26139         "addq    %%rax, %%rcx\n"
26140         "adcq    $0, %%rdx\n"
26141         "movq    32(%%rsi), %%rax\n"
26142         "addq    %%rcx, 24(%%rdi)\n"
26143         "adcq    $0, %%rdx\n"
26144         "movq    %%rdx, %%rcx\n"
26145         "mulq    %[mult]\n"
26146         "addq    %%rax, %%rcx\n"
26147         "adcq    $0, %%rdx\n"
26148         "movq    40(%%rsi), %%rax\n"
26149         "addq    %%rcx, 32(%%rdi)\n"
26150         "adcq    $0, %%rdx\n"
26151         "movq    %%rdx, %%rcx\n"
26152         "mulq    %[mult]\n"
26153         "addq    %%rax, %%rcx\n"
26154         "adcq    $0, %%rdx\n"
26155         "movq    48(%%rsi), %%rax\n"
26156         "addq    %%rcx, 40(%%rdi)\n"
26157         "adcq    $0, %%rdx\n"
26158         "movq    %%rdx, %%rcx\n"
26159         "mulq    %[mult]\n"
26160         "addq    %%rax, %%rcx\n"
26161         "adcq    $0, %%rdx\n"
26162         "movq    56(%%rsi), %%rax\n"
26163         "addq    %%rcx, 48(%%rdi)\n"
26164         "adcq    $0, %%rdx\n"
26165         "movq    %%rdx, %%rcx\n"
26166         "mulq    %[mult]\n"
26167         "addq    %%rax, %%rcx\n"
26168         "adcq    $0, %%rdx\n"
26169         "movq    64(%%rsi), %%rax\n"
26170         "addq    %%rcx, 56(%%rdi)\n"
26171         "adcq    $0, %%rdx\n"
26172         "movq    %%rdx, %%rcx\n"
26173         "mulq    %[mult]\n"
26174         "addq    %%rax, %%rcx\n"
26175         "adcq    $0, %%rdx\n"
26176         "movq    72(%%rsi), %%rax\n"
26177         "addq    %%rcx, 64(%%rdi)\n"
26178         "adcq    $0, %%rdx\n"
26179         "movq    %%rdx, %%rcx\n"
26180         "mulq    %[mult]\n"
26181         "addq    %%rax, %%rcx\n"
26182         "adcq    $0, %%rdx\n"
26183         "movq    80(%%rsi), %%rax\n"
26184         "addq    %%rcx, 72(%%rdi)\n"
26185         "adcq    $0, %%rdx\n"
26186         "movq    %%rdx, %%rcx\n"
26187         "mulq    %[mult]\n"
26188         "addq    %%rax, %%rcx\n"
26189         "adcq    $0, %%rdx\n"
26190         "movq    88(%%rsi), %%rax\n"
26191         "addq    %%rcx, 80(%%rdi)\n"
26192         "adcq    $0, %%rdx\n"
26193         "movq    %%rdx, %%rcx\n"
26194         "mulq    %[mult]\n"
26195         "addq    %%rax, %%rcx\n"
26196         "adcq    $0, %%rdx\n"
26197         "addq    %%rcx, 88(%%rdi)\n"
26198         "adcq    $0, %%rdx\n"
26199         "xorq    %%rcx, %%rcx\n"
26200         "addq    %%rdx, 96(%%rdi)\n"
26201         "adcq    $0, %%rcx\n"
26202         "movq    %%rcx, %[carry]\n"
26203     : [carry]"=g"(carry), [z] "+m" (z)
26204     : [mult] "r" (c), [x] "m" (x)
26205     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
26206     return carry;
26207 }
26208 
26209 /* x has 11.5 words, z has 13.
26210  * Put (z+x*c) in z. Carry bit is lost. */
26211 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
26212 static inline
mpfq_fixmp_11_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)26213 void mpfq_fixmp_11_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
26214 {
26215     __asm__ __volatile__(
26216         "movq    %[z], %%rdi\n"
26217         "movq    %[x], %%rsi\n"
26218         "movq    0(%%rsi), %%rax\n"
26219         "mulq    %[mult]\n"
26220         "addq    %%rax, 0(%%rdi)\n"
26221         "movq    8(%%rsi), %%rax\n"
26222         "adcq    $0, %%rdx\n"
26223         "movq    %%rdx, %%rcx\n"
26224         "mulq    %[mult]\n"
26225         "addq    %%rax, %%rcx\n"
26226         "adcq    $0, %%rdx\n"
26227         "movq    16(%%rsi), %%rax\n"
26228         "addq    %%rcx, 8(%%rdi)\n"
26229         "adcq    $0, %%rdx\n"
26230         "movq    %%rdx, %%rcx\n"
26231         "mulq    %[mult]\n"
26232         "addq    %%rax, %%rcx\n"
26233         "adcq    $0, %%rdx\n"
26234         "movq    24(%%rsi), %%rax\n"
26235         "addq    %%rcx, 16(%%rdi)\n"
26236         "adcq    $0, %%rdx\n"
26237         "movq    %%rdx, %%rcx\n"
26238         "mulq    %[mult]\n"
26239         "addq    %%rax, %%rcx\n"
26240         "adcq    $0, %%rdx\n"
26241         "movq    32(%%rsi), %%rax\n"
26242         "addq    %%rcx, 24(%%rdi)\n"
26243         "adcq    $0, %%rdx\n"
26244         "movq    %%rdx, %%rcx\n"
26245         "mulq    %[mult]\n"
26246         "addq    %%rax, %%rcx\n"
26247         "adcq    $0, %%rdx\n"
26248         "movq    40(%%rsi), %%rax\n"
26249         "addq    %%rcx, 32(%%rdi)\n"
26250         "adcq    $0, %%rdx\n"
26251         "movq    %%rdx, %%rcx\n"
26252         "mulq    %[mult]\n"
26253         "addq    %%rax, %%rcx\n"
26254         "adcq    $0, %%rdx\n"
26255         "movq    48(%%rsi), %%rax\n"
26256         "addq    %%rcx, 40(%%rdi)\n"
26257         "adcq    $0, %%rdx\n"
26258         "movq    %%rdx, %%rcx\n"
26259         "mulq    %[mult]\n"
26260         "addq    %%rax, %%rcx\n"
26261         "adcq    $0, %%rdx\n"
26262         "movq    56(%%rsi), %%rax\n"
26263         "addq    %%rcx, 48(%%rdi)\n"
26264         "adcq    $0, %%rdx\n"
26265         "movq    %%rdx, %%rcx\n"
26266         "mulq    %[mult]\n"
26267         "addq    %%rax, %%rcx\n"
26268         "adcq    $0, %%rdx\n"
26269         "movq    64(%%rsi), %%rax\n"
26270         "addq    %%rcx, 56(%%rdi)\n"
26271         "adcq    $0, %%rdx\n"
26272         "movq    %%rdx, %%rcx\n"
26273         "mulq    %[mult]\n"
26274         "addq    %%rax, %%rcx\n"
26275         "adcq    $0, %%rdx\n"
26276         "movq    72(%%rsi), %%rax\n"
26277         "addq    %%rcx, 64(%%rdi)\n"
26278         "adcq    $0, %%rdx\n"
26279         "movq    %%rdx, %%rcx\n"
26280         "mulq    %[mult]\n"
26281         "addq    %%rax, %%rcx\n"
26282         "adcq    $0, %%rdx\n"
26283         "movq    80(%%rsi), %%rax\n"
26284         "addq    %%rcx, 72(%%rdi)\n"
26285         "adcq    $0, %%rdx\n"
26286         "movq    %%rdx, %%rcx\n"
26287         "mulq    %[mult]\n"
26288         "addq    %%rax, %%rcx\n"
26289         "adcq    $0, %%rdx\n"
26290         "movq    88(%%rsi), %%rax\n"
26291         "addq    %%rcx, 80(%%rdi)\n"
26292         "adcq    $0, %%rdx\n"
26293         "movq    %%rdx, %%rcx\n"
26294         "mulq    %[mult]\n"
26295         "addq    %%rax, %%rcx\n"
26296         "adcq    $0, %%rdx\n"
26297         "addq    %%rcx, 88(%%rdi)\n"
26298         "adcq    $0, %%rdx\n"
26299         "addq    %%rdx, 96(%%rdi)\n"
26300     : [z] "+m" (z)
26301     : [mult] "r" (c), [x] "m" (x)
26302     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
26303 }
26304 
26305 /* x has 11.5 words, z has 12.
26306  * Put (z+x*c) in z. Return carry word. */
26307 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
26308 static inline
mpfq_fixmp_11_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)26309 mp_limb_t mpfq_fixmp_11_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
26310 {
26311     mp_limb_t carry;
26312     __asm__ __volatile__(
26313         "movq    %[z], %%rdi\n"
26314         "movq    %[x], %%rsi\n"
26315         "movq    0(%%rsi), %%rax\n"
26316         "mulq    %[mult]\n"
26317         "addq    %%rax, 0(%%rdi)\n"
26318         "movq    8(%%rsi), %%rax\n"
26319         "adcq    $0, %%rdx\n"
26320         "movq    %%rdx, %%rcx\n"
26321         "mulq    %[mult]\n"
26322         "addq    %%rax, %%rcx\n"
26323         "adcq    $0, %%rdx\n"
26324         "movq    16(%%rsi), %%rax\n"
26325         "addq    %%rcx, 8(%%rdi)\n"
26326         "adcq    $0, %%rdx\n"
26327         "movq    %%rdx, %%rcx\n"
26328         "mulq    %[mult]\n"
26329         "addq    %%rax, %%rcx\n"
26330         "adcq    $0, %%rdx\n"
26331         "movq    24(%%rsi), %%rax\n"
26332         "addq    %%rcx, 16(%%rdi)\n"
26333         "adcq    $0, %%rdx\n"
26334         "movq    %%rdx, %%rcx\n"
26335         "mulq    %[mult]\n"
26336         "addq    %%rax, %%rcx\n"
26337         "adcq    $0, %%rdx\n"
26338         "movq    32(%%rsi), %%rax\n"
26339         "addq    %%rcx, 24(%%rdi)\n"
26340         "adcq    $0, %%rdx\n"
26341         "movq    %%rdx, %%rcx\n"
26342         "mulq    %[mult]\n"
26343         "addq    %%rax, %%rcx\n"
26344         "adcq    $0, %%rdx\n"
26345         "movq    40(%%rsi), %%rax\n"
26346         "addq    %%rcx, 32(%%rdi)\n"
26347         "adcq    $0, %%rdx\n"
26348         "movq    %%rdx, %%rcx\n"
26349         "mulq    %[mult]\n"
26350         "addq    %%rax, %%rcx\n"
26351         "adcq    $0, %%rdx\n"
26352         "movq    48(%%rsi), %%rax\n"
26353         "addq    %%rcx, 40(%%rdi)\n"
26354         "adcq    $0, %%rdx\n"
26355         "movq    %%rdx, %%rcx\n"
26356         "mulq    %[mult]\n"
26357         "addq    %%rax, %%rcx\n"
26358         "adcq    $0, %%rdx\n"
26359         "movq    56(%%rsi), %%rax\n"
26360         "addq    %%rcx, 48(%%rdi)\n"
26361         "adcq    $0, %%rdx\n"
26362         "movq    %%rdx, %%rcx\n"
26363         "mulq    %[mult]\n"
26364         "addq    %%rax, %%rcx\n"
26365         "adcq    $0, %%rdx\n"
26366         "movq    64(%%rsi), %%rax\n"
26367         "addq    %%rcx, 56(%%rdi)\n"
26368         "adcq    $0, %%rdx\n"
26369         "movq    %%rdx, %%rcx\n"
26370         "mulq    %[mult]\n"
26371         "addq    %%rax, %%rcx\n"
26372         "adcq    $0, %%rdx\n"
26373         "movq    72(%%rsi), %%rax\n"
26374         "addq    %%rcx, 64(%%rdi)\n"
26375         "adcq    $0, %%rdx\n"
26376         "movq    %%rdx, %%rcx\n"
26377         "mulq    %[mult]\n"
26378         "addq    %%rax, %%rcx\n"
26379         "adcq    $0, %%rdx\n"
26380         "movq    80(%%rsi), %%rax\n"
26381         "addq    %%rcx, 72(%%rdi)\n"
26382         "adcq    $0, %%rdx\n"
26383         "movq    %%rdx, %%rcx\n"
26384         "mulq    %[mult]\n"
26385         "addq    %%rax, %%rcx\n"
26386         "adcq    $0, %%rdx\n"
26387         "movq    88(%%rsi), %%rax\n"
26388         "addq    %%rcx, 80(%%rdi)\n"
26389         "adcq    $0, %%rdx\n"
26390         "movq    %%rdx, %%rcx\n"
26391         "mulq    %[mult]\n"
26392         "addq    %%rax, %%rcx\n"
26393         "adcq    $0, %%rdx\n"
26394         "addq    %%rcx, 88(%%rdi)\n"
26395         "adcq    $0, %%rdx\n"
26396         "movq    %%rdx, %[carry]\n"
26397     : [carry]"=g"(carry), [z] "+m" (z)
26398     : [mult] "r" (c), [x] "m" (x)
26399     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
26400     return carry;
26401 }
26402 
26403 /* x and y have 11.5 words, z has 23. Put x*y in z. */
26404 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
26405 static inline
mpfq_fixmp_11_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)26406 void mpfq_fixmp_11_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
26407 {
26408     __asm__ __volatile__(
26409         "### x*y[0]\n"
26410         "movq    %2, %%r8\n"
26411         "movq    %0, %%rdi\n"
26412         "movq    0(%%r8), %%r9\n"
26413         "movq    %1, %%rsi\n"
26414         "movq    0(%%rsi), %%rax\n"
26415         "mulq    %%r9\n"
26416         "movq    %%rax, 0(%%rdi)\n"
26417         "movq    8(%%rsi), %%rax\n"
26418         "movq    %%rdx, %%rcx\n"
26419         "mulq    %%r9\n"
26420         "addq    %%rax, %%rcx\n"
26421         "adcq    $0, %%rdx\n"
26422         "movq    16(%%rsi), %%rax\n"
26423         "movq    %%rcx, 8(%%rdi)\n"
26424         "movq    %%rdx, %%rcx\n"
26425         "mulq    %%r9\n"
26426         "addq    %%rax, %%rcx\n"
26427         "adcq    $0, %%rdx\n"
26428         "movq    24(%%rsi), %%rax\n"
26429         "movq    %%rcx, 16(%%rdi)\n"
26430         "movq    %%rdx, %%rcx\n"
26431         "mulq    %%r9\n"
26432         "addq    %%rax, %%rcx\n"
26433         "adcq    $0, %%rdx\n"
26434         "movq    32(%%rsi), %%rax\n"
26435         "movq    %%rcx, 24(%%rdi)\n"
26436         "movq    %%rdx, %%rcx\n"
26437         "mulq    %%r9\n"
26438         "addq    %%rax, %%rcx\n"
26439         "adcq    $0, %%rdx\n"
26440         "movq    40(%%rsi), %%rax\n"
26441         "movq    %%rcx, 32(%%rdi)\n"
26442         "movq    %%rdx, %%rcx\n"
26443         "mulq    %%r9\n"
26444         "addq    %%rax, %%rcx\n"
26445         "adcq    $0, %%rdx\n"
26446         "movq    48(%%rsi), %%rax\n"
26447         "movq    %%rcx, 40(%%rdi)\n"
26448         "movq    %%rdx, %%rcx\n"
26449         "mulq    %%r9\n"
26450         "addq    %%rax, %%rcx\n"
26451         "adcq    $0, %%rdx\n"
26452         "movq    56(%%rsi), %%rax\n"
26453         "movq    %%rcx, 48(%%rdi)\n"
26454         "movq    %%rdx, %%rcx\n"
26455         "mulq    %%r9\n"
26456         "addq    %%rax, %%rcx\n"
26457         "adcq    $0, %%rdx\n"
26458         "movq    64(%%rsi), %%rax\n"
26459         "movq    %%rcx, 56(%%rdi)\n"
26460         "movq    %%rdx, %%rcx\n"
26461         "mulq    %%r9\n"
26462         "addq    %%rax, %%rcx\n"
26463         "adcq    $0, %%rdx\n"
26464         "movq    72(%%rsi), %%rax\n"
26465         "movq    %%rcx, 64(%%rdi)\n"
26466         "movq    %%rdx, %%rcx\n"
26467         "mulq    %%r9\n"
26468         "addq    %%rax, %%rcx\n"
26469         "adcq    $0, %%rdx\n"
26470         "movq    80(%%rsi), %%rax\n"
26471         "movq    %%rcx, 72(%%rdi)\n"
26472         "movq    %%rdx, %%rcx\n"
26473         "mulq    %%r9\n"
26474         "addq    %%rax, %%rcx\n"
26475         "adcq    $0, %%rdx\n"
26476         "movq    88(%%rsi), %%rax\n"
26477         "movq    %%rcx, 80(%%rdi)\n"
26478         "movq    %%rdx, %%rcx\n"
26479         "mulq    %%r9\n"
26480         "addq    %%rax, %%rcx\n"
26481         "adcq    $0, %%rdx\n"
26482         "movq    %%rcx, 88(%%rdi)\n"
26483         "movq    %%rdx, 96(%%rdi)\n"
26484         "movq    $0, 104(%%rdi)\n"
26485         "movq    $0, 112(%%rdi)\n"
26486         "movq    $0, 120(%%rdi)\n"
26487         "movq    $0, 128(%%rdi)\n"
26488         "movq    $0, 136(%%rdi)\n"
26489         "movq    $0, 144(%%rdi)\n"
26490         "movq    $0, 152(%%rdi)\n"
26491         "movq    $0, 160(%%rdi)\n"
26492         "movq    $0, 168(%%rdi)\n"
26493         "movq    $0, 176(%%rdi)\n"
26494         "### x*y[1]\n"
26495         "movq    8(%%r8), %%r9\n"
26496         "movq    0(%%rsi), %%rax\n"
26497         "mulq    %%r9\n"
26498         "addq    %%rax, 8(%%rdi)\n"
26499         "movq    8(%%rsi), %%rax\n"
26500         "adcq    $0, %%rdx\n"
26501         "movq    %%rdx, %%rcx\n"
26502         "mulq    %%r9\n"
26503         "addq    %%rax, %%rcx\n"
26504         "adcq    $0, %%rdx\n"
26505         "movq    16(%%rsi), %%rax\n"
26506         "addq    %%rcx, 16(%%rdi)\n"
26507         "adcq    $0, %%rdx\n"
26508         "movq    %%rdx, %%rcx\n"
26509         "mulq    %%r9\n"
26510         "addq    %%rax, %%rcx\n"
26511         "adcq    $0, %%rdx\n"
26512         "movq    24(%%rsi), %%rax\n"
26513         "addq    %%rcx, 24(%%rdi)\n"
26514         "adcq    $0, %%rdx\n"
26515         "movq    %%rdx, %%rcx\n"
26516         "mulq    %%r9\n"
26517         "addq    %%rax, %%rcx\n"
26518         "adcq    $0, %%rdx\n"
26519         "movq    32(%%rsi), %%rax\n"
26520         "addq    %%rcx, 32(%%rdi)\n"
26521         "adcq    $0, %%rdx\n"
26522         "movq    %%rdx, %%rcx\n"
26523         "mulq    %%r9\n"
26524         "addq    %%rax, %%rcx\n"
26525         "adcq    $0, %%rdx\n"
26526         "movq    40(%%rsi), %%rax\n"
26527         "addq    %%rcx, 40(%%rdi)\n"
26528         "adcq    $0, %%rdx\n"
26529         "movq    %%rdx, %%rcx\n"
26530         "mulq    %%r9\n"
26531         "addq    %%rax, %%rcx\n"
26532         "adcq    $0, %%rdx\n"
26533         "movq    48(%%rsi), %%rax\n"
26534         "addq    %%rcx, 48(%%rdi)\n"
26535         "adcq    $0, %%rdx\n"
26536         "movq    %%rdx, %%rcx\n"
26537         "mulq    %%r9\n"
26538         "addq    %%rax, %%rcx\n"
26539         "adcq    $0, %%rdx\n"
26540         "movq    56(%%rsi), %%rax\n"
26541         "addq    %%rcx, 56(%%rdi)\n"
26542         "adcq    $0, %%rdx\n"
26543         "movq    %%rdx, %%rcx\n"
26544         "mulq    %%r9\n"
26545         "addq    %%rax, %%rcx\n"
26546         "adcq    $0, %%rdx\n"
26547         "movq    64(%%rsi), %%rax\n"
26548         "addq    %%rcx, 64(%%rdi)\n"
26549         "adcq    $0, %%rdx\n"
26550         "movq    %%rdx, %%rcx\n"
26551         "mulq    %%r9\n"
26552         "addq    %%rax, %%rcx\n"
26553         "adcq    $0, %%rdx\n"
26554         "movq    72(%%rsi), %%rax\n"
26555         "addq    %%rcx, 72(%%rdi)\n"
26556         "adcq    $0, %%rdx\n"
26557         "movq    %%rdx, %%rcx\n"
26558         "mulq    %%r9\n"
26559         "addq    %%rax, %%rcx\n"
26560         "adcq    $0, %%rdx\n"
26561         "movq    80(%%rsi), %%rax\n"
26562         "addq    %%rcx, 80(%%rdi)\n"
26563         "adcq    $0, %%rdx\n"
26564         "movq    %%rdx, %%rcx\n"
26565         "mulq    %%r9\n"
26566         "addq    %%rax, %%rcx\n"
26567         "adcq    $0, %%rdx\n"
26568         "movq    88(%%rsi), %%rax\n"
26569         "addq    %%rcx, 88(%%rdi)\n"
26570         "adcq    $0, %%rdx\n"
26571         "movq    %%rdx, %%rcx\n"
26572         "mulq    %%r9\n"
26573         "addq    %%rax, %%rcx\n"
26574         "adcq    $0, %%rdx\n"
26575         "addq    %%rcx, 96(%%rdi)\n"
26576         "adcq    $0, %%rdx\n"
26577         "movq    %%rdx, 104(%%rdi)\n"
26578         "### x*y[2]\n"
26579         "movq    16(%%r8), %%r9\n"
26580         "movq    0(%%rsi), %%rax\n"
26581         "mulq    %%r9\n"
26582         "addq    %%rax, 16(%%rdi)\n"
26583         "movq    8(%%rsi), %%rax\n"
26584         "adcq    $0, %%rdx\n"
26585         "movq    %%rdx, %%rcx\n"
26586         "mulq    %%r9\n"
26587         "addq    %%rax, %%rcx\n"
26588         "adcq    $0, %%rdx\n"
26589         "movq    16(%%rsi), %%rax\n"
26590         "addq    %%rcx, 24(%%rdi)\n"
26591         "adcq    $0, %%rdx\n"
26592         "movq    %%rdx, %%rcx\n"
26593         "mulq    %%r9\n"
26594         "addq    %%rax, %%rcx\n"
26595         "adcq    $0, %%rdx\n"
26596         "movq    24(%%rsi), %%rax\n"
26597         "addq    %%rcx, 32(%%rdi)\n"
26598         "adcq    $0, %%rdx\n"
26599         "movq    %%rdx, %%rcx\n"
26600         "mulq    %%r9\n"
26601         "addq    %%rax, %%rcx\n"
26602         "adcq    $0, %%rdx\n"
26603         "movq    32(%%rsi), %%rax\n"
26604         "addq    %%rcx, 40(%%rdi)\n"
26605         "adcq    $0, %%rdx\n"
26606         "movq    %%rdx, %%rcx\n"
26607         "mulq    %%r9\n"
26608         "addq    %%rax, %%rcx\n"
26609         "adcq    $0, %%rdx\n"
26610         "movq    40(%%rsi), %%rax\n"
26611         "addq    %%rcx, 48(%%rdi)\n"
26612         "adcq    $0, %%rdx\n"
26613         "movq    %%rdx, %%rcx\n"
26614         "mulq    %%r9\n"
26615         "addq    %%rax, %%rcx\n"
26616         "adcq    $0, %%rdx\n"
26617         "movq    48(%%rsi), %%rax\n"
26618         "addq    %%rcx, 56(%%rdi)\n"
26619         "adcq    $0, %%rdx\n"
26620         "movq    %%rdx, %%rcx\n"
26621         "mulq    %%r9\n"
26622         "addq    %%rax, %%rcx\n"
26623         "adcq    $0, %%rdx\n"
26624         "movq    56(%%rsi), %%rax\n"
26625         "addq    %%rcx, 64(%%rdi)\n"
26626         "adcq    $0, %%rdx\n"
26627         "movq    %%rdx, %%rcx\n"
26628         "mulq    %%r9\n"
26629         "addq    %%rax, %%rcx\n"
26630         "adcq    $0, %%rdx\n"
26631         "movq    64(%%rsi), %%rax\n"
26632         "addq    %%rcx, 72(%%rdi)\n"
26633         "adcq    $0, %%rdx\n"
26634         "movq    %%rdx, %%rcx\n"
26635         "mulq    %%r9\n"
26636         "addq    %%rax, %%rcx\n"
26637         "adcq    $0, %%rdx\n"
26638         "movq    72(%%rsi), %%rax\n"
26639         "addq    %%rcx, 80(%%rdi)\n"
26640         "adcq    $0, %%rdx\n"
26641         "movq    %%rdx, %%rcx\n"
26642         "mulq    %%r9\n"
26643         "addq    %%rax, %%rcx\n"
26644         "adcq    $0, %%rdx\n"
26645         "movq    80(%%rsi), %%rax\n"
26646         "addq    %%rcx, 88(%%rdi)\n"
26647         "adcq    $0, %%rdx\n"
26648         "movq    %%rdx, %%rcx\n"
26649         "mulq    %%r9\n"
26650         "addq    %%rax, %%rcx\n"
26651         "adcq    $0, %%rdx\n"
26652         "movq    88(%%rsi), %%rax\n"
26653         "addq    %%rcx, 96(%%rdi)\n"
26654         "adcq    $0, %%rdx\n"
26655         "movq    %%rdx, %%rcx\n"
26656         "mulq    %%r9\n"
26657         "addq    %%rax, %%rcx\n"
26658         "adcq    $0, %%rdx\n"
26659         "addq    %%rcx, 104(%%rdi)\n"
26660         "adcq    $0, %%rdx\n"
26661         "movq    %%rdx, 112(%%rdi)\n"
26662         "### x*y[3]\n"
26663         "movq    24(%%r8), %%r9\n"
26664         "movq    0(%%rsi), %%rax\n"
26665         "mulq    %%r9\n"
26666         "addq    %%rax, 24(%%rdi)\n"
26667         "movq    8(%%rsi), %%rax\n"
26668         "adcq    $0, %%rdx\n"
26669         "movq    %%rdx, %%rcx\n"
26670         "mulq    %%r9\n"
26671         "addq    %%rax, %%rcx\n"
26672         "adcq    $0, %%rdx\n"
26673         "movq    16(%%rsi), %%rax\n"
26674         "addq    %%rcx, 32(%%rdi)\n"
26675         "adcq    $0, %%rdx\n"
26676         "movq    %%rdx, %%rcx\n"
26677         "mulq    %%r9\n"
26678         "addq    %%rax, %%rcx\n"
26679         "adcq    $0, %%rdx\n"
26680         "movq    24(%%rsi), %%rax\n"
26681         "addq    %%rcx, 40(%%rdi)\n"
26682         "adcq    $0, %%rdx\n"
26683         "movq    %%rdx, %%rcx\n"
26684         "mulq    %%r9\n"
26685         "addq    %%rax, %%rcx\n"
26686         "adcq    $0, %%rdx\n"
26687         "movq    32(%%rsi), %%rax\n"
26688         "addq    %%rcx, 48(%%rdi)\n"
26689         "adcq    $0, %%rdx\n"
26690         "movq    %%rdx, %%rcx\n"
26691         "mulq    %%r9\n"
26692         "addq    %%rax, %%rcx\n"
26693         "adcq    $0, %%rdx\n"
26694         "movq    40(%%rsi), %%rax\n"
26695         "addq    %%rcx, 56(%%rdi)\n"
26696         "adcq    $0, %%rdx\n"
26697         "movq    %%rdx, %%rcx\n"
26698         "mulq    %%r9\n"
26699         "addq    %%rax, %%rcx\n"
26700         "adcq    $0, %%rdx\n"
26701         "movq    48(%%rsi), %%rax\n"
26702         "addq    %%rcx, 64(%%rdi)\n"
26703         "adcq    $0, %%rdx\n"
26704         "movq    %%rdx, %%rcx\n"
26705         "mulq    %%r9\n"
26706         "addq    %%rax, %%rcx\n"
26707         "adcq    $0, %%rdx\n"
26708         "movq    56(%%rsi), %%rax\n"
26709         "addq    %%rcx, 72(%%rdi)\n"
26710         "adcq    $0, %%rdx\n"
26711         "movq    %%rdx, %%rcx\n"
26712         "mulq    %%r9\n"
26713         "addq    %%rax, %%rcx\n"
26714         "adcq    $0, %%rdx\n"
26715         "movq    64(%%rsi), %%rax\n"
26716         "addq    %%rcx, 80(%%rdi)\n"
26717         "adcq    $0, %%rdx\n"
26718         "movq    %%rdx, %%rcx\n"
26719         "mulq    %%r9\n"
26720         "addq    %%rax, %%rcx\n"
26721         "adcq    $0, %%rdx\n"
26722         "movq    72(%%rsi), %%rax\n"
26723         "addq    %%rcx, 88(%%rdi)\n"
26724         "adcq    $0, %%rdx\n"
26725         "movq    %%rdx, %%rcx\n"
26726         "mulq    %%r9\n"
26727         "addq    %%rax, %%rcx\n"
26728         "adcq    $0, %%rdx\n"
26729         "movq    80(%%rsi), %%rax\n"
26730         "addq    %%rcx, 96(%%rdi)\n"
26731         "adcq    $0, %%rdx\n"
26732         "movq    %%rdx, %%rcx\n"
26733         "mulq    %%r9\n"
26734         "addq    %%rax, %%rcx\n"
26735         "adcq    $0, %%rdx\n"
26736         "movq    88(%%rsi), %%rax\n"
26737         "addq    %%rcx, 104(%%rdi)\n"
26738         "adcq    $0, %%rdx\n"
26739         "movq    %%rdx, %%rcx\n"
26740         "mulq    %%r9\n"
26741         "addq    %%rax, %%rcx\n"
26742         "adcq    $0, %%rdx\n"
26743         "addq    %%rcx, 112(%%rdi)\n"
26744         "adcq    $0, %%rdx\n"
26745         "movq    %%rdx, 120(%%rdi)\n"
26746         "### x*y[4]\n"
26747         "movq    32(%%r8), %%r9\n"
26748         "movq    0(%%rsi), %%rax\n"
26749         "mulq    %%r9\n"
26750         "addq    %%rax, 32(%%rdi)\n"
26751         "movq    8(%%rsi), %%rax\n"
26752         "adcq    $0, %%rdx\n"
26753         "movq    %%rdx, %%rcx\n"
26754         "mulq    %%r9\n"
26755         "addq    %%rax, %%rcx\n"
26756         "adcq    $0, %%rdx\n"
26757         "movq    16(%%rsi), %%rax\n"
26758         "addq    %%rcx, 40(%%rdi)\n"
26759         "adcq    $0, %%rdx\n"
26760         "movq    %%rdx, %%rcx\n"
26761         "mulq    %%r9\n"
26762         "addq    %%rax, %%rcx\n"
26763         "adcq    $0, %%rdx\n"
26764         "movq    24(%%rsi), %%rax\n"
26765         "addq    %%rcx, 48(%%rdi)\n"
26766         "adcq    $0, %%rdx\n"
26767         "movq    %%rdx, %%rcx\n"
26768         "mulq    %%r9\n"
26769         "addq    %%rax, %%rcx\n"
26770         "adcq    $0, %%rdx\n"
26771         "movq    32(%%rsi), %%rax\n"
26772         "addq    %%rcx, 56(%%rdi)\n"
26773         "adcq    $0, %%rdx\n"
26774         "movq    %%rdx, %%rcx\n"
26775         "mulq    %%r9\n"
26776         "addq    %%rax, %%rcx\n"
26777         "adcq    $0, %%rdx\n"
26778         "movq    40(%%rsi), %%rax\n"
26779         "addq    %%rcx, 64(%%rdi)\n"
26780         "adcq    $0, %%rdx\n"
26781         "movq    %%rdx, %%rcx\n"
26782         "mulq    %%r9\n"
26783         "addq    %%rax, %%rcx\n"
26784         "adcq    $0, %%rdx\n"
26785         "movq    48(%%rsi), %%rax\n"
26786         "addq    %%rcx, 72(%%rdi)\n"
26787         "adcq    $0, %%rdx\n"
26788         "movq    %%rdx, %%rcx\n"
26789         "mulq    %%r9\n"
26790         "addq    %%rax, %%rcx\n"
26791         "adcq    $0, %%rdx\n"
26792         "movq    56(%%rsi), %%rax\n"
26793         "addq    %%rcx, 80(%%rdi)\n"
26794         "adcq    $0, %%rdx\n"
26795         "movq    %%rdx, %%rcx\n"
26796         "mulq    %%r9\n"
26797         "addq    %%rax, %%rcx\n"
26798         "adcq    $0, %%rdx\n"
26799         "movq    64(%%rsi), %%rax\n"
26800         "addq    %%rcx, 88(%%rdi)\n"
26801         "adcq    $0, %%rdx\n"
26802         "movq    %%rdx, %%rcx\n"
26803         "mulq    %%r9\n"
26804         "addq    %%rax, %%rcx\n"
26805         "adcq    $0, %%rdx\n"
26806         "movq    72(%%rsi), %%rax\n"
26807         "addq    %%rcx, 96(%%rdi)\n"
26808         "adcq    $0, %%rdx\n"
26809         "movq    %%rdx, %%rcx\n"
26810         "mulq    %%r9\n"
26811         "addq    %%rax, %%rcx\n"
26812         "adcq    $0, %%rdx\n"
26813         "movq    80(%%rsi), %%rax\n"
26814         "addq    %%rcx, 104(%%rdi)\n"
26815         "adcq    $0, %%rdx\n"
26816         "movq    %%rdx, %%rcx\n"
26817         "mulq    %%r9\n"
26818         "addq    %%rax, %%rcx\n"
26819         "adcq    $0, %%rdx\n"
26820         "movq    88(%%rsi), %%rax\n"
26821         "addq    %%rcx, 112(%%rdi)\n"
26822         "adcq    $0, %%rdx\n"
26823         "movq    %%rdx, %%rcx\n"
26824         "mulq    %%r9\n"
26825         "addq    %%rax, %%rcx\n"
26826         "adcq    $0, %%rdx\n"
26827         "addq    %%rcx, 120(%%rdi)\n"
26828         "adcq    $0, %%rdx\n"
26829         "movq    %%rdx, 128(%%rdi)\n"
26830         "### x*y[5]\n"
26831         "movq    40(%%r8), %%r9\n"
26832         "movq    0(%%rsi), %%rax\n"
26833         "mulq    %%r9\n"
26834         "addq    %%rax, 40(%%rdi)\n"
26835         "movq    8(%%rsi), %%rax\n"
26836         "adcq    $0, %%rdx\n"
26837         "movq    %%rdx, %%rcx\n"
26838         "mulq    %%r9\n"
26839         "addq    %%rax, %%rcx\n"
26840         "adcq    $0, %%rdx\n"
26841         "movq    16(%%rsi), %%rax\n"
26842         "addq    %%rcx, 48(%%rdi)\n"
26843         "adcq    $0, %%rdx\n"
26844         "movq    %%rdx, %%rcx\n"
26845         "mulq    %%r9\n"
26846         "addq    %%rax, %%rcx\n"
26847         "adcq    $0, %%rdx\n"
26848         "movq    24(%%rsi), %%rax\n"
26849         "addq    %%rcx, 56(%%rdi)\n"
26850         "adcq    $0, %%rdx\n"
26851         "movq    %%rdx, %%rcx\n"
26852         "mulq    %%r9\n"
26853         "addq    %%rax, %%rcx\n"
26854         "adcq    $0, %%rdx\n"
26855         "movq    32(%%rsi), %%rax\n"
26856         "addq    %%rcx, 64(%%rdi)\n"
26857         "adcq    $0, %%rdx\n"
26858         "movq    %%rdx, %%rcx\n"
26859         "mulq    %%r9\n"
26860         "addq    %%rax, %%rcx\n"
26861         "adcq    $0, %%rdx\n"
26862         "movq    40(%%rsi), %%rax\n"
26863         "addq    %%rcx, 72(%%rdi)\n"
26864         "adcq    $0, %%rdx\n"
26865         "movq    %%rdx, %%rcx\n"
26866         "mulq    %%r9\n"
26867         "addq    %%rax, %%rcx\n"
26868         "adcq    $0, %%rdx\n"
26869         "movq    48(%%rsi), %%rax\n"
26870         "addq    %%rcx, 80(%%rdi)\n"
26871         "adcq    $0, %%rdx\n"
26872         "movq    %%rdx, %%rcx\n"
26873         "mulq    %%r9\n"
26874         "addq    %%rax, %%rcx\n"
26875         "adcq    $0, %%rdx\n"
26876         "movq    56(%%rsi), %%rax\n"
26877         "addq    %%rcx, 88(%%rdi)\n"
26878         "adcq    $0, %%rdx\n"
26879         "movq    %%rdx, %%rcx\n"
26880         "mulq    %%r9\n"
26881         "addq    %%rax, %%rcx\n"
26882         "adcq    $0, %%rdx\n"
26883         "movq    64(%%rsi), %%rax\n"
26884         "addq    %%rcx, 96(%%rdi)\n"
26885         "adcq    $0, %%rdx\n"
26886         "movq    %%rdx, %%rcx\n"
26887         "mulq    %%r9\n"
26888         "addq    %%rax, %%rcx\n"
26889         "adcq    $0, %%rdx\n"
26890         "movq    72(%%rsi), %%rax\n"
26891         "addq    %%rcx, 104(%%rdi)\n"
26892         "adcq    $0, %%rdx\n"
26893         "movq    %%rdx, %%rcx\n"
26894         "mulq    %%r9\n"
26895         "addq    %%rax, %%rcx\n"
26896         "adcq    $0, %%rdx\n"
26897         "movq    80(%%rsi), %%rax\n"
26898         "addq    %%rcx, 112(%%rdi)\n"
26899         "adcq    $0, %%rdx\n"
26900         "movq    %%rdx, %%rcx\n"
26901         "mulq    %%r9\n"
26902         "addq    %%rax, %%rcx\n"
26903         "adcq    $0, %%rdx\n"
26904         "movq    88(%%rsi), %%rax\n"
26905         "addq    %%rcx, 120(%%rdi)\n"
26906         "adcq    $0, %%rdx\n"
26907         "movq    %%rdx, %%rcx\n"
26908         "mulq    %%r9\n"
26909         "addq    %%rax, %%rcx\n"
26910         "adcq    $0, %%rdx\n"
26911         "addq    %%rcx, 128(%%rdi)\n"
26912         "adcq    $0, %%rdx\n"
26913         "movq    %%rdx, 136(%%rdi)\n"
26914         "### x*y[6]\n"
26915         "movq    48(%%r8), %%r9\n"
26916         "movq    0(%%rsi), %%rax\n"
26917         "mulq    %%r9\n"
26918         "addq    %%rax, 48(%%rdi)\n"
26919         "movq    8(%%rsi), %%rax\n"
26920         "adcq    $0, %%rdx\n"
26921         "movq    %%rdx, %%rcx\n"
26922         "mulq    %%r9\n"
26923         "addq    %%rax, %%rcx\n"
26924         "adcq    $0, %%rdx\n"
26925         "movq    16(%%rsi), %%rax\n"
26926         "addq    %%rcx, 56(%%rdi)\n"
26927         "adcq    $0, %%rdx\n"
26928         "movq    %%rdx, %%rcx\n"
26929         "mulq    %%r9\n"
26930         "addq    %%rax, %%rcx\n"
26931         "adcq    $0, %%rdx\n"
26932         "movq    24(%%rsi), %%rax\n"
26933         "addq    %%rcx, 64(%%rdi)\n"
26934         "adcq    $0, %%rdx\n"
26935         "movq    %%rdx, %%rcx\n"
26936         "mulq    %%r9\n"
26937         "addq    %%rax, %%rcx\n"
26938         "adcq    $0, %%rdx\n"
26939         "movq    32(%%rsi), %%rax\n"
26940         "addq    %%rcx, 72(%%rdi)\n"
26941         "adcq    $0, %%rdx\n"
26942         "movq    %%rdx, %%rcx\n"
26943         "mulq    %%r9\n"
26944         "addq    %%rax, %%rcx\n"
26945         "adcq    $0, %%rdx\n"
26946         "movq    40(%%rsi), %%rax\n"
26947         "addq    %%rcx, 80(%%rdi)\n"
26948         "adcq    $0, %%rdx\n"
26949         "movq    %%rdx, %%rcx\n"
26950         "mulq    %%r9\n"
26951         "addq    %%rax, %%rcx\n"
26952         "adcq    $0, %%rdx\n"
26953         "movq    48(%%rsi), %%rax\n"
26954         "addq    %%rcx, 88(%%rdi)\n"
26955         "adcq    $0, %%rdx\n"
26956         "movq    %%rdx, %%rcx\n"
26957         "mulq    %%r9\n"
26958         "addq    %%rax, %%rcx\n"
26959         "adcq    $0, %%rdx\n"
26960         "movq    56(%%rsi), %%rax\n"
26961         "addq    %%rcx, 96(%%rdi)\n"
26962         "adcq    $0, %%rdx\n"
26963         "movq    %%rdx, %%rcx\n"
26964         "mulq    %%r9\n"
26965         "addq    %%rax, %%rcx\n"
26966         "adcq    $0, %%rdx\n"
26967         "movq    64(%%rsi), %%rax\n"
26968         "addq    %%rcx, 104(%%rdi)\n"
26969         "adcq    $0, %%rdx\n"
26970         "movq    %%rdx, %%rcx\n"
26971         "mulq    %%r9\n"
26972         "addq    %%rax, %%rcx\n"
26973         "adcq    $0, %%rdx\n"
26974         "movq    72(%%rsi), %%rax\n"
26975         "addq    %%rcx, 112(%%rdi)\n"
26976         "adcq    $0, %%rdx\n"
26977         "movq    %%rdx, %%rcx\n"
26978         "mulq    %%r9\n"
26979         "addq    %%rax, %%rcx\n"
26980         "adcq    $0, %%rdx\n"
26981         "movq    80(%%rsi), %%rax\n"
26982         "addq    %%rcx, 120(%%rdi)\n"
26983         "adcq    $0, %%rdx\n"
26984         "movq    %%rdx, %%rcx\n"
26985         "mulq    %%r9\n"
26986         "addq    %%rax, %%rcx\n"
26987         "adcq    $0, %%rdx\n"
26988         "movq    88(%%rsi), %%rax\n"
26989         "addq    %%rcx, 128(%%rdi)\n"
26990         "adcq    $0, %%rdx\n"
26991         "movq    %%rdx, %%rcx\n"
26992         "mulq    %%r9\n"
26993         "addq    %%rax, %%rcx\n"
26994         "adcq    $0, %%rdx\n"
26995         "addq    %%rcx, 136(%%rdi)\n"
26996         "adcq    $0, %%rdx\n"
26997         "movq    %%rdx, 144(%%rdi)\n"
26998         "### x*y[7]\n"
26999         "movq    56(%%r8), %%r9\n"
27000         "movq    0(%%rsi), %%rax\n"
27001         "mulq    %%r9\n"
27002         "addq    %%rax, 56(%%rdi)\n"
27003         "movq    8(%%rsi), %%rax\n"
27004         "adcq    $0, %%rdx\n"
27005         "movq    %%rdx, %%rcx\n"
27006         "mulq    %%r9\n"
27007         "addq    %%rax, %%rcx\n"
27008         "adcq    $0, %%rdx\n"
27009         "movq    16(%%rsi), %%rax\n"
27010         "addq    %%rcx, 64(%%rdi)\n"
27011         "adcq    $0, %%rdx\n"
27012         "movq    %%rdx, %%rcx\n"
27013         "mulq    %%r9\n"
27014         "addq    %%rax, %%rcx\n"
27015         "adcq    $0, %%rdx\n"
27016         "movq    24(%%rsi), %%rax\n"
27017         "addq    %%rcx, 72(%%rdi)\n"
27018         "adcq    $0, %%rdx\n"
27019         "movq    %%rdx, %%rcx\n"
27020         "mulq    %%r9\n"
27021         "addq    %%rax, %%rcx\n"
27022         "adcq    $0, %%rdx\n"
27023         "movq    32(%%rsi), %%rax\n"
27024         "addq    %%rcx, 80(%%rdi)\n"
27025         "adcq    $0, %%rdx\n"
27026         "movq    %%rdx, %%rcx\n"
27027         "mulq    %%r9\n"
27028         "addq    %%rax, %%rcx\n"
27029         "adcq    $0, %%rdx\n"
27030         "movq    40(%%rsi), %%rax\n"
27031         "addq    %%rcx, 88(%%rdi)\n"
27032         "adcq    $0, %%rdx\n"
27033         "movq    %%rdx, %%rcx\n"
27034         "mulq    %%r9\n"
27035         "addq    %%rax, %%rcx\n"
27036         "adcq    $0, %%rdx\n"
27037         "movq    48(%%rsi), %%rax\n"
27038         "addq    %%rcx, 96(%%rdi)\n"
27039         "adcq    $0, %%rdx\n"
27040         "movq    %%rdx, %%rcx\n"
27041         "mulq    %%r9\n"
27042         "addq    %%rax, %%rcx\n"
27043         "adcq    $0, %%rdx\n"
27044         "movq    56(%%rsi), %%rax\n"
27045         "addq    %%rcx, 104(%%rdi)\n"
27046         "adcq    $0, %%rdx\n"
27047         "movq    %%rdx, %%rcx\n"
27048         "mulq    %%r9\n"
27049         "addq    %%rax, %%rcx\n"
27050         "adcq    $0, %%rdx\n"
27051         "movq    64(%%rsi), %%rax\n"
27052         "addq    %%rcx, 112(%%rdi)\n"
27053         "adcq    $0, %%rdx\n"
27054         "movq    %%rdx, %%rcx\n"
27055         "mulq    %%r9\n"
27056         "addq    %%rax, %%rcx\n"
27057         "adcq    $0, %%rdx\n"
27058         "movq    72(%%rsi), %%rax\n"
27059         "addq    %%rcx, 120(%%rdi)\n"
27060         "adcq    $0, %%rdx\n"
27061         "movq    %%rdx, %%rcx\n"
27062         "mulq    %%r9\n"
27063         "addq    %%rax, %%rcx\n"
27064         "adcq    $0, %%rdx\n"
27065         "movq    80(%%rsi), %%rax\n"
27066         "addq    %%rcx, 128(%%rdi)\n"
27067         "adcq    $0, %%rdx\n"
27068         "movq    %%rdx, %%rcx\n"
27069         "mulq    %%r9\n"
27070         "addq    %%rax, %%rcx\n"
27071         "adcq    $0, %%rdx\n"
27072         "movq    88(%%rsi), %%rax\n"
27073         "addq    %%rcx, 136(%%rdi)\n"
27074         "adcq    $0, %%rdx\n"
27075         "movq    %%rdx, %%rcx\n"
27076         "mulq    %%r9\n"
27077         "addq    %%rax, %%rcx\n"
27078         "adcq    $0, %%rdx\n"
27079         "addq    %%rcx, 144(%%rdi)\n"
27080         "adcq    $0, %%rdx\n"
27081         "movq    %%rdx, 152(%%rdi)\n"
27082         "### x*y[8]\n"
27083         "movq    64(%%r8), %%r9\n"
27084         "movq    0(%%rsi), %%rax\n"
27085         "mulq    %%r9\n"
27086         "addq    %%rax, 64(%%rdi)\n"
27087         "movq    8(%%rsi), %%rax\n"
27088         "adcq    $0, %%rdx\n"
27089         "movq    %%rdx, %%rcx\n"
27090         "mulq    %%r9\n"
27091         "addq    %%rax, %%rcx\n"
27092         "adcq    $0, %%rdx\n"
27093         "movq    16(%%rsi), %%rax\n"
27094         "addq    %%rcx, 72(%%rdi)\n"
27095         "adcq    $0, %%rdx\n"
27096         "movq    %%rdx, %%rcx\n"
27097         "mulq    %%r9\n"
27098         "addq    %%rax, %%rcx\n"
27099         "adcq    $0, %%rdx\n"
27100         "movq    24(%%rsi), %%rax\n"
27101         "addq    %%rcx, 80(%%rdi)\n"
27102         "adcq    $0, %%rdx\n"
27103         "movq    %%rdx, %%rcx\n"
27104         "mulq    %%r9\n"
27105         "addq    %%rax, %%rcx\n"
27106         "adcq    $0, %%rdx\n"
27107         "movq    32(%%rsi), %%rax\n"
27108         "addq    %%rcx, 88(%%rdi)\n"
27109         "adcq    $0, %%rdx\n"
27110         "movq    %%rdx, %%rcx\n"
27111         "mulq    %%r9\n"
27112         "addq    %%rax, %%rcx\n"
27113         "adcq    $0, %%rdx\n"
27114         "movq    40(%%rsi), %%rax\n"
27115         "addq    %%rcx, 96(%%rdi)\n"
27116         "adcq    $0, %%rdx\n"
27117         "movq    %%rdx, %%rcx\n"
27118         "mulq    %%r9\n"
27119         "addq    %%rax, %%rcx\n"
27120         "adcq    $0, %%rdx\n"
27121         "movq    48(%%rsi), %%rax\n"
27122         "addq    %%rcx, 104(%%rdi)\n"
27123         "adcq    $0, %%rdx\n"
27124         "movq    %%rdx, %%rcx\n"
27125         "mulq    %%r9\n"
27126         "addq    %%rax, %%rcx\n"
27127         "adcq    $0, %%rdx\n"
27128         "movq    56(%%rsi), %%rax\n"
27129         "addq    %%rcx, 112(%%rdi)\n"
27130         "adcq    $0, %%rdx\n"
27131         "movq    %%rdx, %%rcx\n"
27132         "mulq    %%r9\n"
27133         "addq    %%rax, %%rcx\n"
27134         "adcq    $0, %%rdx\n"
27135         "movq    64(%%rsi), %%rax\n"
27136         "addq    %%rcx, 120(%%rdi)\n"
27137         "adcq    $0, %%rdx\n"
27138         "movq    %%rdx, %%rcx\n"
27139         "mulq    %%r9\n"
27140         "addq    %%rax, %%rcx\n"
27141         "adcq    $0, %%rdx\n"
27142         "movq    72(%%rsi), %%rax\n"
27143         "addq    %%rcx, 128(%%rdi)\n"
27144         "adcq    $0, %%rdx\n"
27145         "movq    %%rdx, %%rcx\n"
27146         "mulq    %%r9\n"
27147         "addq    %%rax, %%rcx\n"
27148         "adcq    $0, %%rdx\n"
27149         "movq    80(%%rsi), %%rax\n"
27150         "addq    %%rcx, 136(%%rdi)\n"
27151         "adcq    $0, %%rdx\n"
27152         "movq    %%rdx, %%rcx\n"
27153         "mulq    %%r9\n"
27154         "addq    %%rax, %%rcx\n"
27155         "adcq    $0, %%rdx\n"
27156         "movq    88(%%rsi), %%rax\n"
27157         "addq    %%rcx, 144(%%rdi)\n"
27158         "adcq    $0, %%rdx\n"
27159         "movq    %%rdx, %%rcx\n"
27160         "mulq    %%r9\n"
27161         "addq    %%rax, %%rcx\n"
27162         "adcq    $0, %%rdx\n"
27163         "addq    %%rcx, 152(%%rdi)\n"
27164         "adcq    $0, %%rdx\n"
27165         "movq    %%rdx, 160(%%rdi)\n"
27166         "### x*y[9]\n"
27167         "movq    72(%%r8), %%r9\n"
27168         "movq    0(%%rsi), %%rax\n"
27169         "mulq    %%r9\n"
27170         "addq    %%rax, 72(%%rdi)\n"
27171         "movq    8(%%rsi), %%rax\n"
27172         "adcq    $0, %%rdx\n"
27173         "movq    %%rdx, %%rcx\n"
27174         "mulq    %%r9\n"
27175         "addq    %%rax, %%rcx\n"
27176         "adcq    $0, %%rdx\n"
27177         "movq    16(%%rsi), %%rax\n"
27178         "addq    %%rcx, 80(%%rdi)\n"
27179         "adcq    $0, %%rdx\n"
27180         "movq    %%rdx, %%rcx\n"
27181         "mulq    %%r9\n"
27182         "addq    %%rax, %%rcx\n"
27183         "adcq    $0, %%rdx\n"
27184         "movq    24(%%rsi), %%rax\n"
27185         "addq    %%rcx, 88(%%rdi)\n"
27186         "adcq    $0, %%rdx\n"
27187         "movq    %%rdx, %%rcx\n"
27188         "mulq    %%r9\n"
27189         "addq    %%rax, %%rcx\n"
27190         "adcq    $0, %%rdx\n"
27191         "movq    32(%%rsi), %%rax\n"
27192         "addq    %%rcx, 96(%%rdi)\n"
27193         "adcq    $0, %%rdx\n"
27194         "movq    %%rdx, %%rcx\n"
27195         "mulq    %%r9\n"
27196         "addq    %%rax, %%rcx\n"
27197         "adcq    $0, %%rdx\n"
27198         "movq    40(%%rsi), %%rax\n"
27199         "addq    %%rcx, 104(%%rdi)\n"
27200         "adcq    $0, %%rdx\n"
27201         "movq    %%rdx, %%rcx\n"
27202         "mulq    %%r9\n"
27203         "addq    %%rax, %%rcx\n"
27204         "adcq    $0, %%rdx\n"
27205         "movq    48(%%rsi), %%rax\n"
27206         "addq    %%rcx, 112(%%rdi)\n"
27207         "adcq    $0, %%rdx\n"
27208         "movq    %%rdx, %%rcx\n"
27209         "mulq    %%r9\n"
27210         "addq    %%rax, %%rcx\n"
27211         "adcq    $0, %%rdx\n"
27212         "movq    56(%%rsi), %%rax\n"
27213         "addq    %%rcx, 120(%%rdi)\n"
27214         "adcq    $0, %%rdx\n"
27215         "movq    %%rdx, %%rcx\n"
27216         "mulq    %%r9\n"
27217         "addq    %%rax, %%rcx\n"
27218         "adcq    $0, %%rdx\n"
27219         "movq    64(%%rsi), %%rax\n"
27220         "addq    %%rcx, 128(%%rdi)\n"
27221         "adcq    $0, %%rdx\n"
27222         "movq    %%rdx, %%rcx\n"
27223         "mulq    %%r9\n"
27224         "addq    %%rax, %%rcx\n"
27225         "adcq    $0, %%rdx\n"
27226         "movq    72(%%rsi), %%rax\n"
27227         "addq    %%rcx, 136(%%rdi)\n"
27228         "adcq    $0, %%rdx\n"
27229         "movq    %%rdx, %%rcx\n"
27230         "mulq    %%r9\n"
27231         "addq    %%rax, %%rcx\n"
27232         "adcq    $0, %%rdx\n"
27233         "movq    80(%%rsi), %%rax\n"
27234         "addq    %%rcx, 144(%%rdi)\n"
27235         "adcq    $0, %%rdx\n"
27236         "movq    %%rdx, %%rcx\n"
27237         "mulq    %%r9\n"
27238         "addq    %%rax, %%rcx\n"
27239         "adcq    $0, %%rdx\n"
27240         "movq    88(%%rsi), %%rax\n"
27241         "addq    %%rcx, 152(%%rdi)\n"
27242         "adcq    $0, %%rdx\n"
27243         "movq    %%rdx, %%rcx\n"
27244         "mulq    %%r9\n"
27245         "addq    %%rax, %%rcx\n"
27246         "adcq    $0, %%rdx\n"
27247         "addq    %%rcx, 160(%%rdi)\n"
27248         "adcq    $0, %%rdx\n"
27249         "movq    %%rdx, 168(%%rdi)\n"
27250         "### x*y[10]\n"
27251         "movq    80(%%r8), %%r9\n"
27252         "movq    0(%%rsi), %%rax\n"
27253         "mulq    %%r9\n"
27254         "addq    %%rax, 80(%%rdi)\n"
27255         "movq    8(%%rsi), %%rax\n"
27256         "adcq    $0, %%rdx\n"
27257         "movq    %%rdx, %%rcx\n"
27258         "mulq    %%r9\n"
27259         "addq    %%rax, %%rcx\n"
27260         "adcq    $0, %%rdx\n"
27261         "movq    16(%%rsi), %%rax\n"
27262         "addq    %%rcx, 88(%%rdi)\n"
27263         "adcq    $0, %%rdx\n"
27264         "movq    %%rdx, %%rcx\n"
27265         "mulq    %%r9\n"
27266         "addq    %%rax, %%rcx\n"
27267         "adcq    $0, %%rdx\n"
27268         "movq    24(%%rsi), %%rax\n"
27269         "addq    %%rcx, 96(%%rdi)\n"
27270         "adcq    $0, %%rdx\n"
27271         "movq    %%rdx, %%rcx\n"
27272         "mulq    %%r9\n"
27273         "addq    %%rax, %%rcx\n"
27274         "adcq    $0, %%rdx\n"
27275         "movq    32(%%rsi), %%rax\n"
27276         "addq    %%rcx, 104(%%rdi)\n"
27277         "adcq    $0, %%rdx\n"
27278         "movq    %%rdx, %%rcx\n"
27279         "mulq    %%r9\n"
27280         "addq    %%rax, %%rcx\n"
27281         "adcq    $0, %%rdx\n"
27282         "movq    40(%%rsi), %%rax\n"
27283         "addq    %%rcx, 112(%%rdi)\n"
27284         "adcq    $0, %%rdx\n"
27285         "movq    %%rdx, %%rcx\n"
27286         "mulq    %%r9\n"
27287         "addq    %%rax, %%rcx\n"
27288         "adcq    $0, %%rdx\n"
27289         "movq    48(%%rsi), %%rax\n"
27290         "addq    %%rcx, 120(%%rdi)\n"
27291         "adcq    $0, %%rdx\n"
27292         "movq    %%rdx, %%rcx\n"
27293         "mulq    %%r9\n"
27294         "addq    %%rax, %%rcx\n"
27295         "adcq    $0, %%rdx\n"
27296         "movq    56(%%rsi), %%rax\n"
27297         "addq    %%rcx, 128(%%rdi)\n"
27298         "adcq    $0, %%rdx\n"
27299         "movq    %%rdx, %%rcx\n"
27300         "mulq    %%r9\n"
27301         "addq    %%rax, %%rcx\n"
27302         "adcq    $0, %%rdx\n"
27303         "movq    64(%%rsi), %%rax\n"
27304         "addq    %%rcx, 136(%%rdi)\n"
27305         "adcq    $0, %%rdx\n"
27306         "movq    %%rdx, %%rcx\n"
27307         "mulq    %%r9\n"
27308         "addq    %%rax, %%rcx\n"
27309         "adcq    $0, %%rdx\n"
27310         "movq    72(%%rsi), %%rax\n"
27311         "addq    %%rcx, 144(%%rdi)\n"
27312         "adcq    $0, %%rdx\n"
27313         "movq    %%rdx, %%rcx\n"
27314         "mulq    %%r9\n"
27315         "addq    %%rax, %%rcx\n"
27316         "adcq    $0, %%rdx\n"
27317         "movq    80(%%rsi), %%rax\n"
27318         "addq    %%rcx, 152(%%rdi)\n"
27319         "adcq    $0, %%rdx\n"
27320         "movq    %%rdx, %%rcx\n"
27321         "mulq    %%r9\n"
27322         "addq    %%rax, %%rcx\n"
27323         "adcq    $0, %%rdx\n"
27324         "movq    88(%%rsi), %%rax\n"
27325         "addq    %%rcx, 160(%%rdi)\n"
27326         "adcq    $0, %%rdx\n"
27327         "movq    %%rdx, %%rcx\n"
27328         "mulq    %%r9\n"
27329         "addq    %%rax, %%rcx\n"
27330         "adcq    $0, %%rdx\n"
27331         "addq    %%rcx, 168(%%rdi)\n"
27332         "adcq    $0, %%rdx\n"
27333         "movq    %%rdx, 176(%%rdi)\n"
27334         "### x*y[11]\n"
27335         "movq    88(%%r8), %%r9\n"
27336         "movq    0(%%rsi), %%rax\n"
27337         "mulq    %%r9\n"
27338         "addq    %%rax, 88(%%rdi)\n"
27339         "movq    8(%%rsi), %%rax\n"
27340         "adcq    $0, %%rdx\n"
27341         "movq    %%rdx, %%rcx\n"
27342         "mulq    %%r9\n"
27343         "addq    %%rax, %%rcx\n"
27344         "adcq    $0, %%rdx\n"
27345         "movq    16(%%rsi), %%rax\n"
27346         "addq    %%rcx, 96(%%rdi)\n"
27347         "adcq    $0, %%rdx\n"
27348         "movq    %%rdx, %%rcx\n"
27349         "mulq    %%r9\n"
27350         "addq    %%rax, %%rcx\n"
27351         "adcq    $0, %%rdx\n"
27352         "movq    24(%%rsi), %%rax\n"
27353         "addq    %%rcx, 104(%%rdi)\n"
27354         "adcq    $0, %%rdx\n"
27355         "movq    %%rdx, %%rcx\n"
27356         "mulq    %%r9\n"
27357         "addq    %%rax, %%rcx\n"
27358         "adcq    $0, %%rdx\n"
27359         "movq    32(%%rsi), %%rax\n"
27360         "addq    %%rcx, 112(%%rdi)\n"
27361         "adcq    $0, %%rdx\n"
27362         "movq    %%rdx, %%rcx\n"
27363         "mulq    %%r9\n"
27364         "addq    %%rax, %%rcx\n"
27365         "adcq    $0, %%rdx\n"
27366         "movq    40(%%rsi), %%rax\n"
27367         "addq    %%rcx, 120(%%rdi)\n"
27368         "adcq    $0, %%rdx\n"
27369         "movq    %%rdx, %%rcx\n"
27370         "mulq    %%r9\n"
27371         "addq    %%rax, %%rcx\n"
27372         "adcq    $0, %%rdx\n"
27373         "movq    48(%%rsi), %%rax\n"
27374         "addq    %%rcx, 128(%%rdi)\n"
27375         "adcq    $0, %%rdx\n"
27376         "movq    %%rdx, %%rcx\n"
27377         "mulq    %%r9\n"
27378         "addq    %%rax, %%rcx\n"
27379         "adcq    $0, %%rdx\n"
27380         "movq    56(%%rsi), %%rax\n"
27381         "addq    %%rcx, 136(%%rdi)\n"
27382         "adcq    $0, %%rdx\n"
27383         "movq    %%rdx, %%rcx\n"
27384         "mulq    %%r9\n"
27385         "addq    %%rax, %%rcx\n"
27386         "adcq    $0, %%rdx\n"
27387         "movq    64(%%rsi), %%rax\n"
27388         "addq    %%rcx, 144(%%rdi)\n"
27389         "adcq    $0, %%rdx\n"
27390         "movq    %%rdx, %%rcx\n"
27391         "mulq    %%r9\n"
27392         "addq    %%rax, %%rcx\n"
27393         "adcq    $0, %%rdx\n"
27394         "movq    72(%%rsi), %%rax\n"
27395         "addq    %%rcx, 152(%%rdi)\n"
27396         "adcq    $0, %%rdx\n"
27397         "movq    %%rdx, %%rcx\n"
27398         "mulq    %%r9\n"
27399         "addq    %%rax, %%rcx\n"
27400         "adcq    $0, %%rdx\n"
27401         "movq    80(%%rsi), %%rax\n"
27402         "addq    %%rcx, 160(%%rdi)\n"
27403         "adcq    $0, %%rdx\n"
27404         "movq    %%rdx, %%rcx\n"
27405         "mulq    %%r9\n"
27406         "addq    %%rax, %%rcx\n"
27407         "adcq    $0, %%rdx\n"
27408         "movq    88(%%rsi), %%rax\n"
27409         "addq    %%rcx, 168(%%rdi)\n"
27410         "adcq    $0, %%rdx\n"
27411         "movq    %%rdx, %%rcx\n"
27412         "mulq    %%r9\n"
27413         "addq    %%rax, %%rcx\n"
27414         "adcq    $0, %%rdx\n"
27415         "addq    %%rcx, 176(%%rdi)\n"
27416       : "+m" (z)
27417       : "m" (x), "m" (y)
27418       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
27419 }
27420 
27421 /* x has 11.5 words, z has 23. Put x*y in z. */
27422 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
27423 static inline
mpfq_fixmp_11_5_sqr(mp_limb_t * z,const mp_limb_t * x)27424 void mpfq_fixmp_11_5_sqr(mp_limb_t * z, const mp_limb_t * x)
27425 {
27426     mpfq_fixmp_11_5_mul(z, x, x);
27427 }
27428 
27429 /* x has 11.5 words, z has 13. Put x*y in z. */
27430 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
27431 static inline
mpfq_fixmp_11_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)27432 void mpfq_fixmp_11_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
27433 {
27434     __asm__ __volatile__(
27435         "movq    %[z], %%rdi\n"
27436         "movq    %[x], %%rsi\n"
27437         "movq    0(%%rsi), %%rax\n"
27438         "mulq    %[mult]\n"
27439         "movq    %%rax, 0(%%rdi)\n"
27440         "movq    8(%%rsi), %%rax\n"
27441         "movq    %%rdx, %%rcx\n"
27442         "mulq    %[mult]\n"
27443         "addq    %%rax, %%rcx\n"
27444         "adcq    $0, %%rdx\n"
27445         "movq    16(%%rsi), %%rax\n"
27446         "movq    %%rcx, 8(%%rdi)\n"
27447         "movq    %%rdx, %%rcx\n"
27448         "mulq    %[mult]\n"
27449         "addq    %%rax, %%rcx\n"
27450         "adcq    $0, %%rdx\n"
27451         "movq    24(%%rsi), %%rax\n"
27452         "movq    %%rcx, 16(%%rdi)\n"
27453         "movq    %%rdx, %%rcx\n"
27454         "mulq    %[mult]\n"
27455         "addq    %%rax, %%rcx\n"
27456         "adcq    $0, %%rdx\n"
27457         "movq    32(%%rsi), %%rax\n"
27458         "movq    %%rcx, 24(%%rdi)\n"
27459         "movq    %%rdx, %%rcx\n"
27460         "mulq    %[mult]\n"
27461         "addq    %%rax, %%rcx\n"
27462         "adcq    $0, %%rdx\n"
27463         "movq    40(%%rsi), %%rax\n"
27464         "movq    %%rcx, 32(%%rdi)\n"
27465         "movq    %%rdx, %%rcx\n"
27466         "mulq    %[mult]\n"
27467         "addq    %%rax, %%rcx\n"
27468         "adcq    $0, %%rdx\n"
27469         "movq    48(%%rsi), %%rax\n"
27470         "movq    %%rcx, 40(%%rdi)\n"
27471         "movq    %%rdx, %%rcx\n"
27472         "mulq    %[mult]\n"
27473         "addq    %%rax, %%rcx\n"
27474         "adcq    $0, %%rdx\n"
27475         "movq    56(%%rsi), %%rax\n"
27476         "movq    %%rcx, 48(%%rdi)\n"
27477         "movq    %%rdx, %%rcx\n"
27478         "mulq    %[mult]\n"
27479         "addq    %%rax, %%rcx\n"
27480         "adcq    $0, %%rdx\n"
27481         "movq    64(%%rsi), %%rax\n"
27482         "movq    %%rcx, 56(%%rdi)\n"
27483         "movq    %%rdx, %%rcx\n"
27484         "mulq    %[mult]\n"
27485         "addq    %%rax, %%rcx\n"
27486         "adcq    $0, %%rdx\n"
27487         "movq    72(%%rsi), %%rax\n"
27488         "movq    %%rcx, 64(%%rdi)\n"
27489         "movq    %%rdx, %%rcx\n"
27490         "mulq    %[mult]\n"
27491         "addq    %%rax, %%rcx\n"
27492         "adcq    $0, %%rdx\n"
27493         "movq    80(%%rsi), %%rax\n"
27494         "movq    %%rcx, 72(%%rdi)\n"
27495         "movq    %%rdx, %%rcx\n"
27496         "mulq    %[mult]\n"
27497         "addq    %%rax, %%rcx\n"
27498         "adcq    $0, %%rdx\n"
27499         "movq    88(%%rsi), %%rax\n"
27500         "movq    %%rcx, 80(%%rdi)\n"
27501         "movq    %%rdx, %%rcx\n"
27502         "mulq    %[mult]\n"
27503         "addq    %%rax, %%rcx\n"
27504         "adcq    $0, %%rdx\n"
27505         "movq    %%rcx, 88(%%rdi)\n"
27506         "movq    %%rdx, 96(%%rdi)\n"
27507     :
27508     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
27509     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
27510 }
27511 
27512 /* x has 11.5 words, z has 12. c is 0.5 word.
27513  * Put (z+x*c) in z. Return carry bit. */
27514 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
27515 static inline
mpfq_fixmp_11_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)27516 mp_limb_t mpfq_fixmp_11_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
27517 {
27518     mp_limb_t carry;
27519     __asm__ __volatile__(
27520         "movq    %[z], %%rdi\n"
27521         "movq    %[x], %%rsi\n"
27522         "movq    0(%%rsi), %%rax\n"
27523         "mulq    %[mult]\n"
27524         "addq    %%rax, 0(%%rdi)\n"
27525         "movq    8(%%rsi), %%rax\n"
27526         "adcq    $0, %%rdx\n"
27527         "movq    %%rdx, %%rcx\n"
27528         "mulq    %[mult]\n"
27529         "addq    %%rax, %%rcx\n"
27530         "adcq    $0, %%rdx\n"
27531         "movq    16(%%rsi), %%rax\n"
27532         "addq    %%rcx, 8(%%rdi)\n"
27533         "adcq    $0, %%rdx\n"
27534         "movq    %%rdx, %%rcx\n"
27535         "mulq    %[mult]\n"
27536         "addq    %%rax, %%rcx\n"
27537         "adcq    $0, %%rdx\n"
27538         "movq    24(%%rsi), %%rax\n"
27539         "addq    %%rcx, 16(%%rdi)\n"
27540         "adcq    $0, %%rdx\n"
27541         "movq    %%rdx, %%rcx\n"
27542         "mulq    %[mult]\n"
27543         "addq    %%rax, %%rcx\n"
27544         "adcq    $0, %%rdx\n"
27545         "movq    32(%%rsi), %%rax\n"
27546         "addq    %%rcx, 24(%%rdi)\n"
27547         "adcq    $0, %%rdx\n"
27548         "movq    %%rdx, %%rcx\n"
27549         "mulq    %[mult]\n"
27550         "addq    %%rax, %%rcx\n"
27551         "adcq    $0, %%rdx\n"
27552         "movq    40(%%rsi), %%rax\n"
27553         "addq    %%rcx, 32(%%rdi)\n"
27554         "adcq    $0, %%rdx\n"
27555         "movq    %%rdx, %%rcx\n"
27556         "mulq    %[mult]\n"
27557         "addq    %%rax, %%rcx\n"
27558         "adcq    $0, %%rdx\n"
27559         "movq    48(%%rsi), %%rax\n"
27560         "addq    %%rcx, 40(%%rdi)\n"
27561         "adcq    $0, %%rdx\n"
27562         "movq    %%rdx, %%rcx\n"
27563         "mulq    %[mult]\n"
27564         "addq    %%rax, %%rcx\n"
27565         "adcq    $0, %%rdx\n"
27566         "movq    56(%%rsi), %%rax\n"
27567         "addq    %%rcx, 48(%%rdi)\n"
27568         "adcq    $0, %%rdx\n"
27569         "movq    %%rdx, %%rcx\n"
27570         "mulq    %[mult]\n"
27571         "addq    %%rax, %%rcx\n"
27572         "adcq    $0, %%rdx\n"
27573         "movq    64(%%rsi), %%rax\n"
27574         "addq    %%rcx, 56(%%rdi)\n"
27575         "adcq    $0, %%rdx\n"
27576         "movq    %%rdx, %%rcx\n"
27577         "mulq    %[mult]\n"
27578         "addq    %%rax, %%rcx\n"
27579         "adcq    $0, %%rdx\n"
27580         "movq    72(%%rsi), %%rax\n"
27581         "addq    %%rcx, 64(%%rdi)\n"
27582         "adcq    $0, %%rdx\n"
27583         "movq    %%rdx, %%rcx\n"
27584         "mulq    %[mult]\n"
27585         "addq    %%rax, %%rcx\n"
27586         "adcq    $0, %%rdx\n"
27587         "movq    80(%%rsi), %%rax\n"
27588         "addq    %%rcx, 72(%%rdi)\n"
27589         "adcq    $0, %%rdx\n"
27590         "movq    %%rdx, %%rcx\n"
27591         "mulq    %[mult]\n"
27592         "addq    %%rax, %%rcx\n"
27593         "adcq    $0, %%rdx\n"
27594         "movq    88(%%rsi), %%rax\n"
27595         "addq    %%rcx, 80(%%rdi)\n"
27596         "adcq    $0, %%rdx\n"
27597         "movq    %%rdx, %%rcx\n"
27598         "imulq    %[mult], %%rax\n"
27599         "xorq    %%rdx, %%rdx\n"
27600         "addq    %%rcx, %%rax\n"
27601         "adcq    $0, %%rdx\n"
27602         "addq    %%rax, 88(%%rdi)\n"
27603         "adcq    $0, %%rdx\n"
27604         "movq    %%rdx, %[carry]\n"
27605     : [carry]"=g"(carry), [z] "+m" (z)
27606     : [mult] "r" (c), [x] "m" (x)
27607     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
27608     return carry;
27609 }
27610 
27611 /* x has 11.5 words, z has 12. c is 0.5 word.
27612  * Put (z+x*c) in z. Carry bit is lost. */
27613 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
27614 static inline
mpfq_fixmp_11_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)27615 void mpfq_fixmp_11_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
27616 {
27617     __asm__ __volatile__(
27618         "movq    %[z], %%rdi\n"
27619         "movq    %[x], %%rsi\n"
27620         "movq    0(%%rsi), %%rax\n"
27621         "mulq    %[mult]\n"
27622         "addq    %%rax, 0(%%rdi)\n"
27623         "movq    8(%%rsi), %%rax\n"
27624         "adcq    $0, %%rdx\n"
27625         "movq    %%rdx, %%rcx\n"
27626         "mulq    %[mult]\n"
27627         "addq    %%rax, %%rcx\n"
27628         "adcq    $0, %%rdx\n"
27629         "movq    16(%%rsi), %%rax\n"
27630         "addq    %%rcx, 8(%%rdi)\n"
27631         "adcq    $0, %%rdx\n"
27632         "movq    %%rdx, %%rcx\n"
27633         "mulq    %[mult]\n"
27634         "addq    %%rax, %%rcx\n"
27635         "adcq    $0, %%rdx\n"
27636         "movq    24(%%rsi), %%rax\n"
27637         "addq    %%rcx, 16(%%rdi)\n"
27638         "adcq    $0, %%rdx\n"
27639         "movq    %%rdx, %%rcx\n"
27640         "mulq    %[mult]\n"
27641         "addq    %%rax, %%rcx\n"
27642         "adcq    $0, %%rdx\n"
27643         "movq    32(%%rsi), %%rax\n"
27644         "addq    %%rcx, 24(%%rdi)\n"
27645         "adcq    $0, %%rdx\n"
27646         "movq    %%rdx, %%rcx\n"
27647         "mulq    %[mult]\n"
27648         "addq    %%rax, %%rcx\n"
27649         "adcq    $0, %%rdx\n"
27650         "movq    40(%%rsi), %%rax\n"
27651         "addq    %%rcx, 32(%%rdi)\n"
27652         "adcq    $0, %%rdx\n"
27653         "movq    %%rdx, %%rcx\n"
27654         "mulq    %[mult]\n"
27655         "addq    %%rax, %%rcx\n"
27656         "adcq    $0, %%rdx\n"
27657         "movq    48(%%rsi), %%rax\n"
27658         "addq    %%rcx, 40(%%rdi)\n"
27659         "adcq    $0, %%rdx\n"
27660         "movq    %%rdx, %%rcx\n"
27661         "mulq    %[mult]\n"
27662         "addq    %%rax, %%rcx\n"
27663         "adcq    $0, %%rdx\n"
27664         "movq    56(%%rsi), %%rax\n"
27665         "addq    %%rcx, 48(%%rdi)\n"
27666         "adcq    $0, %%rdx\n"
27667         "movq    %%rdx, %%rcx\n"
27668         "mulq    %[mult]\n"
27669         "addq    %%rax, %%rcx\n"
27670         "adcq    $0, %%rdx\n"
27671         "movq    64(%%rsi), %%rax\n"
27672         "addq    %%rcx, 56(%%rdi)\n"
27673         "adcq    $0, %%rdx\n"
27674         "movq    %%rdx, %%rcx\n"
27675         "mulq    %[mult]\n"
27676         "addq    %%rax, %%rcx\n"
27677         "adcq    $0, %%rdx\n"
27678         "movq    72(%%rsi), %%rax\n"
27679         "addq    %%rcx, 64(%%rdi)\n"
27680         "adcq    $0, %%rdx\n"
27681         "movq    %%rdx, %%rcx\n"
27682         "mulq    %[mult]\n"
27683         "addq    %%rax, %%rcx\n"
27684         "adcq    $0, %%rdx\n"
27685         "movq    80(%%rsi), %%rax\n"
27686         "addq    %%rcx, 72(%%rdi)\n"
27687         "adcq    $0, %%rdx\n"
27688         "movq    %%rdx, %%rcx\n"
27689         "mulq    %[mult]\n"
27690         "addq    %%rax, %%rcx\n"
27691         "adcq    $0, %%rdx\n"
27692         "movq    88(%%rsi), %%rax\n"
27693         "addq    %%rcx, 80(%%rdi)\n"
27694         "adcq    $0, %%rdx\n"
27695         "movq    %%rdx, %%rcx\n"
27696         "imulq    %[mult], %%rax\n"
27697         "addq    %%rcx, %%rax\n"
27698         "addq    %%rax, 88(%%rdi)\n"
27699     : [z] "+m" (z)
27700     : [mult] "r" (c), [x] "m" (x)
27701     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
27702 }
27703 
27704 /* x has 11.5 words, z has 12. c is 0.5 word.
27705  * Put (x*c) in z. No carry. */
27706 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
27707 static inline
mpfq_fixmp_11_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)27708 void mpfq_fixmp_11_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
27709 {
27710     __asm__ __volatile__(
27711         "movq    %[z], %%rdi\n"
27712         "movq    %[x], %%rsi\n"
27713         "movq    0(%%rsi), %%rax\n"
27714         "mulq    %[mult]\n"
27715         "movq    %%rax, 0(%%rdi)\n"
27716         "movq    8(%%rsi), %%rax\n"
27717         "movq    %%rdx, %%rcx\n"
27718         "mulq    %[mult]\n"
27719         "addq    %%rax, %%rcx\n"
27720         "adcq    $0, %%rdx\n"
27721         "movq    16(%%rsi), %%rax\n"
27722         "movq    %%rcx, 8(%%rdi)\n"
27723         "movq    %%rdx, %%rcx\n"
27724         "mulq    %[mult]\n"
27725         "addq    %%rax, %%rcx\n"
27726         "adcq    $0, %%rdx\n"
27727         "movq    24(%%rsi), %%rax\n"
27728         "movq    %%rcx, 16(%%rdi)\n"
27729         "movq    %%rdx, %%rcx\n"
27730         "mulq    %[mult]\n"
27731         "addq    %%rax, %%rcx\n"
27732         "adcq    $0, %%rdx\n"
27733         "movq    32(%%rsi), %%rax\n"
27734         "movq    %%rcx, 24(%%rdi)\n"
27735         "movq    %%rdx, %%rcx\n"
27736         "mulq    %[mult]\n"
27737         "addq    %%rax, %%rcx\n"
27738         "adcq    $0, %%rdx\n"
27739         "movq    40(%%rsi), %%rax\n"
27740         "movq    %%rcx, 32(%%rdi)\n"
27741         "movq    %%rdx, %%rcx\n"
27742         "mulq    %[mult]\n"
27743         "addq    %%rax, %%rcx\n"
27744         "adcq    $0, %%rdx\n"
27745         "movq    48(%%rsi), %%rax\n"
27746         "movq    %%rcx, 40(%%rdi)\n"
27747         "movq    %%rdx, %%rcx\n"
27748         "mulq    %[mult]\n"
27749         "addq    %%rax, %%rcx\n"
27750         "adcq    $0, %%rdx\n"
27751         "movq    56(%%rsi), %%rax\n"
27752         "movq    %%rcx, 48(%%rdi)\n"
27753         "movq    %%rdx, %%rcx\n"
27754         "mulq    %[mult]\n"
27755         "addq    %%rax, %%rcx\n"
27756         "adcq    $0, %%rdx\n"
27757         "movq    64(%%rsi), %%rax\n"
27758         "movq    %%rcx, 56(%%rdi)\n"
27759         "movq    %%rdx, %%rcx\n"
27760         "mulq    %[mult]\n"
27761         "addq    %%rax, %%rcx\n"
27762         "adcq    $0, %%rdx\n"
27763         "movq    72(%%rsi), %%rax\n"
27764         "movq    %%rcx, 64(%%rdi)\n"
27765         "movq    %%rdx, %%rcx\n"
27766         "mulq    %[mult]\n"
27767         "addq    %%rax, %%rcx\n"
27768         "adcq    $0, %%rdx\n"
27769         "movq    80(%%rsi), %%rax\n"
27770         "movq    %%rcx, 72(%%rdi)\n"
27771         "movq    %%rdx, %%rcx\n"
27772         "mulq    %[mult]\n"
27773         "addq    %%rax, %%rcx\n"
27774         "adcq    $0, %%rdx\n"
27775         "movq    88(%%rsi), %%rax\n"
27776         "movq    %%rcx, 80(%%rdi)\n"
27777         "movq    %%rdx, %%rcx\n"
27778         "imulq    %[mult], %%rax\n"
27779         "addq    %%rcx, %%rax\n"
27780         "movq    %%rax, 88(%%rdi)\n"
27781     :
27782     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
27783     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
27784 }
27785 
27786 /* x, y, and z have 12.5 words. Result in z. Return carry bit */
27787 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
27788 static inline
mpfq_fixmp_12_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)27789 mp_limb_t mpfq_fixmp_12_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
27790 {
27791     mp_limb_t carry;
27792     __asm__ __volatile__(
27793         "movq    %[z], %%rdi\n"
27794         "movq    %[x], %%rsi\n"
27795         "movq    %[y], %%rdx\n"
27796         "movq    0(%%rsi), %%rax\n"
27797         "addq    0(%%rdx), %%rax\n"
27798         "movq    %%rax, 0(%%rdi)\n"
27799         "movq    8(%%rsi), %%rax\n"
27800         "adcq    8(%%rdx), %%rax\n"
27801         "movq    %%rax, 8(%%rdi)\n"
27802         "movq    16(%%rsi), %%rax\n"
27803         "adcq    16(%%rdx), %%rax\n"
27804         "movq    %%rax, 16(%%rdi)\n"
27805         "movq    24(%%rsi), %%rax\n"
27806         "adcq    24(%%rdx), %%rax\n"
27807         "movq    %%rax, 24(%%rdi)\n"
27808         "movq    32(%%rsi), %%rax\n"
27809         "adcq    32(%%rdx), %%rax\n"
27810         "movq    %%rax, 32(%%rdi)\n"
27811         "movq    40(%%rsi), %%rax\n"
27812         "adcq    40(%%rdx), %%rax\n"
27813         "movq    %%rax, 40(%%rdi)\n"
27814         "movq    48(%%rsi), %%rax\n"
27815         "adcq    48(%%rdx), %%rax\n"
27816         "movq    %%rax, 48(%%rdi)\n"
27817         "movq    56(%%rsi), %%rax\n"
27818         "adcq    56(%%rdx), %%rax\n"
27819         "movq    %%rax, 56(%%rdi)\n"
27820         "movq    64(%%rsi), %%rax\n"
27821         "adcq    64(%%rdx), %%rax\n"
27822         "movq    %%rax, 64(%%rdi)\n"
27823         "movq    72(%%rsi), %%rax\n"
27824         "adcq    72(%%rdx), %%rax\n"
27825         "movq    %%rax, 72(%%rdi)\n"
27826         "movq    80(%%rsi), %%rax\n"
27827         "adcq    80(%%rdx), %%rax\n"
27828         "movq    %%rax, 80(%%rdi)\n"
27829         "movq    88(%%rsi), %%rax\n"
27830         "adcq    88(%%rdx), %%rax\n"
27831         "movq    %%rax, 88(%%rdi)\n"
27832         "movq    96(%%rsi), %%rax\n"
27833         "adcq    96(%%rdx), %%rax\n"
27834         "movq    %%rax, 96(%%rdi)\n"
27835         "movq $0, %%rax\n"
27836         "adcq $0, %%rax\n"
27837     : "=&a"(carry)
27838     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
27839     : "%rdx", "%rsi", "%rdi", "memory");
27840     return carry;
27841 }
27842 
27843 /* x, y, and z have 12.5 words. Result in z. Return borrow bit */
27844 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
27845 static inline
mpfq_fixmp_12_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)27846 mp_limb_t mpfq_fixmp_12_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
27847 {
27848     mp_limb_t carry;
27849     __asm__ __volatile__(
27850         "movq    %[z], %%rdi\n"
27851         "movq    %[x], %%rsi\n"
27852         "movq    %[y], %%rdx\n"
27853         "movq    0(%%rsi), %%rax\n"
27854         "subq    0(%%rdx), %%rax\n"
27855         "movq    %%rax, 0(%%rdi)\n"
27856         "movq    8(%%rsi), %%rax\n"
27857         "sbbq    8(%%rdx), %%rax\n"
27858         "movq    %%rax, 8(%%rdi)\n"
27859         "movq    16(%%rsi), %%rax\n"
27860         "sbbq    16(%%rdx), %%rax\n"
27861         "movq    %%rax, 16(%%rdi)\n"
27862         "movq    24(%%rsi), %%rax\n"
27863         "sbbq    24(%%rdx), %%rax\n"
27864         "movq    %%rax, 24(%%rdi)\n"
27865         "movq    32(%%rsi), %%rax\n"
27866         "sbbq    32(%%rdx), %%rax\n"
27867         "movq    %%rax, 32(%%rdi)\n"
27868         "movq    40(%%rsi), %%rax\n"
27869         "sbbq    40(%%rdx), %%rax\n"
27870         "movq    %%rax, 40(%%rdi)\n"
27871         "movq    48(%%rsi), %%rax\n"
27872         "sbbq    48(%%rdx), %%rax\n"
27873         "movq    %%rax, 48(%%rdi)\n"
27874         "movq    56(%%rsi), %%rax\n"
27875         "sbbq    56(%%rdx), %%rax\n"
27876         "movq    %%rax, 56(%%rdi)\n"
27877         "movq    64(%%rsi), %%rax\n"
27878         "sbbq    64(%%rdx), %%rax\n"
27879         "movq    %%rax, 64(%%rdi)\n"
27880         "movq    72(%%rsi), %%rax\n"
27881         "sbbq    72(%%rdx), %%rax\n"
27882         "movq    %%rax, 72(%%rdi)\n"
27883         "movq    80(%%rsi), %%rax\n"
27884         "sbbq    80(%%rdx), %%rax\n"
27885         "movq    %%rax, 80(%%rdi)\n"
27886         "movq    88(%%rsi), %%rax\n"
27887         "sbbq    88(%%rdx), %%rax\n"
27888         "movq    %%rax, 88(%%rdi)\n"
27889         "movq    96(%%rsi), %%rax\n"
27890         "sbbq    96(%%rdx), %%rax\n"
27891         "movq    %%rax, 96(%%rdi)\n"
27892         "movq $0, %%rax\n"
27893         "adcq $0, %%rax\n"
27894     : "=&a"(carry)
27895     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
27896     : "%rdx", "%rsi", "%rdi", "memory");
27897     return carry;
27898 }
27899 
27900 /* x, y, and z have 12.5 words. Result in z. Carry bit is lost. */
27901 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
27902 static inline
mpfq_fixmp_12_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)27903 void mpfq_fixmp_12_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
27904 {
27905     __asm__ __volatile__(
27906         "movq    %[z], %%rdi\n"
27907         "movq    %[x], %%rsi\n"
27908         "movq    %[y], %%rdx\n"
27909         "movq    0(%%rsi), %%rax\n"
27910         "addq    0(%%rdx), %%rax\n"
27911         "movq    %%rax, 0(%%rdi)\n"
27912         "movq    8(%%rsi), %%rax\n"
27913         "adcq    8(%%rdx), %%rax\n"
27914         "movq    %%rax, 8(%%rdi)\n"
27915         "movq    16(%%rsi), %%rax\n"
27916         "adcq    16(%%rdx), %%rax\n"
27917         "movq    %%rax, 16(%%rdi)\n"
27918         "movq    24(%%rsi), %%rax\n"
27919         "adcq    24(%%rdx), %%rax\n"
27920         "movq    %%rax, 24(%%rdi)\n"
27921         "movq    32(%%rsi), %%rax\n"
27922         "adcq    32(%%rdx), %%rax\n"
27923         "movq    %%rax, 32(%%rdi)\n"
27924         "movq    40(%%rsi), %%rax\n"
27925         "adcq    40(%%rdx), %%rax\n"
27926         "movq    %%rax, 40(%%rdi)\n"
27927         "movq    48(%%rsi), %%rax\n"
27928         "adcq    48(%%rdx), %%rax\n"
27929         "movq    %%rax, 48(%%rdi)\n"
27930         "movq    56(%%rsi), %%rax\n"
27931         "adcq    56(%%rdx), %%rax\n"
27932         "movq    %%rax, 56(%%rdi)\n"
27933         "movq    64(%%rsi), %%rax\n"
27934         "adcq    64(%%rdx), %%rax\n"
27935         "movq    %%rax, 64(%%rdi)\n"
27936         "movq    72(%%rsi), %%rax\n"
27937         "adcq    72(%%rdx), %%rax\n"
27938         "movq    %%rax, 72(%%rdi)\n"
27939         "movq    80(%%rsi), %%rax\n"
27940         "adcq    80(%%rdx), %%rax\n"
27941         "movq    %%rax, 80(%%rdi)\n"
27942         "movq    88(%%rsi), %%rax\n"
27943         "adcq    88(%%rdx), %%rax\n"
27944         "movq    %%rax, 88(%%rdi)\n"
27945         "movq    96(%%rsi), %%rax\n"
27946         "adcq    96(%%rdx), %%rax\n"
27947         "movq    %%rax, 96(%%rdi)\n"
27948     :
27949     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
27950     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
27951 }
27952 
27953 /* x, y, and z have 12.5 words. Result in z. Borrow bit is lost. */
27954 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
27955 static inline
mpfq_fixmp_12_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)27956 void mpfq_fixmp_12_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
27957 {
27958     __asm__ __volatile__(
27959         "movq    %[z], %%rdi\n"
27960         "movq    %[x], %%rsi\n"
27961         "movq    %[y], %%rdx\n"
27962         "movq    0(%%rsi), %%rax\n"
27963         "subq    0(%%rdx), %%rax\n"
27964         "movq    %%rax, 0(%%rdi)\n"
27965         "movq    8(%%rsi), %%rax\n"
27966         "sbbq    8(%%rdx), %%rax\n"
27967         "movq    %%rax, 8(%%rdi)\n"
27968         "movq    16(%%rsi), %%rax\n"
27969         "sbbq    16(%%rdx), %%rax\n"
27970         "movq    %%rax, 16(%%rdi)\n"
27971         "movq    24(%%rsi), %%rax\n"
27972         "sbbq    24(%%rdx), %%rax\n"
27973         "movq    %%rax, 24(%%rdi)\n"
27974         "movq    32(%%rsi), %%rax\n"
27975         "sbbq    32(%%rdx), %%rax\n"
27976         "movq    %%rax, 32(%%rdi)\n"
27977         "movq    40(%%rsi), %%rax\n"
27978         "sbbq    40(%%rdx), %%rax\n"
27979         "movq    %%rax, 40(%%rdi)\n"
27980         "movq    48(%%rsi), %%rax\n"
27981         "sbbq    48(%%rdx), %%rax\n"
27982         "movq    %%rax, 48(%%rdi)\n"
27983         "movq    56(%%rsi), %%rax\n"
27984         "sbbq    56(%%rdx), %%rax\n"
27985         "movq    %%rax, 56(%%rdi)\n"
27986         "movq    64(%%rsi), %%rax\n"
27987         "sbbq    64(%%rdx), %%rax\n"
27988         "movq    %%rax, 64(%%rdi)\n"
27989         "movq    72(%%rsi), %%rax\n"
27990         "sbbq    72(%%rdx), %%rax\n"
27991         "movq    %%rax, 72(%%rdi)\n"
27992         "movq    80(%%rsi), %%rax\n"
27993         "sbbq    80(%%rdx), %%rax\n"
27994         "movq    %%rax, 80(%%rdi)\n"
27995         "movq    88(%%rsi), %%rax\n"
27996         "sbbq    88(%%rdx), %%rax\n"
27997         "movq    %%rax, 88(%%rdi)\n"
27998         "movq    96(%%rsi), %%rax\n"
27999         "sbbq    96(%%rdx), %%rax\n"
28000         "movq    %%rax, 96(%%rdi)\n"
28001     :
28002     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
28003     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
28004 }
28005 
28006 /* x has 12.5 words, z has 14.
28007  * Put (z+x*c) in z. Return carry bit. */
28008 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
28009 static inline
mpfq_fixmp_12_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)28010 mp_limb_t mpfq_fixmp_12_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
28011 {
28012     mp_limb_t carry;
28013     __asm__ __volatile__(
28014         "movq    %[z], %%rdi\n"
28015         "movq    %[x], %%rsi\n"
28016         "movq    0(%%rsi), %%rax\n"
28017         "mulq    %[mult]\n"
28018         "addq    %%rax, 0(%%rdi)\n"
28019         "movq    8(%%rsi), %%rax\n"
28020         "adcq    $0, %%rdx\n"
28021         "movq    %%rdx, %%rcx\n"
28022         "mulq    %[mult]\n"
28023         "addq    %%rax, %%rcx\n"
28024         "adcq    $0, %%rdx\n"
28025         "movq    16(%%rsi), %%rax\n"
28026         "addq    %%rcx, 8(%%rdi)\n"
28027         "adcq    $0, %%rdx\n"
28028         "movq    %%rdx, %%rcx\n"
28029         "mulq    %[mult]\n"
28030         "addq    %%rax, %%rcx\n"
28031         "adcq    $0, %%rdx\n"
28032         "movq    24(%%rsi), %%rax\n"
28033         "addq    %%rcx, 16(%%rdi)\n"
28034         "adcq    $0, %%rdx\n"
28035         "movq    %%rdx, %%rcx\n"
28036         "mulq    %[mult]\n"
28037         "addq    %%rax, %%rcx\n"
28038         "adcq    $0, %%rdx\n"
28039         "movq    32(%%rsi), %%rax\n"
28040         "addq    %%rcx, 24(%%rdi)\n"
28041         "adcq    $0, %%rdx\n"
28042         "movq    %%rdx, %%rcx\n"
28043         "mulq    %[mult]\n"
28044         "addq    %%rax, %%rcx\n"
28045         "adcq    $0, %%rdx\n"
28046         "movq    40(%%rsi), %%rax\n"
28047         "addq    %%rcx, 32(%%rdi)\n"
28048         "adcq    $0, %%rdx\n"
28049         "movq    %%rdx, %%rcx\n"
28050         "mulq    %[mult]\n"
28051         "addq    %%rax, %%rcx\n"
28052         "adcq    $0, %%rdx\n"
28053         "movq    48(%%rsi), %%rax\n"
28054         "addq    %%rcx, 40(%%rdi)\n"
28055         "adcq    $0, %%rdx\n"
28056         "movq    %%rdx, %%rcx\n"
28057         "mulq    %[mult]\n"
28058         "addq    %%rax, %%rcx\n"
28059         "adcq    $0, %%rdx\n"
28060         "movq    56(%%rsi), %%rax\n"
28061         "addq    %%rcx, 48(%%rdi)\n"
28062         "adcq    $0, %%rdx\n"
28063         "movq    %%rdx, %%rcx\n"
28064         "mulq    %[mult]\n"
28065         "addq    %%rax, %%rcx\n"
28066         "adcq    $0, %%rdx\n"
28067         "movq    64(%%rsi), %%rax\n"
28068         "addq    %%rcx, 56(%%rdi)\n"
28069         "adcq    $0, %%rdx\n"
28070         "movq    %%rdx, %%rcx\n"
28071         "mulq    %[mult]\n"
28072         "addq    %%rax, %%rcx\n"
28073         "adcq    $0, %%rdx\n"
28074         "movq    72(%%rsi), %%rax\n"
28075         "addq    %%rcx, 64(%%rdi)\n"
28076         "adcq    $0, %%rdx\n"
28077         "movq    %%rdx, %%rcx\n"
28078         "mulq    %[mult]\n"
28079         "addq    %%rax, %%rcx\n"
28080         "adcq    $0, %%rdx\n"
28081         "movq    80(%%rsi), %%rax\n"
28082         "addq    %%rcx, 72(%%rdi)\n"
28083         "adcq    $0, %%rdx\n"
28084         "movq    %%rdx, %%rcx\n"
28085         "mulq    %[mult]\n"
28086         "addq    %%rax, %%rcx\n"
28087         "adcq    $0, %%rdx\n"
28088         "movq    88(%%rsi), %%rax\n"
28089         "addq    %%rcx, 80(%%rdi)\n"
28090         "adcq    $0, %%rdx\n"
28091         "movq    %%rdx, %%rcx\n"
28092         "mulq    %[mult]\n"
28093         "addq    %%rax, %%rcx\n"
28094         "adcq    $0, %%rdx\n"
28095         "movq    96(%%rsi), %%rax\n"
28096         "addq    %%rcx, 88(%%rdi)\n"
28097         "adcq    $0, %%rdx\n"
28098         "movq    %%rdx, %%rcx\n"
28099         "mulq    %[mult]\n"
28100         "addq    %%rax, %%rcx\n"
28101         "adcq    $0, %%rdx\n"
28102         "addq    %%rcx, 96(%%rdi)\n"
28103         "adcq    $0, %%rdx\n"
28104         "xorq    %%rcx, %%rcx\n"
28105         "addq    %%rdx, 104(%%rdi)\n"
28106         "adcq    $0, %%rcx\n"
28107         "movq    %%rcx, %[carry]\n"
28108     : [carry]"=g"(carry), [z] "+m" (z)
28109     : [mult] "r" (c), [x] "m" (x)
28110     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
28111     return carry;
28112 }
28113 
28114 /* x has 12.5 words, z has 14.
28115  * Put (z+x*c) in z. Carry bit is lost. */
28116 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
28117 static inline
mpfq_fixmp_12_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)28118 void mpfq_fixmp_12_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
28119 {
28120     __asm__ __volatile__(
28121         "movq    %[z], %%rdi\n"
28122         "movq    %[x], %%rsi\n"
28123         "movq    0(%%rsi), %%rax\n"
28124         "mulq    %[mult]\n"
28125         "addq    %%rax, 0(%%rdi)\n"
28126         "movq    8(%%rsi), %%rax\n"
28127         "adcq    $0, %%rdx\n"
28128         "movq    %%rdx, %%rcx\n"
28129         "mulq    %[mult]\n"
28130         "addq    %%rax, %%rcx\n"
28131         "adcq    $0, %%rdx\n"
28132         "movq    16(%%rsi), %%rax\n"
28133         "addq    %%rcx, 8(%%rdi)\n"
28134         "adcq    $0, %%rdx\n"
28135         "movq    %%rdx, %%rcx\n"
28136         "mulq    %[mult]\n"
28137         "addq    %%rax, %%rcx\n"
28138         "adcq    $0, %%rdx\n"
28139         "movq    24(%%rsi), %%rax\n"
28140         "addq    %%rcx, 16(%%rdi)\n"
28141         "adcq    $0, %%rdx\n"
28142         "movq    %%rdx, %%rcx\n"
28143         "mulq    %[mult]\n"
28144         "addq    %%rax, %%rcx\n"
28145         "adcq    $0, %%rdx\n"
28146         "movq    32(%%rsi), %%rax\n"
28147         "addq    %%rcx, 24(%%rdi)\n"
28148         "adcq    $0, %%rdx\n"
28149         "movq    %%rdx, %%rcx\n"
28150         "mulq    %[mult]\n"
28151         "addq    %%rax, %%rcx\n"
28152         "adcq    $0, %%rdx\n"
28153         "movq    40(%%rsi), %%rax\n"
28154         "addq    %%rcx, 32(%%rdi)\n"
28155         "adcq    $0, %%rdx\n"
28156         "movq    %%rdx, %%rcx\n"
28157         "mulq    %[mult]\n"
28158         "addq    %%rax, %%rcx\n"
28159         "adcq    $0, %%rdx\n"
28160         "movq    48(%%rsi), %%rax\n"
28161         "addq    %%rcx, 40(%%rdi)\n"
28162         "adcq    $0, %%rdx\n"
28163         "movq    %%rdx, %%rcx\n"
28164         "mulq    %[mult]\n"
28165         "addq    %%rax, %%rcx\n"
28166         "adcq    $0, %%rdx\n"
28167         "movq    56(%%rsi), %%rax\n"
28168         "addq    %%rcx, 48(%%rdi)\n"
28169         "adcq    $0, %%rdx\n"
28170         "movq    %%rdx, %%rcx\n"
28171         "mulq    %[mult]\n"
28172         "addq    %%rax, %%rcx\n"
28173         "adcq    $0, %%rdx\n"
28174         "movq    64(%%rsi), %%rax\n"
28175         "addq    %%rcx, 56(%%rdi)\n"
28176         "adcq    $0, %%rdx\n"
28177         "movq    %%rdx, %%rcx\n"
28178         "mulq    %[mult]\n"
28179         "addq    %%rax, %%rcx\n"
28180         "adcq    $0, %%rdx\n"
28181         "movq    72(%%rsi), %%rax\n"
28182         "addq    %%rcx, 64(%%rdi)\n"
28183         "adcq    $0, %%rdx\n"
28184         "movq    %%rdx, %%rcx\n"
28185         "mulq    %[mult]\n"
28186         "addq    %%rax, %%rcx\n"
28187         "adcq    $0, %%rdx\n"
28188         "movq    80(%%rsi), %%rax\n"
28189         "addq    %%rcx, 72(%%rdi)\n"
28190         "adcq    $0, %%rdx\n"
28191         "movq    %%rdx, %%rcx\n"
28192         "mulq    %[mult]\n"
28193         "addq    %%rax, %%rcx\n"
28194         "adcq    $0, %%rdx\n"
28195         "movq    88(%%rsi), %%rax\n"
28196         "addq    %%rcx, 80(%%rdi)\n"
28197         "adcq    $0, %%rdx\n"
28198         "movq    %%rdx, %%rcx\n"
28199         "mulq    %[mult]\n"
28200         "addq    %%rax, %%rcx\n"
28201         "adcq    $0, %%rdx\n"
28202         "movq    96(%%rsi), %%rax\n"
28203         "addq    %%rcx, 88(%%rdi)\n"
28204         "adcq    $0, %%rdx\n"
28205         "movq    %%rdx, %%rcx\n"
28206         "mulq    %[mult]\n"
28207         "addq    %%rax, %%rcx\n"
28208         "adcq    $0, %%rdx\n"
28209         "addq    %%rcx, 96(%%rdi)\n"
28210         "adcq    $0, %%rdx\n"
28211         "addq    %%rdx, 104(%%rdi)\n"
28212     : [z] "+m" (z)
28213     : [mult] "r" (c), [x] "m" (x)
28214     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
28215 }
28216 
28217 /* x has 12.5 words, z has 13.
28218  * Put (z+x*c) in z. Return carry word. */
28219 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
28220 static inline
mpfq_fixmp_12_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)28221 mp_limb_t mpfq_fixmp_12_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
28222 {
28223     mp_limb_t carry;
28224     __asm__ __volatile__(
28225         "movq    %[z], %%rdi\n"
28226         "movq    %[x], %%rsi\n"
28227         "movq    0(%%rsi), %%rax\n"
28228         "mulq    %[mult]\n"
28229         "addq    %%rax, 0(%%rdi)\n"
28230         "movq    8(%%rsi), %%rax\n"
28231         "adcq    $0, %%rdx\n"
28232         "movq    %%rdx, %%rcx\n"
28233         "mulq    %[mult]\n"
28234         "addq    %%rax, %%rcx\n"
28235         "adcq    $0, %%rdx\n"
28236         "movq    16(%%rsi), %%rax\n"
28237         "addq    %%rcx, 8(%%rdi)\n"
28238         "adcq    $0, %%rdx\n"
28239         "movq    %%rdx, %%rcx\n"
28240         "mulq    %[mult]\n"
28241         "addq    %%rax, %%rcx\n"
28242         "adcq    $0, %%rdx\n"
28243         "movq    24(%%rsi), %%rax\n"
28244         "addq    %%rcx, 16(%%rdi)\n"
28245         "adcq    $0, %%rdx\n"
28246         "movq    %%rdx, %%rcx\n"
28247         "mulq    %[mult]\n"
28248         "addq    %%rax, %%rcx\n"
28249         "adcq    $0, %%rdx\n"
28250         "movq    32(%%rsi), %%rax\n"
28251         "addq    %%rcx, 24(%%rdi)\n"
28252         "adcq    $0, %%rdx\n"
28253         "movq    %%rdx, %%rcx\n"
28254         "mulq    %[mult]\n"
28255         "addq    %%rax, %%rcx\n"
28256         "adcq    $0, %%rdx\n"
28257         "movq    40(%%rsi), %%rax\n"
28258         "addq    %%rcx, 32(%%rdi)\n"
28259         "adcq    $0, %%rdx\n"
28260         "movq    %%rdx, %%rcx\n"
28261         "mulq    %[mult]\n"
28262         "addq    %%rax, %%rcx\n"
28263         "adcq    $0, %%rdx\n"
28264         "movq    48(%%rsi), %%rax\n"
28265         "addq    %%rcx, 40(%%rdi)\n"
28266         "adcq    $0, %%rdx\n"
28267         "movq    %%rdx, %%rcx\n"
28268         "mulq    %[mult]\n"
28269         "addq    %%rax, %%rcx\n"
28270         "adcq    $0, %%rdx\n"
28271         "movq    56(%%rsi), %%rax\n"
28272         "addq    %%rcx, 48(%%rdi)\n"
28273         "adcq    $0, %%rdx\n"
28274         "movq    %%rdx, %%rcx\n"
28275         "mulq    %[mult]\n"
28276         "addq    %%rax, %%rcx\n"
28277         "adcq    $0, %%rdx\n"
28278         "movq    64(%%rsi), %%rax\n"
28279         "addq    %%rcx, 56(%%rdi)\n"
28280         "adcq    $0, %%rdx\n"
28281         "movq    %%rdx, %%rcx\n"
28282         "mulq    %[mult]\n"
28283         "addq    %%rax, %%rcx\n"
28284         "adcq    $0, %%rdx\n"
28285         "movq    72(%%rsi), %%rax\n"
28286         "addq    %%rcx, 64(%%rdi)\n"
28287         "adcq    $0, %%rdx\n"
28288         "movq    %%rdx, %%rcx\n"
28289         "mulq    %[mult]\n"
28290         "addq    %%rax, %%rcx\n"
28291         "adcq    $0, %%rdx\n"
28292         "movq    80(%%rsi), %%rax\n"
28293         "addq    %%rcx, 72(%%rdi)\n"
28294         "adcq    $0, %%rdx\n"
28295         "movq    %%rdx, %%rcx\n"
28296         "mulq    %[mult]\n"
28297         "addq    %%rax, %%rcx\n"
28298         "adcq    $0, %%rdx\n"
28299         "movq    88(%%rsi), %%rax\n"
28300         "addq    %%rcx, 80(%%rdi)\n"
28301         "adcq    $0, %%rdx\n"
28302         "movq    %%rdx, %%rcx\n"
28303         "mulq    %[mult]\n"
28304         "addq    %%rax, %%rcx\n"
28305         "adcq    $0, %%rdx\n"
28306         "movq    96(%%rsi), %%rax\n"
28307         "addq    %%rcx, 88(%%rdi)\n"
28308         "adcq    $0, %%rdx\n"
28309         "movq    %%rdx, %%rcx\n"
28310         "mulq    %[mult]\n"
28311         "addq    %%rax, %%rcx\n"
28312         "adcq    $0, %%rdx\n"
28313         "addq    %%rcx, 96(%%rdi)\n"
28314         "adcq    $0, %%rdx\n"
28315         "movq    %%rdx, %[carry]\n"
28316     : [carry]"=g"(carry), [z] "+m" (z)
28317     : [mult] "r" (c), [x] "m" (x)
28318     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
28319     return carry;
28320 }
28321 
28322 /* x and y have 12.5 words, z has 25. Put x*y in z. */
28323 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
28324 static inline
mpfq_fixmp_12_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)28325 void mpfq_fixmp_12_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
28326 {
28327     __asm__ __volatile__(
28328         "### x*y[0]\n"
28329         "movq    %2, %%r8\n"
28330         "movq    %0, %%rdi\n"
28331         "movq    0(%%r8), %%r9\n"
28332         "movq    %1, %%rsi\n"
28333         "movq    0(%%rsi), %%rax\n"
28334         "mulq    %%r9\n"
28335         "movq    %%rax, 0(%%rdi)\n"
28336         "movq    8(%%rsi), %%rax\n"
28337         "movq    %%rdx, %%rcx\n"
28338         "mulq    %%r9\n"
28339         "addq    %%rax, %%rcx\n"
28340         "adcq    $0, %%rdx\n"
28341         "movq    16(%%rsi), %%rax\n"
28342         "movq    %%rcx, 8(%%rdi)\n"
28343         "movq    %%rdx, %%rcx\n"
28344         "mulq    %%r9\n"
28345         "addq    %%rax, %%rcx\n"
28346         "adcq    $0, %%rdx\n"
28347         "movq    24(%%rsi), %%rax\n"
28348         "movq    %%rcx, 16(%%rdi)\n"
28349         "movq    %%rdx, %%rcx\n"
28350         "mulq    %%r9\n"
28351         "addq    %%rax, %%rcx\n"
28352         "adcq    $0, %%rdx\n"
28353         "movq    32(%%rsi), %%rax\n"
28354         "movq    %%rcx, 24(%%rdi)\n"
28355         "movq    %%rdx, %%rcx\n"
28356         "mulq    %%r9\n"
28357         "addq    %%rax, %%rcx\n"
28358         "adcq    $0, %%rdx\n"
28359         "movq    40(%%rsi), %%rax\n"
28360         "movq    %%rcx, 32(%%rdi)\n"
28361         "movq    %%rdx, %%rcx\n"
28362         "mulq    %%r9\n"
28363         "addq    %%rax, %%rcx\n"
28364         "adcq    $0, %%rdx\n"
28365         "movq    48(%%rsi), %%rax\n"
28366         "movq    %%rcx, 40(%%rdi)\n"
28367         "movq    %%rdx, %%rcx\n"
28368         "mulq    %%r9\n"
28369         "addq    %%rax, %%rcx\n"
28370         "adcq    $0, %%rdx\n"
28371         "movq    56(%%rsi), %%rax\n"
28372         "movq    %%rcx, 48(%%rdi)\n"
28373         "movq    %%rdx, %%rcx\n"
28374         "mulq    %%r9\n"
28375         "addq    %%rax, %%rcx\n"
28376         "adcq    $0, %%rdx\n"
28377         "movq    64(%%rsi), %%rax\n"
28378         "movq    %%rcx, 56(%%rdi)\n"
28379         "movq    %%rdx, %%rcx\n"
28380         "mulq    %%r9\n"
28381         "addq    %%rax, %%rcx\n"
28382         "adcq    $0, %%rdx\n"
28383         "movq    72(%%rsi), %%rax\n"
28384         "movq    %%rcx, 64(%%rdi)\n"
28385         "movq    %%rdx, %%rcx\n"
28386         "mulq    %%r9\n"
28387         "addq    %%rax, %%rcx\n"
28388         "adcq    $0, %%rdx\n"
28389         "movq    80(%%rsi), %%rax\n"
28390         "movq    %%rcx, 72(%%rdi)\n"
28391         "movq    %%rdx, %%rcx\n"
28392         "mulq    %%r9\n"
28393         "addq    %%rax, %%rcx\n"
28394         "adcq    $0, %%rdx\n"
28395         "movq    88(%%rsi), %%rax\n"
28396         "movq    %%rcx, 80(%%rdi)\n"
28397         "movq    %%rdx, %%rcx\n"
28398         "mulq    %%r9\n"
28399         "addq    %%rax, %%rcx\n"
28400         "adcq    $0, %%rdx\n"
28401         "movq    96(%%rsi), %%rax\n"
28402         "movq    %%rcx, 88(%%rdi)\n"
28403         "movq    %%rdx, %%rcx\n"
28404         "mulq    %%r9\n"
28405         "addq    %%rax, %%rcx\n"
28406         "adcq    $0, %%rdx\n"
28407         "movq    %%rcx, 96(%%rdi)\n"
28408         "movq    %%rdx, 104(%%rdi)\n"
28409         "movq    $0, 112(%%rdi)\n"
28410         "movq    $0, 120(%%rdi)\n"
28411         "movq    $0, 128(%%rdi)\n"
28412         "movq    $0, 136(%%rdi)\n"
28413         "movq    $0, 144(%%rdi)\n"
28414         "movq    $0, 152(%%rdi)\n"
28415         "movq    $0, 160(%%rdi)\n"
28416         "movq    $0, 168(%%rdi)\n"
28417         "movq    $0, 176(%%rdi)\n"
28418         "movq    $0, 184(%%rdi)\n"
28419         "movq    $0, 192(%%rdi)\n"
28420         "### x*y[1]\n"
28421         "movq    8(%%r8), %%r9\n"
28422         "movq    0(%%rsi), %%rax\n"
28423         "mulq    %%r9\n"
28424         "addq    %%rax, 8(%%rdi)\n"
28425         "movq    8(%%rsi), %%rax\n"
28426         "adcq    $0, %%rdx\n"
28427         "movq    %%rdx, %%rcx\n"
28428         "mulq    %%r9\n"
28429         "addq    %%rax, %%rcx\n"
28430         "adcq    $0, %%rdx\n"
28431         "movq    16(%%rsi), %%rax\n"
28432         "addq    %%rcx, 16(%%rdi)\n"
28433         "adcq    $0, %%rdx\n"
28434         "movq    %%rdx, %%rcx\n"
28435         "mulq    %%r9\n"
28436         "addq    %%rax, %%rcx\n"
28437         "adcq    $0, %%rdx\n"
28438         "movq    24(%%rsi), %%rax\n"
28439         "addq    %%rcx, 24(%%rdi)\n"
28440         "adcq    $0, %%rdx\n"
28441         "movq    %%rdx, %%rcx\n"
28442         "mulq    %%r9\n"
28443         "addq    %%rax, %%rcx\n"
28444         "adcq    $0, %%rdx\n"
28445         "movq    32(%%rsi), %%rax\n"
28446         "addq    %%rcx, 32(%%rdi)\n"
28447         "adcq    $0, %%rdx\n"
28448         "movq    %%rdx, %%rcx\n"
28449         "mulq    %%r9\n"
28450         "addq    %%rax, %%rcx\n"
28451         "adcq    $0, %%rdx\n"
28452         "movq    40(%%rsi), %%rax\n"
28453         "addq    %%rcx, 40(%%rdi)\n"
28454         "adcq    $0, %%rdx\n"
28455         "movq    %%rdx, %%rcx\n"
28456         "mulq    %%r9\n"
28457         "addq    %%rax, %%rcx\n"
28458         "adcq    $0, %%rdx\n"
28459         "movq    48(%%rsi), %%rax\n"
28460         "addq    %%rcx, 48(%%rdi)\n"
28461         "adcq    $0, %%rdx\n"
28462         "movq    %%rdx, %%rcx\n"
28463         "mulq    %%r9\n"
28464         "addq    %%rax, %%rcx\n"
28465         "adcq    $0, %%rdx\n"
28466         "movq    56(%%rsi), %%rax\n"
28467         "addq    %%rcx, 56(%%rdi)\n"
28468         "adcq    $0, %%rdx\n"
28469         "movq    %%rdx, %%rcx\n"
28470         "mulq    %%r9\n"
28471         "addq    %%rax, %%rcx\n"
28472         "adcq    $0, %%rdx\n"
28473         "movq    64(%%rsi), %%rax\n"
28474         "addq    %%rcx, 64(%%rdi)\n"
28475         "adcq    $0, %%rdx\n"
28476         "movq    %%rdx, %%rcx\n"
28477         "mulq    %%r9\n"
28478         "addq    %%rax, %%rcx\n"
28479         "adcq    $0, %%rdx\n"
28480         "movq    72(%%rsi), %%rax\n"
28481         "addq    %%rcx, 72(%%rdi)\n"
28482         "adcq    $0, %%rdx\n"
28483         "movq    %%rdx, %%rcx\n"
28484         "mulq    %%r9\n"
28485         "addq    %%rax, %%rcx\n"
28486         "adcq    $0, %%rdx\n"
28487         "movq    80(%%rsi), %%rax\n"
28488         "addq    %%rcx, 80(%%rdi)\n"
28489         "adcq    $0, %%rdx\n"
28490         "movq    %%rdx, %%rcx\n"
28491         "mulq    %%r9\n"
28492         "addq    %%rax, %%rcx\n"
28493         "adcq    $0, %%rdx\n"
28494         "movq    88(%%rsi), %%rax\n"
28495         "addq    %%rcx, 88(%%rdi)\n"
28496         "adcq    $0, %%rdx\n"
28497         "movq    %%rdx, %%rcx\n"
28498         "mulq    %%r9\n"
28499         "addq    %%rax, %%rcx\n"
28500         "adcq    $0, %%rdx\n"
28501         "movq    96(%%rsi), %%rax\n"
28502         "addq    %%rcx, 96(%%rdi)\n"
28503         "adcq    $0, %%rdx\n"
28504         "movq    %%rdx, %%rcx\n"
28505         "mulq    %%r9\n"
28506         "addq    %%rax, %%rcx\n"
28507         "adcq    $0, %%rdx\n"
28508         "addq    %%rcx, 104(%%rdi)\n"
28509         "adcq    $0, %%rdx\n"
28510         "movq    %%rdx, 112(%%rdi)\n"
28511         "### x*y[2]\n"
28512         "movq    16(%%r8), %%r9\n"
28513         "movq    0(%%rsi), %%rax\n"
28514         "mulq    %%r9\n"
28515         "addq    %%rax, 16(%%rdi)\n"
28516         "movq    8(%%rsi), %%rax\n"
28517         "adcq    $0, %%rdx\n"
28518         "movq    %%rdx, %%rcx\n"
28519         "mulq    %%r9\n"
28520         "addq    %%rax, %%rcx\n"
28521         "adcq    $0, %%rdx\n"
28522         "movq    16(%%rsi), %%rax\n"
28523         "addq    %%rcx, 24(%%rdi)\n"
28524         "adcq    $0, %%rdx\n"
28525         "movq    %%rdx, %%rcx\n"
28526         "mulq    %%r9\n"
28527         "addq    %%rax, %%rcx\n"
28528         "adcq    $0, %%rdx\n"
28529         "movq    24(%%rsi), %%rax\n"
28530         "addq    %%rcx, 32(%%rdi)\n"
28531         "adcq    $0, %%rdx\n"
28532         "movq    %%rdx, %%rcx\n"
28533         "mulq    %%r9\n"
28534         "addq    %%rax, %%rcx\n"
28535         "adcq    $0, %%rdx\n"
28536         "movq    32(%%rsi), %%rax\n"
28537         "addq    %%rcx, 40(%%rdi)\n"
28538         "adcq    $0, %%rdx\n"
28539         "movq    %%rdx, %%rcx\n"
28540         "mulq    %%r9\n"
28541         "addq    %%rax, %%rcx\n"
28542         "adcq    $0, %%rdx\n"
28543         "movq    40(%%rsi), %%rax\n"
28544         "addq    %%rcx, 48(%%rdi)\n"
28545         "adcq    $0, %%rdx\n"
28546         "movq    %%rdx, %%rcx\n"
28547         "mulq    %%r9\n"
28548         "addq    %%rax, %%rcx\n"
28549         "adcq    $0, %%rdx\n"
28550         "movq    48(%%rsi), %%rax\n"
28551         "addq    %%rcx, 56(%%rdi)\n"
28552         "adcq    $0, %%rdx\n"
28553         "movq    %%rdx, %%rcx\n"
28554         "mulq    %%r9\n"
28555         "addq    %%rax, %%rcx\n"
28556         "adcq    $0, %%rdx\n"
28557         "movq    56(%%rsi), %%rax\n"
28558         "addq    %%rcx, 64(%%rdi)\n"
28559         "adcq    $0, %%rdx\n"
28560         "movq    %%rdx, %%rcx\n"
28561         "mulq    %%r9\n"
28562         "addq    %%rax, %%rcx\n"
28563         "adcq    $0, %%rdx\n"
28564         "movq    64(%%rsi), %%rax\n"
28565         "addq    %%rcx, 72(%%rdi)\n"
28566         "adcq    $0, %%rdx\n"
28567         "movq    %%rdx, %%rcx\n"
28568         "mulq    %%r9\n"
28569         "addq    %%rax, %%rcx\n"
28570         "adcq    $0, %%rdx\n"
28571         "movq    72(%%rsi), %%rax\n"
28572         "addq    %%rcx, 80(%%rdi)\n"
28573         "adcq    $0, %%rdx\n"
28574         "movq    %%rdx, %%rcx\n"
28575         "mulq    %%r9\n"
28576         "addq    %%rax, %%rcx\n"
28577         "adcq    $0, %%rdx\n"
28578         "movq    80(%%rsi), %%rax\n"
28579         "addq    %%rcx, 88(%%rdi)\n"
28580         "adcq    $0, %%rdx\n"
28581         "movq    %%rdx, %%rcx\n"
28582         "mulq    %%r9\n"
28583         "addq    %%rax, %%rcx\n"
28584         "adcq    $0, %%rdx\n"
28585         "movq    88(%%rsi), %%rax\n"
28586         "addq    %%rcx, 96(%%rdi)\n"
28587         "adcq    $0, %%rdx\n"
28588         "movq    %%rdx, %%rcx\n"
28589         "mulq    %%r9\n"
28590         "addq    %%rax, %%rcx\n"
28591         "adcq    $0, %%rdx\n"
28592         "movq    96(%%rsi), %%rax\n"
28593         "addq    %%rcx, 104(%%rdi)\n"
28594         "adcq    $0, %%rdx\n"
28595         "movq    %%rdx, %%rcx\n"
28596         "mulq    %%r9\n"
28597         "addq    %%rax, %%rcx\n"
28598         "adcq    $0, %%rdx\n"
28599         "addq    %%rcx, 112(%%rdi)\n"
28600         "adcq    $0, %%rdx\n"
28601         "movq    %%rdx, 120(%%rdi)\n"
28602         "### x*y[3]\n"
28603         "movq    24(%%r8), %%r9\n"
28604         "movq    0(%%rsi), %%rax\n"
28605         "mulq    %%r9\n"
28606         "addq    %%rax, 24(%%rdi)\n"
28607         "movq    8(%%rsi), %%rax\n"
28608         "adcq    $0, %%rdx\n"
28609         "movq    %%rdx, %%rcx\n"
28610         "mulq    %%r9\n"
28611         "addq    %%rax, %%rcx\n"
28612         "adcq    $0, %%rdx\n"
28613         "movq    16(%%rsi), %%rax\n"
28614         "addq    %%rcx, 32(%%rdi)\n"
28615         "adcq    $0, %%rdx\n"
28616         "movq    %%rdx, %%rcx\n"
28617         "mulq    %%r9\n"
28618         "addq    %%rax, %%rcx\n"
28619         "adcq    $0, %%rdx\n"
28620         "movq    24(%%rsi), %%rax\n"
28621         "addq    %%rcx, 40(%%rdi)\n"
28622         "adcq    $0, %%rdx\n"
28623         "movq    %%rdx, %%rcx\n"
28624         "mulq    %%r9\n"
28625         "addq    %%rax, %%rcx\n"
28626         "adcq    $0, %%rdx\n"
28627         "movq    32(%%rsi), %%rax\n"
28628         "addq    %%rcx, 48(%%rdi)\n"
28629         "adcq    $0, %%rdx\n"
28630         "movq    %%rdx, %%rcx\n"
28631         "mulq    %%r9\n"
28632         "addq    %%rax, %%rcx\n"
28633         "adcq    $0, %%rdx\n"
28634         "movq    40(%%rsi), %%rax\n"
28635         "addq    %%rcx, 56(%%rdi)\n"
28636         "adcq    $0, %%rdx\n"
28637         "movq    %%rdx, %%rcx\n"
28638         "mulq    %%r9\n"
28639         "addq    %%rax, %%rcx\n"
28640         "adcq    $0, %%rdx\n"
28641         "movq    48(%%rsi), %%rax\n"
28642         "addq    %%rcx, 64(%%rdi)\n"
28643         "adcq    $0, %%rdx\n"
28644         "movq    %%rdx, %%rcx\n"
28645         "mulq    %%r9\n"
28646         "addq    %%rax, %%rcx\n"
28647         "adcq    $0, %%rdx\n"
28648         "movq    56(%%rsi), %%rax\n"
28649         "addq    %%rcx, 72(%%rdi)\n"
28650         "adcq    $0, %%rdx\n"
28651         "movq    %%rdx, %%rcx\n"
28652         "mulq    %%r9\n"
28653         "addq    %%rax, %%rcx\n"
28654         "adcq    $0, %%rdx\n"
28655         "movq    64(%%rsi), %%rax\n"
28656         "addq    %%rcx, 80(%%rdi)\n"
28657         "adcq    $0, %%rdx\n"
28658         "movq    %%rdx, %%rcx\n"
28659         "mulq    %%r9\n"
28660         "addq    %%rax, %%rcx\n"
28661         "adcq    $0, %%rdx\n"
28662         "movq    72(%%rsi), %%rax\n"
28663         "addq    %%rcx, 88(%%rdi)\n"
28664         "adcq    $0, %%rdx\n"
28665         "movq    %%rdx, %%rcx\n"
28666         "mulq    %%r9\n"
28667         "addq    %%rax, %%rcx\n"
28668         "adcq    $0, %%rdx\n"
28669         "movq    80(%%rsi), %%rax\n"
28670         "addq    %%rcx, 96(%%rdi)\n"
28671         "adcq    $0, %%rdx\n"
28672         "movq    %%rdx, %%rcx\n"
28673         "mulq    %%r9\n"
28674         "addq    %%rax, %%rcx\n"
28675         "adcq    $0, %%rdx\n"
28676         "movq    88(%%rsi), %%rax\n"
28677         "addq    %%rcx, 104(%%rdi)\n"
28678         "adcq    $0, %%rdx\n"
28679         "movq    %%rdx, %%rcx\n"
28680         "mulq    %%r9\n"
28681         "addq    %%rax, %%rcx\n"
28682         "adcq    $0, %%rdx\n"
28683         "movq    96(%%rsi), %%rax\n"
28684         "addq    %%rcx, 112(%%rdi)\n"
28685         "adcq    $0, %%rdx\n"
28686         "movq    %%rdx, %%rcx\n"
28687         "mulq    %%r9\n"
28688         "addq    %%rax, %%rcx\n"
28689         "adcq    $0, %%rdx\n"
28690         "addq    %%rcx, 120(%%rdi)\n"
28691         "adcq    $0, %%rdx\n"
28692         "movq    %%rdx, 128(%%rdi)\n"
28693         "### x*y[4]\n"
28694         "movq    32(%%r8), %%r9\n"
28695         "movq    0(%%rsi), %%rax\n"
28696         "mulq    %%r9\n"
28697         "addq    %%rax, 32(%%rdi)\n"
28698         "movq    8(%%rsi), %%rax\n"
28699         "adcq    $0, %%rdx\n"
28700         "movq    %%rdx, %%rcx\n"
28701         "mulq    %%r9\n"
28702         "addq    %%rax, %%rcx\n"
28703         "adcq    $0, %%rdx\n"
28704         "movq    16(%%rsi), %%rax\n"
28705         "addq    %%rcx, 40(%%rdi)\n"
28706         "adcq    $0, %%rdx\n"
28707         "movq    %%rdx, %%rcx\n"
28708         "mulq    %%r9\n"
28709         "addq    %%rax, %%rcx\n"
28710         "adcq    $0, %%rdx\n"
28711         "movq    24(%%rsi), %%rax\n"
28712         "addq    %%rcx, 48(%%rdi)\n"
28713         "adcq    $0, %%rdx\n"
28714         "movq    %%rdx, %%rcx\n"
28715         "mulq    %%r9\n"
28716         "addq    %%rax, %%rcx\n"
28717         "adcq    $0, %%rdx\n"
28718         "movq    32(%%rsi), %%rax\n"
28719         "addq    %%rcx, 56(%%rdi)\n"
28720         "adcq    $0, %%rdx\n"
28721         "movq    %%rdx, %%rcx\n"
28722         "mulq    %%r9\n"
28723         "addq    %%rax, %%rcx\n"
28724         "adcq    $0, %%rdx\n"
28725         "movq    40(%%rsi), %%rax\n"
28726         "addq    %%rcx, 64(%%rdi)\n"
28727         "adcq    $0, %%rdx\n"
28728         "movq    %%rdx, %%rcx\n"
28729         "mulq    %%r9\n"
28730         "addq    %%rax, %%rcx\n"
28731         "adcq    $0, %%rdx\n"
28732         "movq    48(%%rsi), %%rax\n"
28733         "addq    %%rcx, 72(%%rdi)\n"
28734         "adcq    $0, %%rdx\n"
28735         "movq    %%rdx, %%rcx\n"
28736         "mulq    %%r9\n"
28737         "addq    %%rax, %%rcx\n"
28738         "adcq    $0, %%rdx\n"
28739         "movq    56(%%rsi), %%rax\n"
28740         "addq    %%rcx, 80(%%rdi)\n"
28741         "adcq    $0, %%rdx\n"
28742         "movq    %%rdx, %%rcx\n"
28743         "mulq    %%r9\n"
28744         "addq    %%rax, %%rcx\n"
28745         "adcq    $0, %%rdx\n"
28746         "movq    64(%%rsi), %%rax\n"
28747         "addq    %%rcx, 88(%%rdi)\n"
28748         "adcq    $0, %%rdx\n"
28749         "movq    %%rdx, %%rcx\n"
28750         "mulq    %%r9\n"
28751         "addq    %%rax, %%rcx\n"
28752         "adcq    $0, %%rdx\n"
28753         "movq    72(%%rsi), %%rax\n"
28754         "addq    %%rcx, 96(%%rdi)\n"
28755         "adcq    $0, %%rdx\n"
28756         "movq    %%rdx, %%rcx\n"
28757         "mulq    %%r9\n"
28758         "addq    %%rax, %%rcx\n"
28759         "adcq    $0, %%rdx\n"
28760         "movq    80(%%rsi), %%rax\n"
28761         "addq    %%rcx, 104(%%rdi)\n"
28762         "adcq    $0, %%rdx\n"
28763         "movq    %%rdx, %%rcx\n"
28764         "mulq    %%r9\n"
28765         "addq    %%rax, %%rcx\n"
28766         "adcq    $0, %%rdx\n"
28767         "movq    88(%%rsi), %%rax\n"
28768         "addq    %%rcx, 112(%%rdi)\n"
28769         "adcq    $0, %%rdx\n"
28770         "movq    %%rdx, %%rcx\n"
28771         "mulq    %%r9\n"
28772         "addq    %%rax, %%rcx\n"
28773         "adcq    $0, %%rdx\n"
28774         "movq    96(%%rsi), %%rax\n"
28775         "addq    %%rcx, 120(%%rdi)\n"
28776         "adcq    $0, %%rdx\n"
28777         "movq    %%rdx, %%rcx\n"
28778         "mulq    %%r9\n"
28779         "addq    %%rax, %%rcx\n"
28780         "adcq    $0, %%rdx\n"
28781         "addq    %%rcx, 128(%%rdi)\n"
28782         "adcq    $0, %%rdx\n"
28783         "movq    %%rdx, 136(%%rdi)\n"
28784         "### x*y[5]\n"
28785         "movq    40(%%r8), %%r9\n"
28786         "movq    0(%%rsi), %%rax\n"
28787         "mulq    %%r9\n"
28788         "addq    %%rax, 40(%%rdi)\n"
28789         "movq    8(%%rsi), %%rax\n"
28790         "adcq    $0, %%rdx\n"
28791         "movq    %%rdx, %%rcx\n"
28792         "mulq    %%r9\n"
28793         "addq    %%rax, %%rcx\n"
28794         "adcq    $0, %%rdx\n"
28795         "movq    16(%%rsi), %%rax\n"
28796         "addq    %%rcx, 48(%%rdi)\n"
28797         "adcq    $0, %%rdx\n"
28798         "movq    %%rdx, %%rcx\n"
28799         "mulq    %%r9\n"
28800         "addq    %%rax, %%rcx\n"
28801         "adcq    $0, %%rdx\n"
28802         "movq    24(%%rsi), %%rax\n"
28803         "addq    %%rcx, 56(%%rdi)\n"
28804         "adcq    $0, %%rdx\n"
28805         "movq    %%rdx, %%rcx\n"
28806         "mulq    %%r9\n"
28807         "addq    %%rax, %%rcx\n"
28808         "adcq    $0, %%rdx\n"
28809         "movq    32(%%rsi), %%rax\n"
28810         "addq    %%rcx, 64(%%rdi)\n"
28811         "adcq    $0, %%rdx\n"
28812         "movq    %%rdx, %%rcx\n"
28813         "mulq    %%r9\n"
28814         "addq    %%rax, %%rcx\n"
28815         "adcq    $0, %%rdx\n"
28816         "movq    40(%%rsi), %%rax\n"
28817         "addq    %%rcx, 72(%%rdi)\n"
28818         "adcq    $0, %%rdx\n"
28819         "movq    %%rdx, %%rcx\n"
28820         "mulq    %%r9\n"
28821         "addq    %%rax, %%rcx\n"
28822         "adcq    $0, %%rdx\n"
28823         "movq    48(%%rsi), %%rax\n"
28824         "addq    %%rcx, 80(%%rdi)\n"
28825         "adcq    $0, %%rdx\n"
28826         "movq    %%rdx, %%rcx\n"
28827         "mulq    %%r9\n"
28828         "addq    %%rax, %%rcx\n"
28829         "adcq    $0, %%rdx\n"
28830         "movq    56(%%rsi), %%rax\n"
28831         "addq    %%rcx, 88(%%rdi)\n"
28832         "adcq    $0, %%rdx\n"
28833         "movq    %%rdx, %%rcx\n"
28834         "mulq    %%r9\n"
28835         "addq    %%rax, %%rcx\n"
28836         "adcq    $0, %%rdx\n"
28837         "movq    64(%%rsi), %%rax\n"
28838         "addq    %%rcx, 96(%%rdi)\n"
28839         "adcq    $0, %%rdx\n"
28840         "movq    %%rdx, %%rcx\n"
28841         "mulq    %%r9\n"
28842         "addq    %%rax, %%rcx\n"
28843         "adcq    $0, %%rdx\n"
28844         "movq    72(%%rsi), %%rax\n"
28845         "addq    %%rcx, 104(%%rdi)\n"
28846         "adcq    $0, %%rdx\n"
28847         "movq    %%rdx, %%rcx\n"
28848         "mulq    %%r9\n"
28849         "addq    %%rax, %%rcx\n"
28850         "adcq    $0, %%rdx\n"
28851         "movq    80(%%rsi), %%rax\n"
28852         "addq    %%rcx, 112(%%rdi)\n"
28853         "adcq    $0, %%rdx\n"
28854         "movq    %%rdx, %%rcx\n"
28855         "mulq    %%r9\n"
28856         "addq    %%rax, %%rcx\n"
28857         "adcq    $0, %%rdx\n"
28858         "movq    88(%%rsi), %%rax\n"
28859         "addq    %%rcx, 120(%%rdi)\n"
28860         "adcq    $0, %%rdx\n"
28861         "movq    %%rdx, %%rcx\n"
28862         "mulq    %%r9\n"
28863         "addq    %%rax, %%rcx\n"
28864         "adcq    $0, %%rdx\n"
28865         "movq    96(%%rsi), %%rax\n"
28866         "addq    %%rcx, 128(%%rdi)\n"
28867         "adcq    $0, %%rdx\n"
28868         "movq    %%rdx, %%rcx\n"
28869         "mulq    %%r9\n"
28870         "addq    %%rax, %%rcx\n"
28871         "adcq    $0, %%rdx\n"
28872         "addq    %%rcx, 136(%%rdi)\n"
28873         "adcq    $0, %%rdx\n"
28874         "movq    %%rdx, 144(%%rdi)\n"
28875         "### x*y[6]\n"
28876         "movq    48(%%r8), %%r9\n"
28877         "movq    0(%%rsi), %%rax\n"
28878         "mulq    %%r9\n"
28879         "addq    %%rax, 48(%%rdi)\n"
28880         "movq    8(%%rsi), %%rax\n"
28881         "adcq    $0, %%rdx\n"
28882         "movq    %%rdx, %%rcx\n"
28883         "mulq    %%r9\n"
28884         "addq    %%rax, %%rcx\n"
28885         "adcq    $0, %%rdx\n"
28886         "movq    16(%%rsi), %%rax\n"
28887         "addq    %%rcx, 56(%%rdi)\n"
28888         "adcq    $0, %%rdx\n"
28889         "movq    %%rdx, %%rcx\n"
28890         "mulq    %%r9\n"
28891         "addq    %%rax, %%rcx\n"
28892         "adcq    $0, %%rdx\n"
28893         "movq    24(%%rsi), %%rax\n"
28894         "addq    %%rcx, 64(%%rdi)\n"
28895         "adcq    $0, %%rdx\n"
28896         "movq    %%rdx, %%rcx\n"
28897         "mulq    %%r9\n"
28898         "addq    %%rax, %%rcx\n"
28899         "adcq    $0, %%rdx\n"
28900         "movq    32(%%rsi), %%rax\n"
28901         "addq    %%rcx, 72(%%rdi)\n"
28902         "adcq    $0, %%rdx\n"
28903         "movq    %%rdx, %%rcx\n"
28904         "mulq    %%r9\n"
28905         "addq    %%rax, %%rcx\n"
28906         "adcq    $0, %%rdx\n"
28907         "movq    40(%%rsi), %%rax\n"
28908         "addq    %%rcx, 80(%%rdi)\n"
28909         "adcq    $0, %%rdx\n"
28910         "movq    %%rdx, %%rcx\n"
28911         "mulq    %%r9\n"
28912         "addq    %%rax, %%rcx\n"
28913         "adcq    $0, %%rdx\n"
28914         "movq    48(%%rsi), %%rax\n"
28915         "addq    %%rcx, 88(%%rdi)\n"
28916         "adcq    $0, %%rdx\n"
28917         "movq    %%rdx, %%rcx\n"
28918         "mulq    %%r9\n"
28919         "addq    %%rax, %%rcx\n"
28920         "adcq    $0, %%rdx\n"
28921         "movq    56(%%rsi), %%rax\n"
28922         "addq    %%rcx, 96(%%rdi)\n"
28923         "adcq    $0, %%rdx\n"
28924         "movq    %%rdx, %%rcx\n"
28925         "mulq    %%r9\n"
28926         "addq    %%rax, %%rcx\n"
28927         "adcq    $0, %%rdx\n"
28928         "movq    64(%%rsi), %%rax\n"
28929         "addq    %%rcx, 104(%%rdi)\n"
28930         "adcq    $0, %%rdx\n"
28931         "movq    %%rdx, %%rcx\n"
28932         "mulq    %%r9\n"
28933         "addq    %%rax, %%rcx\n"
28934         "adcq    $0, %%rdx\n"
28935         "movq    72(%%rsi), %%rax\n"
28936         "addq    %%rcx, 112(%%rdi)\n"
28937         "adcq    $0, %%rdx\n"
28938         "movq    %%rdx, %%rcx\n"
28939         "mulq    %%r9\n"
28940         "addq    %%rax, %%rcx\n"
28941         "adcq    $0, %%rdx\n"
28942         "movq    80(%%rsi), %%rax\n"
28943         "addq    %%rcx, 120(%%rdi)\n"
28944         "adcq    $0, %%rdx\n"
28945         "movq    %%rdx, %%rcx\n"
28946         "mulq    %%r9\n"
28947         "addq    %%rax, %%rcx\n"
28948         "adcq    $0, %%rdx\n"
28949         "movq    88(%%rsi), %%rax\n"
28950         "addq    %%rcx, 128(%%rdi)\n"
28951         "adcq    $0, %%rdx\n"
28952         "movq    %%rdx, %%rcx\n"
28953         "mulq    %%r9\n"
28954         "addq    %%rax, %%rcx\n"
28955         "adcq    $0, %%rdx\n"
28956         "movq    96(%%rsi), %%rax\n"
28957         "addq    %%rcx, 136(%%rdi)\n"
28958         "adcq    $0, %%rdx\n"
28959         "movq    %%rdx, %%rcx\n"
28960         "mulq    %%r9\n"
28961         "addq    %%rax, %%rcx\n"
28962         "adcq    $0, %%rdx\n"
28963         "addq    %%rcx, 144(%%rdi)\n"
28964         "adcq    $0, %%rdx\n"
28965         "movq    %%rdx, 152(%%rdi)\n"
28966         "### x*y[7]\n"
28967         "movq    56(%%r8), %%r9\n"
28968         "movq    0(%%rsi), %%rax\n"
28969         "mulq    %%r9\n"
28970         "addq    %%rax, 56(%%rdi)\n"
28971         "movq    8(%%rsi), %%rax\n"
28972         "adcq    $0, %%rdx\n"
28973         "movq    %%rdx, %%rcx\n"
28974         "mulq    %%r9\n"
28975         "addq    %%rax, %%rcx\n"
28976         "adcq    $0, %%rdx\n"
28977         "movq    16(%%rsi), %%rax\n"
28978         "addq    %%rcx, 64(%%rdi)\n"
28979         "adcq    $0, %%rdx\n"
28980         "movq    %%rdx, %%rcx\n"
28981         "mulq    %%r9\n"
28982         "addq    %%rax, %%rcx\n"
28983         "adcq    $0, %%rdx\n"
28984         "movq    24(%%rsi), %%rax\n"
28985         "addq    %%rcx, 72(%%rdi)\n"
28986         "adcq    $0, %%rdx\n"
28987         "movq    %%rdx, %%rcx\n"
28988         "mulq    %%r9\n"
28989         "addq    %%rax, %%rcx\n"
28990         "adcq    $0, %%rdx\n"
28991         "movq    32(%%rsi), %%rax\n"
28992         "addq    %%rcx, 80(%%rdi)\n"
28993         "adcq    $0, %%rdx\n"
28994         "movq    %%rdx, %%rcx\n"
28995         "mulq    %%r9\n"
28996         "addq    %%rax, %%rcx\n"
28997         "adcq    $0, %%rdx\n"
28998         "movq    40(%%rsi), %%rax\n"
28999         "addq    %%rcx, 88(%%rdi)\n"
29000         "adcq    $0, %%rdx\n"
29001         "movq    %%rdx, %%rcx\n"
29002         "mulq    %%r9\n"
29003         "addq    %%rax, %%rcx\n"
29004         "adcq    $0, %%rdx\n"
29005         "movq    48(%%rsi), %%rax\n"
29006         "addq    %%rcx, 96(%%rdi)\n"
29007         "adcq    $0, %%rdx\n"
29008         "movq    %%rdx, %%rcx\n"
29009         "mulq    %%r9\n"
29010         "addq    %%rax, %%rcx\n"
29011         "adcq    $0, %%rdx\n"
29012         "movq    56(%%rsi), %%rax\n"
29013         "addq    %%rcx, 104(%%rdi)\n"
29014         "adcq    $0, %%rdx\n"
29015         "movq    %%rdx, %%rcx\n"
29016         "mulq    %%r9\n"
29017         "addq    %%rax, %%rcx\n"
29018         "adcq    $0, %%rdx\n"
29019         "movq    64(%%rsi), %%rax\n"
29020         "addq    %%rcx, 112(%%rdi)\n"
29021         "adcq    $0, %%rdx\n"
29022         "movq    %%rdx, %%rcx\n"
29023         "mulq    %%r9\n"
29024         "addq    %%rax, %%rcx\n"
29025         "adcq    $0, %%rdx\n"
29026         "movq    72(%%rsi), %%rax\n"
29027         "addq    %%rcx, 120(%%rdi)\n"
29028         "adcq    $0, %%rdx\n"
29029         "movq    %%rdx, %%rcx\n"
29030         "mulq    %%r9\n"
29031         "addq    %%rax, %%rcx\n"
29032         "adcq    $0, %%rdx\n"
29033         "movq    80(%%rsi), %%rax\n"
29034         "addq    %%rcx, 128(%%rdi)\n"
29035         "adcq    $0, %%rdx\n"
29036         "movq    %%rdx, %%rcx\n"
29037         "mulq    %%r9\n"
29038         "addq    %%rax, %%rcx\n"
29039         "adcq    $0, %%rdx\n"
29040         "movq    88(%%rsi), %%rax\n"
29041         "addq    %%rcx, 136(%%rdi)\n"
29042         "adcq    $0, %%rdx\n"
29043         "movq    %%rdx, %%rcx\n"
29044         "mulq    %%r9\n"
29045         "addq    %%rax, %%rcx\n"
29046         "adcq    $0, %%rdx\n"
29047         "movq    96(%%rsi), %%rax\n"
29048         "addq    %%rcx, 144(%%rdi)\n"
29049         "adcq    $0, %%rdx\n"
29050         "movq    %%rdx, %%rcx\n"
29051         "mulq    %%r9\n"
29052         "addq    %%rax, %%rcx\n"
29053         "adcq    $0, %%rdx\n"
29054         "addq    %%rcx, 152(%%rdi)\n"
29055         "adcq    $0, %%rdx\n"
29056         "movq    %%rdx, 160(%%rdi)\n"
29057         "### x*y[8]\n"
29058         "movq    64(%%r8), %%r9\n"
29059         "movq    0(%%rsi), %%rax\n"
29060         "mulq    %%r9\n"
29061         "addq    %%rax, 64(%%rdi)\n"
29062         "movq    8(%%rsi), %%rax\n"
29063         "adcq    $0, %%rdx\n"
29064         "movq    %%rdx, %%rcx\n"
29065         "mulq    %%r9\n"
29066         "addq    %%rax, %%rcx\n"
29067         "adcq    $0, %%rdx\n"
29068         "movq    16(%%rsi), %%rax\n"
29069         "addq    %%rcx, 72(%%rdi)\n"
29070         "adcq    $0, %%rdx\n"
29071         "movq    %%rdx, %%rcx\n"
29072         "mulq    %%r9\n"
29073         "addq    %%rax, %%rcx\n"
29074         "adcq    $0, %%rdx\n"
29075         "movq    24(%%rsi), %%rax\n"
29076         "addq    %%rcx, 80(%%rdi)\n"
29077         "adcq    $0, %%rdx\n"
29078         "movq    %%rdx, %%rcx\n"
29079         "mulq    %%r9\n"
29080         "addq    %%rax, %%rcx\n"
29081         "adcq    $0, %%rdx\n"
29082         "movq    32(%%rsi), %%rax\n"
29083         "addq    %%rcx, 88(%%rdi)\n"
29084         "adcq    $0, %%rdx\n"
29085         "movq    %%rdx, %%rcx\n"
29086         "mulq    %%r9\n"
29087         "addq    %%rax, %%rcx\n"
29088         "adcq    $0, %%rdx\n"
29089         "movq    40(%%rsi), %%rax\n"
29090         "addq    %%rcx, 96(%%rdi)\n"
29091         "adcq    $0, %%rdx\n"
29092         "movq    %%rdx, %%rcx\n"
29093         "mulq    %%r9\n"
29094         "addq    %%rax, %%rcx\n"
29095         "adcq    $0, %%rdx\n"
29096         "movq    48(%%rsi), %%rax\n"
29097         "addq    %%rcx, 104(%%rdi)\n"
29098         "adcq    $0, %%rdx\n"
29099         "movq    %%rdx, %%rcx\n"
29100         "mulq    %%r9\n"
29101         "addq    %%rax, %%rcx\n"
29102         "adcq    $0, %%rdx\n"
29103         "movq    56(%%rsi), %%rax\n"
29104         "addq    %%rcx, 112(%%rdi)\n"
29105         "adcq    $0, %%rdx\n"
29106         "movq    %%rdx, %%rcx\n"
29107         "mulq    %%r9\n"
29108         "addq    %%rax, %%rcx\n"
29109         "adcq    $0, %%rdx\n"
29110         "movq    64(%%rsi), %%rax\n"
29111         "addq    %%rcx, 120(%%rdi)\n"
29112         "adcq    $0, %%rdx\n"
29113         "movq    %%rdx, %%rcx\n"
29114         "mulq    %%r9\n"
29115         "addq    %%rax, %%rcx\n"
29116         "adcq    $0, %%rdx\n"
29117         "movq    72(%%rsi), %%rax\n"
29118         "addq    %%rcx, 128(%%rdi)\n"
29119         "adcq    $0, %%rdx\n"
29120         "movq    %%rdx, %%rcx\n"
29121         "mulq    %%r9\n"
29122         "addq    %%rax, %%rcx\n"
29123         "adcq    $0, %%rdx\n"
29124         "movq    80(%%rsi), %%rax\n"
29125         "addq    %%rcx, 136(%%rdi)\n"
29126         "adcq    $0, %%rdx\n"
29127         "movq    %%rdx, %%rcx\n"
29128         "mulq    %%r9\n"
29129         "addq    %%rax, %%rcx\n"
29130         "adcq    $0, %%rdx\n"
29131         "movq    88(%%rsi), %%rax\n"
29132         "addq    %%rcx, 144(%%rdi)\n"
29133         "adcq    $0, %%rdx\n"
29134         "movq    %%rdx, %%rcx\n"
29135         "mulq    %%r9\n"
29136         "addq    %%rax, %%rcx\n"
29137         "adcq    $0, %%rdx\n"
29138         "movq    96(%%rsi), %%rax\n"
29139         "addq    %%rcx, 152(%%rdi)\n"
29140         "adcq    $0, %%rdx\n"
29141         "movq    %%rdx, %%rcx\n"
29142         "mulq    %%r9\n"
29143         "addq    %%rax, %%rcx\n"
29144         "adcq    $0, %%rdx\n"
29145         "addq    %%rcx, 160(%%rdi)\n"
29146         "adcq    $0, %%rdx\n"
29147         "movq    %%rdx, 168(%%rdi)\n"
29148         "### x*y[9]\n"
29149         "movq    72(%%r8), %%r9\n"
29150         "movq    0(%%rsi), %%rax\n"
29151         "mulq    %%r9\n"
29152         "addq    %%rax, 72(%%rdi)\n"
29153         "movq    8(%%rsi), %%rax\n"
29154         "adcq    $0, %%rdx\n"
29155         "movq    %%rdx, %%rcx\n"
29156         "mulq    %%r9\n"
29157         "addq    %%rax, %%rcx\n"
29158         "adcq    $0, %%rdx\n"
29159         "movq    16(%%rsi), %%rax\n"
29160         "addq    %%rcx, 80(%%rdi)\n"
29161         "adcq    $0, %%rdx\n"
29162         "movq    %%rdx, %%rcx\n"
29163         "mulq    %%r9\n"
29164         "addq    %%rax, %%rcx\n"
29165         "adcq    $0, %%rdx\n"
29166         "movq    24(%%rsi), %%rax\n"
29167         "addq    %%rcx, 88(%%rdi)\n"
29168         "adcq    $0, %%rdx\n"
29169         "movq    %%rdx, %%rcx\n"
29170         "mulq    %%r9\n"
29171         "addq    %%rax, %%rcx\n"
29172         "adcq    $0, %%rdx\n"
29173         "movq    32(%%rsi), %%rax\n"
29174         "addq    %%rcx, 96(%%rdi)\n"
29175         "adcq    $0, %%rdx\n"
29176         "movq    %%rdx, %%rcx\n"
29177         "mulq    %%r9\n"
29178         "addq    %%rax, %%rcx\n"
29179         "adcq    $0, %%rdx\n"
29180         "movq    40(%%rsi), %%rax\n"
29181         "addq    %%rcx, 104(%%rdi)\n"
29182         "adcq    $0, %%rdx\n"
29183         "movq    %%rdx, %%rcx\n"
29184         "mulq    %%r9\n"
29185         "addq    %%rax, %%rcx\n"
29186         "adcq    $0, %%rdx\n"
29187         "movq    48(%%rsi), %%rax\n"
29188         "addq    %%rcx, 112(%%rdi)\n"
29189         "adcq    $0, %%rdx\n"
29190         "movq    %%rdx, %%rcx\n"
29191         "mulq    %%r9\n"
29192         "addq    %%rax, %%rcx\n"
29193         "adcq    $0, %%rdx\n"
29194         "movq    56(%%rsi), %%rax\n"
29195         "addq    %%rcx, 120(%%rdi)\n"
29196         "adcq    $0, %%rdx\n"
29197         "movq    %%rdx, %%rcx\n"
29198         "mulq    %%r9\n"
29199         "addq    %%rax, %%rcx\n"
29200         "adcq    $0, %%rdx\n"
29201         "movq    64(%%rsi), %%rax\n"
29202         "addq    %%rcx, 128(%%rdi)\n"
29203         "adcq    $0, %%rdx\n"
29204         "movq    %%rdx, %%rcx\n"
29205         "mulq    %%r9\n"
29206         "addq    %%rax, %%rcx\n"
29207         "adcq    $0, %%rdx\n"
29208         "movq    72(%%rsi), %%rax\n"
29209         "addq    %%rcx, 136(%%rdi)\n"
29210         "adcq    $0, %%rdx\n"
29211         "movq    %%rdx, %%rcx\n"
29212         "mulq    %%r9\n"
29213         "addq    %%rax, %%rcx\n"
29214         "adcq    $0, %%rdx\n"
29215         "movq    80(%%rsi), %%rax\n"
29216         "addq    %%rcx, 144(%%rdi)\n"
29217         "adcq    $0, %%rdx\n"
29218         "movq    %%rdx, %%rcx\n"
29219         "mulq    %%r9\n"
29220         "addq    %%rax, %%rcx\n"
29221         "adcq    $0, %%rdx\n"
29222         "movq    88(%%rsi), %%rax\n"
29223         "addq    %%rcx, 152(%%rdi)\n"
29224         "adcq    $0, %%rdx\n"
29225         "movq    %%rdx, %%rcx\n"
29226         "mulq    %%r9\n"
29227         "addq    %%rax, %%rcx\n"
29228         "adcq    $0, %%rdx\n"
29229         "movq    96(%%rsi), %%rax\n"
29230         "addq    %%rcx, 160(%%rdi)\n"
29231         "adcq    $0, %%rdx\n"
29232         "movq    %%rdx, %%rcx\n"
29233         "mulq    %%r9\n"
29234         "addq    %%rax, %%rcx\n"
29235         "adcq    $0, %%rdx\n"
29236         "addq    %%rcx, 168(%%rdi)\n"
29237         "adcq    $0, %%rdx\n"
29238         "movq    %%rdx, 176(%%rdi)\n"
29239         "### x*y[10]\n"
29240         "movq    80(%%r8), %%r9\n"
29241         "movq    0(%%rsi), %%rax\n"
29242         "mulq    %%r9\n"
29243         "addq    %%rax, 80(%%rdi)\n"
29244         "movq    8(%%rsi), %%rax\n"
29245         "adcq    $0, %%rdx\n"
29246         "movq    %%rdx, %%rcx\n"
29247         "mulq    %%r9\n"
29248         "addq    %%rax, %%rcx\n"
29249         "adcq    $0, %%rdx\n"
29250         "movq    16(%%rsi), %%rax\n"
29251         "addq    %%rcx, 88(%%rdi)\n"
29252         "adcq    $0, %%rdx\n"
29253         "movq    %%rdx, %%rcx\n"
29254         "mulq    %%r9\n"
29255         "addq    %%rax, %%rcx\n"
29256         "adcq    $0, %%rdx\n"
29257         "movq    24(%%rsi), %%rax\n"
29258         "addq    %%rcx, 96(%%rdi)\n"
29259         "adcq    $0, %%rdx\n"
29260         "movq    %%rdx, %%rcx\n"
29261         "mulq    %%r9\n"
29262         "addq    %%rax, %%rcx\n"
29263         "adcq    $0, %%rdx\n"
29264         "movq    32(%%rsi), %%rax\n"
29265         "addq    %%rcx, 104(%%rdi)\n"
29266         "adcq    $0, %%rdx\n"
29267         "movq    %%rdx, %%rcx\n"
29268         "mulq    %%r9\n"
29269         "addq    %%rax, %%rcx\n"
29270         "adcq    $0, %%rdx\n"
29271         "movq    40(%%rsi), %%rax\n"
29272         "addq    %%rcx, 112(%%rdi)\n"
29273         "adcq    $0, %%rdx\n"
29274         "movq    %%rdx, %%rcx\n"
29275         "mulq    %%r9\n"
29276         "addq    %%rax, %%rcx\n"
29277         "adcq    $0, %%rdx\n"
29278         "movq    48(%%rsi), %%rax\n"
29279         "addq    %%rcx, 120(%%rdi)\n"
29280         "adcq    $0, %%rdx\n"
29281         "movq    %%rdx, %%rcx\n"
29282         "mulq    %%r9\n"
29283         "addq    %%rax, %%rcx\n"
29284         "adcq    $0, %%rdx\n"
29285         "movq    56(%%rsi), %%rax\n"
29286         "addq    %%rcx, 128(%%rdi)\n"
29287         "adcq    $0, %%rdx\n"
29288         "movq    %%rdx, %%rcx\n"
29289         "mulq    %%r9\n"
29290         "addq    %%rax, %%rcx\n"
29291         "adcq    $0, %%rdx\n"
29292         "movq    64(%%rsi), %%rax\n"
29293         "addq    %%rcx, 136(%%rdi)\n"
29294         "adcq    $0, %%rdx\n"
29295         "movq    %%rdx, %%rcx\n"
29296         "mulq    %%r9\n"
29297         "addq    %%rax, %%rcx\n"
29298         "adcq    $0, %%rdx\n"
29299         "movq    72(%%rsi), %%rax\n"
29300         "addq    %%rcx, 144(%%rdi)\n"
29301         "adcq    $0, %%rdx\n"
29302         "movq    %%rdx, %%rcx\n"
29303         "mulq    %%r9\n"
29304         "addq    %%rax, %%rcx\n"
29305         "adcq    $0, %%rdx\n"
29306         "movq    80(%%rsi), %%rax\n"
29307         "addq    %%rcx, 152(%%rdi)\n"
29308         "adcq    $0, %%rdx\n"
29309         "movq    %%rdx, %%rcx\n"
29310         "mulq    %%r9\n"
29311         "addq    %%rax, %%rcx\n"
29312         "adcq    $0, %%rdx\n"
29313         "movq    88(%%rsi), %%rax\n"
29314         "addq    %%rcx, 160(%%rdi)\n"
29315         "adcq    $0, %%rdx\n"
29316         "movq    %%rdx, %%rcx\n"
29317         "mulq    %%r9\n"
29318         "addq    %%rax, %%rcx\n"
29319         "adcq    $0, %%rdx\n"
29320         "movq    96(%%rsi), %%rax\n"
29321         "addq    %%rcx, 168(%%rdi)\n"
29322         "adcq    $0, %%rdx\n"
29323         "movq    %%rdx, %%rcx\n"
29324         "mulq    %%r9\n"
29325         "addq    %%rax, %%rcx\n"
29326         "adcq    $0, %%rdx\n"
29327         "addq    %%rcx, 176(%%rdi)\n"
29328         "adcq    $0, %%rdx\n"
29329         "movq    %%rdx, 184(%%rdi)\n"
29330         "### x*y[11]\n"
29331         "movq    88(%%r8), %%r9\n"
29332         "movq    0(%%rsi), %%rax\n"
29333         "mulq    %%r9\n"
29334         "addq    %%rax, 88(%%rdi)\n"
29335         "movq    8(%%rsi), %%rax\n"
29336         "adcq    $0, %%rdx\n"
29337         "movq    %%rdx, %%rcx\n"
29338         "mulq    %%r9\n"
29339         "addq    %%rax, %%rcx\n"
29340         "adcq    $0, %%rdx\n"
29341         "movq    16(%%rsi), %%rax\n"
29342         "addq    %%rcx, 96(%%rdi)\n"
29343         "adcq    $0, %%rdx\n"
29344         "movq    %%rdx, %%rcx\n"
29345         "mulq    %%r9\n"
29346         "addq    %%rax, %%rcx\n"
29347         "adcq    $0, %%rdx\n"
29348         "movq    24(%%rsi), %%rax\n"
29349         "addq    %%rcx, 104(%%rdi)\n"
29350         "adcq    $0, %%rdx\n"
29351         "movq    %%rdx, %%rcx\n"
29352         "mulq    %%r9\n"
29353         "addq    %%rax, %%rcx\n"
29354         "adcq    $0, %%rdx\n"
29355         "movq    32(%%rsi), %%rax\n"
29356         "addq    %%rcx, 112(%%rdi)\n"
29357         "adcq    $0, %%rdx\n"
29358         "movq    %%rdx, %%rcx\n"
29359         "mulq    %%r9\n"
29360         "addq    %%rax, %%rcx\n"
29361         "adcq    $0, %%rdx\n"
29362         "movq    40(%%rsi), %%rax\n"
29363         "addq    %%rcx, 120(%%rdi)\n"
29364         "adcq    $0, %%rdx\n"
29365         "movq    %%rdx, %%rcx\n"
29366         "mulq    %%r9\n"
29367         "addq    %%rax, %%rcx\n"
29368         "adcq    $0, %%rdx\n"
29369         "movq    48(%%rsi), %%rax\n"
29370         "addq    %%rcx, 128(%%rdi)\n"
29371         "adcq    $0, %%rdx\n"
29372         "movq    %%rdx, %%rcx\n"
29373         "mulq    %%r9\n"
29374         "addq    %%rax, %%rcx\n"
29375         "adcq    $0, %%rdx\n"
29376         "movq    56(%%rsi), %%rax\n"
29377         "addq    %%rcx, 136(%%rdi)\n"
29378         "adcq    $0, %%rdx\n"
29379         "movq    %%rdx, %%rcx\n"
29380         "mulq    %%r9\n"
29381         "addq    %%rax, %%rcx\n"
29382         "adcq    $0, %%rdx\n"
29383         "movq    64(%%rsi), %%rax\n"
29384         "addq    %%rcx, 144(%%rdi)\n"
29385         "adcq    $0, %%rdx\n"
29386         "movq    %%rdx, %%rcx\n"
29387         "mulq    %%r9\n"
29388         "addq    %%rax, %%rcx\n"
29389         "adcq    $0, %%rdx\n"
29390         "movq    72(%%rsi), %%rax\n"
29391         "addq    %%rcx, 152(%%rdi)\n"
29392         "adcq    $0, %%rdx\n"
29393         "movq    %%rdx, %%rcx\n"
29394         "mulq    %%r9\n"
29395         "addq    %%rax, %%rcx\n"
29396         "adcq    $0, %%rdx\n"
29397         "movq    80(%%rsi), %%rax\n"
29398         "addq    %%rcx, 160(%%rdi)\n"
29399         "adcq    $0, %%rdx\n"
29400         "movq    %%rdx, %%rcx\n"
29401         "mulq    %%r9\n"
29402         "addq    %%rax, %%rcx\n"
29403         "adcq    $0, %%rdx\n"
29404         "movq    88(%%rsi), %%rax\n"
29405         "addq    %%rcx, 168(%%rdi)\n"
29406         "adcq    $0, %%rdx\n"
29407         "movq    %%rdx, %%rcx\n"
29408         "mulq    %%r9\n"
29409         "addq    %%rax, %%rcx\n"
29410         "adcq    $0, %%rdx\n"
29411         "movq    96(%%rsi), %%rax\n"
29412         "addq    %%rcx, 176(%%rdi)\n"
29413         "adcq    $0, %%rdx\n"
29414         "movq    %%rdx, %%rcx\n"
29415         "mulq    %%r9\n"
29416         "addq    %%rax, %%rcx\n"
29417         "adcq    $0, %%rdx\n"
29418         "addq    %%rcx, 184(%%rdi)\n"
29419         "adcq    $0, %%rdx\n"
29420         "movq    %%rdx, 192(%%rdi)\n"
29421         "### x*y[12]\n"
29422         "movq    96(%%r8), %%r9\n"
29423         "movq    0(%%rsi), %%rax\n"
29424         "mulq    %%r9\n"
29425         "addq    %%rax, 96(%%rdi)\n"
29426         "movq    8(%%rsi), %%rax\n"
29427         "adcq    $0, %%rdx\n"
29428         "movq    %%rdx, %%rcx\n"
29429         "mulq    %%r9\n"
29430         "addq    %%rax, %%rcx\n"
29431         "adcq    $0, %%rdx\n"
29432         "movq    16(%%rsi), %%rax\n"
29433         "addq    %%rcx, 104(%%rdi)\n"
29434         "adcq    $0, %%rdx\n"
29435         "movq    %%rdx, %%rcx\n"
29436         "mulq    %%r9\n"
29437         "addq    %%rax, %%rcx\n"
29438         "adcq    $0, %%rdx\n"
29439         "movq    24(%%rsi), %%rax\n"
29440         "addq    %%rcx, 112(%%rdi)\n"
29441         "adcq    $0, %%rdx\n"
29442         "movq    %%rdx, %%rcx\n"
29443         "mulq    %%r9\n"
29444         "addq    %%rax, %%rcx\n"
29445         "adcq    $0, %%rdx\n"
29446         "movq    32(%%rsi), %%rax\n"
29447         "addq    %%rcx, 120(%%rdi)\n"
29448         "adcq    $0, %%rdx\n"
29449         "movq    %%rdx, %%rcx\n"
29450         "mulq    %%r9\n"
29451         "addq    %%rax, %%rcx\n"
29452         "adcq    $0, %%rdx\n"
29453         "movq    40(%%rsi), %%rax\n"
29454         "addq    %%rcx, 128(%%rdi)\n"
29455         "adcq    $0, %%rdx\n"
29456         "movq    %%rdx, %%rcx\n"
29457         "mulq    %%r9\n"
29458         "addq    %%rax, %%rcx\n"
29459         "adcq    $0, %%rdx\n"
29460         "movq    48(%%rsi), %%rax\n"
29461         "addq    %%rcx, 136(%%rdi)\n"
29462         "adcq    $0, %%rdx\n"
29463         "movq    %%rdx, %%rcx\n"
29464         "mulq    %%r9\n"
29465         "addq    %%rax, %%rcx\n"
29466         "adcq    $0, %%rdx\n"
29467         "movq    56(%%rsi), %%rax\n"
29468         "addq    %%rcx, 144(%%rdi)\n"
29469         "adcq    $0, %%rdx\n"
29470         "movq    %%rdx, %%rcx\n"
29471         "mulq    %%r9\n"
29472         "addq    %%rax, %%rcx\n"
29473         "adcq    $0, %%rdx\n"
29474         "movq    64(%%rsi), %%rax\n"
29475         "addq    %%rcx, 152(%%rdi)\n"
29476         "adcq    $0, %%rdx\n"
29477         "movq    %%rdx, %%rcx\n"
29478         "mulq    %%r9\n"
29479         "addq    %%rax, %%rcx\n"
29480         "adcq    $0, %%rdx\n"
29481         "movq    72(%%rsi), %%rax\n"
29482         "addq    %%rcx, 160(%%rdi)\n"
29483         "adcq    $0, %%rdx\n"
29484         "movq    %%rdx, %%rcx\n"
29485         "mulq    %%r9\n"
29486         "addq    %%rax, %%rcx\n"
29487         "adcq    $0, %%rdx\n"
29488         "movq    80(%%rsi), %%rax\n"
29489         "addq    %%rcx, 168(%%rdi)\n"
29490         "adcq    $0, %%rdx\n"
29491         "movq    %%rdx, %%rcx\n"
29492         "mulq    %%r9\n"
29493         "addq    %%rax, %%rcx\n"
29494         "adcq    $0, %%rdx\n"
29495         "movq    88(%%rsi), %%rax\n"
29496         "addq    %%rcx, 176(%%rdi)\n"
29497         "adcq    $0, %%rdx\n"
29498         "movq    %%rdx, %%rcx\n"
29499         "mulq    %%r9\n"
29500         "addq    %%rax, %%rcx\n"
29501         "adcq    $0, %%rdx\n"
29502         "movq    96(%%rsi), %%rax\n"
29503         "addq    %%rcx, 184(%%rdi)\n"
29504         "adcq    $0, %%rdx\n"
29505         "movq    %%rdx, %%rcx\n"
29506         "mulq    %%r9\n"
29507         "addq    %%rax, %%rcx\n"
29508         "adcq    $0, %%rdx\n"
29509         "addq    %%rcx, 192(%%rdi)\n"
29510       : "+m" (z)
29511       : "m" (x), "m" (y)
29512       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
29513 }
29514 
29515 /* x has 12.5 words, z has 25. Put x*y in z. */
29516 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
29517 static inline
mpfq_fixmp_12_5_sqr(mp_limb_t * z,const mp_limb_t * x)29518 void mpfq_fixmp_12_5_sqr(mp_limb_t * z, const mp_limb_t * x)
29519 {
29520     mpfq_fixmp_12_5_mul(z, x, x);
29521 }
29522 
29523 /* x has 12.5 words, z has 14. Put x*y in z. */
29524 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
29525 static inline
mpfq_fixmp_12_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)29526 void mpfq_fixmp_12_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
29527 {
29528     __asm__ __volatile__(
29529         "movq    %[z], %%rdi\n"
29530         "movq    %[x], %%rsi\n"
29531         "movq    0(%%rsi), %%rax\n"
29532         "mulq    %[mult]\n"
29533         "movq    %%rax, 0(%%rdi)\n"
29534         "movq    8(%%rsi), %%rax\n"
29535         "movq    %%rdx, %%rcx\n"
29536         "mulq    %[mult]\n"
29537         "addq    %%rax, %%rcx\n"
29538         "adcq    $0, %%rdx\n"
29539         "movq    16(%%rsi), %%rax\n"
29540         "movq    %%rcx, 8(%%rdi)\n"
29541         "movq    %%rdx, %%rcx\n"
29542         "mulq    %[mult]\n"
29543         "addq    %%rax, %%rcx\n"
29544         "adcq    $0, %%rdx\n"
29545         "movq    24(%%rsi), %%rax\n"
29546         "movq    %%rcx, 16(%%rdi)\n"
29547         "movq    %%rdx, %%rcx\n"
29548         "mulq    %[mult]\n"
29549         "addq    %%rax, %%rcx\n"
29550         "adcq    $0, %%rdx\n"
29551         "movq    32(%%rsi), %%rax\n"
29552         "movq    %%rcx, 24(%%rdi)\n"
29553         "movq    %%rdx, %%rcx\n"
29554         "mulq    %[mult]\n"
29555         "addq    %%rax, %%rcx\n"
29556         "adcq    $0, %%rdx\n"
29557         "movq    40(%%rsi), %%rax\n"
29558         "movq    %%rcx, 32(%%rdi)\n"
29559         "movq    %%rdx, %%rcx\n"
29560         "mulq    %[mult]\n"
29561         "addq    %%rax, %%rcx\n"
29562         "adcq    $0, %%rdx\n"
29563         "movq    48(%%rsi), %%rax\n"
29564         "movq    %%rcx, 40(%%rdi)\n"
29565         "movq    %%rdx, %%rcx\n"
29566         "mulq    %[mult]\n"
29567         "addq    %%rax, %%rcx\n"
29568         "adcq    $0, %%rdx\n"
29569         "movq    56(%%rsi), %%rax\n"
29570         "movq    %%rcx, 48(%%rdi)\n"
29571         "movq    %%rdx, %%rcx\n"
29572         "mulq    %[mult]\n"
29573         "addq    %%rax, %%rcx\n"
29574         "adcq    $0, %%rdx\n"
29575         "movq    64(%%rsi), %%rax\n"
29576         "movq    %%rcx, 56(%%rdi)\n"
29577         "movq    %%rdx, %%rcx\n"
29578         "mulq    %[mult]\n"
29579         "addq    %%rax, %%rcx\n"
29580         "adcq    $0, %%rdx\n"
29581         "movq    72(%%rsi), %%rax\n"
29582         "movq    %%rcx, 64(%%rdi)\n"
29583         "movq    %%rdx, %%rcx\n"
29584         "mulq    %[mult]\n"
29585         "addq    %%rax, %%rcx\n"
29586         "adcq    $0, %%rdx\n"
29587         "movq    80(%%rsi), %%rax\n"
29588         "movq    %%rcx, 72(%%rdi)\n"
29589         "movq    %%rdx, %%rcx\n"
29590         "mulq    %[mult]\n"
29591         "addq    %%rax, %%rcx\n"
29592         "adcq    $0, %%rdx\n"
29593         "movq    88(%%rsi), %%rax\n"
29594         "movq    %%rcx, 80(%%rdi)\n"
29595         "movq    %%rdx, %%rcx\n"
29596         "mulq    %[mult]\n"
29597         "addq    %%rax, %%rcx\n"
29598         "adcq    $0, %%rdx\n"
29599         "movq    96(%%rsi), %%rax\n"
29600         "movq    %%rcx, 88(%%rdi)\n"
29601         "movq    %%rdx, %%rcx\n"
29602         "mulq    %[mult]\n"
29603         "addq    %%rax, %%rcx\n"
29604         "adcq    $0, %%rdx\n"
29605         "movq    %%rcx, 96(%%rdi)\n"
29606         "movq    %%rdx, 104(%%rdi)\n"
29607     :
29608     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
29609     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
29610 }
29611 
29612 /* x has 12.5 words, z has 13. c is 0.5 word.
29613  * Put (z+x*c) in z. Return carry bit. */
29614 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
29615 static inline
mpfq_fixmp_12_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)29616 mp_limb_t mpfq_fixmp_12_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
29617 {
29618     mp_limb_t carry;
29619     __asm__ __volatile__(
29620         "movq    %[z], %%rdi\n"
29621         "movq    %[x], %%rsi\n"
29622         "movq    0(%%rsi), %%rax\n"
29623         "mulq    %[mult]\n"
29624         "addq    %%rax, 0(%%rdi)\n"
29625         "movq    8(%%rsi), %%rax\n"
29626         "adcq    $0, %%rdx\n"
29627         "movq    %%rdx, %%rcx\n"
29628         "mulq    %[mult]\n"
29629         "addq    %%rax, %%rcx\n"
29630         "adcq    $0, %%rdx\n"
29631         "movq    16(%%rsi), %%rax\n"
29632         "addq    %%rcx, 8(%%rdi)\n"
29633         "adcq    $0, %%rdx\n"
29634         "movq    %%rdx, %%rcx\n"
29635         "mulq    %[mult]\n"
29636         "addq    %%rax, %%rcx\n"
29637         "adcq    $0, %%rdx\n"
29638         "movq    24(%%rsi), %%rax\n"
29639         "addq    %%rcx, 16(%%rdi)\n"
29640         "adcq    $0, %%rdx\n"
29641         "movq    %%rdx, %%rcx\n"
29642         "mulq    %[mult]\n"
29643         "addq    %%rax, %%rcx\n"
29644         "adcq    $0, %%rdx\n"
29645         "movq    32(%%rsi), %%rax\n"
29646         "addq    %%rcx, 24(%%rdi)\n"
29647         "adcq    $0, %%rdx\n"
29648         "movq    %%rdx, %%rcx\n"
29649         "mulq    %[mult]\n"
29650         "addq    %%rax, %%rcx\n"
29651         "adcq    $0, %%rdx\n"
29652         "movq    40(%%rsi), %%rax\n"
29653         "addq    %%rcx, 32(%%rdi)\n"
29654         "adcq    $0, %%rdx\n"
29655         "movq    %%rdx, %%rcx\n"
29656         "mulq    %[mult]\n"
29657         "addq    %%rax, %%rcx\n"
29658         "adcq    $0, %%rdx\n"
29659         "movq    48(%%rsi), %%rax\n"
29660         "addq    %%rcx, 40(%%rdi)\n"
29661         "adcq    $0, %%rdx\n"
29662         "movq    %%rdx, %%rcx\n"
29663         "mulq    %[mult]\n"
29664         "addq    %%rax, %%rcx\n"
29665         "adcq    $0, %%rdx\n"
29666         "movq    56(%%rsi), %%rax\n"
29667         "addq    %%rcx, 48(%%rdi)\n"
29668         "adcq    $0, %%rdx\n"
29669         "movq    %%rdx, %%rcx\n"
29670         "mulq    %[mult]\n"
29671         "addq    %%rax, %%rcx\n"
29672         "adcq    $0, %%rdx\n"
29673         "movq    64(%%rsi), %%rax\n"
29674         "addq    %%rcx, 56(%%rdi)\n"
29675         "adcq    $0, %%rdx\n"
29676         "movq    %%rdx, %%rcx\n"
29677         "mulq    %[mult]\n"
29678         "addq    %%rax, %%rcx\n"
29679         "adcq    $0, %%rdx\n"
29680         "movq    72(%%rsi), %%rax\n"
29681         "addq    %%rcx, 64(%%rdi)\n"
29682         "adcq    $0, %%rdx\n"
29683         "movq    %%rdx, %%rcx\n"
29684         "mulq    %[mult]\n"
29685         "addq    %%rax, %%rcx\n"
29686         "adcq    $0, %%rdx\n"
29687         "movq    80(%%rsi), %%rax\n"
29688         "addq    %%rcx, 72(%%rdi)\n"
29689         "adcq    $0, %%rdx\n"
29690         "movq    %%rdx, %%rcx\n"
29691         "mulq    %[mult]\n"
29692         "addq    %%rax, %%rcx\n"
29693         "adcq    $0, %%rdx\n"
29694         "movq    88(%%rsi), %%rax\n"
29695         "addq    %%rcx, 80(%%rdi)\n"
29696         "adcq    $0, %%rdx\n"
29697         "movq    %%rdx, %%rcx\n"
29698         "mulq    %[mult]\n"
29699         "addq    %%rax, %%rcx\n"
29700         "adcq    $0, %%rdx\n"
29701         "movq    96(%%rsi), %%rax\n"
29702         "addq    %%rcx, 88(%%rdi)\n"
29703         "adcq    $0, %%rdx\n"
29704         "movq    %%rdx, %%rcx\n"
29705         "imulq    %[mult], %%rax\n"
29706         "xorq    %%rdx, %%rdx\n"
29707         "addq    %%rcx, %%rax\n"
29708         "adcq    $0, %%rdx\n"
29709         "addq    %%rax, 96(%%rdi)\n"
29710         "adcq    $0, %%rdx\n"
29711         "movq    %%rdx, %[carry]\n"
29712     : [carry]"=g"(carry), [z] "+m" (z)
29713     : [mult] "r" (c), [x] "m" (x)
29714     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
29715     return carry;
29716 }
29717 
29718 /* x has 12.5 words, z has 13. c is 0.5 word.
29719  * Put (z+x*c) in z. Carry bit is lost. */
29720 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
29721 static inline
mpfq_fixmp_12_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)29722 void mpfq_fixmp_12_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
29723 {
29724     __asm__ __volatile__(
29725         "movq    %[z], %%rdi\n"
29726         "movq    %[x], %%rsi\n"
29727         "movq    0(%%rsi), %%rax\n"
29728         "mulq    %[mult]\n"
29729         "addq    %%rax, 0(%%rdi)\n"
29730         "movq    8(%%rsi), %%rax\n"
29731         "adcq    $0, %%rdx\n"
29732         "movq    %%rdx, %%rcx\n"
29733         "mulq    %[mult]\n"
29734         "addq    %%rax, %%rcx\n"
29735         "adcq    $0, %%rdx\n"
29736         "movq    16(%%rsi), %%rax\n"
29737         "addq    %%rcx, 8(%%rdi)\n"
29738         "adcq    $0, %%rdx\n"
29739         "movq    %%rdx, %%rcx\n"
29740         "mulq    %[mult]\n"
29741         "addq    %%rax, %%rcx\n"
29742         "adcq    $0, %%rdx\n"
29743         "movq    24(%%rsi), %%rax\n"
29744         "addq    %%rcx, 16(%%rdi)\n"
29745         "adcq    $0, %%rdx\n"
29746         "movq    %%rdx, %%rcx\n"
29747         "mulq    %[mult]\n"
29748         "addq    %%rax, %%rcx\n"
29749         "adcq    $0, %%rdx\n"
29750         "movq    32(%%rsi), %%rax\n"
29751         "addq    %%rcx, 24(%%rdi)\n"
29752         "adcq    $0, %%rdx\n"
29753         "movq    %%rdx, %%rcx\n"
29754         "mulq    %[mult]\n"
29755         "addq    %%rax, %%rcx\n"
29756         "adcq    $0, %%rdx\n"
29757         "movq    40(%%rsi), %%rax\n"
29758         "addq    %%rcx, 32(%%rdi)\n"
29759         "adcq    $0, %%rdx\n"
29760         "movq    %%rdx, %%rcx\n"
29761         "mulq    %[mult]\n"
29762         "addq    %%rax, %%rcx\n"
29763         "adcq    $0, %%rdx\n"
29764         "movq    48(%%rsi), %%rax\n"
29765         "addq    %%rcx, 40(%%rdi)\n"
29766         "adcq    $0, %%rdx\n"
29767         "movq    %%rdx, %%rcx\n"
29768         "mulq    %[mult]\n"
29769         "addq    %%rax, %%rcx\n"
29770         "adcq    $0, %%rdx\n"
29771         "movq    56(%%rsi), %%rax\n"
29772         "addq    %%rcx, 48(%%rdi)\n"
29773         "adcq    $0, %%rdx\n"
29774         "movq    %%rdx, %%rcx\n"
29775         "mulq    %[mult]\n"
29776         "addq    %%rax, %%rcx\n"
29777         "adcq    $0, %%rdx\n"
29778         "movq    64(%%rsi), %%rax\n"
29779         "addq    %%rcx, 56(%%rdi)\n"
29780         "adcq    $0, %%rdx\n"
29781         "movq    %%rdx, %%rcx\n"
29782         "mulq    %[mult]\n"
29783         "addq    %%rax, %%rcx\n"
29784         "adcq    $0, %%rdx\n"
29785         "movq    72(%%rsi), %%rax\n"
29786         "addq    %%rcx, 64(%%rdi)\n"
29787         "adcq    $0, %%rdx\n"
29788         "movq    %%rdx, %%rcx\n"
29789         "mulq    %[mult]\n"
29790         "addq    %%rax, %%rcx\n"
29791         "adcq    $0, %%rdx\n"
29792         "movq    80(%%rsi), %%rax\n"
29793         "addq    %%rcx, 72(%%rdi)\n"
29794         "adcq    $0, %%rdx\n"
29795         "movq    %%rdx, %%rcx\n"
29796         "mulq    %[mult]\n"
29797         "addq    %%rax, %%rcx\n"
29798         "adcq    $0, %%rdx\n"
29799         "movq    88(%%rsi), %%rax\n"
29800         "addq    %%rcx, 80(%%rdi)\n"
29801         "adcq    $0, %%rdx\n"
29802         "movq    %%rdx, %%rcx\n"
29803         "mulq    %[mult]\n"
29804         "addq    %%rax, %%rcx\n"
29805         "adcq    $0, %%rdx\n"
29806         "movq    96(%%rsi), %%rax\n"
29807         "addq    %%rcx, 88(%%rdi)\n"
29808         "adcq    $0, %%rdx\n"
29809         "movq    %%rdx, %%rcx\n"
29810         "imulq    %[mult], %%rax\n"
29811         "addq    %%rcx, %%rax\n"
29812         "addq    %%rax, 96(%%rdi)\n"
29813     : [z] "+m" (z)
29814     : [mult] "r" (c), [x] "m" (x)
29815     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
29816 }
29817 
29818 /* x has 12.5 words, z has 13. c is 0.5 word.
29819  * Put (x*c) in z. No carry. */
29820 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
29821 static inline
mpfq_fixmp_12_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)29822 void mpfq_fixmp_12_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
29823 {
29824     __asm__ __volatile__(
29825         "movq    %[z], %%rdi\n"
29826         "movq    %[x], %%rsi\n"
29827         "movq    0(%%rsi), %%rax\n"
29828         "mulq    %[mult]\n"
29829         "movq    %%rax, 0(%%rdi)\n"
29830         "movq    8(%%rsi), %%rax\n"
29831         "movq    %%rdx, %%rcx\n"
29832         "mulq    %[mult]\n"
29833         "addq    %%rax, %%rcx\n"
29834         "adcq    $0, %%rdx\n"
29835         "movq    16(%%rsi), %%rax\n"
29836         "movq    %%rcx, 8(%%rdi)\n"
29837         "movq    %%rdx, %%rcx\n"
29838         "mulq    %[mult]\n"
29839         "addq    %%rax, %%rcx\n"
29840         "adcq    $0, %%rdx\n"
29841         "movq    24(%%rsi), %%rax\n"
29842         "movq    %%rcx, 16(%%rdi)\n"
29843         "movq    %%rdx, %%rcx\n"
29844         "mulq    %[mult]\n"
29845         "addq    %%rax, %%rcx\n"
29846         "adcq    $0, %%rdx\n"
29847         "movq    32(%%rsi), %%rax\n"
29848         "movq    %%rcx, 24(%%rdi)\n"
29849         "movq    %%rdx, %%rcx\n"
29850         "mulq    %[mult]\n"
29851         "addq    %%rax, %%rcx\n"
29852         "adcq    $0, %%rdx\n"
29853         "movq    40(%%rsi), %%rax\n"
29854         "movq    %%rcx, 32(%%rdi)\n"
29855         "movq    %%rdx, %%rcx\n"
29856         "mulq    %[mult]\n"
29857         "addq    %%rax, %%rcx\n"
29858         "adcq    $0, %%rdx\n"
29859         "movq    48(%%rsi), %%rax\n"
29860         "movq    %%rcx, 40(%%rdi)\n"
29861         "movq    %%rdx, %%rcx\n"
29862         "mulq    %[mult]\n"
29863         "addq    %%rax, %%rcx\n"
29864         "adcq    $0, %%rdx\n"
29865         "movq    56(%%rsi), %%rax\n"
29866         "movq    %%rcx, 48(%%rdi)\n"
29867         "movq    %%rdx, %%rcx\n"
29868         "mulq    %[mult]\n"
29869         "addq    %%rax, %%rcx\n"
29870         "adcq    $0, %%rdx\n"
29871         "movq    64(%%rsi), %%rax\n"
29872         "movq    %%rcx, 56(%%rdi)\n"
29873         "movq    %%rdx, %%rcx\n"
29874         "mulq    %[mult]\n"
29875         "addq    %%rax, %%rcx\n"
29876         "adcq    $0, %%rdx\n"
29877         "movq    72(%%rsi), %%rax\n"
29878         "movq    %%rcx, 64(%%rdi)\n"
29879         "movq    %%rdx, %%rcx\n"
29880         "mulq    %[mult]\n"
29881         "addq    %%rax, %%rcx\n"
29882         "adcq    $0, %%rdx\n"
29883         "movq    80(%%rsi), %%rax\n"
29884         "movq    %%rcx, 72(%%rdi)\n"
29885         "movq    %%rdx, %%rcx\n"
29886         "mulq    %[mult]\n"
29887         "addq    %%rax, %%rcx\n"
29888         "adcq    $0, %%rdx\n"
29889         "movq    88(%%rsi), %%rax\n"
29890         "movq    %%rcx, 80(%%rdi)\n"
29891         "movq    %%rdx, %%rcx\n"
29892         "mulq    %[mult]\n"
29893         "addq    %%rax, %%rcx\n"
29894         "adcq    $0, %%rdx\n"
29895         "movq    96(%%rsi), %%rax\n"
29896         "movq    %%rcx, 88(%%rdi)\n"
29897         "movq    %%rdx, %%rcx\n"
29898         "imulq    %[mult], %%rax\n"
29899         "addq    %%rcx, %%rax\n"
29900         "movq    %%rax, 96(%%rdi)\n"
29901     :
29902     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
29903     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
29904 }
29905 
29906 /* x, y, and z have 13.5 words. Result in z. Return carry bit */
29907 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
29908 static inline
mpfq_fixmp_13_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)29909 mp_limb_t mpfq_fixmp_13_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
29910 {
29911     mp_limb_t carry;
29912     __asm__ __volatile__(
29913         "movq    %[z], %%rdi\n"
29914         "movq    %[x], %%rsi\n"
29915         "movq    %[y], %%rdx\n"
29916         "movq    0(%%rsi), %%rax\n"
29917         "addq    0(%%rdx), %%rax\n"
29918         "movq    %%rax, 0(%%rdi)\n"
29919         "movq    8(%%rsi), %%rax\n"
29920         "adcq    8(%%rdx), %%rax\n"
29921         "movq    %%rax, 8(%%rdi)\n"
29922         "movq    16(%%rsi), %%rax\n"
29923         "adcq    16(%%rdx), %%rax\n"
29924         "movq    %%rax, 16(%%rdi)\n"
29925         "movq    24(%%rsi), %%rax\n"
29926         "adcq    24(%%rdx), %%rax\n"
29927         "movq    %%rax, 24(%%rdi)\n"
29928         "movq    32(%%rsi), %%rax\n"
29929         "adcq    32(%%rdx), %%rax\n"
29930         "movq    %%rax, 32(%%rdi)\n"
29931         "movq    40(%%rsi), %%rax\n"
29932         "adcq    40(%%rdx), %%rax\n"
29933         "movq    %%rax, 40(%%rdi)\n"
29934         "movq    48(%%rsi), %%rax\n"
29935         "adcq    48(%%rdx), %%rax\n"
29936         "movq    %%rax, 48(%%rdi)\n"
29937         "movq    56(%%rsi), %%rax\n"
29938         "adcq    56(%%rdx), %%rax\n"
29939         "movq    %%rax, 56(%%rdi)\n"
29940         "movq    64(%%rsi), %%rax\n"
29941         "adcq    64(%%rdx), %%rax\n"
29942         "movq    %%rax, 64(%%rdi)\n"
29943         "movq    72(%%rsi), %%rax\n"
29944         "adcq    72(%%rdx), %%rax\n"
29945         "movq    %%rax, 72(%%rdi)\n"
29946         "movq    80(%%rsi), %%rax\n"
29947         "adcq    80(%%rdx), %%rax\n"
29948         "movq    %%rax, 80(%%rdi)\n"
29949         "movq    88(%%rsi), %%rax\n"
29950         "adcq    88(%%rdx), %%rax\n"
29951         "movq    %%rax, 88(%%rdi)\n"
29952         "movq    96(%%rsi), %%rax\n"
29953         "adcq    96(%%rdx), %%rax\n"
29954         "movq    %%rax, 96(%%rdi)\n"
29955         "movq    104(%%rsi), %%rax\n"
29956         "adcq    104(%%rdx), %%rax\n"
29957         "movq    %%rax, 104(%%rdi)\n"
29958         "movq $0, %%rax\n"
29959         "adcq $0, %%rax\n"
29960     : "=&a"(carry)
29961     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
29962     : "%rdx", "%rsi", "%rdi", "memory");
29963     return carry;
29964 }
29965 
29966 /* x, y, and z have 13.5 words. Result in z. Return borrow bit */
29967 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
29968 static inline
mpfq_fixmp_13_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)29969 mp_limb_t mpfq_fixmp_13_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
29970 {
29971     mp_limb_t carry;
29972     __asm__ __volatile__(
29973         "movq    %[z], %%rdi\n"
29974         "movq    %[x], %%rsi\n"
29975         "movq    %[y], %%rdx\n"
29976         "movq    0(%%rsi), %%rax\n"
29977         "subq    0(%%rdx), %%rax\n"
29978         "movq    %%rax, 0(%%rdi)\n"
29979         "movq    8(%%rsi), %%rax\n"
29980         "sbbq    8(%%rdx), %%rax\n"
29981         "movq    %%rax, 8(%%rdi)\n"
29982         "movq    16(%%rsi), %%rax\n"
29983         "sbbq    16(%%rdx), %%rax\n"
29984         "movq    %%rax, 16(%%rdi)\n"
29985         "movq    24(%%rsi), %%rax\n"
29986         "sbbq    24(%%rdx), %%rax\n"
29987         "movq    %%rax, 24(%%rdi)\n"
29988         "movq    32(%%rsi), %%rax\n"
29989         "sbbq    32(%%rdx), %%rax\n"
29990         "movq    %%rax, 32(%%rdi)\n"
29991         "movq    40(%%rsi), %%rax\n"
29992         "sbbq    40(%%rdx), %%rax\n"
29993         "movq    %%rax, 40(%%rdi)\n"
29994         "movq    48(%%rsi), %%rax\n"
29995         "sbbq    48(%%rdx), %%rax\n"
29996         "movq    %%rax, 48(%%rdi)\n"
29997         "movq    56(%%rsi), %%rax\n"
29998         "sbbq    56(%%rdx), %%rax\n"
29999         "movq    %%rax, 56(%%rdi)\n"
30000         "movq    64(%%rsi), %%rax\n"
30001         "sbbq    64(%%rdx), %%rax\n"
30002         "movq    %%rax, 64(%%rdi)\n"
30003         "movq    72(%%rsi), %%rax\n"
30004         "sbbq    72(%%rdx), %%rax\n"
30005         "movq    %%rax, 72(%%rdi)\n"
30006         "movq    80(%%rsi), %%rax\n"
30007         "sbbq    80(%%rdx), %%rax\n"
30008         "movq    %%rax, 80(%%rdi)\n"
30009         "movq    88(%%rsi), %%rax\n"
30010         "sbbq    88(%%rdx), %%rax\n"
30011         "movq    %%rax, 88(%%rdi)\n"
30012         "movq    96(%%rsi), %%rax\n"
30013         "sbbq    96(%%rdx), %%rax\n"
30014         "movq    %%rax, 96(%%rdi)\n"
30015         "movq    104(%%rsi), %%rax\n"
30016         "sbbq    104(%%rdx), %%rax\n"
30017         "movq    %%rax, 104(%%rdi)\n"
30018         "movq $0, %%rax\n"
30019         "adcq $0, %%rax\n"
30020     : "=&a"(carry)
30021     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
30022     : "%rdx", "%rsi", "%rdi", "memory");
30023     return carry;
30024 }
30025 
30026 /* x, y, and z have 13.5 words. Result in z. Carry bit is lost. */
30027 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
30028 static inline
mpfq_fixmp_13_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)30029 void mpfq_fixmp_13_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
30030 {
30031     __asm__ __volatile__(
30032         "movq    %[z], %%rdi\n"
30033         "movq    %[x], %%rsi\n"
30034         "movq    %[y], %%rdx\n"
30035         "movq    0(%%rsi), %%rax\n"
30036         "addq    0(%%rdx), %%rax\n"
30037         "movq    %%rax, 0(%%rdi)\n"
30038         "movq    8(%%rsi), %%rax\n"
30039         "adcq    8(%%rdx), %%rax\n"
30040         "movq    %%rax, 8(%%rdi)\n"
30041         "movq    16(%%rsi), %%rax\n"
30042         "adcq    16(%%rdx), %%rax\n"
30043         "movq    %%rax, 16(%%rdi)\n"
30044         "movq    24(%%rsi), %%rax\n"
30045         "adcq    24(%%rdx), %%rax\n"
30046         "movq    %%rax, 24(%%rdi)\n"
30047         "movq    32(%%rsi), %%rax\n"
30048         "adcq    32(%%rdx), %%rax\n"
30049         "movq    %%rax, 32(%%rdi)\n"
30050         "movq    40(%%rsi), %%rax\n"
30051         "adcq    40(%%rdx), %%rax\n"
30052         "movq    %%rax, 40(%%rdi)\n"
30053         "movq    48(%%rsi), %%rax\n"
30054         "adcq    48(%%rdx), %%rax\n"
30055         "movq    %%rax, 48(%%rdi)\n"
30056         "movq    56(%%rsi), %%rax\n"
30057         "adcq    56(%%rdx), %%rax\n"
30058         "movq    %%rax, 56(%%rdi)\n"
30059         "movq    64(%%rsi), %%rax\n"
30060         "adcq    64(%%rdx), %%rax\n"
30061         "movq    %%rax, 64(%%rdi)\n"
30062         "movq    72(%%rsi), %%rax\n"
30063         "adcq    72(%%rdx), %%rax\n"
30064         "movq    %%rax, 72(%%rdi)\n"
30065         "movq    80(%%rsi), %%rax\n"
30066         "adcq    80(%%rdx), %%rax\n"
30067         "movq    %%rax, 80(%%rdi)\n"
30068         "movq    88(%%rsi), %%rax\n"
30069         "adcq    88(%%rdx), %%rax\n"
30070         "movq    %%rax, 88(%%rdi)\n"
30071         "movq    96(%%rsi), %%rax\n"
30072         "adcq    96(%%rdx), %%rax\n"
30073         "movq    %%rax, 96(%%rdi)\n"
30074         "movq    104(%%rsi), %%rax\n"
30075         "adcq    104(%%rdx), %%rax\n"
30076         "movq    %%rax, 104(%%rdi)\n"
30077     :
30078     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
30079     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
30080 }
30081 
30082 /* x, y, and z have 13.5 words. Result in z. Borrow bit is lost. */
30083 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
30084 static inline
mpfq_fixmp_13_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)30085 void mpfq_fixmp_13_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
30086 {
30087     __asm__ __volatile__(
30088         "movq    %[z], %%rdi\n"
30089         "movq    %[x], %%rsi\n"
30090         "movq    %[y], %%rdx\n"
30091         "movq    0(%%rsi), %%rax\n"
30092         "subq    0(%%rdx), %%rax\n"
30093         "movq    %%rax, 0(%%rdi)\n"
30094         "movq    8(%%rsi), %%rax\n"
30095         "sbbq    8(%%rdx), %%rax\n"
30096         "movq    %%rax, 8(%%rdi)\n"
30097         "movq    16(%%rsi), %%rax\n"
30098         "sbbq    16(%%rdx), %%rax\n"
30099         "movq    %%rax, 16(%%rdi)\n"
30100         "movq    24(%%rsi), %%rax\n"
30101         "sbbq    24(%%rdx), %%rax\n"
30102         "movq    %%rax, 24(%%rdi)\n"
30103         "movq    32(%%rsi), %%rax\n"
30104         "sbbq    32(%%rdx), %%rax\n"
30105         "movq    %%rax, 32(%%rdi)\n"
30106         "movq    40(%%rsi), %%rax\n"
30107         "sbbq    40(%%rdx), %%rax\n"
30108         "movq    %%rax, 40(%%rdi)\n"
30109         "movq    48(%%rsi), %%rax\n"
30110         "sbbq    48(%%rdx), %%rax\n"
30111         "movq    %%rax, 48(%%rdi)\n"
30112         "movq    56(%%rsi), %%rax\n"
30113         "sbbq    56(%%rdx), %%rax\n"
30114         "movq    %%rax, 56(%%rdi)\n"
30115         "movq    64(%%rsi), %%rax\n"
30116         "sbbq    64(%%rdx), %%rax\n"
30117         "movq    %%rax, 64(%%rdi)\n"
30118         "movq    72(%%rsi), %%rax\n"
30119         "sbbq    72(%%rdx), %%rax\n"
30120         "movq    %%rax, 72(%%rdi)\n"
30121         "movq    80(%%rsi), %%rax\n"
30122         "sbbq    80(%%rdx), %%rax\n"
30123         "movq    %%rax, 80(%%rdi)\n"
30124         "movq    88(%%rsi), %%rax\n"
30125         "sbbq    88(%%rdx), %%rax\n"
30126         "movq    %%rax, 88(%%rdi)\n"
30127         "movq    96(%%rsi), %%rax\n"
30128         "sbbq    96(%%rdx), %%rax\n"
30129         "movq    %%rax, 96(%%rdi)\n"
30130         "movq    104(%%rsi), %%rax\n"
30131         "sbbq    104(%%rdx), %%rax\n"
30132         "movq    %%rax, 104(%%rdi)\n"
30133     :
30134     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
30135     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
30136 }
30137 
30138 /* x has 13.5 words, z has 15.
30139  * Put (z+x*c) in z. Return carry bit. */
30140 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
30141 static inline
mpfq_fixmp_13_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)30142 mp_limb_t mpfq_fixmp_13_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
30143 {
30144     mp_limb_t carry;
30145     __asm__ __volatile__(
30146         "movq    %[z], %%rdi\n"
30147         "movq    %[x], %%rsi\n"
30148         "movq    0(%%rsi), %%rax\n"
30149         "mulq    %[mult]\n"
30150         "addq    %%rax, 0(%%rdi)\n"
30151         "movq    8(%%rsi), %%rax\n"
30152         "adcq    $0, %%rdx\n"
30153         "movq    %%rdx, %%rcx\n"
30154         "mulq    %[mult]\n"
30155         "addq    %%rax, %%rcx\n"
30156         "adcq    $0, %%rdx\n"
30157         "movq    16(%%rsi), %%rax\n"
30158         "addq    %%rcx, 8(%%rdi)\n"
30159         "adcq    $0, %%rdx\n"
30160         "movq    %%rdx, %%rcx\n"
30161         "mulq    %[mult]\n"
30162         "addq    %%rax, %%rcx\n"
30163         "adcq    $0, %%rdx\n"
30164         "movq    24(%%rsi), %%rax\n"
30165         "addq    %%rcx, 16(%%rdi)\n"
30166         "adcq    $0, %%rdx\n"
30167         "movq    %%rdx, %%rcx\n"
30168         "mulq    %[mult]\n"
30169         "addq    %%rax, %%rcx\n"
30170         "adcq    $0, %%rdx\n"
30171         "movq    32(%%rsi), %%rax\n"
30172         "addq    %%rcx, 24(%%rdi)\n"
30173         "adcq    $0, %%rdx\n"
30174         "movq    %%rdx, %%rcx\n"
30175         "mulq    %[mult]\n"
30176         "addq    %%rax, %%rcx\n"
30177         "adcq    $0, %%rdx\n"
30178         "movq    40(%%rsi), %%rax\n"
30179         "addq    %%rcx, 32(%%rdi)\n"
30180         "adcq    $0, %%rdx\n"
30181         "movq    %%rdx, %%rcx\n"
30182         "mulq    %[mult]\n"
30183         "addq    %%rax, %%rcx\n"
30184         "adcq    $0, %%rdx\n"
30185         "movq    48(%%rsi), %%rax\n"
30186         "addq    %%rcx, 40(%%rdi)\n"
30187         "adcq    $0, %%rdx\n"
30188         "movq    %%rdx, %%rcx\n"
30189         "mulq    %[mult]\n"
30190         "addq    %%rax, %%rcx\n"
30191         "adcq    $0, %%rdx\n"
30192         "movq    56(%%rsi), %%rax\n"
30193         "addq    %%rcx, 48(%%rdi)\n"
30194         "adcq    $0, %%rdx\n"
30195         "movq    %%rdx, %%rcx\n"
30196         "mulq    %[mult]\n"
30197         "addq    %%rax, %%rcx\n"
30198         "adcq    $0, %%rdx\n"
30199         "movq    64(%%rsi), %%rax\n"
30200         "addq    %%rcx, 56(%%rdi)\n"
30201         "adcq    $0, %%rdx\n"
30202         "movq    %%rdx, %%rcx\n"
30203         "mulq    %[mult]\n"
30204         "addq    %%rax, %%rcx\n"
30205         "adcq    $0, %%rdx\n"
30206         "movq    72(%%rsi), %%rax\n"
30207         "addq    %%rcx, 64(%%rdi)\n"
30208         "adcq    $0, %%rdx\n"
30209         "movq    %%rdx, %%rcx\n"
30210         "mulq    %[mult]\n"
30211         "addq    %%rax, %%rcx\n"
30212         "adcq    $0, %%rdx\n"
30213         "movq    80(%%rsi), %%rax\n"
30214         "addq    %%rcx, 72(%%rdi)\n"
30215         "adcq    $0, %%rdx\n"
30216         "movq    %%rdx, %%rcx\n"
30217         "mulq    %[mult]\n"
30218         "addq    %%rax, %%rcx\n"
30219         "adcq    $0, %%rdx\n"
30220         "movq    88(%%rsi), %%rax\n"
30221         "addq    %%rcx, 80(%%rdi)\n"
30222         "adcq    $0, %%rdx\n"
30223         "movq    %%rdx, %%rcx\n"
30224         "mulq    %[mult]\n"
30225         "addq    %%rax, %%rcx\n"
30226         "adcq    $0, %%rdx\n"
30227         "movq    96(%%rsi), %%rax\n"
30228         "addq    %%rcx, 88(%%rdi)\n"
30229         "adcq    $0, %%rdx\n"
30230         "movq    %%rdx, %%rcx\n"
30231         "mulq    %[mult]\n"
30232         "addq    %%rax, %%rcx\n"
30233         "adcq    $0, %%rdx\n"
30234         "movq    104(%%rsi), %%rax\n"
30235         "addq    %%rcx, 96(%%rdi)\n"
30236         "adcq    $0, %%rdx\n"
30237         "movq    %%rdx, %%rcx\n"
30238         "mulq    %[mult]\n"
30239         "addq    %%rax, %%rcx\n"
30240         "adcq    $0, %%rdx\n"
30241         "addq    %%rcx, 104(%%rdi)\n"
30242         "adcq    $0, %%rdx\n"
30243         "xorq    %%rcx, %%rcx\n"
30244         "addq    %%rdx, 112(%%rdi)\n"
30245         "adcq    $0, %%rcx\n"
30246         "movq    %%rcx, %[carry]\n"
30247     : [carry]"=g"(carry), [z] "+m" (z)
30248     : [mult] "r" (c), [x] "m" (x)
30249     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
30250     return carry;
30251 }
30252 
30253 /* x has 13.5 words, z has 15.
30254  * Put (z+x*c) in z. Carry bit is lost. */
30255 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
30256 static inline
mpfq_fixmp_13_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)30257 void mpfq_fixmp_13_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
30258 {
30259     __asm__ __volatile__(
30260         "movq    %[z], %%rdi\n"
30261         "movq    %[x], %%rsi\n"
30262         "movq    0(%%rsi), %%rax\n"
30263         "mulq    %[mult]\n"
30264         "addq    %%rax, 0(%%rdi)\n"
30265         "movq    8(%%rsi), %%rax\n"
30266         "adcq    $0, %%rdx\n"
30267         "movq    %%rdx, %%rcx\n"
30268         "mulq    %[mult]\n"
30269         "addq    %%rax, %%rcx\n"
30270         "adcq    $0, %%rdx\n"
30271         "movq    16(%%rsi), %%rax\n"
30272         "addq    %%rcx, 8(%%rdi)\n"
30273         "adcq    $0, %%rdx\n"
30274         "movq    %%rdx, %%rcx\n"
30275         "mulq    %[mult]\n"
30276         "addq    %%rax, %%rcx\n"
30277         "adcq    $0, %%rdx\n"
30278         "movq    24(%%rsi), %%rax\n"
30279         "addq    %%rcx, 16(%%rdi)\n"
30280         "adcq    $0, %%rdx\n"
30281         "movq    %%rdx, %%rcx\n"
30282         "mulq    %[mult]\n"
30283         "addq    %%rax, %%rcx\n"
30284         "adcq    $0, %%rdx\n"
30285         "movq    32(%%rsi), %%rax\n"
30286         "addq    %%rcx, 24(%%rdi)\n"
30287         "adcq    $0, %%rdx\n"
30288         "movq    %%rdx, %%rcx\n"
30289         "mulq    %[mult]\n"
30290         "addq    %%rax, %%rcx\n"
30291         "adcq    $0, %%rdx\n"
30292         "movq    40(%%rsi), %%rax\n"
30293         "addq    %%rcx, 32(%%rdi)\n"
30294         "adcq    $0, %%rdx\n"
30295         "movq    %%rdx, %%rcx\n"
30296         "mulq    %[mult]\n"
30297         "addq    %%rax, %%rcx\n"
30298         "adcq    $0, %%rdx\n"
30299         "movq    48(%%rsi), %%rax\n"
30300         "addq    %%rcx, 40(%%rdi)\n"
30301         "adcq    $0, %%rdx\n"
30302         "movq    %%rdx, %%rcx\n"
30303         "mulq    %[mult]\n"
30304         "addq    %%rax, %%rcx\n"
30305         "adcq    $0, %%rdx\n"
30306         "movq    56(%%rsi), %%rax\n"
30307         "addq    %%rcx, 48(%%rdi)\n"
30308         "adcq    $0, %%rdx\n"
30309         "movq    %%rdx, %%rcx\n"
30310         "mulq    %[mult]\n"
30311         "addq    %%rax, %%rcx\n"
30312         "adcq    $0, %%rdx\n"
30313         "movq    64(%%rsi), %%rax\n"
30314         "addq    %%rcx, 56(%%rdi)\n"
30315         "adcq    $0, %%rdx\n"
30316         "movq    %%rdx, %%rcx\n"
30317         "mulq    %[mult]\n"
30318         "addq    %%rax, %%rcx\n"
30319         "adcq    $0, %%rdx\n"
30320         "movq    72(%%rsi), %%rax\n"
30321         "addq    %%rcx, 64(%%rdi)\n"
30322         "adcq    $0, %%rdx\n"
30323         "movq    %%rdx, %%rcx\n"
30324         "mulq    %[mult]\n"
30325         "addq    %%rax, %%rcx\n"
30326         "adcq    $0, %%rdx\n"
30327         "movq    80(%%rsi), %%rax\n"
30328         "addq    %%rcx, 72(%%rdi)\n"
30329         "adcq    $0, %%rdx\n"
30330         "movq    %%rdx, %%rcx\n"
30331         "mulq    %[mult]\n"
30332         "addq    %%rax, %%rcx\n"
30333         "adcq    $0, %%rdx\n"
30334         "movq    88(%%rsi), %%rax\n"
30335         "addq    %%rcx, 80(%%rdi)\n"
30336         "adcq    $0, %%rdx\n"
30337         "movq    %%rdx, %%rcx\n"
30338         "mulq    %[mult]\n"
30339         "addq    %%rax, %%rcx\n"
30340         "adcq    $0, %%rdx\n"
30341         "movq    96(%%rsi), %%rax\n"
30342         "addq    %%rcx, 88(%%rdi)\n"
30343         "adcq    $0, %%rdx\n"
30344         "movq    %%rdx, %%rcx\n"
30345         "mulq    %[mult]\n"
30346         "addq    %%rax, %%rcx\n"
30347         "adcq    $0, %%rdx\n"
30348         "movq    104(%%rsi), %%rax\n"
30349         "addq    %%rcx, 96(%%rdi)\n"
30350         "adcq    $0, %%rdx\n"
30351         "movq    %%rdx, %%rcx\n"
30352         "mulq    %[mult]\n"
30353         "addq    %%rax, %%rcx\n"
30354         "adcq    $0, %%rdx\n"
30355         "addq    %%rcx, 104(%%rdi)\n"
30356         "adcq    $0, %%rdx\n"
30357         "addq    %%rdx, 112(%%rdi)\n"
30358     : [z] "+m" (z)
30359     : [mult] "r" (c), [x] "m" (x)
30360     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
30361 }
30362 
30363 /* x has 13.5 words, z has 14.
30364  * Put (z+x*c) in z. Return carry word. */
30365 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
30366 static inline
mpfq_fixmp_13_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)30367 mp_limb_t mpfq_fixmp_13_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
30368 {
30369     mp_limb_t carry;
30370     __asm__ __volatile__(
30371         "movq    %[z], %%rdi\n"
30372         "movq    %[x], %%rsi\n"
30373         "movq    0(%%rsi), %%rax\n"
30374         "mulq    %[mult]\n"
30375         "addq    %%rax, 0(%%rdi)\n"
30376         "movq    8(%%rsi), %%rax\n"
30377         "adcq    $0, %%rdx\n"
30378         "movq    %%rdx, %%rcx\n"
30379         "mulq    %[mult]\n"
30380         "addq    %%rax, %%rcx\n"
30381         "adcq    $0, %%rdx\n"
30382         "movq    16(%%rsi), %%rax\n"
30383         "addq    %%rcx, 8(%%rdi)\n"
30384         "adcq    $0, %%rdx\n"
30385         "movq    %%rdx, %%rcx\n"
30386         "mulq    %[mult]\n"
30387         "addq    %%rax, %%rcx\n"
30388         "adcq    $0, %%rdx\n"
30389         "movq    24(%%rsi), %%rax\n"
30390         "addq    %%rcx, 16(%%rdi)\n"
30391         "adcq    $0, %%rdx\n"
30392         "movq    %%rdx, %%rcx\n"
30393         "mulq    %[mult]\n"
30394         "addq    %%rax, %%rcx\n"
30395         "adcq    $0, %%rdx\n"
30396         "movq    32(%%rsi), %%rax\n"
30397         "addq    %%rcx, 24(%%rdi)\n"
30398         "adcq    $0, %%rdx\n"
30399         "movq    %%rdx, %%rcx\n"
30400         "mulq    %[mult]\n"
30401         "addq    %%rax, %%rcx\n"
30402         "adcq    $0, %%rdx\n"
30403         "movq    40(%%rsi), %%rax\n"
30404         "addq    %%rcx, 32(%%rdi)\n"
30405         "adcq    $0, %%rdx\n"
30406         "movq    %%rdx, %%rcx\n"
30407         "mulq    %[mult]\n"
30408         "addq    %%rax, %%rcx\n"
30409         "adcq    $0, %%rdx\n"
30410         "movq    48(%%rsi), %%rax\n"
30411         "addq    %%rcx, 40(%%rdi)\n"
30412         "adcq    $0, %%rdx\n"
30413         "movq    %%rdx, %%rcx\n"
30414         "mulq    %[mult]\n"
30415         "addq    %%rax, %%rcx\n"
30416         "adcq    $0, %%rdx\n"
30417         "movq    56(%%rsi), %%rax\n"
30418         "addq    %%rcx, 48(%%rdi)\n"
30419         "adcq    $0, %%rdx\n"
30420         "movq    %%rdx, %%rcx\n"
30421         "mulq    %[mult]\n"
30422         "addq    %%rax, %%rcx\n"
30423         "adcq    $0, %%rdx\n"
30424         "movq    64(%%rsi), %%rax\n"
30425         "addq    %%rcx, 56(%%rdi)\n"
30426         "adcq    $0, %%rdx\n"
30427         "movq    %%rdx, %%rcx\n"
30428         "mulq    %[mult]\n"
30429         "addq    %%rax, %%rcx\n"
30430         "adcq    $0, %%rdx\n"
30431         "movq    72(%%rsi), %%rax\n"
30432         "addq    %%rcx, 64(%%rdi)\n"
30433         "adcq    $0, %%rdx\n"
30434         "movq    %%rdx, %%rcx\n"
30435         "mulq    %[mult]\n"
30436         "addq    %%rax, %%rcx\n"
30437         "adcq    $0, %%rdx\n"
30438         "movq    80(%%rsi), %%rax\n"
30439         "addq    %%rcx, 72(%%rdi)\n"
30440         "adcq    $0, %%rdx\n"
30441         "movq    %%rdx, %%rcx\n"
30442         "mulq    %[mult]\n"
30443         "addq    %%rax, %%rcx\n"
30444         "adcq    $0, %%rdx\n"
30445         "movq    88(%%rsi), %%rax\n"
30446         "addq    %%rcx, 80(%%rdi)\n"
30447         "adcq    $0, %%rdx\n"
30448         "movq    %%rdx, %%rcx\n"
30449         "mulq    %[mult]\n"
30450         "addq    %%rax, %%rcx\n"
30451         "adcq    $0, %%rdx\n"
30452         "movq    96(%%rsi), %%rax\n"
30453         "addq    %%rcx, 88(%%rdi)\n"
30454         "adcq    $0, %%rdx\n"
30455         "movq    %%rdx, %%rcx\n"
30456         "mulq    %[mult]\n"
30457         "addq    %%rax, %%rcx\n"
30458         "adcq    $0, %%rdx\n"
30459         "movq    104(%%rsi), %%rax\n"
30460         "addq    %%rcx, 96(%%rdi)\n"
30461         "adcq    $0, %%rdx\n"
30462         "movq    %%rdx, %%rcx\n"
30463         "mulq    %[mult]\n"
30464         "addq    %%rax, %%rcx\n"
30465         "adcq    $0, %%rdx\n"
30466         "addq    %%rcx, 104(%%rdi)\n"
30467         "adcq    $0, %%rdx\n"
30468         "movq    %%rdx, %[carry]\n"
30469     : [carry]"=g"(carry), [z] "+m" (z)
30470     : [mult] "r" (c), [x] "m" (x)
30471     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
30472     return carry;
30473 }
30474 
30475 /* x and y have 13.5 words, z has 27. Put x*y in z. */
30476 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
30477 static inline
mpfq_fixmp_13_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)30478 void mpfq_fixmp_13_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
30479 {
30480     __asm__ __volatile__(
30481         "### x*y[0]\n"
30482         "movq    %2, %%r8\n"
30483         "movq    %0, %%rdi\n"
30484         "movq    0(%%r8), %%r9\n"
30485         "movq    %1, %%rsi\n"
30486         "movq    0(%%rsi), %%rax\n"
30487         "mulq    %%r9\n"
30488         "movq    %%rax, 0(%%rdi)\n"
30489         "movq    8(%%rsi), %%rax\n"
30490         "movq    %%rdx, %%rcx\n"
30491         "mulq    %%r9\n"
30492         "addq    %%rax, %%rcx\n"
30493         "adcq    $0, %%rdx\n"
30494         "movq    16(%%rsi), %%rax\n"
30495         "movq    %%rcx, 8(%%rdi)\n"
30496         "movq    %%rdx, %%rcx\n"
30497         "mulq    %%r9\n"
30498         "addq    %%rax, %%rcx\n"
30499         "adcq    $0, %%rdx\n"
30500         "movq    24(%%rsi), %%rax\n"
30501         "movq    %%rcx, 16(%%rdi)\n"
30502         "movq    %%rdx, %%rcx\n"
30503         "mulq    %%r9\n"
30504         "addq    %%rax, %%rcx\n"
30505         "adcq    $0, %%rdx\n"
30506         "movq    32(%%rsi), %%rax\n"
30507         "movq    %%rcx, 24(%%rdi)\n"
30508         "movq    %%rdx, %%rcx\n"
30509         "mulq    %%r9\n"
30510         "addq    %%rax, %%rcx\n"
30511         "adcq    $0, %%rdx\n"
30512         "movq    40(%%rsi), %%rax\n"
30513         "movq    %%rcx, 32(%%rdi)\n"
30514         "movq    %%rdx, %%rcx\n"
30515         "mulq    %%r9\n"
30516         "addq    %%rax, %%rcx\n"
30517         "adcq    $0, %%rdx\n"
30518         "movq    48(%%rsi), %%rax\n"
30519         "movq    %%rcx, 40(%%rdi)\n"
30520         "movq    %%rdx, %%rcx\n"
30521         "mulq    %%r9\n"
30522         "addq    %%rax, %%rcx\n"
30523         "adcq    $0, %%rdx\n"
30524         "movq    56(%%rsi), %%rax\n"
30525         "movq    %%rcx, 48(%%rdi)\n"
30526         "movq    %%rdx, %%rcx\n"
30527         "mulq    %%r9\n"
30528         "addq    %%rax, %%rcx\n"
30529         "adcq    $0, %%rdx\n"
30530         "movq    64(%%rsi), %%rax\n"
30531         "movq    %%rcx, 56(%%rdi)\n"
30532         "movq    %%rdx, %%rcx\n"
30533         "mulq    %%r9\n"
30534         "addq    %%rax, %%rcx\n"
30535         "adcq    $0, %%rdx\n"
30536         "movq    72(%%rsi), %%rax\n"
30537         "movq    %%rcx, 64(%%rdi)\n"
30538         "movq    %%rdx, %%rcx\n"
30539         "mulq    %%r9\n"
30540         "addq    %%rax, %%rcx\n"
30541         "adcq    $0, %%rdx\n"
30542         "movq    80(%%rsi), %%rax\n"
30543         "movq    %%rcx, 72(%%rdi)\n"
30544         "movq    %%rdx, %%rcx\n"
30545         "mulq    %%r9\n"
30546         "addq    %%rax, %%rcx\n"
30547         "adcq    $0, %%rdx\n"
30548         "movq    88(%%rsi), %%rax\n"
30549         "movq    %%rcx, 80(%%rdi)\n"
30550         "movq    %%rdx, %%rcx\n"
30551         "mulq    %%r9\n"
30552         "addq    %%rax, %%rcx\n"
30553         "adcq    $0, %%rdx\n"
30554         "movq    96(%%rsi), %%rax\n"
30555         "movq    %%rcx, 88(%%rdi)\n"
30556         "movq    %%rdx, %%rcx\n"
30557         "mulq    %%r9\n"
30558         "addq    %%rax, %%rcx\n"
30559         "adcq    $0, %%rdx\n"
30560         "movq    104(%%rsi), %%rax\n"
30561         "movq    %%rcx, 96(%%rdi)\n"
30562         "movq    %%rdx, %%rcx\n"
30563         "mulq    %%r9\n"
30564         "addq    %%rax, %%rcx\n"
30565         "adcq    $0, %%rdx\n"
30566         "movq    %%rcx, 104(%%rdi)\n"
30567         "movq    %%rdx, 112(%%rdi)\n"
30568         "movq    $0, 120(%%rdi)\n"
30569         "movq    $0, 128(%%rdi)\n"
30570         "movq    $0, 136(%%rdi)\n"
30571         "movq    $0, 144(%%rdi)\n"
30572         "movq    $0, 152(%%rdi)\n"
30573         "movq    $0, 160(%%rdi)\n"
30574         "movq    $0, 168(%%rdi)\n"
30575         "movq    $0, 176(%%rdi)\n"
30576         "movq    $0, 184(%%rdi)\n"
30577         "movq    $0, 192(%%rdi)\n"
30578         "movq    $0, 200(%%rdi)\n"
30579         "movq    $0, 208(%%rdi)\n"
30580         "### x*y[1]\n"
30581         "movq    8(%%r8), %%r9\n"
30582         "movq    0(%%rsi), %%rax\n"
30583         "mulq    %%r9\n"
30584         "addq    %%rax, 8(%%rdi)\n"
30585         "movq    8(%%rsi), %%rax\n"
30586         "adcq    $0, %%rdx\n"
30587         "movq    %%rdx, %%rcx\n"
30588         "mulq    %%r9\n"
30589         "addq    %%rax, %%rcx\n"
30590         "adcq    $0, %%rdx\n"
30591         "movq    16(%%rsi), %%rax\n"
30592         "addq    %%rcx, 16(%%rdi)\n"
30593         "adcq    $0, %%rdx\n"
30594         "movq    %%rdx, %%rcx\n"
30595         "mulq    %%r9\n"
30596         "addq    %%rax, %%rcx\n"
30597         "adcq    $0, %%rdx\n"
30598         "movq    24(%%rsi), %%rax\n"
30599         "addq    %%rcx, 24(%%rdi)\n"
30600         "adcq    $0, %%rdx\n"
30601         "movq    %%rdx, %%rcx\n"
30602         "mulq    %%r9\n"
30603         "addq    %%rax, %%rcx\n"
30604         "adcq    $0, %%rdx\n"
30605         "movq    32(%%rsi), %%rax\n"
30606         "addq    %%rcx, 32(%%rdi)\n"
30607         "adcq    $0, %%rdx\n"
30608         "movq    %%rdx, %%rcx\n"
30609         "mulq    %%r9\n"
30610         "addq    %%rax, %%rcx\n"
30611         "adcq    $0, %%rdx\n"
30612         "movq    40(%%rsi), %%rax\n"
30613         "addq    %%rcx, 40(%%rdi)\n"
30614         "adcq    $0, %%rdx\n"
30615         "movq    %%rdx, %%rcx\n"
30616         "mulq    %%r9\n"
30617         "addq    %%rax, %%rcx\n"
30618         "adcq    $0, %%rdx\n"
30619         "movq    48(%%rsi), %%rax\n"
30620         "addq    %%rcx, 48(%%rdi)\n"
30621         "adcq    $0, %%rdx\n"
30622         "movq    %%rdx, %%rcx\n"
30623         "mulq    %%r9\n"
30624         "addq    %%rax, %%rcx\n"
30625         "adcq    $0, %%rdx\n"
30626         "movq    56(%%rsi), %%rax\n"
30627         "addq    %%rcx, 56(%%rdi)\n"
30628         "adcq    $0, %%rdx\n"
30629         "movq    %%rdx, %%rcx\n"
30630         "mulq    %%r9\n"
30631         "addq    %%rax, %%rcx\n"
30632         "adcq    $0, %%rdx\n"
30633         "movq    64(%%rsi), %%rax\n"
30634         "addq    %%rcx, 64(%%rdi)\n"
30635         "adcq    $0, %%rdx\n"
30636         "movq    %%rdx, %%rcx\n"
30637         "mulq    %%r9\n"
30638         "addq    %%rax, %%rcx\n"
30639         "adcq    $0, %%rdx\n"
30640         "movq    72(%%rsi), %%rax\n"
30641         "addq    %%rcx, 72(%%rdi)\n"
30642         "adcq    $0, %%rdx\n"
30643         "movq    %%rdx, %%rcx\n"
30644         "mulq    %%r9\n"
30645         "addq    %%rax, %%rcx\n"
30646         "adcq    $0, %%rdx\n"
30647         "movq    80(%%rsi), %%rax\n"
30648         "addq    %%rcx, 80(%%rdi)\n"
30649         "adcq    $0, %%rdx\n"
30650         "movq    %%rdx, %%rcx\n"
30651         "mulq    %%r9\n"
30652         "addq    %%rax, %%rcx\n"
30653         "adcq    $0, %%rdx\n"
30654         "movq    88(%%rsi), %%rax\n"
30655         "addq    %%rcx, 88(%%rdi)\n"
30656         "adcq    $0, %%rdx\n"
30657         "movq    %%rdx, %%rcx\n"
30658         "mulq    %%r9\n"
30659         "addq    %%rax, %%rcx\n"
30660         "adcq    $0, %%rdx\n"
30661         "movq    96(%%rsi), %%rax\n"
30662         "addq    %%rcx, 96(%%rdi)\n"
30663         "adcq    $0, %%rdx\n"
30664         "movq    %%rdx, %%rcx\n"
30665         "mulq    %%r9\n"
30666         "addq    %%rax, %%rcx\n"
30667         "adcq    $0, %%rdx\n"
30668         "movq    104(%%rsi), %%rax\n"
30669         "addq    %%rcx, 104(%%rdi)\n"
30670         "adcq    $0, %%rdx\n"
30671         "movq    %%rdx, %%rcx\n"
30672         "mulq    %%r9\n"
30673         "addq    %%rax, %%rcx\n"
30674         "adcq    $0, %%rdx\n"
30675         "addq    %%rcx, 112(%%rdi)\n"
30676         "adcq    $0, %%rdx\n"
30677         "movq    %%rdx, 120(%%rdi)\n"
30678         "### x*y[2]\n"
30679         "movq    16(%%r8), %%r9\n"
30680         "movq    0(%%rsi), %%rax\n"
30681         "mulq    %%r9\n"
30682         "addq    %%rax, 16(%%rdi)\n"
30683         "movq    8(%%rsi), %%rax\n"
30684         "adcq    $0, %%rdx\n"
30685         "movq    %%rdx, %%rcx\n"
30686         "mulq    %%r9\n"
30687         "addq    %%rax, %%rcx\n"
30688         "adcq    $0, %%rdx\n"
30689         "movq    16(%%rsi), %%rax\n"
30690         "addq    %%rcx, 24(%%rdi)\n"
30691         "adcq    $0, %%rdx\n"
30692         "movq    %%rdx, %%rcx\n"
30693         "mulq    %%r9\n"
30694         "addq    %%rax, %%rcx\n"
30695         "adcq    $0, %%rdx\n"
30696         "movq    24(%%rsi), %%rax\n"
30697         "addq    %%rcx, 32(%%rdi)\n"
30698         "adcq    $0, %%rdx\n"
30699         "movq    %%rdx, %%rcx\n"
30700         "mulq    %%r9\n"
30701         "addq    %%rax, %%rcx\n"
30702         "adcq    $0, %%rdx\n"
30703         "movq    32(%%rsi), %%rax\n"
30704         "addq    %%rcx, 40(%%rdi)\n"
30705         "adcq    $0, %%rdx\n"
30706         "movq    %%rdx, %%rcx\n"
30707         "mulq    %%r9\n"
30708         "addq    %%rax, %%rcx\n"
30709         "adcq    $0, %%rdx\n"
30710         "movq    40(%%rsi), %%rax\n"
30711         "addq    %%rcx, 48(%%rdi)\n"
30712         "adcq    $0, %%rdx\n"
30713         "movq    %%rdx, %%rcx\n"
30714         "mulq    %%r9\n"
30715         "addq    %%rax, %%rcx\n"
30716         "adcq    $0, %%rdx\n"
30717         "movq    48(%%rsi), %%rax\n"
30718         "addq    %%rcx, 56(%%rdi)\n"
30719         "adcq    $0, %%rdx\n"
30720         "movq    %%rdx, %%rcx\n"
30721         "mulq    %%r9\n"
30722         "addq    %%rax, %%rcx\n"
30723         "adcq    $0, %%rdx\n"
30724         "movq    56(%%rsi), %%rax\n"
30725         "addq    %%rcx, 64(%%rdi)\n"
30726         "adcq    $0, %%rdx\n"
30727         "movq    %%rdx, %%rcx\n"
30728         "mulq    %%r9\n"
30729         "addq    %%rax, %%rcx\n"
30730         "adcq    $0, %%rdx\n"
30731         "movq    64(%%rsi), %%rax\n"
30732         "addq    %%rcx, 72(%%rdi)\n"
30733         "adcq    $0, %%rdx\n"
30734         "movq    %%rdx, %%rcx\n"
30735         "mulq    %%r9\n"
30736         "addq    %%rax, %%rcx\n"
30737         "adcq    $0, %%rdx\n"
30738         "movq    72(%%rsi), %%rax\n"
30739         "addq    %%rcx, 80(%%rdi)\n"
30740         "adcq    $0, %%rdx\n"
30741         "movq    %%rdx, %%rcx\n"
30742         "mulq    %%r9\n"
30743         "addq    %%rax, %%rcx\n"
30744         "adcq    $0, %%rdx\n"
30745         "movq    80(%%rsi), %%rax\n"
30746         "addq    %%rcx, 88(%%rdi)\n"
30747         "adcq    $0, %%rdx\n"
30748         "movq    %%rdx, %%rcx\n"
30749         "mulq    %%r9\n"
30750         "addq    %%rax, %%rcx\n"
30751         "adcq    $0, %%rdx\n"
30752         "movq    88(%%rsi), %%rax\n"
30753         "addq    %%rcx, 96(%%rdi)\n"
30754         "adcq    $0, %%rdx\n"
30755         "movq    %%rdx, %%rcx\n"
30756         "mulq    %%r9\n"
30757         "addq    %%rax, %%rcx\n"
30758         "adcq    $0, %%rdx\n"
30759         "movq    96(%%rsi), %%rax\n"
30760         "addq    %%rcx, 104(%%rdi)\n"
30761         "adcq    $0, %%rdx\n"
30762         "movq    %%rdx, %%rcx\n"
30763         "mulq    %%r9\n"
30764         "addq    %%rax, %%rcx\n"
30765         "adcq    $0, %%rdx\n"
30766         "movq    104(%%rsi), %%rax\n"
30767         "addq    %%rcx, 112(%%rdi)\n"
30768         "adcq    $0, %%rdx\n"
30769         "movq    %%rdx, %%rcx\n"
30770         "mulq    %%r9\n"
30771         "addq    %%rax, %%rcx\n"
30772         "adcq    $0, %%rdx\n"
30773         "addq    %%rcx, 120(%%rdi)\n"
30774         "adcq    $0, %%rdx\n"
30775         "movq    %%rdx, 128(%%rdi)\n"
30776         "### x*y[3]\n"
30777         "movq    24(%%r8), %%r9\n"
30778         "movq    0(%%rsi), %%rax\n"
30779         "mulq    %%r9\n"
30780         "addq    %%rax, 24(%%rdi)\n"
30781         "movq    8(%%rsi), %%rax\n"
30782         "adcq    $0, %%rdx\n"
30783         "movq    %%rdx, %%rcx\n"
30784         "mulq    %%r9\n"
30785         "addq    %%rax, %%rcx\n"
30786         "adcq    $0, %%rdx\n"
30787         "movq    16(%%rsi), %%rax\n"
30788         "addq    %%rcx, 32(%%rdi)\n"
30789         "adcq    $0, %%rdx\n"
30790         "movq    %%rdx, %%rcx\n"
30791         "mulq    %%r9\n"
30792         "addq    %%rax, %%rcx\n"
30793         "adcq    $0, %%rdx\n"
30794         "movq    24(%%rsi), %%rax\n"
30795         "addq    %%rcx, 40(%%rdi)\n"
30796         "adcq    $0, %%rdx\n"
30797         "movq    %%rdx, %%rcx\n"
30798         "mulq    %%r9\n"
30799         "addq    %%rax, %%rcx\n"
30800         "adcq    $0, %%rdx\n"
30801         "movq    32(%%rsi), %%rax\n"
30802         "addq    %%rcx, 48(%%rdi)\n"
30803         "adcq    $0, %%rdx\n"
30804         "movq    %%rdx, %%rcx\n"
30805         "mulq    %%r9\n"
30806         "addq    %%rax, %%rcx\n"
30807         "adcq    $0, %%rdx\n"
30808         "movq    40(%%rsi), %%rax\n"
30809         "addq    %%rcx, 56(%%rdi)\n"
30810         "adcq    $0, %%rdx\n"
30811         "movq    %%rdx, %%rcx\n"
30812         "mulq    %%r9\n"
30813         "addq    %%rax, %%rcx\n"
30814         "adcq    $0, %%rdx\n"
30815         "movq    48(%%rsi), %%rax\n"
30816         "addq    %%rcx, 64(%%rdi)\n"
30817         "adcq    $0, %%rdx\n"
30818         "movq    %%rdx, %%rcx\n"
30819         "mulq    %%r9\n"
30820         "addq    %%rax, %%rcx\n"
30821         "adcq    $0, %%rdx\n"
30822         "movq    56(%%rsi), %%rax\n"
30823         "addq    %%rcx, 72(%%rdi)\n"
30824         "adcq    $0, %%rdx\n"
30825         "movq    %%rdx, %%rcx\n"
30826         "mulq    %%r9\n"
30827         "addq    %%rax, %%rcx\n"
30828         "adcq    $0, %%rdx\n"
30829         "movq    64(%%rsi), %%rax\n"
30830         "addq    %%rcx, 80(%%rdi)\n"
30831         "adcq    $0, %%rdx\n"
30832         "movq    %%rdx, %%rcx\n"
30833         "mulq    %%r9\n"
30834         "addq    %%rax, %%rcx\n"
30835         "adcq    $0, %%rdx\n"
30836         "movq    72(%%rsi), %%rax\n"
30837         "addq    %%rcx, 88(%%rdi)\n"
30838         "adcq    $0, %%rdx\n"
30839         "movq    %%rdx, %%rcx\n"
30840         "mulq    %%r9\n"
30841         "addq    %%rax, %%rcx\n"
30842         "adcq    $0, %%rdx\n"
30843         "movq    80(%%rsi), %%rax\n"
30844         "addq    %%rcx, 96(%%rdi)\n"
30845         "adcq    $0, %%rdx\n"
30846         "movq    %%rdx, %%rcx\n"
30847         "mulq    %%r9\n"
30848         "addq    %%rax, %%rcx\n"
30849         "adcq    $0, %%rdx\n"
30850         "movq    88(%%rsi), %%rax\n"
30851         "addq    %%rcx, 104(%%rdi)\n"
30852         "adcq    $0, %%rdx\n"
30853         "movq    %%rdx, %%rcx\n"
30854         "mulq    %%r9\n"
30855         "addq    %%rax, %%rcx\n"
30856         "adcq    $0, %%rdx\n"
30857         "movq    96(%%rsi), %%rax\n"
30858         "addq    %%rcx, 112(%%rdi)\n"
30859         "adcq    $0, %%rdx\n"
30860         "movq    %%rdx, %%rcx\n"
30861         "mulq    %%r9\n"
30862         "addq    %%rax, %%rcx\n"
30863         "adcq    $0, %%rdx\n"
30864         "movq    104(%%rsi), %%rax\n"
30865         "addq    %%rcx, 120(%%rdi)\n"
30866         "adcq    $0, %%rdx\n"
30867         "movq    %%rdx, %%rcx\n"
30868         "mulq    %%r9\n"
30869         "addq    %%rax, %%rcx\n"
30870         "adcq    $0, %%rdx\n"
30871         "addq    %%rcx, 128(%%rdi)\n"
30872         "adcq    $0, %%rdx\n"
30873         "movq    %%rdx, 136(%%rdi)\n"
30874         "### x*y[4]\n"
30875         "movq    32(%%r8), %%r9\n"
30876         "movq    0(%%rsi), %%rax\n"
30877         "mulq    %%r9\n"
30878         "addq    %%rax, 32(%%rdi)\n"
30879         "movq    8(%%rsi), %%rax\n"
30880         "adcq    $0, %%rdx\n"
30881         "movq    %%rdx, %%rcx\n"
30882         "mulq    %%r9\n"
30883         "addq    %%rax, %%rcx\n"
30884         "adcq    $0, %%rdx\n"
30885         "movq    16(%%rsi), %%rax\n"
30886         "addq    %%rcx, 40(%%rdi)\n"
30887         "adcq    $0, %%rdx\n"
30888         "movq    %%rdx, %%rcx\n"
30889         "mulq    %%r9\n"
30890         "addq    %%rax, %%rcx\n"
30891         "adcq    $0, %%rdx\n"
30892         "movq    24(%%rsi), %%rax\n"
30893         "addq    %%rcx, 48(%%rdi)\n"
30894         "adcq    $0, %%rdx\n"
30895         "movq    %%rdx, %%rcx\n"
30896         "mulq    %%r9\n"
30897         "addq    %%rax, %%rcx\n"
30898         "adcq    $0, %%rdx\n"
30899         "movq    32(%%rsi), %%rax\n"
30900         "addq    %%rcx, 56(%%rdi)\n"
30901         "adcq    $0, %%rdx\n"
30902         "movq    %%rdx, %%rcx\n"
30903         "mulq    %%r9\n"
30904         "addq    %%rax, %%rcx\n"
30905         "adcq    $0, %%rdx\n"
30906         "movq    40(%%rsi), %%rax\n"
30907         "addq    %%rcx, 64(%%rdi)\n"
30908         "adcq    $0, %%rdx\n"
30909         "movq    %%rdx, %%rcx\n"
30910         "mulq    %%r9\n"
30911         "addq    %%rax, %%rcx\n"
30912         "adcq    $0, %%rdx\n"
30913         "movq    48(%%rsi), %%rax\n"
30914         "addq    %%rcx, 72(%%rdi)\n"
30915         "adcq    $0, %%rdx\n"
30916         "movq    %%rdx, %%rcx\n"
30917         "mulq    %%r9\n"
30918         "addq    %%rax, %%rcx\n"
30919         "adcq    $0, %%rdx\n"
30920         "movq    56(%%rsi), %%rax\n"
30921         "addq    %%rcx, 80(%%rdi)\n"
30922         "adcq    $0, %%rdx\n"
30923         "movq    %%rdx, %%rcx\n"
30924         "mulq    %%r9\n"
30925         "addq    %%rax, %%rcx\n"
30926         "adcq    $0, %%rdx\n"
30927         "movq    64(%%rsi), %%rax\n"
30928         "addq    %%rcx, 88(%%rdi)\n"
30929         "adcq    $0, %%rdx\n"
30930         "movq    %%rdx, %%rcx\n"
30931         "mulq    %%r9\n"
30932         "addq    %%rax, %%rcx\n"
30933         "adcq    $0, %%rdx\n"
30934         "movq    72(%%rsi), %%rax\n"
30935         "addq    %%rcx, 96(%%rdi)\n"
30936         "adcq    $0, %%rdx\n"
30937         "movq    %%rdx, %%rcx\n"
30938         "mulq    %%r9\n"
30939         "addq    %%rax, %%rcx\n"
30940         "adcq    $0, %%rdx\n"
30941         "movq    80(%%rsi), %%rax\n"
30942         "addq    %%rcx, 104(%%rdi)\n"
30943         "adcq    $0, %%rdx\n"
30944         "movq    %%rdx, %%rcx\n"
30945         "mulq    %%r9\n"
30946         "addq    %%rax, %%rcx\n"
30947         "adcq    $0, %%rdx\n"
30948         "movq    88(%%rsi), %%rax\n"
30949         "addq    %%rcx, 112(%%rdi)\n"
30950         "adcq    $0, %%rdx\n"
30951         "movq    %%rdx, %%rcx\n"
30952         "mulq    %%r9\n"
30953         "addq    %%rax, %%rcx\n"
30954         "adcq    $0, %%rdx\n"
30955         "movq    96(%%rsi), %%rax\n"
30956         "addq    %%rcx, 120(%%rdi)\n"
30957         "adcq    $0, %%rdx\n"
30958         "movq    %%rdx, %%rcx\n"
30959         "mulq    %%r9\n"
30960         "addq    %%rax, %%rcx\n"
30961         "adcq    $0, %%rdx\n"
30962         "movq    104(%%rsi), %%rax\n"
30963         "addq    %%rcx, 128(%%rdi)\n"
30964         "adcq    $0, %%rdx\n"
30965         "movq    %%rdx, %%rcx\n"
30966         "mulq    %%r9\n"
30967         "addq    %%rax, %%rcx\n"
30968         "adcq    $0, %%rdx\n"
30969         "addq    %%rcx, 136(%%rdi)\n"
30970         "adcq    $0, %%rdx\n"
30971         "movq    %%rdx, 144(%%rdi)\n"
30972         "### x*y[5]\n"
30973         "movq    40(%%r8), %%r9\n"
30974         "movq    0(%%rsi), %%rax\n"
30975         "mulq    %%r9\n"
30976         "addq    %%rax, 40(%%rdi)\n"
30977         "movq    8(%%rsi), %%rax\n"
30978         "adcq    $0, %%rdx\n"
30979         "movq    %%rdx, %%rcx\n"
30980         "mulq    %%r9\n"
30981         "addq    %%rax, %%rcx\n"
30982         "adcq    $0, %%rdx\n"
30983         "movq    16(%%rsi), %%rax\n"
30984         "addq    %%rcx, 48(%%rdi)\n"
30985         "adcq    $0, %%rdx\n"
30986         "movq    %%rdx, %%rcx\n"
30987         "mulq    %%r9\n"
30988         "addq    %%rax, %%rcx\n"
30989         "adcq    $0, %%rdx\n"
30990         "movq    24(%%rsi), %%rax\n"
30991         "addq    %%rcx, 56(%%rdi)\n"
30992         "adcq    $0, %%rdx\n"
30993         "movq    %%rdx, %%rcx\n"
30994         "mulq    %%r9\n"
30995         "addq    %%rax, %%rcx\n"
30996         "adcq    $0, %%rdx\n"
30997         "movq    32(%%rsi), %%rax\n"
30998         "addq    %%rcx, 64(%%rdi)\n"
30999         "adcq    $0, %%rdx\n"
31000         "movq    %%rdx, %%rcx\n"
31001         "mulq    %%r9\n"
31002         "addq    %%rax, %%rcx\n"
31003         "adcq    $0, %%rdx\n"
31004         "movq    40(%%rsi), %%rax\n"
31005         "addq    %%rcx, 72(%%rdi)\n"
31006         "adcq    $0, %%rdx\n"
31007         "movq    %%rdx, %%rcx\n"
31008         "mulq    %%r9\n"
31009         "addq    %%rax, %%rcx\n"
31010         "adcq    $0, %%rdx\n"
31011         "movq    48(%%rsi), %%rax\n"
31012         "addq    %%rcx, 80(%%rdi)\n"
31013         "adcq    $0, %%rdx\n"
31014         "movq    %%rdx, %%rcx\n"
31015         "mulq    %%r9\n"
31016         "addq    %%rax, %%rcx\n"
31017         "adcq    $0, %%rdx\n"
31018         "movq    56(%%rsi), %%rax\n"
31019         "addq    %%rcx, 88(%%rdi)\n"
31020         "adcq    $0, %%rdx\n"
31021         "movq    %%rdx, %%rcx\n"
31022         "mulq    %%r9\n"
31023         "addq    %%rax, %%rcx\n"
31024         "adcq    $0, %%rdx\n"
31025         "movq    64(%%rsi), %%rax\n"
31026         "addq    %%rcx, 96(%%rdi)\n"
31027         "adcq    $0, %%rdx\n"
31028         "movq    %%rdx, %%rcx\n"
31029         "mulq    %%r9\n"
31030         "addq    %%rax, %%rcx\n"
31031         "adcq    $0, %%rdx\n"
31032         "movq    72(%%rsi), %%rax\n"
31033         "addq    %%rcx, 104(%%rdi)\n"
31034         "adcq    $0, %%rdx\n"
31035         "movq    %%rdx, %%rcx\n"
31036         "mulq    %%r9\n"
31037         "addq    %%rax, %%rcx\n"
31038         "adcq    $0, %%rdx\n"
31039         "movq    80(%%rsi), %%rax\n"
31040         "addq    %%rcx, 112(%%rdi)\n"
31041         "adcq    $0, %%rdx\n"
31042         "movq    %%rdx, %%rcx\n"
31043         "mulq    %%r9\n"
31044         "addq    %%rax, %%rcx\n"
31045         "adcq    $0, %%rdx\n"
31046         "movq    88(%%rsi), %%rax\n"
31047         "addq    %%rcx, 120(%%rdi)\n"
31048         "adcq    $0, %%rdx\n"
31049         "movq    %%rdx, %%rcx\n"
31050         "mulq    %%r9\n"
31051         "addq    %%rax, %%rcx\n"
31052         "adcq    $0, %%rdx\n"
31053         "movq    96(%%rsi), %%rax\n"
31054         "addq    %%rcx, 128(%%rdi)\n"
31055         "adcq    $0, %%rdx\n"
31056         "movq    %%rdx, %%rcx\n"
31057         "mulq    %%r9\n"
31058         "addq    %%rax, %%rcx\n"
31059         "adcq    $0, %%rdx\n"
31060         "movq    104(%%rsi), %%rax\n"
31061         "addq    %%rcx, 136(%%rdi)\n"
31062         "adcq    $0, %%rdx\n"
31063         "movq    %%rdx, %%rcx\n"
31064         "mulq    %%r9\n"
31065         "addq    %%rax, %%rcx\n"
31066         "adcq    $0, %%rdx\n"
31067         "addq    %%rcx, 144(%%rdi)\n"
31068         "adcq    $0, %%rdx\n"
31069         "movq    %%rdx, 152(%%rdi)\n"
31070         "### x*y[6]\n"
31071         "movq    48(%%r8), %%r9\n"
31072         "movq    0(%%rsi), %%rax\n"
31073         "mulq    %%r9\n"
31074         "addq    %%rax, 48(%%rdi)\n"
31075         "movq    8(%%rsi), %%rax\n"
31076         "adcq    $0, %%rdx\n"
31077         "movq    %%rdx, %%rcx\n"
31078         "mulq    %%r9\n"
31079         "addq    %%rax, %%rcx\n"
31080         "adcq    $0, %%rdx\n"
31081         "movq    16(%%rsi), %%rax\n"
31082         "addq    %%rcx, 56(%%rdi)\n"
31083         "adcq    $0, %%rdx\n"
31084         "movq    %%rdx, %%rcx\n"
31085         "mulq    %%r9\n"
31086         "addq    %%rax, %%rcx\n"
31087         "adcq    $0, %%rdx\n"
31088         "movq    24(%%rsi), %%rax\n"
31089         "addq    %%rcx, 64(%%rdi)\n"
31090         "adcq    $0, %%rdx\n"
31091         "movq    %%rdx, %%rcx\n"
31092         "mulq    %%r9\n"
31093         "addq    %%rax, %%rcx\n"
31094         "adcq    $0, %%rdx\n"
31095         "movq    32(%%rsi), %%rax\n"
31096         "addq    %%rcx, 72(%%rdi)\n"
31097         "adcq    $0, %%rdx\n"
31098         "movq    %%rdx, %%rcx\n"
31099         "mulq    %%r9\n"
31100         "addq    %%rax, %%rcx\n"
31101         "adcq    $0, %%rdx\n"
31102         "movq    40(%%rsi), %%rax\n"
31103         "addq    %%rcx, 80(%%rdi)\n"
31104         "adcq    $0, %%rdx\n"
31105         "movq    %%rdx, %%rcx\n"
31106         "mulq    %%r9\n"
31107         "addq    %%rax, %%rcx\n"
31108         "adcq    $0, %%rdx\n"
31109         "movq    48(%%rsi), %%rax\n"
31110         "addq    %%rcx, 88(%%rdi)\n"
31111         "adcq    $0, %%rdx\n"
31112         "movq    %%rdx, %%rcx\n"
31113         "mulq    %%r9\n"
31114         "addq    %%rax, %%rcx\n"
31115         "adcq    $0, %%rdx\n"
31116         "movq    56(%%rsi), %%rax\n"
31117         "addq    %%rcx, 96(%%rdi)\n"
31118         "adcq    $0, %%rdx\n"
31119         "movq    %%rdx, %%rcx\n"
31120         "mulq    %%r9\n"
31121         "addq    %%rax, %%rcx\n"
31122         "adcq    $0, %%rdx\n"
31123         "movq    64(%%rsi), %%rax\n"
31124         "addq    %%rcx, 104(%%rdi)\n"
31125         "adcq    $0, %%rdx\n"
31126         "movq    %%rdx, %%rcx\n"
31127         "mulq    %%r9\n"
31128         "addq    %%rax, %%rcx\n"
31129         "adcq    $0, %%rdx\n"
31130         "movq    72(%%rsi), %%rax\n"
31131         "addq    %%rcx, 112(%%rdi)\n"
31132         "adcq    $0, %%rdx\n"
31133         "movq    %%rdx, %%rcx\n"
31134         "mulq    %%r9\n"
31135         "addq    %%rax, %%rcx\n"
31136         "adcq    $0, %%rdx\n"
31137         "movq    80(%%rsi), %%rax\n"
31138         "addq    %%rcx, 120(%%rdi)\n"
31139         "adcq    $0, %%rdx\n"
31140         "movq    %%rdx, %%rcx\n"
31141         "mulq    %%r9\n"
31142         "addq    %%rax, %%rcx\n"
31143         "adcq    $0, %%rdx\n"
31144         "movq    88(%%rsi), %%rax\n"
31145         "addq    %%rcx, 128(%%rdi)\n"
31146         "adcq    $0, %%rdx\n"
31147         "movq    %%rdx, %%rcx\n"
31148         "mulq    %%r9\n"
31149         "addq    %%rax, %%rcx\n"
31150         "adcq    $0, %%rdx\n"
31151         "movq    96(%%rsi), %%rax\n"
31152         "addq    %%rcx, 136(%%rdi)\n"
31153         "adcq    $0, %%rdx\n"
31154         "movq    %%rdx, %%rcx\n"
31155         "mulq    %%r9\n"
31156         "addq    %%rax, %%rcx\n"
31157         "adcq    $0, %%rdx\n"
31158         "movq    104(%%rsi), %%rax\n"
31159         "addq    %%rcx, 144(%%rdi)\n"
31160         "adcq    $0, %%rdx\n"
31161         "movq    %%rdx, %%rcx\n"
31162         "mulq    %%r9\n"
31163         "addq    %%rax, %%rcx\n"
31164         "adcq    $0, %%rdx\n"
31165         "addq    %%rcx, 152(%%rdi)\n"
31166         "adcq    $0, %%rdx\n"
31167         "movq    %%rdx, 160(%%rdi)\n"
31168         "### x*y[7]\n"
31169         "movq    56(%%r8), %%r9\n"
31170         "movq    0(%%rsi), %%rax\n"
31171         "mulq    %%r9\n"
31172         "addq    %%rax, 56(%%rdi)\n"
31173         "movq    8(%%rsi), %%rax\n"
31174         "adcq    $0, %%rdx\n"
31175         "movq    %%rdx, %%rcx\n"
31176         "mulq    %%r9\n"
31177         "addq    %%rax, %%rcx\n"
31178         "adcq    $0, %%rdx\n"
31179         "movq    16(%%rsi), %%rax\n"
31180         "addq    %%rcx, 64(%%rdi)\n"
31181         "adcq    $0, %%rdx\n"
31182         "movq    %%rdx, %%rcx\n"
31183         "mulq    %%r9\n"
31184         "addq    %%rax, %%rcx\n"
31185         "adcq    $0, %%rdx\n"
31186         "movq    24(%%rsi), %%rax\n"
31187         "addq    %%rcx, 72(%%rdi)\n"
31188         "adcq    $0, %%rdx\n"
31189         "movq    %%rdx, %%rcx\n"
31190         "mulq    %%r9\n"
31191         "addq    %%rax, %%rcx\n"
31192         "adcq    $0, %%rdx\n"
31193         "movq    32(%%rsi), %%rax\n"
31194         "addq    %%rcx, 80(%%rdi)\n"
31195         "adcq    $0, %%rdx\n"
31196         "movq    %%rdx, %%rcx\n"
31197         "mulq    %%r9\n"
31198         "addq    %%rax, %%rcx\n"
31199         "adcq    $0, %%rdx\n"
31200         "movq    40(%%rsi), %%rax\n"
31201         "addq    %%rcx, 88(%%rdi)\n"
31202         "adcq    $0, %%rdx\n"
31203         "movq    %%rdx, %%rcx\n"
31204         "mulq    %%r9\n"
31205         "addq    %%rax, %%rcx\n"
31206         "adcq    $0, %%rdx\n"
31207         "movq    48(%%rsi), %%rax\n"
31208         "addq    %%rcx, 96(%%rdi)\n"
31209         "adcq    $0, %%rdx\n"
31210         "movq    %%rdx, %%rcx\n"
31211         "mulq    %%r9\n"
31212         "addq    %%rax, %%rcx\n"
31213         "adcq    $0, %%rdx\n"
31214         "movq    56(%%rsi), %%rax\n"
31215         "addq    %%rcx, 104(%%rdi)\n"
31216         "adcq    $0, %%rdx\n"
31217         "movq    %%rdx, %%rcx\n"
31218         "mulq    %%r9\n"
31219         "addq    %%rax, %%rcx\n"
31220         "adcq    $0, %%rdx\n"
31221         "movq    64(%%rsi), %%rax\n"
31222         "addq    %%rcx, 112(%%rdi)\n"
31223         "adcq    $0, %%rdx\n"
31224         "movq    %%rdx, %%rcx\n"
31225         "mulq    %%r9\n"
31226         "addq    %%rax, %%rcx\n"
31227         "adcq    $0, %%rdx\n"
31228         "movq    72(%%rsi), %%rax\n"
31229         "addq    %%rcx, 120(%%rdi)\n"
31230         "adcq    $0, %%rdx\n"
31231         "movq    %%rdx, %%rcx\n"
31232         "mulq    %%r9\n"
31233         "addq    %%rax, %%rcx\n"
31234         "adcq    $0, %%rdx\n"
31235         "movq    80(%%rsi), %%rax\n"
31236         "addq    %%rcx, 128(%%rdi)\n"
31237         "adcq    $0, %%rdx\n"
31238         "movq    %%rdx, %%rcx\n"
31239         "mulq    %%r9\n"
31240         "addq    %%rax, %%rcx\n"
31241         "adcq    $0, %%rdx\n"
31242         "movq    88(%%rsi), %%rax\n"
31243         "addq    %%rcx, 136(%%rdi)\n"
31244         "adcq    $0, %%rdx\n"
31245         "movq    %%rdx, %%rcx\n"
31246         "mulq    %%r9\n"
31247         "addq    %%rax, %%rcx\n"
31248         "adcq    $0, %%rdx\n"
31249         "movq    96(%%rsi), %%rax\n"
31250         "addq    %%rcx, 144(%%rdi)\n"
31251         "adcq    $0, %%rdx\n"
31252         "movq    %%rdx, %%rcx\n"
31253         "mulq    %%r9\n"
31254         "addq    %%rax, %%rcx\n"
31255         "adcq    $0, %%rdx\n"
31256         "movq    104(%%rsi), %%rax\n"
31257         "addq    %%rcx, 152(%%rdi)\n"
31258         "adcq    $0, %%rdx\n"
31259         "movq    %%rdx, %%rcx\n"
31260         "mulq    %%r9\n"
31261         "addq    %%rax, %%rcx\n"
31262         "adcq    $0, %%rdx\n"
31263         "addq    %%rcx, 160(%%rdi)\n"
31264         "adcq    $0, %%rdx\n"
31265         "movq    %%rdx, 168(%%rdi)\n"
31266         "### x*y[8]\n"
31267         "movq    64(%%r8), %%r9\n"
31268         "movq    0(%%rsi), %%rax\n"
31269         "mulq    %%r9\n"
31270         "addq    %%rax, 64(%%rdi)\n"
31271         "movq    8(%%rsi), %%rax\n"
31272         "adcq    $0, %%rdx\n"
31273         "movq    %%rdx, %%rcx\n"
31274         "mulq    %%r9\n"
31275         "addq    %%rax, %%rcx\n"
31276         "adcq    $0, %%rdx\n"
31277         "movq    16(%%rsi), %%rax\n"
31278         "addq    %%rcx, 72(%%rdi)\n"
31279         "adcq    $0, %%rdx\n"
31280         "movq    %%rdx, %%rcx\n"
31281         "mulq    %%r9\n"
31282         "addq    %%rax, %%rcx\n"
31283         "adcq    $0, %%rdx\n"
31284         "movq    24(%%rsi), %%rax\n"
31285         "addq    %%rcx, 80(%%rdi)\n"
31286         "adcq    $0, %%rdx\n"
31287         "movq    %%rdx, %%rcx\n"
31288         "mulq    %%r9\n"
31289         "addq    %%rax, %%rcx\n"
31290         "adcq    $0, %%rdx\n"
31291         "movq    32(%%rsi), %%rax\n"
31292         "addq    %%rcx, 88(%%rdi)\n"
31293         "adcq    $0, %%rdx\n"
31294         "movq    %%rdx, %%rcx\n"
31295         "mulq    %%r9\n"
31296         "addq    %%rax, %%rcx\n"
31297         "adcq    $0, %%rdx\n"
31298         "movq    40(%%rsi), %%rax\n"
31299         "addq    %%rcx, 96(%%rdi)\n"
31300         "adcq    $0, %%rdx\n"
31301         "movq    %%rdx, %%rcx\n"
31302         "mulq    %%r9\n"
31303         "addq    %%rax, %%rcx\n"
31304         "adcq    $0, %%rdx\n"
31305         "movq    48(%%rsi), %%rax\n"
31306         "addq    %%rcx, 104(%%rdi)\n"
31307         "adcq    $0, %%rdx\n"
31308         "movq    %%rdx, %%rcx\n"
31309         "mulq    %%r9\n"
31310         "addq    %%rax, %%rcx\n"
31311         "adcq    $0, %%rdx\n"
31312         "movq    56(%%rsi), %%rax\n"
31313         "addq    %%rcx, 112(%%rdi)\n"
31314         "adcq    $0, %%rdx\n"
31315         "movq    %%rdx, %%rcx\n"
31316         "mulq    %%r9\n"
31317         "addq    %%rax, %%rcx\n"
31318         "adcq    $0, %%rdx\n"
31319         "movq    64(%%rsi), %%rax\n"
31320         "addq    %%rcx, 120(%%rdi)\n"
31321         "adcq    $0, %%rdx\n"
31322         "movq    %%rdx, %%rcx\n"
31323         "mulq    %%r9\n"
31324         "addq    %%rax, %%rcx\n"
31325         "adcq    $0, %%rdx\n"
31326         "movq    72(%%rsi), %%rax\n"
31327         "addq    %%rcx, 128(%%rdi)\n"
31328         "adcq    $0, %%rdx\n"
31329         "movq    %%rdx, %%rcx\n"
31330         "mulq    %%r9\n"
31331         "addq    %%rax, %%rcx\n"
31332         "adcq    $0, %%rdx\n"
31333         "movq    80(%%rsi), %%rax\n"
31334         "addq    %%rcx, 136(%%rdi)\n"
31335         "adcq    $0, %%rdx\n"
31336         "movq    %%rdx, %%rcx\n"
31337         "mulq    %%r9\n"
31338         "addq    %%rax, %%rcx\n"
31339         "adcq    $0, %%rdx\n"
31340         "movq    88(%%rsi), %%rax\n"
31341         "addq    %%rcx, 144(%%rdi)\n"
31342         "adcq    $0, %%rdx\n"
31343         "movq    %%rdx, %%rcx\n"
31344         "mulq    %%r9\n"
31345         "addq    %%rax, %%rcx\n"
31346         "adcq    $0, %%rdx\n"
31347         "movq    96(%%rsi), %%rax\n"
31348         "addq    %%rcx, 152(%%rdi)\n"
31349         "adcq    $0, %%rdx\n"
31350         "movq    %%rdx, %%rcx\n"
31351         "mulq    %%r9\n"
31352         "addq    %%rax, %%rcx\n"
31353         "adcq    $0, %%rdx\n"
31354         "movq    104(%%rsi), %%rax\n"
31355         "addq    %%rcx, 160(%%rdi)\n"
31356         "adcq    $0, %%rdx\n"
31357         "movq    %%rdx, %%rcx\n"
31358         "mulq    %%r9\n"
31359         "addq    %%rax, %%rcx\n"
31360         "adcq    $0, %%rdx\n"
31361         "addq    %%rcx, 168(%%rdi)\n"
31362         "adcq    $0, %%rdx\n"
31363         "movq    %%rdx, 176(%%rdi)\n"
31364         "### x*y[9]\n"
31365         "movq    72(%%r8), %%r9\n"
31366         "movq    0(%%rsi), %%rax\n"
31367         "mulq    %%r9\n"
31368         "addq    %%rax, 72(%%rdi)\n"
31369         "movq    8(%%rsi), %%rax\n"
31370         "adcq    $0, %%rdx\n"
31371         "movq    %%rdx, %%rcx\n"
31372         "mulq    %%r9\n"
31373         "addq    %%rax, %%rcx\n"
31374         "adcq    $0, %%rdx\n"
31375         "movq    16(%%rsi), %%rax\n"
31376         "addq    %%rcx, 80(%%rdi)\n"
31377         "adcq    $0, %%rdx\n"
31378         "movq    %%rdx, %%rcx\n"
31379         "mulq    %%r9\n"
31380         "addq    %%rax, %%rcx\n"
31381         "adcq    $0, %%rdx\n"
31382         "movq    24(%%rsi), %%rax\n"
31383         "addq    %%rcx, 88(%%rdi)\n"
31384         "adcq    $0, %%rdx\n"
31385         "movq    %%rdx, %%rcx\n"
31386         "mulq    %%r9\n"
31387         "addq    %%rax, %%rcx\n"
31388         "adcq    $0, %%rdx\n"
31389         "movq    32(%%rsi), %%rax\n"
31390         "addq    %%rcx, 96(%%rdi)\n"
31391         "adcq    $0, %%rdx\n"
31392         "movq    %%rdx, %%rcx\n"
31393         "mulq    %%r9\n"
31394         "addq    %%rax, %%rcx\n"
31395         "adcq    $0, %%rdx\n"
31396         "movq    40(%%rsi), %%rax\n"
31397         "addq    %%rcx, 104(%%rdi)\n"
31398         "adcq    $0, %%rdx\n"
31399         "movq    %%rdx, %%rcx\n"
31400         "mulq    %%r9\n"
31401         "addq    %%rax, %%rcx\n"
31402         "adcq    $0, %%rdx\n"
31403         "movq    48(%%rsi), %%rax\n"
31404         "addq    %%rcx, 112(%%rdi)\n"
31405         "adcq    $0, %%rdx\n"
31406         "movq    %%rdx, %%rcx\n"
31407         "mulq    %%r9\n"
31408         "addq    %%rax, %%rcx\n"
31409         "adcq    $0, %%rdx\n"
31410         "movq    56(%%rsi), %%rax\n"
31411         "addq    %%rcx, 120(%%rdi)\n"
31412         "adcq    $0, %%rdx\n"
31413         "movq    %%rdx, %%rcx\n"
31414         "mulq    %%r9\n"
31415         "addq    %%rax, %%rcx\n"
31416         "adcq    $0, %%rdx\n"
31417         "movq    64(%%rsi), %%rax\n"
31418         "addq    %%rcx, 128(%%rdi)\n"
31419         "adcq    $0, %%rdx\n"
31420         "movq    %%rdx, %%rcx\n"
31421         "mulq    %%r9\n"
31422         "addq    %%rax, %%rcx\n"
31423         "adcq    $0, %%rdx\n"
31424         "movq    72(%%rsi), %%rax\n"
31425         "addq    %%rcx, 136(%%rdi)\n"
31426         "adcq    $0, %%rdx\n"
31427         "movq    %%rdx, %%rcx\n"
31428         "mulq    %%r9\n"
31429         "addq    %%rax, %%rcx\n"
31430         "adcq    $0, %%rdx\n"
31431         "movq    80(%%rsi), %%rax\n"
31432         "addq    %%rcx, 144(%%rdi)\n"
31433         "adcq    $0, %%rdx\n"
31434         "movq    %%rdx, %%rcx\n"
31435         "mulq    %%r9\n"
31436         "addq    %%rax, %%rcx\n"
31437         "adcq    $0, %%rdx\n"
31438         "movq    88(%%rsi), %%rax\n"
31439         "addq    %%rcx, 152(%%rdi)\n"
31440         "adcq    $0, %%rdx\n"
31441         "movq    %%rdx, %%rcx\n"
31442         "mulq    %%r9\n"
31443         "addq    %%rax, %%rcx\n"
31444         "adcq    $0, %%rdx\n"
31445         "movq    96(%%rsi), %%rax\n"
31446         "addq    %%rcx, 160(%%rdi)\n"
31447         "adcq    $0, %%rdx\n"
31448         "movq    %%rdx, %%rcx\n"
31449         "mulq    %%r9\n"
31450         "addq    %%rax, %%rcx\n"
31451         "adcq    $0, %%rdx\n"
31452         "movq    104(%%rsi), %%rax\n"
31453         "addq    %%rcx, 168(%%rdi)\n"
31454         "adcq    $0, %%rdx\n"
31455         "movq    %%rdx, %%rcx\n"
31456         "mulq    %%r9\n"
31457         "addq    %%rax, %%rcx\n"
31458         "adcq    $0, %%rdx\n"
31459         "addq    %%rcx, 176(%%rdi)\n"
31460         "adcq    $0, %%rdx\n"
31461         "movq    %%rdx, 184(%%rdi)\n"
31462         "### x*y[10]\n"
31463         "movq    80(%%r8), %%r9\n"
31464         "movq    0(%%rsi), %%rax\n"
31465         "mulq    %%r9\n"
31466         "addq    %%rax, 80(%%rdi)\n"
31467         "movq    8(%%rsi), %%rax\n"
31468         "adcq    $0, %%rdx\n"
31469         "movq    %%rdx, %%rcx\n"
31470         "mulq    %%r9\n"
31471         "addq    %%rax, %%rcx\n"
31472         "adcq    $0, %%rdx\n"
31473         "movq    16(%%rsi), %%rax\n"
31474         "addq    %%rcx, 88(%%rdi)\n"
31475         "adcq    $0, %%rdx\n"
31476         "movq    %%rdx, %%rcx\n"
31477         "mulq    %%r9\n"
31478         "addq    %%rax, %%rcx\n"
31479         "adcq    $0, %%rdx\n"
31480         "movq    24(%%rsi), %%rax\n"
31481         "addq    %%rcx, 96(%%rdi)\n"
31482         "adcq    $0, %%rdx\n"
31483         "movq    %%rdx, %%rcx\n"
31484         "mulq    %%r9\n"
31485         "addq    %%rax, %%rcx\n"
31486         "adcq    $0, %%rdx\n"
31487         "movq    32(%%rsi), %%rax\n"
31488         "addq    %%rcx, 104(%%rdi)\n"
31489         "adcq    $0, %%rdx\n"
31490         "movq    %%rdx, %%rcx\n"
31491         "mulq    %%r9\n"
31492         "addq    %%rax, %%rcx\n"
31493         "adcq    $0, %%rdx\n"
31494         "movq    40(%%rsi), %%rax\n"
31495         "addq    %%rcx, 112(%%rdi)\n"
31496         "adcq    $0, %%rdx\n"
31497         "movq    %%rdx, %%rcx\n"
31498         "mulq    %%r9\n"
31499         "addq    %%rax, %%rcx\n"
31500         "adcq    $0, %%rdx\n"
31501         "movq    48(%%rsi), %%rax\n"
31502         "addq    %%rcx, 120(%%rdi)\n"
31503         "adcq    $0, %%rdx\n"
31504         "movq    %%rdx, %%rcx\n"
31505         "mulq    %%r9\n"
31506         "addq    %%rax, %%rcx\n"
31507         "adcq    $0, %%rdx\n"
31508         "movq    56(%%rsi), %%rax\n"
31509         "addq    %%rcx, 128(%%rdi)\n"
31510         "adcq    $0, %%rdx\n"
31511         "movq    %%rdx, %%rcx\n"
31512         "mulq    %%r9\n"
31513         "addq    %%rax, %%rcx\n"
31514         "adcq    $0, %%rdx\n"
31515         "movq    64(%%rsi), %%rax\n"
31516         "addq    %%rcx, 136(%%rdi)\n"
31517         "adcq    $0, %%rdx\n"
31518         "movq    %%rdx, %%rcx\n"
31519         "mulq    %%r9\n"
31520         "addq    %%rax, %%rcx\n"
31521         "adcq    $0, %%rdx\n"
31522         "movq    72(%%rsi), %%rax\n"
31523         "addq    %%rcx, 144(%%rdi)\n"
31524         "adcq    $0, %%rdx\n"
31525         "movq    %%rdx, %%rcx\n"
31526         "mulq    %%r9\n"
31527         "addq    %%rax, %%rcx\n"
31528         "adcq    $0, %%rdx\n"
31529         "movq    80(%%rsi), %%rax\n"
31530         "addq    %%rcx, 152(%%rdi)\n"
31531         "adcq    $0, %%rdx\n"
31532         "movq    %%rdx, %%rcx\n"
31533         "mulq    %%r9\n"
31534         "addq    %%rax, %%rcx\n"
31535         "adcq    $0, %%rdx\n"
31536         "movq    88(%%rsi), %%rax\n"
31537         "addq    %%rcx, 160(%%rdi)\n"
31538         "adcq    $0, %%rdx\n"
31539         "movq    %%rdx, %%rcx\n"
31540         "mulq    %%r9\n"
31541         "addq    %%rax, %%rcx\n"
31542         "adcq    $0, %%rdx\n"
31543         "movq    96(%%rsi), %%rax\n"
31544         "addq    %%rcx, 168(%%rdi)\n"
31545         "adcq    $0, %%rdx\n"
31546         "movq    %%rdx, %%rcx\n"
31547         "mulq    %%r9\n"
31548         "addq    %%rax, %%rcx\n"
31549         "adcq    $0, %%rdx\n"
31550         "movq    104(%%rsi), %%rax\n"
31551         "addq    %%rcx, 176(%%rdi)\n"
31552         "adcq    $0, %%rdx\n"
31553         "movq    %%rdx, %%rcx\n"
31554         "mulq    %%r9\n"
31555         "addq    %%rax, %%rcx\n"
31556         "adcq    $0, %%rdx\n"
31557         "addq    %%rcx, 184(%%rdi)\n"
31558         "adcq    $0, %%rdx\n"
31559         "movq    %%rdx, 192(%%rdi)\n"
31560         "### x*y[11]\n"
31561         "movq    88(%%r8), %%r9\n"
31562         "movq    0(%%rsi), %%rax\n"
31563         "mulq    %%r9\n"
31564         "addq    %%rax, 88(%%rdi)\n"
31565         "movq    8(%%rsi), %%rax\n"
31566         "adcq    $0, %%rdx\n"
31567         "movq    %%rdx, %%rcx\n"
31568         "mulq    %%r9\n"
31569         "addq    %%rax, %%rcx\n"
31570         "adcq    $0, %%rdx\n"
31571         "movq    16(%%rsi), %%rax\n"
31572         "addq    %%rcx, 96(%%rdi)\n"
31573         "adcq    $0, %%rdx\n"
31574         "movq    %%rdx, %%rcx\n"
31575         "mulq    %%r9\n"
31576         "addq    %%rax, %%rcx\n"
31577         "adcq    $0, %%rdx\n"
31578         "movq    24(%%rsi), %%rax\n"
31579         "addq    %%rcx, 104(%%rdi)\n"
31580         "adcq    $0, %%rdx\n"
31581         "movq    %%rdx, %%rcx\n"
31582         "mulq    %%r9\n"
31583         "addq    %%rax, %%rcx\n"
31584         "adcq    $0, %%rdx\n"
31585         "movq    32(%%rsi), %%rax\n"
31586         "addq    %%rcx, 112(%%rdi)\n"
31587         "adcq    $0, %%rdx\n"
31588         "movq    %%rdx, %%rcx\n"
31589         "mulq    %%r9\n"
31590         "addq    %%rax, %%rcx\n"
31591         "adcq    $0, %%rdx\n"
31592         "movq    40(%%rsi), %%rax\n"
31593         "addq    %%rcx, 120(%%rdi)\n"
31594         "adcq    $0, %%rdx\n"
31595         "movq    %%rdx, %%rcx\n"
31596         "mulq    %%r9\n"
31597         "addq    %%rax, %%rcx\n"
31598         "adcq    $0, %%rdx\n"
31599         "movq    48(%%rsi), %%rax\n"
31600         "addq    %%rcx, 128(%%rdi)\n"
31601         "adcq    $0, %%rdx\n"
31602         "movq    %%rdx, %%rcx\n"
31603         "mulq    %%r9\n"
31604         "addq    %%rax, %%rcx\n"
31605         "adcq    $0, %%rdx\n"
31606         "movq    56(%%rsi), %%rax\n"
31607         "addq    %%rcx, 136(%%rdi)\n"
31608         "adcq    $0, %%rdx\n"
31609         "movq    %%rdx, %%rcx\n"
31610         "mulq    %%r9\n"
31611         "addq    %%rax, %%rcx\n"
31612         "adcq    $0, %%rdx\n"
31613         "movq    64(%%rsi), %%rax\n"
31614         "addq    %%rcx, 144(%%rdi)\n"
31615         "adcq    $0, %%rdx\n"
31616         "movq    %%rdx, %%rcx\n"
31617         "mulq    %%r9\n"
31618         "addq    %%rax, %%rcx\n"
31619         "adcq    $0, %%rdx\n"
31620         "movq    72(%%rsi), %%rax\n"
31621         "addq    %%rcx, 152(%%rdi)\n"
31622         "adcq    $0, %%rdx\n"
31623         "movq    %%rdx, %%rcx\n"
31624         "mulq    %%r9\n"
31625         "addq    %%rax, %%rcx\n"
31626         "adcq    $0, %%rdx\n"
31627         "movq    80(%%rsi), %%rax\n"
31628         "addq    %%rcx, 160(%%rdi)\n"
31629         "adcq    $0, %%rdx\n"
31630         "movq    %%rdx, %%rcx\n"
31631         "mulq    %%r9\n"
31632         "addq    %%rax, %%rcx\n"
31633         "adcq    $0, %%rdx\n"
31634         "movq    88(%%rsi), %%rax\n"
31635         "addq    %%rcx, 168(%%rdi)\n"
31636         "adcq    $0, %%rdx\n"
31637         "movq    %%rdx, %%rcx\n"
31638         "mulq    %%r9\n"
31639         "addq    %%rax, %%rcx\n"
31640         "adcq    $0, %%rdx\n"
31641         "movq    96(%%rsi), %%rax\n"
31642         "addq    %%rcx, 176(%%rdi)\n"
31643         "adcq    $0, %%rdx\n"
31644         "movq    %%rdx, %%rcx\n"
31645         "mulq    %%r9\n"
31646         "addq    %%rax, %%rcx\n"
31647         "adcq    $0, %%rdx\n"
31648         "movq    104(%%rsi), %%rax\n"
31649         "addq    %%rcx, 184(%%rdi)\n"
31650         "adcq    $0, %%rdx\n"
31651         "movq    %%rdx, %%rcx\n"
31652         "mulq    %%r9\n"
31653         "addq    %%rax, %%rcx\n"
31654         "adcq    $0, %%rdx\n"
31655         "addq    %%rcx, 192(%%rdi)\n"
31656         "adcq    $0, %%rdx\n"
31657         "movq    %%rdx, 200(%%rdi)\n"
31658         "### x*y[12]\n"
31659         "movq    96(%%r8), %%r9\n"
31660         "movq    0(%%rsi), %%rax\n"
31661         "mulq    %%r9\n"
31662         "addq    %%rax, 96(%%rdi)\n"
31663         "movq    8(%%rsi), %%rax\n"
31664         "adcq    $0, %%rdx\n"
31665         "movq    %%rdx, %%rcx\n"
31666         "mulq    %%r9\n"
31667         "addq    %%rax, %%rcx\n"
31668         "adcq    $0, %%rdx\n"
31669         "movq    16(%%rsi), %%rax\n"
31670         "addq    %%rcx, 104(%%rdi)\n"
31671         "adcq    $0, %%rdx\n"
31672         "movq    %%rdx, %%rcx\n"
31673         "mulq    %%r9\n"
31674         "addq    %%rax, %%rcx\n"
31675         "adcq    $0, %%rdx\n"
31676         "movq    24(%%rsi), %%rax\n"
31677         "addq    %%rcx, 112(%%rdi)\n"
31678         "adcq    $0, %%rdx\n"
31679         "movq    %%rdx, %%rcx\n"
31680         "mulq    %%r9\n"
31681         "addq    %%rax, %%rcx\n"
31682         "adcq    $0, %%rdx\n"
31683         "movq    32(%%rsi), %%rax\n"
31684         "addq    %%rcx, 120(%%rdi)\n"
31685         "adcq    $0, %%rdx\n"
31686         "movq    %%rdx, %%rcx\n"
31687         "mulq    %%r9\n"
31688         "addq    %%rax, %%rcx\n"
31689         "adcq    $0, %%rdx\n"
31690         "movq    40(%%rsi), %%rax\n"
31691         "addq    %%rcx, 128(%%rdi)\n"
31692         "adcq    $0, %%rdx\n"
31693         "movq    %%rdx, %%rcx\n"
31694         "mulq    %%r9\n"
31695         "addq    %%rax, %%rcx\n"
31696         "adcq    $0, %%rdx\n"
31697         "movq    48(%%rsi), %%rax\n"
31698         "addq    %%rcx, 136(%%rdi)\n"
31699         "adcq    $0, %%rdx\n"
31700         "movq    %%rdx, %%rcx\n"
31701         "mulq    %%r9\n"
31702         "addq    %%rax, %%rcx\n"
31703         "adcq    $0, %%rdx\n"
31704         "movq    56(%%rsi), %%rax\n"
31705         "addq    %%rcx, 144(%%rdi)\n"
31706         "adcq    $0, %%rdx\n"
31707         "movq    %%rdx, %%rcx\n"
31708         "mulq    %%r9\n"
31709         "addq    %%rax, %%rcx\n"
31710         "adcq    $0, %%rdx\n"
31711         "movq    64(%%rsi), %%rax\n"
31712         "addq    %%rcx, 152(%%rdi)\n"
31713         "adcq    $0, %%rdx\n"
31714         "movq    %%rdx, %%rcx\n"
31715         "mulq    %%r9\n"
31716         "addq    %%rax, %%rcx\n"
31717         "adcq    $0, %%rdx\n"
31718         "movq    72(%%rsi), %%rax\n"
31719         "addq    %%rcx, 160(%%rdi)\n"
31720         "adcq    $0, %%rdx\n"
31721         "movq    %%rdx, %%rcx\n"
31722         "mulq    %%r9\n"
31723         "addq    %%rax, %%rcx\n"
31724         "adcq    $0, %%rdx\n"
31725         "movq    80(%%rsi), %%rax\n"
31726         "addq    %%rcx, 168(%%rdi)\n"
31727         "adcq    $0, %%rdx\n"
31728         "movq    %%rdx, %%rcx\n"
31729         "mulq    %%r9\n"
31730         "addq    %%rax, %%rcx\n"
31731         "adcq    $0, %%rdx\n"
31732         "movq    88(%%rsi), %%rax\n"
31733         "addq    %%rcx, 176(%%rdi)\n"
31734         "adcq    $0, %%rdx\n"
31735         "movq    %%rdx, %%rcx\n"
31736         "mulq    %%r9\n"
31737         "addq    %%rax, %%rcx\n"
31738         "adcq    $0, %%rdx\n"
31739         "movq    96(%%rsi), %%rax\n"
31740         "addq    %%rcx, 184(%%rdi)\n"
31741         "adcq    $0, %%rdx\n"
31742         "movq    %%rdx, %%rcx\n"
31743         "mulq    %%r9\n"
31744         "addq    %%rax, %%rcx\n"
31745         "adcq    $0, %%rdx\n"
31746         "movq    104(%%rsi), %%rax\n"
31747         "addq    %%rcx, 192(%%rdi)\n"
31748         "adcq    $0, %%rdx\n"
31749         "movq    %%rdx, %%rcx\n"
31750         "mulq    %%r9\n"
31751         "addq    %%rax, %%rcx\n"
31752         "adcq    $0, %%rdx\n"
31753         "addq    %%rcx, 200(%%rdi)\n"
31754         "adcq    $0, %%rdx\n"
31755         "movq    %%rdx, 208(%%rdi)\n"
31756         "### x*y[13]\n"
31757         "movq    104(%%r8), %%r9\n"
31758         "movq    0(%%rsi), %%rax\n"
31759         "mulq    %%r9\n"
31760         "addq    %%rax, 104(%%rdi)\n"
31761         "movq    8(%%rsi), %%rax\n"
31762         "adcq    $0, %%rdx\n"
31763         "movq    %%rdx, %%rcx\n"
31764         "mulq    %%r9\n"
31765         "addq    %%rax, %%rcx\n"
31766         "adcq    $0, %%rdx\n"
31767         "movq    16(%%rsi), %%rax\n"
31768         "addq    %%rcx, 112(%%rdi)\n"
31769         "adcq    $0, %%rdx\n"
31770         "movq    %%rdx, %%rcx\n"
31771         "mulq    %%r9\n"
31772         "addq    %%rax, %%rcx\n"
31773         "adcq    $0, %%rdx\n"
31774         "movq    24(%%rsi), %%rax\n"
31775         "addq    %%rcx, 120(%%rdi)\n"
31776         "adcq    $0, %%rdx\n"
31777         "movq    %%rdx, %%rcx\n"
31778         "mulq    %%r9\n"
31779         "addq    %%rax, %%rcx\n"
31780         "adcq    $0, %%rdx\n"
31781         "movq    32(%%rsi), %%rax\n"
31782         "addq    %%rcx, 128(%%rdi)\n"
31783         "adcq    $0, %%rdx\n"
31784         "movq    %%rdx, %%rcx\n"
31785         "mulq    %%r9\n"
31786         "addq    %%rax, %%rcx\n"
31787         "adcq    $0, %%rdx\n"
31788         "movq    40(%%rsi), %%rax\n"
31789         "addq    %%rcx, 136(%%rdi)\n"
31790         "adcq    $0, %%rdx\n"
31791         "movq    %%rdx, %%rcx\n"
31792         "mulq    %%r9\n"
31793         "addq    %%rax, %%rcx\n"
31794         "adcq    $0, %%rdx\n"
31795         "movq    48(%%rsi), %%rax\n"
31796         "addq    %%rcx, 144(%%rdi)\n"
31797         "adcq    $0, %%rdx\n"
31798         "movq    %%rdx, %%rcx\n"
31799         "mulq    %%r9\n"
31800         "addq    %%rax, %%rcx\n"
31801         "adcq    $0, %%rdx\n"
31802         "movq    56(%%rsi), %%rax\n"
31803         "addq    %%rcx, 152(%%rdi)\n"
31804         "adcq    $0, %%rdx\n"
31805         "movq    %%rdx, %%rcx\n"
31806         "mulq    %%r9\n"
31807         "addq    %%rax, %%rcx\n"
31808         "adcq    $0, %%rdx\n"
31809         "movq    64(%%rsi), %%rax\n"
31810         "addq    %%rcx, 160(%%rdi)\n"
31811         "adcq    $0, %%rdx\n"
31812         "movq    %%rdx, %%rcx\n"
31813         "mulq    %%r9\n"
31814         "addq    %%rax, %%rcx\n"
31815         "adcq    $0, %%rdx\n"
31816         "movq    72(%%rsi), %%rax\n"
31817         "addq    %%rcx, 168(%%rdi)\n"
31818         "adcq    $0, %%rdx\n"
31819         "movq    %%rdx, %%rcx\n"
31820         "mulq    %%r9\n"
31821         "addq    %%rax, %%rcx\n"
31822         "adcq    $0, %%rdx\n"
31823         "movq    80(%%rsi), %%rax\n"
31824         "addq    %%rcx, 176(%%rdi)\n"
31825         "adcq    $0, %%rdx\n"
31826         "movq    %%rdx, %%rcx\n"
31827         "mulq    %%r9\n"
31828         "addq    %%rax, %%rcx\n"
31829         "adcq    $0, %%rdx\n"
31830         "movq    88(%%rsi), %%rax\n"
31831         "addq    %%rcx, 184(%%rdi)\n"
31832         "adcq    $0, %%rdx\n"
31833         "movq    %%rdx, %%rcx\n"
31834         "mulq    %%r9\n"
31835         "addq    %%rax, %%rcx\n"
31836         "adcq    $0, %%rdx\n"
31837         "movq    96(%%rsi), %%rax\n"
31838         "addq    %%rcx, 192(%%rdi)\n"
31839         "adcq    $0, %%rdx\n"
31840         "movq    %%rdx, %%rcx\n"
31841         "mulq    %%r9\n"
31842         "addq    %%rax, %%rcx\n"
31843         "adcq    $0, %%rdx\n"
31844         "movq    104(%%rsi), %%rax\n"
31845         "addq    %%rcx, 200(%%rdi)\n"
31846         "adcq    $0, %%rdx\n"
31847         "movq    %%rdx, %%rcx\n"
31848         "mulq    %%r9\n"
31849         "addq    %%rax, %%rcx\n"
31850         "adcq    $0, %%rdx\n"
31851         "addq    %%rcx, 208(%%rdi)\n"
31852       : "+m" (z)
31853       : "m" (x), "m" (y)
31854       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
31855 }
31856 
31857 /* x has 13.5 words, z has 27. Put x*y in z. */
31858 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
31859 static inline
mpfq_fixmp_13_5_sqr(mp_limb_t * z,const mp_limb_t * x)31860 void mpfq_fixmp_13_5_sqr(mp_limb_t * z, const mp_limb_t * x)
31861 {
31862     mpfq_fixmp_13_5_mul(z, x, x);
31863 }
31864 
31865 /* x has 13.5 words, z has 15. Put x*y in z. */
31866 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
31867 static inline
mpfq_fixmp_13_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)31868 void mpfq_fixmp_13_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
31869 {
31870     __asm__ __volatile__(
31871         "movq    %[z], %%rdi\n"
31872         "movq    %[x], %%rsi\n"
31873         "movq    0(%%rsi), %%rax\n"
31874         "mulq    %[mult]\n"
31875         "movq    %%rax, 0(%%rdi)\n"
31876         "movq    8(%%rsi), %%rax\n"
31877         "movq    %%rdx, %%rcx\n"
31878         "mulq    %[mult]\n"
31879         "addq    %%rax, %%rcx\n"
31880         "adcq    $0, %%rdx\n"
31881         "movq    16(%%rsi), %%rax\n"
31882         "movq    %%rcx, 8(%%rdi)\n"
31883         "movq    %%rdx, %%rcx\n"
31884         "mulq    %[mult]\n"
31885         "addq    %%rax, %%rcx\n"
31886         "adcq    $0, %%rdx\n"
31887         "movq    24(%%rsi), %%rax\n"
31888         "movq    %%rcx, 16(%%rdi)\n"
31889         "movq    %%rdx, %%rcx\n"
31890         "mulq    %[mult]\n"
31891         "addq    %%rax, %%rcx\n"
31892         "adcq    $0, %%rdx\n"
31893         "movq    32(%%rsi), %%rax\n"
31894         "movq    %%rcx, 24(%%rdi)\n"
31895         "movq    %%rdx, %%rcx\n"
31896         "mulq    %[mult]\n"
31897         "addq    %%rax, %%rcx\n"
31898         "adcq    $0, %%rdx\n"
31899         "movq    40(%%rsi), %%rax\n"
31900         "movq    %%rcx, 32(%%rdi)\n"
31901         "movq    %%rdx, %%rcx\n"
31902         "mulq    %[mult]\n"
31903         "addq    %%rax, %%rcx\n"
31904         "adcq    $0, %%rdx\n"
31905         "movq    48(%%rsi), %%rax\n"
31906         "movq    %%rcx, 40(%%rdi)\n"
31907         "movq    %%rdx, %%rcx\n"
31908         "mulq    %[mult]\n"
31909         "addq    %%rax, %%rcx\n"
31910         "adcq    $0, %%rdx\n"
31911         "movq    56(%%rsi), %%rax\n"
31912         "movq    %%rcx, 48(%%rdi)\n"
31913         "movq    %%rdx, %%rcx\n"
31914         "mulq    %[mult]\n"
31915         "addq    %%rax, %%rcx\n"
31916         "adcq    $0, %%rdx\n"
31917         "movq    64(%%rsi), %%rax\n"
31918         "movq    %%rcx, 56(%%rdi)\n"
31919         "movq    %%rdx, %%rcx\n"
31920         "mulq    %[mult]\n"
31921         "addq    %%rax, %%rcx\n"
31922         "adcq    $0, %%rdx\n"
31923         "movq    72(%%rsi), %%rax\n"
31924         "movq    %%rcx, 64(%%rdi)\n"
31925         "movq    %%rdx, %%rcx\n"
31926         "mulq    %[mult]\n"
31927         "addq    %%rax, %%rcx\n"
31928         "adcq    $0, %%rdx\n"
31929         "movq    80(%%rsi), %%rax\n"
31930         "movq    %%rcx, 72(%%rdi)\n"
31931         "movq    %%rdx, %%rcx\n"
31932         "mulq    %[mult]\n"
31933         "addq    %%rax, %%rcx\n"
31934         "adcq    $0, %%rdx\n"
31935         "movq    88(%%rsi), %%rax\n"
31936         "movq    %%rcx, 80(%%rdi)\n"
31937         "movq    %%rdx, %%rcx\n"
31938         "mulq    %[mult]\n"
31939         "addq    %%rax, %%rcx\n"
31940         "adcq    $0, %%rdx\n"
31941         "movq    96(%%rsi), %%rax\n"
31942         "movq    %%rcx, 88(%%rdi)\n"
31943         "movq    %%rdx, %%rcx\n"
31944         "mulq    %[mult]\n"
31945         "addq    %%rax, %%rcx\n"
31946         "adcq    $0, %%rdx\n"
31947         "movq    104(%%rsi), %%rax\n"
31948         "movq    %%rcx, 96(%%rdi)\n"
31949         "movq    %%rdx, %%rcx\n"
31950         "mulq    %[mult]\n"
31951         "addq    %%rax, %%rcx\n"
31952         "adcq    $0, %%rdx\n"
31953         "movq    %%rcx, 104(%%rdi)\n"
31954         "movq    %%rdx, 112(%%rdi)\n"
31955     :
31956     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
31957     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
31958 }
31959 
31960 /* x has 13.5 words, z has 14. c is 0.5 word.
31961  * Put (z+x*c) in z. Return carry bit. */
31962 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
31963 static inline
mpfq_fixmp_13_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)31964 mp_limb_t mpfq_fixmp_13_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
31965 {
31966     mp_limb_t carry;
31967     __asm__ __volatile__(
31968         "movq    %[z], %%rdi\n"
31969         "movq    %[x], %%rsi\n"
31970         "movq    0(%%rsi), %%rax\n"
31971         "mulq    %[mult]\n"
31972         "addq    %%rax, 0(%%rdi)\n"
31973         "movq    8(%%rsi), %%rax\n"
31974         "adcq    $0, %%rdx\n"
31975         "movq    %%rdx, %%rcx\n"
31976         "mulq    %[mult]\n"
31977         "addq    %%rax, %%rcx\n"
31978         "adcq    $0, %%rdx\n"
31979         "movq    16(%%rsi), %%rax\n"
31980         "addq    %%rcx, 8(%%rdi)\n"
31981         "adcq    $0, %%rdx\n"
31982         "movq    %%rdx, %%rcx\n"
31983         "mulq    %[mult]\n"
31984         "addq    %%rax, %%rcx\n"
31985         "adcq    $0, %%rdx\n"
31986         "movq    24(%%rsi), %%rax\n"
31987         "addq    %%rcx, 16(%%rdi)\n"
31988         "adcq    $0, %%rdx\n"
31989         "movq    %%rdx, %%rcx\n"
31990         "mulq    %[mult]\n"
31991         "addq    %%rax, %%rcx\n"
31992         "adcq    $0, %%rdx\n"
31993         "movq    32(%%rsi), %%rax\n"
31994         "addq    %%rcx, 24(%%rdi)\n"
31995         "adcq    $0, %%rdx\n"
31996         "movq    %%rdx, %%rcx\n"
31997         "mulq    %[mult]\n"
31998         "addq    %%rax, %%rcx\n"
31999         "adcq    $0, %%rdx\n"
32000         "movq    40(%%rsi), %%rax\n"
32001         "addq    %%rcx, 32(%%rdi)\n"
32002         "adcq    $0, %%rdx\n"
32003         "movq    %%rdx, %%rcx\n"
32004         "mulq    %[mult]\n"
32005         "addq    %%rax, %%rcx\n"
32006         "adcq    $0, %%rdx\n"
32007         "movq    48(%%rsi), %%rax\n"
32008         "addq    %%rcx, 40(%%rdi)\n"
32009         "adcq    $0, %%rdx\n"
32010         "movq    %%rdx, %%rcx\n"
32011         "mulq    %[mult]\n"
32012         "addq    %%rax, %%rcx\n"
32013         "adcq    $0, %%rdx\n"
32014         "movq    56(%%rsi), %%rax\n"
32015         "addq    %%rcx, 48(%%rdi)\n"
32016         "adcq    $0, %%rdx\n"
32017         "movq    %%rdx, %%rcx\n"
32018         "mulq    %[mult]\n"
32019         "addq    %%rax, %%rcx\n"
32020         "adcq    $0, %%rdx\n"
32021         "movq    64(%%rsi), %%rax\n"
32022         "addq    %%rcx, 56(%%rdi)\n"
32023         "adcq    $0, %%rdx\n"
32024         "movq    %%rdx, %%rcx\n"
32025         "mulq    %[mult]\n"
32026         "addq    %%rax, %%rcx\n"
32027         "adcq    $0, %%rdx\n"
32028         "movq    72(%%rsi), %%rax\n"
32029         "addq    %%rcx, 64(%%rdi)\n"
32030         "adcq    $0, %%rdx\n"
32031         "movq    %%rdx, %%rcx\n"
32032         "mulq    %[mult]\n"
32033         "addq    %%rax, %%rcx\n"
32034         "adcq    $0, %%rdx\n"
32035         "movq    80(%%rsi), %%rax\n"
32036         "addq    %%rcx, 72(%%rdi)\n"
32037         "adcq    $0, %%rdx\n"
32038         "movq    %%rdx, %%rcx\n"
32039         "mulq    %[mult]\n"
32040         "addq    %%rax, %%rcx\n"
32041         "adcq    $0, %%rdx\n"
32042         "movq    88(%%rsi), %%rax\n"
32043         "addq    %%rcx, 80(%%rdi)\n"
32044         "adcq    $0, %%rdx\n"
32045         "movq    %%rdx, %%rcx\n"
32046         "mulq    %[mult]\n"
32047         "addq    %%rax, %%rcx\n"
32048         "adcq    $0, %%rdx\n"
32049         "movq    96(%%rsi), %%rax\n"
32050         "addq    %%rcx, 88(%%rdi)\n"
32051         "adcq    $0, %%rdx\n"
32052         "movq    %%rdx, %%rcx\n"
32053         "mulq    %[mult]\n"
32054         "addq    %%rax, %%rcx\n"
32055         "adcq    $0, %%rdx\n"
32056         "movq    104(%%rsi), %%rax\n"
32057         "addq    %%rcx, 96(%%rdi)\n"
32058         "adcq    $0, %%rdx\n"
32059         "movq    %%rdx, %%rcx\n"
32060         "imulq    %[mult], %%rax\n"
32061         "xorq    %%rdx, %%rdx\n"
32062         "addq    %%rcx, %%rax\n"
32063         "adcq    $0, %%rdx\n"
32064         "addq    %%rax, 104(%%rdi)\n"
32065         "adcq    $0, %%rdx\n"
32066         "movq    %%rdx, %[carry]\n"
32067     : [carry]"=g"(carry), [z] "+m" (z)
32068     : [mult] "r" (c), [x] "m" (x)
32069     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
32070     return carry;
32071 }
32072 
32073 /* x has 13.5 words, z has 14. c is 0.5 word.
32074  * Put (z+x*c) in z. Carry bit is lost. */
32075 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
32076 static inline
mpfq_fixmp_13_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)32077 void mpfq_fixmp_13_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
32078 {
32079     __asm__ __volatile__(
32080         "movq    %[z], %%rdi\n"
32081         "movq    %[x], %%rsi\n"
32082         "movq    0(%%rsi), %%rax\n"
32083         "mulq    %[mult]\n"
32084         "addq    %%rax, 0(%%rdi)\n"
32085         "movq    8(%%rsi), %%rax\n"
32086         "adcq    $0, %%rdx\n"
32087         "movq    %%rdx, %%rcx\n"
32088         "mulq    %[mult]\n"
32089         "addq    %%rax, %%rcx\n"
32090         "adcq    $0, %%rdx\n"
32091         "movq    16(%%rsi), %%rax\n"
32092         "addq    %%rcx, 8(%%rdi)\n"
32093         "adcq    $0, %%rdx\n"
32094         "movq    %%rdx, %%rcx\n"
32095         "mulq    %[mult]\n"
32096         "addq    %%rax, %%rcx\n"
32097         "adcq    $0, %%rdx\n"
32098         "movq    24(%%rsi), %%rax\n"
32099         "addq    %%rcx, 16(%%rdi)\n"
32100         "adcq    $0, %%rdx\n"
32101         "movq    %%rdx, %%rcx\n"
32102         "mulq    %[mult]\n"
32103         "addq    %%rax, %%rcx\n"
32104         "adcq    $0, %%rdx\n"
32105         "movq    32(%%rsi), %%rax\n"
32106         "addq    %%rcx, 24(%%rdi)\n"
32107         "adcq    $0, %%rdx\n"
32108         "movq    %%rdx, %%rcx\n"
32109         "mulq    %[mult]\n"
32110         "addq    %%rax, %%rcx\n"
32111         "adcq    $0, %%rdx\n"
32112         "movq    40(%%rsi), %%rax\n"
32113         "addq    %%rcx, 32(%%rdi)\n"
32114         "adcq    $0, %%rdx\n"
32115         "movq    %%rdx, %%rcx\n"
32116         "mulq    %[mult]\n"
32117         "addq    %%rax, %%rcx\n"
32118         "adcq    $0, %%rdx\n"
32119         "movq    48(%%rsi), %%rax\n"
32120         "addq    %%rcx, 40(%%rdi)\n"
32121         "adcq    $0, %%rdx\n"
32122         "movq    %%rdx, %%rcx\n"
32123         "mulq    %[mult]\n"
32124         "addq    %%rax, %%rcx\n"
32125         "adcq    $0, %%rdx\n"
32126         "movq    56(%%rsi), %%rax\n"
32127         "addq    %%rcx, 48(%%rdi)\n"
32128         "adcq    $0, %%rdx\n"
32129         "movq    %%rdx, %%rcx\n"
32130         "mulq    %[mult]\n"
32131         "addq    %%rax, %%rcx\n"
32132         "adcq    $0, %%rdx\n"
32133         "movq    64(%%rsi), %%rax\n"
32134         "addq    %%rcx, 56(%%rdi)\n"
32135         "adcq    $0, %%rdx\n"
32136         "movq    %%rdx, %%rcx\n"
32137         "mulq    %[mult]\n"
32138         "addq    %%rax, %%rcx\n"
32139         "adcq    $0, %%rdx\n"
32140         "movq    72(%%rsi), %%rax\n"
32141         "addq    %%rcx, 64(%%rdi)\n"
32142         "adcq    $0, %%rdx\n"
32143         "movq    %%rdx, %%rcx\n"
32144         "mulq    %[mult]\n"
32145         "addq    %%rax, %%rcx\n"
32146         "adcq    $0, %%rdx\n"
32147         "movq    80(%%rsi), %%rax\n"
32148         "addq    %%rcx, 72(%%rdi)\n"
32149         "adcq    $0, %%rdx\n"
32150         "movq    %%rdx, %%rcx\n"
32151         "mulq    %[mult]\n"
32152         "addq    %%rax, %%rcx\n"
32153         "adcq    $0, %%rdx\n"
32154         "movq    88(%%rsi), %%rax\n"
32155         "addq    %%rcx, 80(%%rdi)\n"
32156         "adcq    $0, %%rdx\n"
32157         "movq    %%rdx, %%rcx\n"
32158         "mulq    %[mult]\n"
32159         "addq    %%rax, %%rcx\n"
32160         "adcq    $0, %%rdx\n"
32161         "movq    96(%%rsi), %%rax\n"
32162         "addq    %%rcx, 88(%%rdi)\n"
32163         "adcq    $0, %%rdx\n"
32164         "movq    %%rdx, %%rcx\n"
32165         "mulq    %[mult]\n"
32166         "addq    %%rax, %%rcx\n"
32167         "adcq    $0, %%rdx\n"
32168         "movq    104(%%rsi), %%rax\n"
32169         "addq    %%rcx, 96(%%rdi)\n"
32170         "adcq    $0, %%rdx\n"
32171         "movq    %%rdx, %%rcx\n"
32172         "imulq    %[mult], %%rax\n"
32173         "addq    %%rcx, %%rax\n"
32174         "addq    %%rax, 104(%%rdi)\n"
32175     : [z] "+m" (z)
32176     : [mult] "r" (c), [x] "m" (x)
32177     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
32178 }
32179 
32180 /* x has 13.5 words, z has 14. c is 0.5 word.
32181  * Put (x*c) in z. No carry. */
32182 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
32183 static inline
mpfq_fixmp_13_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)32184 void mpfq_fixmp_13_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
32185 {
32186     __asm__ __volatile__(
32187         "movq    %[z], %%rdi\n"
32188         "movq    %[x], %%rsi\n"
32189         "movq    0(%%rsi), %%rax\n"
32190         "mulq    %[mult]\n"
32191         "movq    %%rax, 0(%%rdi)\n"
32192         "movq    8(%%rsi), %%rax\n"
32193         "movq    %%rdx, %%rcx\n"
32194         "mulq    %[mult]\n"
32195         "addq    %%rax, %%rcx\n"
32196         "adcq    $0, %%rdx\n"
32197         "movq    16(%%rsi), %%rax\n"
32198         "movq    %%rcx, 8(%%rdi)\n"
32199         "movq    %%rdx, %%rcx\n"
32200         "mulq    %[mult]\n"
32201         "addq    %%rax, %%rcx\n"
32202         "adcq    $0, %%rdx\n"
32203         "movq    24(%%rsi), %%rax\n"
32204         "movq    %%rcx, 16(%%rdi)\n"
32205         "movq    %%rdx, %%rcx\n"
32206         "mulq    %[mult]\n"
32207         "addq    %%rax, %%rcx\n"
32208         "adcq    $0, %%rdx\n"
32209         "movq    32(%%rsi), %%rax\n"
32210         "movq    %%rcx, 24(%%rdi)\n"
32211         "movq    %%rdx, %%rcx\n"
32212         "mulq    %[mult]\n"
32213         "addq    %%rax, %%rcx\n"
32214         "adcq    $0, %%rdx\n"
32215         "movq    40(%%rsi), %%rax\n"
32216         "movq    %%rcx, 32(%%rdi)\n"
32217         "movq    %%rdx, %%rcx\n"
32218         "mulq    %[mult]\n"
32219         "addq    %%rax, %%rcx\n"
32220         "adcq    $0, %%rdx\n"
32221         "movq    48(%%rsi), %%rax\n"
32222         "movq    %%rcx, 40(%%rdi)\n"
32223         "movq    %%rdx, %%rcx\n"
32224         "mulq    %[mult]\n"
32225         "addq    %%rax, %%rcx\n"
32226         "adcq    $0, %%rdx\n"
32227         "movq    56(%%rsi), %%rax\n"
32228         "movq    %%rcx, 48(%%rdi)\n"
32229         "movq    %%rdx, %%rcx\n"
32230         "mulq    %[mult]\n"
32231         "addq    %%rax, %%rcx\n"
32232         "adcq    $0, %%rdx\n"
32233         "movq    64(%%rsi), %%rax\n"
32234         "movq    %%rcx, 56(%%rdi)\n"
32235         "movq    %%rdx, %%rcx\n"
32236         "mulq    %[mult]\n"
32237         "addq    %%rax, %%rcx\n"
32238         "adcq    $0, %%rdx\n"
32239         "movq    72(%%rsi), %%rax\n"
32240         "movq    %%rcx, 64(%%rdi)\n"
32241         "movq    %%rdx, %%rcx\n"
32242         "mulq    %[mult]\n"
32243         "addq    %%rax, %%rcx\n"
32244         "adcq    $0, %%rdx\n"
32245         "movq    80(%%rsi), %%rax\n"
32246         "movq    %%rcx, 72(%%rdi)\n"
32247         "movq    %%rdx, %%rcx\n"
32248         "mulq    %[mult]\n"
32249         "addq    %%rax, %%rcx\n"
32250         "adcq    $0, %%rdx\n"
32251         "movq    88(%%rsi), %%rax\n"
32252         "movq    %%rcx, 80(%%rdi)\n"
32253         "movq    %%rdx, %%rcx\n"
32254         "mulq    %[mult]\n"
32255         "addq    %%rax, %%rcx\n"
32256         "adcq    $0, %%rdx\n"
32257         "movq    96(%%rsi), %%rax\n"
32258         "movq    %%rcx, 88(%%rdi)\n"
32259         "movq    %%rdx, %%rcx\n"
32260         "mulq    %[mult]\n"
32261         "addq    %%rax, %%rcx\n"
32262         "adcq    $0, %%rdx\n"
32263         "movq    104(%%rsi), %%rax\n"
32264         "movq    %%rcx, 96(%%rdi)\n"
32265         "movq    %%rdx, %%rcx\n"
32266         "imulq    %[mult], %%rax\n"
32267         "addq    %%rcx, %%rax\n"
32268         "movq    %%rax, 104(%%rdi)\n"
32269     :
32270     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
32271     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
32272 }
32273 
32274 /* x, y, and z have 14.5 words. Result in z. Return carry bit */
32275 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add */
32276 static inline
mpfq_fixmp_14_5_add(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)32277 mp_limb_t mpfq_fixmp_14_5_add(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
32278 {
32279     mp_limb_t carry;
32280     __asm__ __volatile__(
32281         "movq    %[z], %%rdi\n"
32282         "movq    %[x], %%rsi\n"
32283         "movq    %[y], %%rdx\n"
32284         "movq    0(%%rsi), %%rax\n"
32285         "addq    0(%%rdx), %%rax\n"
32286         "movq    %%rax, 0(%%rdi)\n"
32287         "movq    8(%%rsi), %%rax\n"
32288         "adcq    8(%%rdx), %%rax\n"
32289         "movq    %%rax, 8(%%rdi)\n"
32290         "movq    16(%%rsi), %%rax\n"
32291         "adcq    16(%%rdx), %%rax\n"
32292         "movq    %%rax, 16(%%rdi)\n"
32293         "movq    24(%%rsi), %%rax\n"
32294         "adcq    24(%%rdx), %%rax\n"
32295         "movq    %%rax, 24(%%rdi)\n"
32296         "movq    32(%%rsi), %%rax\n"
32297         "adcq    32(%%rdx), %%rax\n"
32298         "movq    %%rax, 32(%%rdi)\n"
32299         "movq    40(%%rsi), %%rax\n"
32300         "adcq    40(%%rdx), %%rax\n"
32301         "movq    %%rax, 40(%%rdi)\n"
32302         "movq    48(%%rsi), %%rax\n"
32303         "adcq    48(%%rdx), %%rax\n"
32304         "movq    %%rax, 48(%%rdi)\n"
32305         "movq    56(%%rsi), %%rax\n"
32306         "adcq    56(%%rdx), %%rax\n"
32307         "movq    %%rax, 56(%%rdi)\n"
32308         "movq    64(%%rsi), %%rax\n"
32309         "adcq    64(%%rdx), %%rax\n"
32310         "movq    %%rax, 64(%%rdi)\n"
32311         "movq    72(%%rsi), %%rax\n"
32312         "adcq    72(%%rdx), %%rax\n"
32313         "movq    %%rax, 72(%%rdi)\n"
32314         "movq    80(%%rsi), %%rax\n"
32315         "adcq    80(%%rdx), %%rax\n"
32316         "movq    %%rax, 80(%%rdi)\n"
32317         "movq    88(%%rsi), %%rax\n"
32318         "adcq    88(%%rdx), %%rax\n"
32319         "movq    %%rax, 88(%%rdi)\n"
32320         "movq    96(%%rsi), %%rax\n"
32321         "adcq    96(%%rdx), %%rax\n"
32322         "movq    %%rax, 96(%%rdi)\n"
32323         "movq    104(%%rsi), %%rax\n"
32324         "adcq    104(%%rdx), %%rax\n"
32325         "movq    %%rax, 104(%%rdi)\n"
32326         "movq    112(%%rsi), %%rax\n"
32327         "adcq    112(%%rdx), %%rax\n"
32328         "movq    %%rax, 112(%%rdi)\n"
32329         "movq $0, %%rax\n"
32330         "adcq $0, %%rax\n"
32331     : "=&a"(carry)
32332     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
32333     : "%rdx", "%rsi", "%rdi", "memory");
32334     return carry;
32335 }
32336 
32337 /* x, y, and z have 14.5 words. Result in z. Return borrow bit */
32338 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub */
32339 static inline
mpfq_fixmp_14_5_sub(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)32340 mp_limb_t mpfq_fixmp_14_5_sub(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
32341 {
32342     mp_limb_t carry;
32343     __asm__ __volatile__(
32344         "movq    %[z], %%rdi\n"
32345         "movq    %[x], %%rsi\n"
32346         "movq    %[y], %%rdx\n"
32347         "movq    0(%%rsi), %%rax\n"
32348         "subq    0(%%rdx), %%rax\n"
32349         "movq    %%rax, 0(%%rdi)\n"
32350         "movq    8(%%rsi), %%rax\n"
32351         "sbbq    8(%%rdx), %%rax\n"
32352         "movq    %%rax, 8(%%rdi)\n"
32353         "movq    16(%%rsi), %%rax\n"
32354         "sbbq    16(%%rdx), %%rax\n"
32355         "movq    %%rax, 16(%%rdi)\n"
32356         "movq    24(%%rsi), %%rax\n"
32357         "sbbq    24(%%rdx), %%rax\n"
32358         "movq    %%rax, 24(%%rdi)\n"
32359         "movq    32(%%rsi), %%rax\n"
32360         "sbbq    32(%%rdx), %%rax\n"
32361         "movq    %%rax, 32(%%rdi)\n"
32362         "movq    40(%%rsi), %%rax\n"
32363         "sbbq    40(%%rdx), %%rax\n"
32364         "movq    %%rax, 40(%%rdi)\n"
32365         "movq    48(%%rsi), %%rax\n"
32366         "sbbq    48(%%rdx), %%rax\n"
32367         "movq    %%rax, 48(%%rdi)\n"
32368         "movq    56(%%rsi), %%rax\n"
32369         "sbbq    56(%%rdx), %%rax\n"
32370         "movq    %%rax, 56(%%rdi)\n"
32371         "movq    64(%%rsi), %%rax\n"
32372         "sbbq    64(%%rdx), %%rax\n"
32373         "movq    %%rax, 64(%%rdi)\n"
32374         "movq    72(%%rsi), %%rax\n"
32375         "sbbq    72(%%rdx), %%rax\n"
32376         "movq    %%rax, 72(%%rdi)\n"
32377         "movq    80(%%rsi), %%rax\n"
32378         "sbbq    80(%%rdx), %%rax\n"
32379         "movq    %%rax, 80(%%rdi)\n"
32380         "movq    88(%%rsi), %%rax\n"
32381         "sbbq    88(%%rdx), %%rax\n"
32382         "movq    %%rax, 88(%%rdi)\n"
32383         "movq    96(%%rsi), %%rax\n"
32384         "sbbq    96(%%rdx), %%rax\n"
32385         "movq    %%rax, 96(%%rdi)\n"
32386         "movq    104(%%rsi), %%rax\n"
32387         "sbbq    104(%%rdx), %%rax\n"
32388         "movq    %%rax, 104(%%rdi)\n"
32389         "movq    112(%%rsi), %%rax\n"
32390         "sbbq    112(%%rdx), %%rax\n"
32391         "movq    %%rax, 112(%%rdi)\n"
32392         "movq $0, %%rax\n"
32393         "adcq $0, %%rax\n"
32394     : "=&a"(carry)
32395     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
32396     : "%rdx", "%rsi", "%rdi", "memory");
32397     return carry;
32398 }
32399 
32400 /* x, y, and z have 14.5 words. Result in z. Carry bit is lost. */
32401 /* *Mpfq::fixmp::x86_64::code_for__fixmp_add_nc */
32402 static inline
mpfq_fixmp_14_5_add_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)32403 void mpfq_fixmp_14_5_add_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
32404 {
32405     __asm__ __volatile__(
32406         "movq    %[z], %%rdi\n"
32407         "movq    %[x], %%rsi\n"
32408         "movq    %[y], %%rdx\n"
32409         "movq    0(%%rsi), %%rax\n"
32410         "addq    0(%%rdx), %%rax\n"
32411         "movq    %%rax, 0(%%rdi)\n"
32412         "movq    8(%%rsi), %%rax\n"
32413         "adcq    8(%%rdx), %%rax\n"
32414         "movq    %%rax, 8(%%rdi)\n"
32415         "movq    16(%%rsi), %%rax\n"
32416         "adcq    16(%%rdx), %%rax\n"
32417         "movq    %%rax, 16(%%rdi)\n"
32418         "movq    24(%%rsi), %%rax\n"
32419         "adcq    24(%%rdx), %%rax\n"
32420         "movq    %%rax, 24(%%rdi)\n"
32421         "movq    32(%%rsi), %%rax\n"
32422         "adcq    32(%%rdx), %%rax\n"
32423         "movq    %%rax, 32(%%rdi)\n"
32424         "movq    40(%%rsi), %%rax\n"
32425         "adcq    40(%%rdx), %%rax\n"
32426         "movq    %%rax, 40(%%rdi)\n"
32427         "movq    48(%%rsi), %%rax\n"
32428         "adcq    48(%%rdx), %%rax\n"
32429         "movq    %%rax, 48(%%rdi)\n"
32430         "movq    56(%%rsi), %%rax\n"
32431         "adcq    56(%%rdx), %%rax\n"
32432         "movq    %%rax, 56(%%rdi)\n"
32433         "movq    64(%%rsi), %%rax\n"
32434         "adcq    64(%%rdx), %%rax\n"
32435         "movq    %%rax, 64(%%rdi)\n"
32436         "movq    72(%%rsi), %%rax\n"
32437         "adcq    72(%%rdx), %%rax\n"
32438         "movq    %%rax, 72(%%rdi)\n"
32439         "movq    80(%%rsi), %%rax\n"
32440         "adcq    80(%%rdx), %%rax\n"
32441         "movq    %%rax, 80(%%rdi)\n"
32442         "movq    88(%%rsi), %%rax\n"
32443         "adcq    88(%%rdx), %%rax\n"
32444         "movq    %%rax, 88(%%rdi)\n"
32445         "movq    96(%%rsi), %%rax\n"
32446         "adcq    96(%%rdx), %%rax\n"
32447         "movq    %%rax, 96(%%rdi)\n"
32448         "movq    104(%%rsi), %%rax\n"
32449         "adcq    104(%%rdx), %%rax\n"
32450         "movq    %%rax, 104(%%rdi)\n"
32451         "movq    112(%%rsi), %%rax\n"
32452         "adcq    112(%%rdx), %%rax\n"
32453         "movq    %%rax, 112(%%rdi)\n"
32454     :
32455     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
32456     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
32457 }
32458 
32459 /* x, y, and z have 14.5 words. Result in z. Borrow bit is lost. */
32460 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sub_nc */
32461 static inline
mpfq_fixmp_14_5_sub_nc(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)32462 void mpfq_fixmp_14_5_sub_nc(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
32463 {
32464     __asm__ __volatile__(
32465         "movq    %[z], %%rdi\n"
32466         "movq    %[x], %%rsi\n"
32467         "movq    %[y], %%rdx\n"
32468         "movq    0(%%rsi), %%rax\n"
32469         "subq    0(%%rdx), %%rax\n"
32470         "movq    %%rax, 0(%%rdi)\n"
32471         "movq    8(%%rsi), %%rax\n"
32472         "sbbq    8(%%rdx), %%rax\n"
32473         "movq    %%rax, 8(%%rdi)\n"
32474         "movq    16(%%rsi), %%rax\n"
32475         "sbbq    16(%%rdx), %%rax\n"
32476         "movq    %%rax, 16(%%rdi)\n"
32477         "movq    24(%%rsi), %%rax\n"
32478         "sbbq    24(%%rdx), %%rax\n"
32479         "movq    %%rax, 24(%%rdi)\n"
32480         "movq    32(%%rsi), %%rax\n"
32481         "sbbq    32(%%rdx), %%rax\n"
32482         "movq    %%rax, 32(%%rdi)\n"
32483         "movq    40(%%rsi), %%rax\n"
32484         "sbbq    40(%%rdx), %%rax\n"
32485         "movq    %%rax, 40(%%rdi)\n"
32486         "movq    48(%%rsi), %%rax\n"
32487         "sbbq    48(%%rdx), %%rax\n"
32488         "movq    %%rax, 48(%%rdi)\n"
32489         "movq    56(%%rsi), %%rax\n"
32490         "sbbq    56(%%rdx), %%rax\n"
32491         "movq    %%rax, 56(%%rdi)\n"
32492         "movq    64(%%rsi), %%rax\n"
32493         "sbbq    64(%%rdx), %%rax\n"
32494         "movq    %%rax, 64(%%rdi)\n"
32495         "movq    72(%%rsi), %%rax\n"
32496         "sbbq    72(%%rdx), %%rax\n"
32497         "movq    %%rax, 72(%%rdi)\n"
32498         "movq    80(%%rsi), %%rax\n"
32499         "sbbq    80(%%rdx), %%rax\n"
32500         "movq    %%rax, 80(%%rdi)\n"
32501         "movq    88(%%rsi), %%rax\n"
32502         "sbbq    88(%%rdx), %%rax\n"
32503         "movq    %%rax, 88(%%rdi)\n"
32504         "movq    96(%%rsi), %%rax\n"
32505         "sbbq    96(%%rdx), %%rax\n"
32506         "movq    %%rax, 96(%%rdi)\n"
32507         "movq    104(%%rsi), %%rax\n"
32508         "sbbq    104(%%rdx), %%rax\n"
32509         "movq    %%rax, 104(%%rdi)\n"
32510         "movq    112(%%rsi), %%rax\n"
32511         "sbbq    112(%%rdx), %%rax\n"
32512         "movq    %%rax, 112(%%rdi)\n"
32513     :
32514     : [z]"m"(z), [x]"m"(x), [y]"m"(y)
32515     : "%rdx", "%rsi", "%rdi", "memory", "%rax");
32516 }
32517 
32518 /* x has 14.5 words, z has 16.
32519  * Put (z+x*c) in z. Return carry bit. */
32520 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1 */
32521 static inline
mpfq_fixmp_14_5_addmul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)32522 mp_limb_t mpfq_fixmp_14_5_addmul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
32523 {
32524     mp_limb_t carry;
32525     __asm__ __volatile__(
32526         "movq    %[z], %%rdi\n"
32527         "movq    %[x], %%rsi\n"
32528         "movq    0(%%rsi), %%rax\n"
32529         "mulq    %[mult]\n"
32530         "addq    %%rax, 0(%%rdi)\n"
32531         "movq    8(%%rsi), %%rax\n"
32532         "adcq    $0, %%rdx\n"
32533         "movq    %%rdx, %%rcx\n"
32534         "mulq    %[mult]\n"
32535         "addq    %%rax, %%rcx\n"
32536         "adcq    $0, %%rdx\n"
32537         "movq    16(%%rsi), %%rax\n"
32538         "addq    %%rcx, 8(%%rdi)\n"
32539         "adcq    $0, %%rdx\n"
32540         "movq    %%rdx, %%rcx\n"
32541         "mulq    %[mult]\n"
32542         "addq    %%rax, %%rcx\n"
32543         "adcq    $0, %%rdx\n"
32544         "movq    24(%%rsi), %%rax\n"
32545         "addq    %%rcx, 16(%%rdi)\n"
32546         "adcq    $0, %%rdx\n"
32547         "movq    %%rdx, %%rcx\n"
32548         "mulq    %[mult]\n"
32549         "addq    %%rax, %%rcx\n"
32550         "adcq    $0, %%rdx\n"
32551         "movq    32(%%rsi), %%rax\n"
32552         "addq    %%rcx, 24(%%rdi)\n"
32553         "adcq    $0, %%rdx\n"
32554         "movq    %%rdx, %%rcx\n"
32555         "mulq    %[mult]\n"
32556         "addq    %%rax, %%rcx\n"
32557         "adcq    $0, %%rdx\n"
32558         "movq    40(%%rsi), %%rax\n"
32559         "addq    %%rcx, 32(%%rdi)\n"
32560         "adcq    $0, %%rdx\n"
32561         "movq    %%rdx, %%rcx\n"
32562         "mulq    %[mult]\n"
32563         "addq    %%rax, %%rcx\n"
32564         "adcq    $0, %%rdx\n"
32565         "movq    48(%%rsi), %%rax\n"
32566         "addq    %%rcx, 40(%%rdi)\n"
32567         "adcq    $0, %%rdx\n"
32568         "movq    %%rdx, %%rcx\n"
32569         "mulq    %[mult]\n"
32570         "addq    %%rax, %%rcx\n"
32571         "adcq    $0, %%rdx\n"
32572         "movq    56(%%rsi), %%rax\n"
32573         "addq    %%rcx, 48(%%rdi)\n"
32574         "adcq    $0, %%rdx\n"
32575         "movq    %%rdx, %%rcx\n"
32576         "mulq    %[mult]\n"
32577         "addq    %%rax, %%rcx\n"
32578         "adcq    $0, %%rdx\n"
32579         "movq    64(%%rsi), %%rax\n"
32580         "addq    %%rcx, 56(%%rdi)\n"
32581         "adcq    $0, %%rdx\n"
32582         "movq    %%rdx, %%rcx\n"
32583         "mulq    %[mult]\n"
32584         "addq    %%rax, %%rcx\n"
32585         "adcq    $0, %%rdx\n"
32586         "movq    72(%%rsi), %%rax\n"
32587         "addq    %%rcx, 64(%%rdi)\n"
32588         "adcq    $0, %%rdx\n"
32589         "movq    %%rdx, %%rcx\n"
32590         "mulq    %[mult]\n"
32591         "addq    %%rax, %%rcx\n"
32592         "adcq    $0, %%rdx\n"
32593         "movq    80(%%rsi), %%rax\n"
32594         "addq    %%rcx, 72(%%rdi)\n"
32595         "adcq    $0, %%rdx\n"
32596         "movq    %%rdx, %%rcx\n"
32597         "mulq    %[mult]\n"
32598         "addq    %%rax, %%rcx\n"
32599         "adcq    $0, %%rdx\n"
32600         "movq    88(%%rsi), %%rax\n"
32601         "addq    %%rcx, 80(%%rdi)\n"
32602         "adcq    $0, %%rdx\n"
32603         "movq    %%rdx, %%rcx\n"
32604         "mulq    %[mult]\n"
32605         "addq    %%rax, %%rcx\n"
32606         "adcq    $0, %%rdx\n"
32607         "movq    96(%%rsi), %%rax\n"
32608         "addq    %%rcx, 88(%%rdi)\n"
32609         "adcq    $0, %%rdx\n"
32610         "movq    %%rdx, %%rcx\n"
32611         "mulq    %[mult]\n"
32612         "addq    %%rax, %%rcx\n"
32613         "adcq    $0, %%rdx\n"
32614         "movq    104(%%rsi), %%rax\n"
32615         "addq    %%rcx, 96(%%rdi)\n"
32616         "adcq    $0, %%rdx\n"
32617         "movq    %%rdx, %%rcx\n"
32618         "mulq    %[mult]\n"
32619         "addq    %%rax, %%rcx\n"
32620         "adcq    $0, %%rdx\n"
32621         "movq    112(%%rsi), %%rax\n"
32622         "addq    %%rcx, 104(%%rdi)\n"
32623         "adcq    $0, %%rdx\n"
32624         "movq    %%rdx, %%rcx\n"
32625         "mulq    %[mult]\n"
32626         "addq    %%rax, %%rcx\n"
32627         "adcq    $0, %%rdx\n"
32628         "addq    %%rcx, 112(%%rdi)\n"
32629         "adcq    $0, %%rdx\n"
32630         "xorq    %%rcx, %%rcx\n"
32631         "addq    %%rdx, 120(%%rdi)\n"
32632         "adcq    $0, %%rcx\n"
32633         "movq    %%rcx, %[carry]\n"
32634     : [carry]"=g"(carry), [z] "+m" (z)
32635     : [mult] "r" (c), [x] "m" (x)
32636     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
32637     return carry;
32638 }
32639 
32640 /* x has 14.5 words, z has 16.
32641  * Put (z+x*c) in z. Carry bit is lost. */
32642 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_nc */
32643 static inline
mpfq_fixmp_14_5_addmul1_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)32644 void mpfq_fixmp_14_5_addmul1_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
32645 {
32646     __asm__ __volatile__(
32647         "movq    %[z], %%rdi\n"
32648         "movq    %[x], %%rsi\n"
32649         "movq    0(%%rsi), %%rax\n"
32650         "mulq    %[mult]\n"
32651         "addq    %%rax, 0(%%rdi)\n"
32652         "movq    8(%%rsi), %%rax\n"
32653         "adcq    $0, %%rdx\n"
32654         "movq    %%rdx, %%rcx\n"
32655         "mulq    %[mult]\n"
32656         "addq    %%rax, %%rcx\n"
32657         "adcq    $0, %%rdx\n"
32658         "movq    16(%%rsi), %%rax\n"
32659         "addq    %%rcx, 8(%%rdi)\n"
32660         "adcq    $0, %%rdx\n"
32661         "movq    %%rdx, %%rcx\n"
32662         "mulq    %[mult]\n"
32663         "addq    %%rax, %%rcx\n"
32664         "adcq    $0, %%rdx\n"
32665         "movq    24(%%rsi), %%rax\n"
32666         "addq    %%rcx, 16(%%rdi)\n"
32667         "adcq    $0, %%rdx\n"
32668         "movq    %%rdx, %%rcx\n"
32669         "mulq    %[mult]\n"
32670         "addq    %%rax, %%rcx\n"
32671         "adcq    $0, %%rdx\n"
32672         "movq    32(%%rsi), %%rax\n"
32673         "addq    %%rcx, 24(%%rdi)\n"
32674         "adcq    $0, %%rdx\n"
32675         "movq    %%rdx, %%rcx\n"
32676         "mulq    %[mult]\n"
32677         "addq    %%rax, %%rcx\n"
32678         "adcq    $0, %%rdx\n"
32679         "movq    40(%%rsi), %%rax\n"
32680         "addq    %%rcx, 32(%%rdi)\n"
32681         "adcq    $0, %%rdx\n"
32682         "movq    %%rdx, %%rcx\n"
32683         "mulq    %[mult]\n"
32684         "addq    %%rax, %%rcx\n"
32685         "adcq    $0, %%rdx\n"
32686         "movq    48(%%rsi), %%rax\n"
32687         "addq    %%rcx, 40(%%rdi)\n"
32688         "adcq    $0, %%rdx\n"
32689         "movq    %%rdx, %%rcx\n"
32690         "mulq    %[mult]\n"
32691         "addq    %%rax, %%rcx\n"
32692         "adcq    $0, %%rdx\n"
32693         "movq    56(%%rsi), %%rax\n"
32694         "addq    %%rcx, 48(%%rdi)\n"
32695         "adcq    $0, %%rdx\n"
32696         "movq    %%rdx, %%rcx\n"
32697         "mulq    %[mult]\n"
32698         "addq    %%rax, %%rcx\n"
32699         "adcq    $0, %%rdx\n"
32700         "movq    64(%%rsi), %%rax\n"
32701         "addq    %%rcx, 56(%%rdi)\n"
32702         "adcq    $0, %%rdx\n"
32703         "movq    %%rdx, %%rcx\n"
32704         "mulq    %[mult]\n"
32705         "addq    %%rax, %%rcx\n"
32706         "adcq    $0, %%rdx\n"
32707         "movq    72(%%rsi), %%rax\n"
32708         "addq    %%rcx, 64(%%rdi)\n"
32709         "adcq    $0, %%rdx\n"
32710         "movq    %%rdx, %%rcx\n"
32711         "mulq    %[mult]\n"
32712         "addq    %%rax, %%rcx\n"
32713         "adcq    $0, %%rdx\n"
32714         "movq    80(%%rsi), %%rax\n"
32715         "addq    %%rcx, 72(%%rdi)\n"
32716         "adcq    $0, %%rdx\n"
32717         "movq    %%rdx, %%rcx\n"
32718         "mulq    %[mult]\n"
32719         "addq    %%rax, %%rcx\n"
32720         "adcq    $0, %%rdx\n"
32721         "movq    88(%%rsi), %%rax\n"
32722         "addq    %%rcx, 80(%%rdi)\n"
32723         "adcq    $0, %%rdx\n"
32724         "movq    %%rdx, %%rcx\n"
32725         "mulq    %[mult]\n"
32726         "addq    %%rax, %%rcx\n"
32727         "adcq    $0, %%rdx\n"
32728         "movq    96(%%rsi), %%rax\n"
32729         "addq    %%rcx, 88(%%rdi)\n"
32730         "adcq    $0, %%rdx\n"
32731         "movq    %%rdx, %%rcx\n"
32732         "mulq    %[mult]\n"
32733         "addq    %%rax, %%rcx\n"
32734         "adcq    $0, %%rdx\n"
32735         "movq    104(%%rsi), %%rax\n"
32736         "addq    %%rcx, 96(%%rdi)\n"
32737         "adcq    $0, %%rdx\n"
32738         "movq    %%rdx, %%rcx\n"
32739         "mulq    %[mult]\n"
32740         "addq    %%rax, %%rcx\n"
32741         "adcq    $0, %%rdx\n"
32742         "movq    112(%%rsi), %%rax\n"
32743         "addq    %%rcx, 104(%%rdi)\n"
32744         "adcq    $0, %%rdx\n"
32745         "movq    %%rdx, %%rcx\n"
32746         "mulq    %[mult]\n"
32747         "addq    %%rax, %%rcx\n"
32748         "adcq    $0, %%rdx\n"
32749         "addq    %%rcx, 112(%%rdi)\n"
32750         "adcq    $0, %%rdx\n"
32751         "addq    %%rdx, 120(%%rdi)\n"
32752     : [z] "+m" (z)
32753     : [mult] "r" (c), [x] "m" (x)
32754     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
32755 }
32756 
32757 /* x has 14.5 words, z has 15.
32758  * Put (z+x*c) in z. Return carry word. */
32759 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul1_shortz */
32760 static inline
mpfq_fixmp_14_5_addmul1_shortz(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)32761 mp_limb_t mpfq_fixmp_14_5_addmul1_shortz(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
32762 {
32763     mp_limb_t carry;
32764     __asm__ __volatile__(
32765         "movq    %[z], %%rdi\n"
32766         "movq    %[x], %%rsi\n"
32767         "movq    0(%%rsi), %%rax\n"
32768         "mulq    %[mult]\n"
32769         "addq    %%rax, 0(%%rdi)\n"
32770         "movq    8(%%rsi), %%rax\n"
32771         "adcq    $0, %%rdx\n"
32772         "movq    %%rdx, %%rcx\n"
32773         "mulq    %[mult]\n"
32774         "addq    %%rax, %%rcx\n"
32775         "adcq    $0, %%rdx\n"
32776         "movq    16(%%rsi), %%rax\n"
32777         "addq    %%rcx, 8(%%rdi)\n"
32778         "adcq    $0, %%rdx\n"
32779         "movq    %%rdx, %%rcx\n"
32780         "mulq    %[mult]\n"
32781         "addq    %%rax, %%rcx\n"
32782         "adcq    $0, %%rdx\n"
32783         "movq    24(%%rsi), %%rax\n"
32784         "addq    %%rcx, 16(%%rdi)\n"
32785         "adcq    $0, %%rdx\n"
32786         "movq    %%rdx, %%rcx\n"
32787         "mulq    %[mult]\n"
32788         "addq    %%rax, %%rcx\n"
32789         "adcq    $0, %%rdx\n"
32790         "movq    32(%%rsi), %%rax\n"
32791         "addq    %%rcx, 24(%%rdi)\n"
32792         "adcq    $0, %%rdx\n"
32793         "movq    %%rdx, %%rcx\n"
32794         "mulq    %[mult]\n"
32795         "addq    %%rax, %%rcx\n"
32796         "adcq    $0, %%rdx\n"
32797         "movq    40(%%rsi), %%rax\n"
32798         "addq    %%rcx, 32(%%rdi)\n"
32799         "adcq    $0, %%rdx\n"
32800         "movq    %%rdx, %%rcx\n"
32801         "mulq    %[mult]\n"
32802         "addq    %%rax, %%rcx\n"
32803         "adcq    $0, %%rdx\n"
32804         "movq    48(%%rsi), %%rax\n"
32805         "addq    %%rcx, 40(%%rdi)\n"
32806         "adcq    $0, %%rdx\n"
32807         "movq    %%rdx, %%rcx\n"
32808         "mulq    %[mult]\n"
32809         "addq    %%rax, %%rcx\n"
32810         "adcq    $0, %%rdx\n"
32811         "movq    56(%%rsi), %%rax\n"
32812         "addq    %%rcx, 48(%%rdi)\n"
32813         "adcq    $0, %%rdx\n"
32814         "movq    %%rdx, %%rcx\n"
32815         "mulq    %[mult]\n"
32816         "addq    %%rax, %%rcx\n"
32817         "adcq    $0, %%rdx\n"
32818         "movq    64(%%rsi), %%rax\n"
32819         "addq    %%rcx, 56(%%rdi)\n"
32820         "adcq    $0, %%rdx\n"
32821         "movq    %%rdx, %%rcx\n"
32822         "mulq    %[mult]\n"
32823         "addq    %%rax, %%rcx\n"
32824         "adcq    $0, %%rdx\n"
32825         "movq    72(%%rsi), %%rax\n"
32826         "addq    %%rcx, 64(%%rdi)\n"
32827         "adcq    $0, %%rdx\n"
32828         "movq    %%rdx, %%rcx\n"
32829         "mulq    %[mult]\n"
32830         "addq    %%rax, %%rcx\n"
32831         "adcq    $0, %%rdx\n"
32832         "movq    80(%%rsi), %%rax\n"
32833         "addq    %%rcx, 72(%%rdi)\n"
32834         "adcq    $0, %%rdx\n"
32835         "movq    %%rdx, %%rcx\n"
32836         "mulq    %[mult]\n"
32837         "addq    %%rax, %%rcx\n"
32838         "adcq    $0, %%rdx\n"
32839         "movq    88(%%rsi), %%rax\n"
32840         "addq    %%rcx, 80(%%rdi)\n"
32841         "adcq    $0, %%rdx\n"
32842         "movq    %%rdx, %%rcx\n"
32843         "mulq    %[mult]\n"
32844         "addq    %%rax, %%rcx\n"
32845         "adcq    $0, %%rdx\n"
32846         "movq    96(%%rsi), %%rax\n"
32847         "addq    %%rcx, 88(%%rdi)\n"
32848         "adcq    $0, %%rdx\n"
32849         "movq    %%rdx, %%rcx\n"
32850         "mulq    %[mult]\n"
32851         "addq    %%rax, %%rcx\n"
32852         "adcq    $0, %%rdx\n"
32853         "movq    104(%%rsi), %%rax\n"
32854         "addq    %%rcx, 96(%%rdi)\n"
32855         "adcq    $0, %%rdx\n"
32856         "movq    %%rdx, %%rcx\n"
32857         "mulq    %[mult]\n"
32858         "addq    %%rax, %%rcx\n"
32859         "adcq    $0, %%rdx\n"
32860         "movq    112(%%rsi), %%rax\n"
32861         "addq    %%rcx, 104(%%rdi)\n"
32862         "adcq    $0, %%rdx\n"
32863         "movq    %%rdx, %%rcx\n"
32864         "mulq    %[mult]\n"
32865         "addq    %%rax, %%rcx\n"
32866         "adcq    $0, %%rdx\n"
32867         "addq    %%rcx, 112(%%rdi)\n"
32868         "adcq    $0, %%rdx\n"
32869         "movq    %%rdx, %[carry]\n"
32870     : [carry]"=g"(carry), [z] "+m" (z)
32871     : [mult] "r" (c), [x] "m" (x)
32872     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
32873     return carry;
32874 }
32875 
32876 /* x and y have 14.5 words, z has 29. Put x*y in z. */
32877 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul */
32878 static inline
mpfq_fixmp_14_5_mul(mp_limb_t * z,const mp_limb_t * x,const mp_limb_t * y)32879 void mpfq_fixmp_14_5_mul(mp_limb_t * z, const mp_limb_t * x, const mp_limb_t * y)
32880 {
32881     __asm__ __volatile__(
32882         "### x*y[0]\n"
32883         "movq    %2, %%r8\n"
32884         "movq    %0, %%rdi\n"
32885         "movq    0(%%r8), %%r9\n"
32886         "movq    %1, %%rsi\n"
32887         "movq    0(%%rsi), %%rax\n"
32888         "mulq    %%r9\n"
32889         "movq    %%rax, 0(%%rdi)\n"
32890         "movq    8(%%rsi), %%rax\n"
32891         "movq    %%rdx, %%rcx\n"
32892         "mulq    %%r9\n"
32893         "addq    %%rax, %%rcx\n"
32894         "adcq    $0, %%rdx\n"
32895         "movq    16(%%rsi), %%rax\n"
32896         "movq    %%rcx, 8(%%rdi)\n"
32897         "movq    %%rdx, %%rcx\n"
32898         "mulq    %%r9\n"
32899         "addq    %%rax, %%rcx\n"
32900         "adcq    $0, %%rdx\n"
32901         "movq    24(%%rsi), %%rax\n"
32902         "movq    %%rcx, 16(%%rdi)\n"
32903         "movq    %%rdx, %%rcx\n"
32904         "mulq    %%r9\n"
32905         "addq    %%rax, %%rcx\n"
32906         "adcq    $0, %%rdx\n"
32907         "movq    32(%%rsi), %%rax\n"
32908         "movq    %%rcx, 24(%%rdi)\n"
32909         "movq    %%rdx, %%rcx\n"
32910         "mulq    %%r9\n"
32911         "addq    %%rax, %%rcx\n"
32912         "adcq    $0, %%rdx\n"
32913         "movq    40(%%rsi), %%rax\n"
32914         "movq    %%rcx, 32(%%rdi)\n"
32915         "movq    %%rdx, %%rcx\n"
32916         "mulq    %%r9\n"
32917         "addq    %%rax, %%rcx\n"
32918         "adcq    $0, %%rdx\n"
32919         "movq    48(%%rsi), %%rax\n"
32920         "movq    %%rcx, 40(%%rdi)\n"
32921         "movq    %%rdx, %%rcx\n"
32922         "mulq    %%r9\n"
32923         "addq    %%rax, %%rcx\n"
32924         "adcq    $0, %%rdx\n"
32925         "movq    56(%%rsi), %%rax\n"
32926         "movq    %%rcx, 48(%%rdi)\n"
32927         "movq    %%rdx, %%rcx\n"
32928         "mulq    %%r9\n"
32929         "addq    %%rax, %%rcx\n"
32930         "adcq    $0, %%rdx\n"
32931         "movq    64(%%rsi), %%rax\n"
32932         "movq    %%rcx, 56(%%rdi)\n"
32933         "movq    %%rdx, %%rcx\n"
32934         "mulq    %%r9\n"
32935         "addq    %%rax, %%rcx\n"
32936         "adcq    $0, %%rdx\n"
32937         "movq    72(%%rsi), %%rax\n"
32938         "movq    %%rcx, 64(%%rdi)\n"
32939         "movq    %%rdx, %%rcx\n"
32940         "mulq    %%r9\n"
32941         "addq    %%rax, %%rcx\n"
32942         "adcq    $0, %%rdx\n"
32943         "movq    80(%%rsi), %%rax\n"
32944         "movq    %%rcx, 72(%%rdi)\n"
32945         "movq    %%rdx, %%rcx\n"
32946         "mulq    %%r9\n"
32947         "addq    %%rax, %%rcx\n"
32948         "adcq    $0, %%rdx\n"
32949         "movq    88(%%rsi), %%rax\n"
32950         "movq    %%rcx, 80(%%rdi)\n"
32951         "movq    %%rdx, %%rcx\n"
32952         "mulq    %%r9\n"
32953         "addq    %%rax, %%rcx\n"
32954         "adcq    $0, %%rdx\n"
32955         "movq    96(%%rsi), %%rax\n"
32956         "movq    %%rcx, 88(%%rdi)\n"
32957         "movq    %%rdx, %%rcx\n"
32958         "mulq    %%r9\n"
32959         "addq    %%rax, %%rcx\n"
32960         "adcq    $0, %%rdx\n"
32961         "movq    104(%%rsi), %%rax\n"
32962         "movq    %%rcx, 96(%%rdi)\n"
32963         "movq    %%rdx, %%rcx\n"
32964         "mulq    %%r9\n"
32965         "addq    %%rax, %%rcx\n"
32966         "adcq    $0, %%rdx\n"
32967         "movq    112(%%rsi), %%rax\n"
32968         "movq    %%rcx, 104(%%rdi)\n"
32969         "movq    %%rdx, %%rcx\n"
32970         "mulq    %%r9\n"
32971         "addq    %%rax, %%rcx\n"
32972         "adcq    $0, %%rdx\n"
32973         "movq    %%rcx, 112(%%rdi)\n"
32974         "movq    %%rdx, 120(%%rdi)\n"
32975         "movq    $0, 128(%%rdi)\n"
32976         "movq    $0, 136(%%rdi)\n"
32977         "movq    $0, 144(%%rdi)\n"
32978         "movq    $0, 152(%%rdi)\n"
32979         "movq    $0, 160(%%rdi)\n"
32980         "movq    $0, 168(%%rdi)\n"
32981         "movq    $0, 176(%%rdi)\n"
32982         "movq    $0, 184(%%rdi)\n"
32983         "movq    $0, 192(%%rdi)\n"
32984         "movq    $0, 200(%%rdi)\n"
32985         "movq    $0, 208(%%rdi)\n"
32986         "movq    $0, 216(%%rdi)\n"
32987         "movq    $0, 224(%%rdi)\n"
32988         "### x*y[1]\n"
32989         "movq    8(%%r8), %%r9\n"
32990         "movq    0(%%rsi), %%rax\n"
32991         "mulq    %%r9\n"
32992         "addq    %%rax, 8(%%rdi)\n"
32993         "movq    8(%%rsi), %%rax\n"
32994         "adcq    $0, %%rdx\n"
32995         "movq    %%rdx, %%rcx\n"
32996         "mulq    %%r9\n"
32997         "addq    %%rax, %%rcx\n"
32998         "adcq    $0, %%rdx\n"
32999         "movq    16(%%rsi), %%rax\n"
33000         "addq    %%rcx, 16(%%rdi)\n"
33001         "adcq    $0, %%rdx\n"
33002         "movq    %%rdx, %%rcx\n"
33003         "mulq    %%r9\n"
33004         "addq    %%rax, %%rcx\n"
33005         "adcq    $0, %%rdx\n"
33006         "movq    24(%%rsi), %%rax\n"
33007         "addq    %%rcx, 24(%%rdi)\n"
33008         "adcq    $0, %%rdx\n"
33009         "movq    %%rdx, %%rcx\n"
33010         "mulq    %%r9\n"
33011         "addq    %%rax, %%rcx\n"
33012         "adcq    $0, %%rdx\n"
33013         "movq    32(%%rsi), %%rax\n"
33014         "addq    %%rcx, 32(%%rdi)\n"
33015         "adcq    $0, %%rdx\n"
33016         "movq    %%rdx, %%rcx\n"
33017         "mulq    %%r9\n"
33018         "addq    %%rax, %%rcx\n"
33019         "adcq    $0, %%rdx\n"
33020         "movq    40(%%rsi), %%rax\n"
33021         "addq    %%rcx, 40(%%rdi)\n"
33022         "adcq    $0, %%rdx\n"
33023         "movq    %%rdx, %%rcx\n"
33024         "mulq    %%r9\n"
33025         "addq    %%rax, %%rcx\n"
33026         "adcq    $0, %%rdx\n"
33027         "movq    48(%%rsi), %%rax\n"
33028         "addq    %%rcx, 48(%%rdi)\n"
33029         "adcq    $0, %%rdx\n"
33030         "movq    %%rdx, %%rcx\n"
33031         "mulq    %%r9\n"
33032         "addq    %%rax, %%rcx\n"
33033         "adcq    $0, %%rdx\n"
33034         "movq    56(%%rsi), %%rax\n"
33035         "addq    %%rcx, 56(%%rdi)\n"
33036         "adcq    $0, %%rdx\n"
33037         "movq    %%rdx, %%rcx\n"
33038         "mulq    %%r9\n"
33039         "addq    %%rax, %%rcx\n"
33040         "adcq    $0, %%rdx\n"
33041         "movq    64(%%rsi), %%rax\n"
33042         "addq    %%rcx, 64(%%rdi)\n"
33043         "adcq    $0, %%rdx\n"
33044         "movq    %%rdx, %%rcx\n"
33045         "mulq    %%r9\n"
33046         "addq    %%rax, %%rcx\n"
33047         "adcq    $0, %%rdx\n"
33048         "movq    72(%%rsi), %%rax\n"
33049         "addq    %%rcx, 72(%%rdi)\n"
33050         "adcq    $0, %%rdx\n"
33051         "movq    %%rdx, %%rcx\n"
33052         "mulq    %%r9\n"
33053         "addq    %%rax, %%rcx\n"
33054         "adcq    $0, %%rdx\n"
33055         "movq    80(%%rsi), %%rax\n"
33056         "addq    %%rcx, 80(%%rdi)\n"
33057         "adcq    $0, %%rdx\n"
33058         "movq    %%rdx, %%rcx\n"
33059         "mulq    %%r9\n"
33060         "addq    %%rax, %%rcx\n"
33061         "adcq    $0, %%rdx\n"
33062         "movq    88(%%rsi), %%rax\n"
33063         "addq    %%rcx, 88(%%rdi)\n"
33064         "adcq    $0, %%rdx\n"
33065         "movq    %%rdx, %%rcx\n"
33066         "mulq    %%r9\n"
33067         "addq    %%rax, %%rcx\n"
33068         "adcq    $0, %%rdx\n"
33069         "movq    96(%%rsi), %%rax\n"
33070         "addq    %%rcx, 96(%%rdi)\n"
33071         "adcq    $0, %%rdx\n"
33072         "movq    %%rdx, %%rcx\n"
33073         "mulq    %%r9\n"
33074         "addq    %%rax, %%rcx\n"
33075         "adcq    $0, %%rdx\n"
33076         "movq    104(%%rsi), %%rax\n"
33077         "addq    %%rcx, 104(%%rdi)\n"
33078         "adcq    $0, %%rdx\n"
33079         "movq    %%rdx, %%rcx\n"
33080         "mulq    %%r9\n"
33081         "addq    %%rax, %%rcx\n"
33082         "adcq    $0, %%rdx\n"
33083         "movq    112(%%rsi), %%rax\n"
33084         "addq    %%rcx, 112(%%rdi)\n"
33085         "adcq    $0, %%rdx\n"
33086         "movq    %%rdx, %%rcx\n"
33087         "mulq    %%r9\n"
33088         "addq    %%rax, %%rcx\n"
33089         "adcq    $0, %%rdx\n"
33090         "addq    %%rcx, 120(%%rdi)\n"
33091         "adcq    $0, %%rdx\n"
33092         "movq    %%rdx, 128(%%rdi)\n"
33093         "### x*y[2]\n"
33094         "movq    16(%%r8), %%r9\n"
33095         "movq    0(%%rsi), %%rax\n"
33096         "mulq    %%r9\n"
33097         "addq    %%rax, 16(%%rdi)\n"
33098         "movq    8(%%rsi), %%rax\n"
33099         "adcq    $0, %%rdx\n"
33100         "movq    %%rdx, %%rcx\n"
33101         "mulq    %%r9\n"
33102         "addq    %%rax, %%rcx\n"
33103         "adcq    $0, %%rdx\n"
33104         "movq    16(%%rsi), %%rax\n"
33105         "addq    %%rcx, 24(%%rdi)\n"
33106         "adcq    $0, %%rdx\n"
33107         "movq    %%rdx, %%rcx\n"
33108         "mulq    %%r9\n"
33109         "addq    %%rax, %%rcx\n"
33110         "adcq    $0, %%rdx\n"
33111         "movq    24(%%rsi), %%rax\n"
33112         "addq    %%rcx, 32(%%rdi)\n"
33113         "adcq    $0, %%rdx\n"
33114         "movq    %%rdx, %%rcx\n"
33115         "mulq    %%r9\n"
33116         "addq    %%rax, %%rcx\n"
33117         "adcq    $0, %%rdx\n"
33118         "movq    32(%%rsi), %%rax\n"
33119         "addq    %%rcx, 40(%%rdi)\n"
33120         "adcq    $0, %%rdx\n"
33121         "movq    %%rdx, %%rcx\n"
33122         "mulq    %%r9\n"
33123         "addq    %%rax, %%rcx\n"
33124         "adcq    $0, %%rdx\n"
33125         "movq    40(%%rsi), %%rax\n"
33126         "addq    %%rcx, 48(%%rdi)\n"
33127         "adcq    $0, %%rdx\n"
33128         "movq    %%rdx, %%rcx\n"
33129         "mulq    %%r9\n"
33130         "addq    %%rax, %%rcx\n"
33131         "adcq    $0, %%rdx\n"
33132         "movq    48(%%rsi), %%rax\n"
33133         "addq    %%rcx, 56(%%rdi)\n"
33134         "adcq    $0, %%rdx\n"
33135         "movq    %%rdx, %%rcx\n"
33136         "mulq    %%r9\n"
33137         "addq    %%rax, %%rcx\n"
33138         "adcq    $0, %%rdx\n"
33139         "movq    56(%%rsi), %%rax\n"
33140         "addq    %%rcx, 64(%%rdi)\n"
33141         "adcq    $0, %%rdx\n"
33142         "movq    %%rdx, %%rcx\n"
33143         "mulq    %%r9\n"
33144         "addq    %%rax, %%rcx\n"
33145         "adcq    $0, %%rdx\n"
33146         "movq    64(%%rsi), %%rax\n"
33147         "addq    %%rcx, 72(%%rdi)\n"
33148         "adcq    $0, %%rdx\n"
33149         "movq    %%rdx, %%rcx\n"
33150         "mulq    %%r9\n"
33151         "addq    %%rax, %%rcx\n"
33152         "adcq    $0, %%rdx\n"
33153         "movq    72(%%rsi), %%rax\n"
33154         "addq    %%rcx, 80(%%rdi)\n"
33155         "adcq    $0, %%rdx\n"
33156         "movq    %%rdx, %%rcx\n"
33157         "mulq    %%r9\n"
33158         "addq    %%rax, %%rcx\n"
33159         "adcq    $0, %%rdx\n"
33160         "movq    80(%%rsi), %%rax\n"
33161         "addq    %%rcx, 88(%%rdi)\n"
33162         "adcq    $0, %%rdx\n"
33163         "movq    %%rdx, %%rcx\n"
33164         "mulq    %%r9\n"
33165         "addq    %%rax, %%rcx\n"
33166         "adcq    $0, %%rdx\n"
33167         "movq    88(%%rsi), %%rax\n"
33168         "addq    %%rcx, 96(%%rdi)\n"
33169         "adcq    $0, %%rdx\n"
33170         "movq    %%rdx, %%rcx\n"
33171         "mulq    %%r9\n"
33172         "addq    %%rax, %%rcx\n"
33173         "adcq    $0, %%rdx\n"
33174         "movq    96(%%rsi), %%rax\n"
33175         "addq    %%rcx, 104(%%rdi)\n"
33176         "adcq    $0, %%rdx\n"
33177         "movq    %%rdx, %%rcx\n"
33178         "mulq    %%r9\n"
33179         "addq    %%rax, %%rcx\n"
33180         "adcq    $0, %%rdx\n"
33181         "movq    104(%%rsi), %%rax\n"
33182         "addq    %%rcx, 112(%%rdi)\n"
33183         "adcq    $0, %%rdx\n"
33184         "movq    %%rdx, %%rcx\n"
33185         "mulq    %%r9\n"
33186         "addq    %%rax, %%rcx\n"
33187         "adcq    $0, %%rdx\n"
33188         "movq    112(%%rsi), %%rax\n"
33189         "addq    %%rcx, 120(%%rdi)\n"
33190         "adcq    $0, %%rdx\n"
33191         "movq    %%rdx, %%rcx\n"
33192         "mulq    %%r9\n"
33193         "addq    %%rax, %%rcx\n"
33194         "adcq    $0, %%rdx\n"
33195         "addq    %%rcx, 128(%%rdi)\n"
33196         "adcq    $0, %%rdx\n"
33197         "movq    %%rdx, 136(%%rdi)\n"
33198         "### x*y[3]\n"
33199         "movq    24(%%r8), %%r9\n"
33200         "movq    0(%%rsi), %%rax\n"
33201         "mulq    %%r9\n"
33202         "addq    %%rax, 24(%%rdi)\n"
33203         "movq    8(%%rsi), %%rax\n"
33204         "adcq    $0, %%rdx\n"
33205         "movq    %%rdx, %%rcx\n"
33206         "mulq    %%r9\n"
33207         "addq    %%rax, %%rcx\n"
33208         "adcq    $0, %%rdx\n"
33209         "movq    16(%%rsi), %%rax\n"
33210         "addq    %%rcx, 32(%%rdi)\n"
33211         "adcq    $0, %%rdx\n"
33212         "movq    %%rdx, %%rcx\n"
33213         "mulq    %%r9\n"
33214         "addq    %%rax, %%rcx\n"
33215         "adcq    $0, %%rdx\n"
33216         "movq    24(%%rsi), %%rax\n"
33217         "addq    %%rcx, 40(%%rdi)\n"
33218         "adcq    $0, %%rdx\n"
33219         "movq    %%rdx, %%rcx\n"
33220         "mulq    %%r9\n"
33221         "addq    %%rax, %%rcx\n"
33222         "adcq    $0, %%rdx\n"
33223         "movq    32(%%rsi), %%rax\n"
33224         "addq    %%rcx, 48(%%rdi)\n"
33225         "adcq    $0, %%rdx\n"
33226         "movq    %%rdx, %%rcx\n"
33227         "mulq    %%r9\n"
33228         "addq    %%rax, %%rcx\n"
33229         "adcq    $0, %%rdx\n"
33230         "movq    40(%%rsi), %%rax\n"
33231         "addq    %%rcx, 56(%%rdi)\n"
33232         "adcq    $0, %%rdx\n"
33233         "movq    %%rdx, %%rcx\n"
33234         "mulq    %%r9\n"
33235         "addq    %%rax, %%rcx\n"
33236         "adcq    $0, %%rdx\n"
33237         "movq    48(%%rsi), %%rax\n"
33238         "addq    %%rcx, 64(%%rdi)\n"
33239         "adcq    $0, %%rdx\n"
33240         "movq    %%rdx, %%rcx\n"
33241         "mulq    %%r9\n"
33242         "addq    %%rax, %%rcx\n"
33243         "adcq    $0, %%rdx\n"
33244         "movq    56(%%rsi), %%rax\n"
33245         "addq    %%rcx, 72(%%rdi)\n"
33246         "adcq    $0, %%rdx\n"
33247         "movq    %%rdx, %%rcx\n"
33248         "mulq    %%r9\n"
33249         "addq    %%rax, %%rcx\n"
33250         "adcq    $0, %%rdx\n"
33251         "movq    64(%%rsi), %%rax\n"
33252         "addq    %%rcx, 80(%%rdi)\n"
33253         "adcq    $0, %%rdx\n"
33254         "movq    %%rdx, %%rcx\n"
33255         "mulq    %%r9\n"
33256         "addq    %%rax, %%rcx\n"
33257         "adcq    $0, %%rdx\n"
33258         "movq    72(%%rsi), %%rax\n"
33259         "addq    %%rcx, 88(%%rdi)\n"
33260         "adcq    $0, %%rdx\n"
33261         "movq    %%rdx, %%rcx\n"
33262         "mulq    %%r9\n"
33263         "addq    %%rax, %%rcx\n"
33264         "adcq    $0, %%rdx\n"
33265         "movq    80(%%rsi), %%rax\n"
33266         "addq    %%rcx, 96(%%rdi)\n"
33267         "adcq    $0, %%rdx\n"
33268         "movq    %%rdx, %%rcx\n"
33269         "mulq    %%r9\n"
33270         "addq    %%rax, %%rcx\n"
33271         "adcq    $0, %%rdx\n"
33272         "movq    88(%%rsi), %%rax\n"
33273         "addq    %%rcx, 104(%%rdi)\n"
33274         "adcq    $0, %%rdx\n"
33275         "movq    %%rdx, %%rcx\n"
33276         "mulq    %%r9\n"
33277         "addq    %%rax, %%rcx\n"
33278         "adcq    $0, %%rdx\n"
33279         "movq    96(%%rsi), %%rax\n"
33280         "addq    %%rcx, 112(%%rdi)\n"
33281         "adcq    $0, %%rdx\n"
33282         "movq    %%rdx, %%rcx\n"
33283         "mulq    %%r9\n"
33284         "addq    %%rax, %%rcx\n"
33285         "adcq    $0, %%rdx\n"
33286         "movq    104(%%rsi), %%rax\n"
33287         "addq    %%rcx, 120(%%rdi)\n"
33288         "adcq    $0, %%rdx\n"
33289         "movq    %%rdx, %%rcx\n"
33290         "mulq    %%r9\n"
33291         "addq    %%rax, %%rcx\n"
33292         "adcq    $0, %%rdx\n"
33293         "movq    112(%%rsi), %%rax\n"
33294         "addq    %%rcx, 128(%%rdi)\n"
33295         "adcq    $0, %%rdx\n"
33296         "movq    %%rdx, %%rcx\n"
33297         "mulq    %%r9\n"
33298         "addq    %%rax, %%rcx\n"
33299         "adcq    $0, %%rdx\n"
33300         "addq    %%rcx, 136(%%rdi)\n"
33301         "adcq    $0, %%rdx\n"
33302         "movq    %%rdx, 144(%%rdi)\n"
33303         "### x*y[4]\n"
33304         "movq    32(%%r8), %%r9\n"
33305         "movq    0(%%rsi), %%rax\n"
33306         "mulq    %%r9\n"
33307         "addq    %%rax, 32(%%rdi)\n"
33308         "movq    8(%%rsi), %%rax\n"
33309         "adcq    $0, %%rdx\n"
33310         "movq    %%rdx, %%rcx\n"
33311         "mulq    %%r9\n"
33312         "addq    %%rax, %%rcx\n"
33313         "adcq    $0, %%rdx\n"
33314         "movq    16(%%rsi), %%rax\n"
33315         "addq    %%rcx, 40(%%rdi)\n"
33316         "adcq    $0, %%rdx\n"
33317         "movq    %%rdx, %%rcx\n"
33318         "mulq    %%r9\n"
33319         "addq    %%rax, %%rcx\n"
33320         "adcq    $0, %%rdx\n"
33321         "movq    24(%%rsi), %%rax\n"
33322         "addq    %%rcx, 48(%%rdi)\n"
33323         "adcq    $0, %%rdx\n"
33324         "movq    %%rdx, %%rcx\n"
33325         "mulq    %%r9\n"
33326         "addq    %%rax, %%rcx\n"
33327         "adcq    $0, %%rdx\n"
33328         "movq    32(%%rsi), %%rax\n"
33329         "addq    %%rcx, 56(%%rdi)\n"
33330         "adcq    $0, %%rdx\n"
33331         "movq    %%rdx, %%rcx\n"
33332         "mulq    %%r9\n"
33333         "addq    %%rax, %%rcx\n"
33334         "adcq    $0, %%rdx\n"
33335         "movq    40(%%rsi), %%rax\n"
33336         "addq    %%rcx, 64(%%rdi)\n"
33337         "adcq    $0, %%rdx\n"
33338         "movq    %%rdx, %%rcx\n"
33339         "mulq    %%r9\n"
33340         "addq    %%rax, %%rcx\n"
33341         "adcq    $0, %%rdx\n"
33342         "movq    48(%%rsi), %%rax\n"
33343         "addq    %%rcx, 72(%%rdi)\n"
33344         "adcq    $0, %%rdx\n"
33345         "movq    %%rdx, %%rcx\n"
33346         "mulq    %%r9\n"
33347         "addq    %%rax, %%rcx\n"
33348         "adcq    $0, %%rdx\n"
33349         "movq    56(%%rsi), %%rax\n"
33350         "addq    %%rcx, 80(%%rdi)\n"
33351         "adcq    $0, %%rdx\n"
33352         "movq    %%rdx, %%rcx\n"
33353         "mulq    %%r9\n"
33354         "addq    %%rax, %%rcx\n"
33355         "adcq    $0, %%rdx\n"
33356         "movq    64(%%rsi), %%rax\n"
33357         "addq    %%rcx, 88(%%rdi)\n"
33358         "adcq    $0, %%rdx\n"
33359         "movq    %%rdx, %%rcx\n"
33360         "mulq    %%r9\n"
33361         "addq    %%rax, %%rcx\n"
33362         "adcq    $0, %%rdx\n"
33363         "movq    72(%%rsi), %%rax\n"
33364         "addq    %%rcx, 96(%%rdi)\n"
33365         "adcq    $0, %%rdx\n"
33366         "movq    %%rdx, %%rcx\n"
33367         "mulq    %%r9\n"
33368         "addq    %%rax, %%rcx\n"
33369         "adcq    $0, %%rdx\n"
33370         "movq    80(%%rsi), %%rax\n"
33371         "addq    %%rcx, 104(%%rdi)\n"
33372         "adcq    $0, %%rdx\n"
33373         "movq    %%rdx, %%rcx\n"
33374         "mulq    %%r9\n"
33375         "addq    %%rax, %%rcx\n"
33376         "adcq    $0, %%rdx\n"
33377         "movq    88(%%rsi), %%rax\n"
33378         "addq    %%rcx, 112(%%rdi)\n"
33379         "adcq    $0, %%rdx\n"
33380         "movq    %%rdx, %%rcx\n"
33381         "mulq    %%r9\n"
33382         "addq    %%rax, %%rcx\n"
33383         "adcq    $0, %%rdx\n"
33384         "movq    96(%%rsi), %%rax\n"
33385         "addq    %%rcx, 120(%%rdi)\n"
33386         "adcq    $0, %%rdx\n"
33387         "movq    %%rdx, %%rcx\n"
33388         "mulq    %%r9\n"
33389         "addq    %%rax, %%rcx\n"
33390         "adcq    $0, %%rdx\n"
33391         "movq    104(%%rsi), %%rax\n"
33392         "addq    %%rcx, 128(%%rdi)\n"
33393         "adcq    $0, %%rdx\n"
33394         "movq    %%rdx, %%rcx\n"
33395         "mulq    %%r9\n"
33396         "addq    %%rax, %%rcx\n"
33397         "adcq    $0, %%rdx\n"
33398         "movq    112(%%rsi), %%rax\n"
33399         "addq    %%rcx, 136(%%rdi)\n"
33400         "adcq    $0, %%rdx\n"
33401         "movq    %%rdx, %%rcx\n"
33402         "mulq    %%r9\n"
33403         "addq    %%rax, %%rcx\n"
33404         "adcq    $0, %%rdx\n"
33405         "addq    %%rcx, 144(%%rdi)\n"
33406         "adcq    $0, %%rdx\n"
33407         "movq    %%rdx, 152(%%rdi)\n"
33408         "### x*y[5]\n"
33409         "movq    40(%%r8), %%r9\n"
33410         "movq    0(%%rsi), %%rax\n"
33411         "mulq    %%r9\n"
33412         "addq    %%rax, 40(%%rdi)\n"
33413         "movq    8(%%rsi), %%rax\n"
33414         "adcq    $0, %%rdx\n"
33415         "movq    %%rdx, %%rcx\n"
33416         "mulq    %%r9\n"
33417         "addq    %%rax, %%rcx\n"
33418         "adcq    $0, %%rdx\n"
33419         "movq    16(%%rsi), %%rax\n"
33420         "addq    %%rcx, 48(%%rdi)\n"
33421         "adcq    $0, %%rdx\n"
33422         "movq    %%rdx, %%rcx\n"
33423         "mulq    %%r9\n"
33424         "addq    %%rax, %%rcx\n"
33425         "adcq    $0, %%rdx\n"
33426         "movq    24(%%rsi), %%rax\n"
33427         "addq    %%rcx, 56(%%rdi)\n"
33428         "adcq    $0, %%rdx\n"
33429         "movq    %%rdx, %%rcx\n"
33430         "mulq    %%r9\n"
33431         "addq    %%rax, %%rcx\n"
33432         "adcq    $0, %%rdx\n"
33433         "movq    32(%%rsi), %%rax\n"
33434         "addq    %%rcx, 64(%%rdi)\n"
33435         "adcq    $0, %%rdx\n"
33436         "movq    %%rdx, %%rcx\n"
33437         "mulq    %%r9\n"
33438         "addq    %%rax, %%rcx\n"
33439         "adcq    $0, %%rdx\n"
33440         "movq    40(%%rsi), %%rax\n"
33441         "addq    %%rcx, 72(%%rdi)\n"
33442         "adcq    $0, %%rdx\n"
33443         "movq    %%rdx, %%rcx\n"
33444         "mulq    %%r9\n"
33445         "addq    %%rax, %%rcx\n"
33446         "adcq    $0, %%rdx\n"
33447         "movq    48(%%rsi), %%rax\n"
33448         "addq    %%rcx, 80(%%rdi)\n"
33449         "adcq    $0, %%rdx\n"
33450         "movq    %%rdx, %%rcx\n"
33451         "mulq    %%r9\n"
33452         "addq    %%rax, %%rcx\n"
33453         "adcq    $0, %%rdx\n"
33454         "movq    56(%%rsi), %%rax\n"
33455         "addq    %%rcx, 88(%%rdi)\n"
33456         "adcq    $0, %%rdx\n"
33457         "movq    %%rdx, %%rcx\n"
33458         "mulq    %%r9\n"
33459         "addq    %%rax, %%rcx\n"
33460         "adcq    $0, %%rdx\n"
33461         "movq    64(%%rsi), %%rax\n"
33462         "addq    %%rcx, 96(%%rdi)\n"
33463         "adcq    $0, %%rdx\n"
33464         "movq    %%rdx, %%rcx\n"
33465         "mulq    %%r9\n"
33466         "addq    %%rax, %%rcx\n"
33467         "adcq    $0, %%rdx\n"
33468         "movq    72(%%rsi), %%rax\n"
33469         "addq    %%rcx, 104(%%rdi)\n"
33470         "adcq    $0, %%rdx\n"
33471         "movq    %%rdx, %%rcx\n"
33472         "mulq    %%r9\n"
33473         "addq    %%rax, %%rcx\n"
33474         "adcq    $0, %%rdx\n"
33475         "movq    80(%%rsi), %%rax\n"
33476         "addq    %%rcx, 112(%%rdi)\n"
33477         "adcq    $0, %%rdx\n"
33478         "movq    %%rdx, %%rcx\n"
33479         "mulq    %%r9\n"
33480         "addq    %%rax, %%rcx\n"
33481         "adcq    $0, %%rdx\n"
33482         "movq    88(%%rsi), %%rax\n"
33483         "addq    %%rcx, 120(%%rdi)\n"
33484         "adcq    $0, %%rdx\n"
33485         "movq    %%rdx, %%rcx\n"
33486         "mulq    %%r9\n"
33487         "addq    %%rax, %%rcx\n"
33488         "adcq    $0, %%rdx\n"
33489         "movq    96(%%rsi), %%rax\n"
33490         "addq    %%rcx, 128(%%rdi)\n"
33491         "adcq    $0, %%rdx\n"
33492         "movq    %%rdx, %%rcx\n"
33493         "mulq    %%r9\n"
33494         "addq    %%rax, %%rcx\n"
33495         "adcq    $0, %%rdx\n"
33496         "movq    104(%%rsi), %%rax\n"
33497         "addq    %%rcx, 136(%%rdi)\n"
33498         "adcq    $0, %%rdx\n"
33499         "movq    %%rdx, %%rcx\n"
33500         "mulq    %%r9\n"
33501         "addq    %%rax, %%rcx\n"
33502         "adcq    $0, %%rdx\n"
33503         "movq    112(%%rsi), %%rax\n"
33504         "addq    %%rcx, 144(%%rdi)\n"
33505         "adcq    $0, %%rdx\n"
33506         "movq    %%rdx, %%rcx\n"
33507         "mulq    %%r9\n"
33508         "addq    %%rax, %%rcx\n"
33509         "adcq    $0, %%rdx\n"
33510         "addq    %%rcx, 152(%%rdi)\n"
33511         "adcq    $0, %%rdx\n"
33512         "movq    %%rdx, 160(%%rdi)\n"
33513         "### x*y[6]\n"
33514         "movq    48(%%r8), %%r9\n"
33515         "movq    0(%%rsi), %%rax\n"
33516         "mulq    %%r9\n"
33517         "addq    %%rax, 48(%%rdi)\n"
33518         "movq    8(%%rsi), %%rax\n"
33519         "adcq    $0, %%rdx\n"
33520         "movq    %%rdx, %%rcx\n"
33521         "mulq    %%r9\n"
33522         "addq    %%rax, %%rcx\n"
33523         "adcq    $0, %%rdx\n"
33524         "movq    16(%%rsi), %%rax\n"
33525         "addq    %%rcx, 56(%%rdi)\n"
33526         "adcq    $0, %%rdx\n"
33527         "movq    %%rdx, %%rcx\n"
33528         "mulq    %%r9\n"
33529         "addq    %%rax, %%rcx\n"
33530         "adcq    $0, %%rdx\n"
33531         "movq    24(%%rsi), %%rax\n"
33532         "addq    %%rcx, 64(%%rdi)\n"
33533         "adcq    $0, %%rdx\n"
33534         "movq    %%rdx, %%rcx\n"
33535         "mulq    %%r9\n"
33536         "addq    %%rax, %%rcx\n"
33537         "adcq    $0, %%rdx\n"
33538         "movq    32(%%rsi), %%rax\n"
33539         "addq    %%rcx, 72(%%rdi)\n"
33540         "adcq    $0, %%rdx\n"
33541         "movq    %%rdx, %%rcx\n"
33542         "mulq    %%r9\n"
33543         "addq    %%rax, %%rcx\n"
33544         "adcq    $0, %%rdx\n"
33545         "movq    40(%%rsi), %%rax\n"
33546         "addq    %%rcx, 80(%%rdi)\n"
33547         "adcq    $0, %%rdx\n"
33548         "movq    %%rdx, %%rcx\n"
33549         "mulq    %%r9\n"
33550         "addq    %%rax, %%rcx\n"
33551         "adcq    $0, %%rdx\n"
33552         "movq    48(%%rsi), %%rax\n"
33553         "addq    %%rcx, 88(%%rdi)\n"
33554         "adcq    $0, %%rdx\n"
33555         "movq    %%rdx, %%rcx\n"
33556         "mulq    %%r9\n"
33557         "addq    %%rax, %%rcx\n"
33558         "adcq    $0, %%rdx\n"
33559         "movq    56(%%rsi), %%rax\n"
33560         "addq    %%rcx, 96(%%rdi)\n"
33561         "adcq    $0, %%rdx\n"
33562         "movq    %%rdx, %%rcx\n"
33563         "mulq    %%r9\n"
33564         "addq    %%rax, %%rcx\n"
33565         "adcq    $0, %%rdx\n"
33566         "movq    64(%%rsi), %%rax\n"
33567         "addq    %%rcx, 104(%%rdi)\n"
33568         "adcq    $0, %%rdx\n"
33569         "movq    %%rdx, %%rcx\n"
33570         "mulq    %%r9\n"
33571         "addq    %%rax, %%rcx\n"
33572         "adcq    $0, %%rdx\n"
33573         "movq    72(%%rsi), %%rax\n"
33574         "addq    %%rcx, 112(%%rdi)\n"
33575         "adcq    $0, %%rdx\n"
33576         "movq    %%rdx, %%rcx\n"
33577         "mulq    %%r9\n"
33578         "addq    %%rax, %%rcx\n"
33579         "adcq    $0, %%rdx\n"
33580         "movq    80(%%rsi), %%rax\n"
33581         "addq    %%rcx, 120(%%rdi)\n"
33582         "adcq    $0, %%rdx\n"
33583         "movq    %%rdx, %%rcx\n"
33584         "mulq    %%r9\n"
33585         "addq    %%rax, %%rcx\n"
33586         "adcq    $0, %%rdx\n"
33587         "movq    88(%%rsi), %%rax\n"
33588         "addq    %%rcx, 128(%%rdi)\n"
33589         "adcq    $0, %%rdx\n"
33590         "movq    %%rdx, %%rcx\n"
33591         "mulq    %%r9\n"
33592         "addq    %%rax, %%rcx\n"
33593         "adcq    $0, %%rdx\n"
33594         "movq    96(%%rsi), %%rax\n"
33595         "addq    %%rcx, 136(%%rdi)\n"
33596         "adcq    $0, %%rdx\n"
33597         "movq    %%rdx, %%rcx\n"
33598         "mulq    %%r9\n"
33599         "addq    %%rax, %%rcx\n"
33600         "adcq    $0, %%rdx\n"
33601         "movq    104(%%rsi), %%rax\n"
33602         "addq    %%rcx, 144(%%rdi)\n"
33603         "adcq    $0, %%rdx\n"
33604         "movq    %%rdx, %%rcx\n"
33605         "mulq    %%r9\n"
33606         "addq    %%rax, %%rcx\n"
33607         "adcq    $0, %%rdx\n"
33608         "movq    112(%%rsi), %%rax\n"
33609         "addq    %%rcx, 152(%%rdi)\n"
33610         "adcq    $0, %%rdx\n"
33611         "movq    %%rdx, %%rcx\n"
33612         "mulq    %%r9\n"
33613         "addq    %%rax, %%rcx\n"
33614         "adcq    $0, %%rdx\n"
33615         "addq    %%rcx, 160(%%rdi)\n"
33616         "adcq    $0, %%rdx\n"
33617         "movq    %%rdx, 168(%%rdi)\n"
33618         "### x*y[7]\n"
33619         "movq    56(%%r8), %%r9\n"
33620         "movq    0(%%rsi), %%rax\n"
33621         "mulq    %%r9\n"
33622         "addq    %%rax, 56(%%rdi)\n"
33623         "movq    8(%%rsi), %%rax\n"
33624         "adcq    $0, %%rdx\n"
33625         "movq    %%rdx, %%rcx\n"
33626         "mulq    %%r9\n"
33627         "addq    %%rax, %%rcx\n"
33628         "adcq    $0, %%rdx\n"
33629         "movq    16(%%rsi), %%rax\n"
33630         "addq    %%rcx, 64(%%rdi)\n"
33631         "adcq    $0, %%rdx\n"
33632         "movq    %%rdx, %%rcx\n"
33633         "mulq    %%r9\n"
33634         "addq    %%rax, %%rcx\n"
33635         "adcq    $0, %%rdx\n"
33636         "movq    24(%%rsi), %%rax\n"
33637         "addq    %%rcx, 72(%%rdi)\n"
33638         "adcq    $0, %%rdx\n"
33639         "movq    %%rdx, %%rcx\n"
33640         "mulq    %%r9\n"
33641         "addq    %%rax, %%rcx\n"
33642         "adcq    $0, %%rdx\n"
33643         "movq    32(%%rsi), %%rax\n"
33644         "addq    %%rcx, 80(%%rdi)\n"
33645         "adcq    $0, %%rdx\n"
33646         "movq    %%rdx, %%rcx\n"
33647         "mulq    %%r9\n"
33648         "addq    %%rax, %%rcx\n"
33649         "adcq    $0, %%rdx\n"
33650         "movq    40(%%rsi), %%rax\n"
33651         "addq    %%rcx, 88(%%rdi)\n"
33652         "adcq    $0, %%rdx\n"
33653         "movq    %%rdx, %%rcx\n"
33654         "mulq    %%r9\n"
33655         "addq    %%rax, %%rcx\n"
33656         "adcq    $0, %%rdx\n"
33657         "movq    48(%%rsi), %%rax\n"
33658         "addq    %%rcx, 96(%%rdi)\n"
33659         "adcq    $0, %%rdx\n"
33660         "movq    %%rdx, %%rcx\n"
33661         "mulq    %%r9\n"
33662         "addq    %%rax, %%rcx\n"
33663         "adcq    $0, %%rdx\n"
33664         "movq    56(%%rsi), %%rax\n"
33665         "addq    %%rcx, 104(%%rdi)\n"
33666         "adcq    $0, %%rdx\n"
33667         "movq    %%rdx, %%rcx\n"
33668         "mulq    %%r9\n"
33669         "addq    %%rax, %%rcx\n"
33670         "adcq    $0, %%rdx\n"
33671         "movq    64(%%rsi), %%rax\n"
33672         "addq    %%rcx, 112(%%rdi)\n"
33673         "adcq    $0, %%rdx\n"
33674         "movq    %%rdx, %%rcx\n"
33675         "mulq    %%r9\n"
33676         "addq    %%rax, %%rcx\n"
33677         "adcq    $0, %%rdx\n"
33678         "movq    72(%%rsi), %%rax\n"
33679         "addq    %%rcx, 120(%%rdi)\n"
33680         "adcq    $0, %%rdx\n"
33681         "movq    %%rdx, %%rcx\n"
33682         "mulq    %%r9\n"
33683         "addq    %%rax, %%rcx\n"
33684         "adcq    $0, %%rdx\n"
33685         "movq    80(%%rsi), %%rax\n"
33686         "addq    %%rcx, 128(%%rdi)\n"
33687         "adcq    $0, %%rdx\n"
33688         "movq    %%rdx, %%rcx\n"
33689         "mulq    %%r9\n"
33690         "addq    %%rax, %%rcx\n"
33691         "adcq    $0, %%rdx\n"
33692         "movq    88(%%rsi), %%rax\n"
33693         "addq    %%rcx, 136(%%rdi)\n"
33694         "adcq    $0, %%rdx\n"
33695         "movq    %%rdx, %%rcx\n"
33696         "mulq    %%r9\n"
33697         "addq    %%rax, %%rcx\n"
33698         "adcq    $0, %%rdx\n"
33699         "movq    96(%%rsi), %%rax\n"
33700         "addq    %%rcx, 144(%%rdi)\n"
33701         "adcq    $0, %%rdx\n"
33702         "movq    %%rdx, %%rcx\n"
33703         "mulq    %%r9\n"
33704         "addq    %%rax, %%rcx\n"
33705         "adcq    $0, %%rdx\n"
33706         "movq    104(%%rsi), %%rax\n"
33707         "addq    %%rcx, 152(%%rdi)\n"
33708         "adcq    $0, %%rdx\n"
33709         "movq    %%rdx, %%rcx\n"
33710         "mulq    %%r9\n"
33711         "addq    %%rax, %%rcx\n"
33712         "adcq    $0, %%rdx\n"
33713         "movq    112(%%rsi), %%rax\n"
33714         "addq    %%rcx, 160(%%rdi)\n"
33715         "adcq    $0, %%rdx\n"
33716         "movq    %%rdx, %%rcx\n"
33717         "mulq    %%r9\n"
33718         "addq    %%rax, %%rcx\n"
33719         "adcq    $0, %%rdx\n"
33720         "addq    %%rcx, 168(%%rdi)\n"
33721         "adcq    $0, %%rdx\n"
33722         "movq    %%rdx, 176(%%rdi)\n"
33723         "### x*y[8]\n"
33724         "movq    64(%%r8), %%r9\n"
33725         "movq    0(%%rsi), %%rax\n"
33726         "mulq    %%r9\n"
33727         "addq    %%rax, 64(%%rdi)\n"
33728         "movq    8(%%rsi), %%rax\n"
33729         "adcq    $0, %%rdx\n"
33730         "movq    %%rdx, %%rcx\n"
33731         "mulq    %%r9\n"
33732         "addq    %%rax, %%rcx\n"
33733         "adcq    $0, %%rdx\n"
33734         "movq    16(%%rsi), %%rax\n"
33735         "addq    %%rcx, 72(%%rdi)\n"
33736         "adcq    $0, %%rdx\n"
33737         "movq    %%rdx, %%rcx\n"
33738         "mulq    %%r9\n"
33739         "addq    %%rax, %%rcx\n"
33740         "adcq    $0, %%rdx\n"
33741         "movq    24(%%rsi), %%rax\n"
33742         "addq    %%rcx, 80(%%rdi)\n"
33743         "adcq    $0, %%rdx\n"
33744         "movq    %%rdx, %%rcx\n"
33745         "mulq    %%r9\n"
33746         "addq    %%rax, %%rcx\n"
33747         "adcq    $0, %%rdx\n"
33748         "movq    32(%%rsi), %%rax\n"
33749         "addq    %%rcx, 88(%%rdi)\n"
33750         "adcq    $0, %%rdx\n"
33751         "movq    %%rdx, %%rcx\n"
33752         "mulq    %%r9\n"
33753         "addq    %%rax, %%rcx\n"
33754         "adcq    $0, %%rdx\n"
33755         "movq    40(%%rsi), %%rax\n"
33756         "addq    %%rcx, 96(%%rdi)\n"
33757         "adcq    $0, %%rdx\n"
33758         "movq    %%rdx, %%rcx\n"
33759         "mulq    %%r9\n"
33760         "addq    %%rax, %%rcx\n"
33761         "adcq    $0, %%rdx\n"
33762         "movq    48(%%rsi), %%rax\n"
33763         "addq    %%rcx, 104(%%rdi)\n"
33764         "adcq    $0, %%rdx\n"
33765         "movq    %%rdx, %%rcx\n"
33766         "mulq    %%r9\n"
33767         "addq    %%rax, %%rcx\n"
33768         "adcq    $0, %%rdx\n"
33769         "movq    56(%%rsi), %%rax\n"
33770         "addq    %%rcx, 112(%%rdi)\n"
33771         "adcq    $0, %%rdx\n"
33772         "movq    %%rdx, %%rcx\n"
33773         "mulq    %%r9\n"
33774         "addq    %%rax, %%rcx\n"
33775         "adcq    $0, %%rdx\n"
33776         "movq    64(%%rsi), %%rax\n"
33777         "addq    %%rcx, 120(%%rdi)\n"
33778         "adcq    $0, %%rdx\n"
33779         "movq    %%rdx, %%rcx\n"
33780         "mulq    %%r9\n"
33781         "addq    %%rax, %%rcx\n"
33782         "adcq    $0, %%rdx\n"
33783         "movq    72(%%rsi), %%rax\n"
33784         "addq    %%rcx, 128(%%rdi)\n"
33785         "adcq    $0, %%rdx\n"
33786         "movq    %%rdx, %%rcx\n"
33787         "mulq    %%r9\n"
33788         "addq    %%rax, %%rcx\n"
33789         "adcq    $0, %%rdx\n"
33790         "movq    80(%%rsi), %%rax\n"
33791         "addq    %%rcx, 136(%%rdi)\n"
33792         "adcq    $0, %%rdx\n"
33793         "movq    %%rdx, %%rcx\n"
33794         "mulq    %%r9\n"
33795         "addq    %%rax, %%rcx\n"
33796         "adcq    $0, %%rdx\n"
33797         "movq    88(%%rsi), %%rax\n"
33798         "addq    %%rcx, 144(%%rdi)\n"
33799         "adcq    $0, %%rdx\n"
33800         "movq    %%rdx, %%rcx\n"
33801         "mulq    %%r9\n"
33802         "addq    %%rax, %%rcx\n"
33803         "adcq    $0, %%rdx\n"
33804         "movq    96(%%rsi), %%rax\n"
33805         "addq    %%rcx, 152(%%rdi)\n"
33806         "adcq    $0, %%rdx\n"
33807         "movq    %%rdx, %%rcx\n"
33808         "mulq    %%r9\n"
33809         "addq    %%rax, %%rcx\n"
33810         "adcq    $0, %%rdx\n"
33811         "movq    104(%%rsi), %%rax\n"
33812         "addq    %%rcx, 160(%%rdi)\n"
33813         "adcq    $0, %%rdx\n"
33814         "movq    %%rdx, %%rcx\n"
33815         "mulq    %%r9\n"
33816         "addq    %%rax, %%rcx\n"
33817         "adcq    $0, %%rdx\n"
33818         "movq    112(%%rsi), %%rax\n"
33819         "addq    %%rcx, 168(%%rdi)\n"
33820         "adcq    $0, %%rdx\n"
33821         "movq    %%rdx, %%rcx\n"
33822         "mulq    %%r9\n"
33823         "addq    %%rax, %%rcx\n"
33824         "adcq    $0, %%rdx\n"
33825         "addq    %%rcx, 176(%%rdi)\n"
33826         "adcq    $0, %%rdx\n"
33827         "movq    %%rdx, 184(%%rdi)\n"
33828         "### x*y[9]\n"
33829         "movq    72(%%r8), %%r9\n"
33830         "movq    0(%%rsi), %%rax\n"
33831         "mulq    %%r9\n"
33832         "addq    %%rax, 72(%%rdi)\n"
33833         "movq    8(%%rsi), %%rax\n"
33834         "adcq    $0, %%rdx\n"
33835         "movq    %%rdx, %%rcx\n"
33836         "mulq    %%r9\n"
33837         "addq    %%rax, %%rcx\n"
33838         "adcq    $0, %%rdx\n"
33839         "movq    16(%%rsi), %%rax\n"
33840         "addq    %%rcx, 80(%%rdi)\n"
33841         "adcq    $0, %%rdx\n"
33842         "movq    %%rdx, %%rcx\n"
33843         "mulq    %%r9\n"
33844         "addq    %%rax, %%rcx\n"
33845         "adcq    $0, %%rdx\n"
33846         "movq    24(%%rsi), %%rax\n"
33847         "addq    %%rcx, 88(%%rdi)\n"
33848         "adcq    $0, %%rdx\n"
33849         "movq    %%rdx, %%rcx\n"
33850         "mulq    %%r9\n"
33851         "addq    %%rax, %%rcx\n"
33852         "adcq    $0, %%rdx\n"
33853         "movq    32(%%rsi), %%rax\n"
33854         "addq    %%rcx, 96(%%rdi)\n"
33855         "adcq    $0, %%rdx\n"
33856         "movq    %%rdx, %%rcx\n"
33857         "mulq    %%r9\n"
33858         "addq    %%rax, %%rcx\n"
33859         "adcq    $0, %%rdx\n"
33860         "movq    40(%%rsi), %%rax\n"
33861         "addq    %%rcx, 104(%%rdi)\n"
33862         "adcq    $0, %%rdx\n"
33863         "movq    %%rdx, %%rcx\n"
33864         "mulq    %%r9\n"
33865         "addq    %%rax, %%rcx\n"
33866         "adcq    $0, %%rdx\n"
33867         "movq    48(%%rsi), %%rax\n"
33868         "addq    %%rcx, 112(%%rdi)\n"
33869         "adcq    $0, %%rdx\n"
33870         "movq    %%rdx, %%rcx\n"
33871         "mulq    %%r9\n"
33872         "addq    %%rax, %%rcx\n"
33873         "adcq    $0, %%rdx\n"
33874         "movq    56(%%rsi), %%rax\n"
33875         "addq    %%rcx, 120(%%rdi)\n"
33876         "adcq    $0, %%rdx\n"
33877         "movq    %%rdx, %%rcx\n"
33878         "mulq    %%r9\n"
33879         "addq    %%rax, %%rcx\n"
33880         "adcq    $0, %%rdx\n"
33881         "movq    64(%%rsi), %%rax\n"
33882         "addq    %%rcx, 128(%%rdi)\n"
33883         "adcq    $0, %%rdx\n"
33884         "movq    %%rdx, %%rcx\n"
33885         "mulq    %%r9\n"
33886         "addq    %%rax, %%rcx\n"
33887         "adcq    $0, %%rdx\n"
33888         "movq    72(%%rsi), %%rax\n"
33889         "addq    %%rcx, 136(%%rdi)\n"
33890         "adcq    $0, %%rdx\n"
33891         "movq    %%rdx, %%rcx\n"
33892         "mulq    %%r9\n"
33893         "addq    %%rax, %%rcx\n"
33894         "adcq    $0, %%rdx\n"
33895         "movq    80(%%rsi), %%rax\n"
33896         "addq    %%rcx, 144(%%rdi)\n"
33897         "adcq    $0, %%rdx\n"
33898         "movq    %%rdx, %%rcx\n"
33899         "mulq    %%r9\n"
33900         "addq    %%rax, %%rcx\n"
33901         "adcq    $0, %%rdx\n"
33902         "movq    88(%%rsi), %%rax\n"
33903         "addq    %%rcx, 152(%%rdi)\n"
33904         "adcq    $0, %%rdx\n"
33905         "movq    %%rdx, %%rcx\n"
33906         "mulq    %%r9\n"
33907         "addq    %%rax, %%rcx\n"
33908         "adcq    $0, %%rdx\n"
33909         "movq    96(%%rsi), %%rax\n"
33910         "addq    %%rcx, 160(%%rdi)\n"
33911         "adcq    $0, %%rdx\n"
33912         "movq    %%rdx, %%rcx\n"
33913         "mulq    %%r9\n"
33914         "addq    %%rax, %%rcx\n"
33915         "adcq    $0, %%rdx\n"
33916         "movq    104(%%rsi), %%rax\n"
33917         "addq    %%rcx, 168(%%rdi)\n"
33918         "adcq    $0, %%rdx\n"
33919         "movq    %%rdx, %%rcx\n"
33920         "mulq    %%r9\n"
33921         "addq    %%rax, %%rcx\n"
33922         "adcq    $0, %%rdx\n"
33923         "movq    112(%%rsi), %%rax\n"
33924         "addq    %%rcx, 176(%%rdi)\n"
33925         "adcq    $0, %%rdx\n"
33926         "movq    %%rdx, %%rcx\n"
33927         "mulq    %%r9\n"
33928         "addq    %%rax, %%rcx\n"
33929         "adcq    $0, %%rdx\n"
33930         "addq    %%rcx, 184(%%rdi)\n"
33931         "adcq    $0, %%rdx\n"
33932         "movq    %%rdx, 192(%%rdi)\n"
33933         "### x*y[10]\n"
33934         "movq    80(%%r8), %%r9\n"
33935         "movq    0(%%rsi), %%rax\n"
33936         "mulq    %%r9\n"
33937         "addq    %%rax, 80(%%rdi)\n"
33938         "movq    8(%%rsi), %%rax\n"
33939         "adcq    $0, %%rdx\n"
33940         "movq    %%rdx, %%rcx\n"
33941         "mulq    %%r9\n"
33942         "addq    %%rax, %%rcx\n"
33943         "adcq    $0, %%rdx\n"
33944         "movq    16(%%rsi), %%rax\n"
33945         "addq    %%rcx, 88(%%rdi)\n"
33946         "adcq    $0, %%rdx\n"
33947         "movq    %%rdx, %%rcx\n"
33948         "mulq    %%r9\n"
33949         "addq    %%rax, %%rcx\n"
33950         "adcq    $0, %%rdx\n"
33951         "movq    24(%%rsi), %%rax\n"
33952         "addq    %%rcx, 96(%%rdi)\n"
33953         "adcq    $0, %%rdx\n"
33954         "movq    %%rdx, %%rcx\n"
33955         "mulq    %%r9\n"
33956         "addq    %%rax, %%rcx\n"
33957         "adcq    $0, %%rdx\n"
33958         "movq    32(%%rsi), %%rax\n"
33959         "addq    %%rcx, 104(%%rdi)\n"
33960         "adcq    $0, %%rdx\n"
33961         "movq    %%rdx, %%rcx\n"
33962         "mulq    %%r9\n"
33963         "addq    %%rax, %%rcx\n"
33964         "adcq    $0, %%rdx\n"
33965         "movq    40(%%rsi), %%rax\n"
33966         "addq    %%rcx, 112(%%rdi)\n"
33967         "adcq    $0, %%rdx\n"
33968         "movq    %%rdx, %%rcx\n"
33969         "mulq    %%r9\n"
33970         "addq    %%rax, %%rcx\n"
33971         "adcq    $0, %%rdx\n"
33972         "movq    48(%%rsi), %%rax\n"
33973         "addq    %%rcx, 120(%%rdi)\n"
33974         "adcq    $0, %%rdx\n"
33975         "movq    %%rdx, %%rcx\n"
33976         "mulq    %%r9\n"
33977         "addq    %%rax, %%rcx\n"
33978         "adcq    $0, %%rdx\n"
33979         "movq    56(%%rsi), %%rax\n"
33980         "addq    %%rcx, 128(%%rdi)\n"
33981         "adcq    $0, %%rdx\n"
33982         "movq    %%rdx, %%rcx\n"
33983         "mulq    %%r9\n"
33984         "addq    %%rax, %%rcx\n"
33985         "adcq    $0, %%rdx\n"
33986         "movq    64(%%rsi), %%rax\n"
33987         "addq    %%rcx, 136(%%rdi)\n"
33988         "adcq    $0, %%rdx\n"
33989         "movq    %%rdx, %%rcx\n"
33990         "mulq    %%r9\n"
33991         "addq    %%rax, %%rcx\n"
33992         "adcq    $0, %%rdx\n"
33993         "movq    72(%%rsi), %%rax\n"
33994         "addq    %%rcx, 144(%%rdi)\n"
33995         "adcq    $0, %%rdx\n"
33996         "movq    %%rdx, %%rcx\n"
33997         "mulq    %%r9\n"
33998         "addq    %%rax, %%rcx\n"
33999         "adcq    $0, %%rdx\n"
34000         "movq    80(%%rsi), %%rax\n"
34001         "addq    %%rcx, 152(%%rdi)\n"
34002         "adcq    $0, %%rdx\n"
34003         "movq    %%rdx, %%rcx\n"
34004         "mulq    %%r9\n"
34005         "addq    %%rax, %%rcx\n"
34006         "adcq    $0, %%rdx\n"
34007         "movq    88(%%rsi), %%rax\n"
34008         "addq    %%rcx, 160(%%rdi)\n"
34009         "adcq    $0, %%rdx\n"
34010         "movq    %%rdx, %%rcx\n"
34011         "mulq    %%r9\n"
34012         "addq    %%rax, %%rcx\n"
34013         "adcq    $0, %%rdx\n"
34014         "movq    96(%%rsi), %%rax\n"
34015         "addq    %%rcx, 168(%%rdi)\n"
34016         "adcq    $0, %%rdx\n"
34017         "movq    %%rdx, %%rcx\n"
34018         "mulq    %%r9\n"
34019         "addq    %%rax, %%rcx\n"
34020         "adcq    $0, %%rdx\n"
34021         "movq    104(%%rsi), %%rax\n"
34022         "addq    %%rcx, 176(%%rdi)\n"
34023         "adcq    $0, %%rdx\n"
34024         "movq    %%rdx, %%rcx\n"
34025         "mulq    %%r9\n"
34026         "addq    %%rax, %%rcx\n"
34027         "adcq    $0, %%rdx\n"
34028         "movq    112(%%rsi), %%rax\n"
34029         "addq    %%rcx, 184(%%rdi)\n"
34030         "adcq    $0, %%rdx\n"
34031         "movq    %%rdx, %%rcx\n"
34032         "mulq    %%r9\n"
34033         "addq    %%rax, %%rcx\n"
34034         "adcq    $0, %%rdx\n"
34035         "addq    %%rcx, 192(%%rdi)\n"
34036         "adcq    $0, %%rdx\n"
34037         "movq    %%rdx, 200(%%rdi)\n"
34038         "### x*y[11]\n"
34039         "movq    88(%%r8), %%r9\n"
34040         "movq    0(%%rsi), %%rax\n"
34041         "mulq    %%r9\n"
34042         "addq    %%rax, 88(%%rdi)\n"
34043         "movq    8(%%rsi), %%rax\n"
34044         "adcq    $0, %%rdx\n"
34045         "movq    %%rdx, %%rcx\n"
34046         "mulq    %%r9\n"
34047         "addq    %%rax, %%rcx\n"
34048         "adcq    $0, %%rdx\n"
34049         "movq    16(%%rsi), %%rax\n"
34050         "addq    %%rcx, 96(%%rdi)\n"
34051         "adcq    $0, %%rdx\n"
34052         "movq    %%rdx, %%rcx\n"
34053         "mulq    %%r9\n"
34054         "addq    %%rax, %%rcx\n"
34055         "adcq    $0, %%rdx\n"
34056         "movq    24(%%rsi), %%rax\n"
34057         "addq    %%rcx, 104(%%rdi)\n"
34058         "adcq    $0, %%rdx\n"
34059         "movq    %%rdx, %%rcx\n"
34060         "mulq    %%r9\n"
34061         "addq    %%rax, %%rcx\n"
34062         "adcq    $0, %%rdx\n"
34063         "movq    32(%%rsi), %%rax\n"
34064         "addq    %%rcx, 112(%%rdi)\n"
34065         "adcq    $0, %%rdx\n"
34066         "movq    %%rdx, %%rcx\n"
34067         "mulq    %%r9\n"
34068         "addq    %%rax, %%rcx\n"
34069         "adcq    $0, %%rdx\n"
34070         "movq    40(%%rsi), %%rax\n"
34071         "addq    %%rcx, 120(%%rdi)\n"
34072         "adcq    $0, %%rdx\n"
34073         "movq    %%rdx, %%rcx\n"
34074         "mulq    %%r9\n"
34075         "addq    %%rax, %%rcx\n"
34076         "adcq    $0, %%rdx\n"
34077         "movq    48(%%rsi), %%rax\n"
34078         "addq    %%rcx, 128(%%rdi)\n"
34079         "adcq    $0, %%rdx\n"
34080         "movq    %%rdx, %%rcx\n"
34081         "mulq    %%r9\n"
34082         "addq    %%rax, %%rcx\n"
34083         "adcq    $0, %%rdx\n"
34084         "movq    56(%%rsi), %%rax\n"
34085         "addq    %%rcx, 136(%%rdi)\n"
34086         "adcq    $0, %%rdx\n"
34087         "movq    %%rdx, %%rcx\n"
34088         "mulq    %%r9\n"
34089         "addq    %%rax, %%rcx\n"
34090         "adcq    $0, %%rdx\n"
34091         "movq    64(%%rsi), %%rax\n"
34092         "addq    %%rcx, 144(%%rdi)\n"
34093         "adcq    $0, %%rdx\n"
34094         "movq    %%rdx, %%rcx\n"
34095         "mulq    %%r9\n"
34096         "addq    %%rax, %%rcx\n"
34097         "adcq    $0, %%rdx\n"
34098         "movq    72(%%rsi), %%rax\n"
34099         "addq    %%rcx, 152(%%rdi)\n"
34100         "adcq    $0, %%rdx\n"
34101         "movq    %%rdx, %%rcx\n"
34102         "mulq    %%r9\n"
34103         "addq    %%rax, %%rcx\n"
34104         "adcq    $0, %%rdx\n"
34105         "movq    80(%%rsi), %%rax\n"
34106         "addq    %%rcx, 160(%%rdi)\n"
34107         "adcq    $0, %%rdx\n"
34108         "movq    %%rdx, %%rcx\n"
34109         "mulq    %%r9\n"
34110         "addq    %%rax, %%rcx\n"
34111         "adcq    $0, %%rdx\n"
34112         "movq    88(%%rsi), %%rax\n"
34113         "addq    %%rcx, 168(%%rdi)\n"
34114         "adcq    $0, %%rdx\n"
34115         "movq    %%rdx, %%rcx\n"
34116         "mulq    %%r9\n"
34117         "addq    %%rax, %%rcx\n"
34118         "adcq    $0, %%rdx\n"
34119         "movq    96(%%rsi), %%rax\n"
34120         "addq    %%rcx, 176(%%rdi)\n"
34121         "adcq    $0, %%rdx\n"
34122         "movq    %%rdx, %%rcx\n"
34123         "mulq    %%r9\n"
34124         "addq    %%rax, %%rcx\n"
34125         "adcq    $0, %%rdx\n"
34126         "movq    104(%%rsi), %%rax\n"
34127         "addq    %%rcx, 184(%%rdi)\n"
34128         "adcq    $0, %%rdx\n"
34129         "movq    %%rdx, %%rcx\n"
34130         "mulq    %%r9\n"
34131         "addq    %%rax, %%rcx\n"
34132         "adcq    $0, %%rdx\n"
34133         "movq    112(%%rsi), %%rax\n"
34134         "addq    %%rcx, 192(%%rdi)\n"
34135         "adcq    $0, %%rdx\n"
34136         "movq    %%rdx, %%rcx\n"
34137         "mulq    %%r9\n"
34138         "addq    %%rax, %%rcx\n"
34139         "adcq    $0, %%rdx\n"
34140         "addq    %%rcx, 200(%%rdi)\n"
34141         "adcq    $0, %%rdx\n"
34142         "movq    %%rdx, 208(%%rdi)\n"
34143         "### x*y[12]\n"
34144         "movq    96(%%r8), %%r9\n"
34145         "movq    0(%%rsi), %%rax\n"
34146         "mulq    %%r9\n"
34147         "addq    %%rax, 96(%%rdi)\n"
34148         "movq    8(%%rsi), %%rax\n"
34149         "adcq    $0, %%rdx\n"
34150         "movq    %%rdx, %%rcx\n"
34151         "mulq    %%r9\n"
34152         "addq    %%rax, %%rcx\n"
34153         "adcq    $0, %%rdx\n"
34154         "movq    16(%%rsi), %%rax\n"
34155         "addq    %%rcx, 104(%%rdi)\n"
34156         "adcq    $0, %%rdx\n"
34157         "movq    %%rdx, %%rcx\n"
34158         "mulq    %%r9\n"
34159         "addq    %%rax, %%rcx\n"
34160         "adcq    $0, %%rdx\n"
34161         "movq    24(%%rsi), %%rax\n"
34162         "addq    %%rcx, 112(%%rdi)\n"
34163         "adcq    $0, %%rdx\n"
34164         "movq    %%rdx, %%rcx\n"
34165         "mulq    %%r9\n"
34166         "addq    %%rax, %%rcx\n"
34167         "adcq    $0, %%rdx\n"
34168         "movq    32(%%rsi), %%rax\n"
34169         "addq    %%rcx, 120(%%rdi)\n"
34170         "adcq    $0, %%rdx\n"
34171         "movq    %%rdx, %%rcx\n"
34172         "mulq    %%r9\n"
34173         "addq    %%rax, %%rcx\n"
34174         "adcq    $0, %%rdx\n"
34175         "movq    40(%%rsi), %%rax\n"
34176         "addq    %%rcx, 128(%%rdi)\n"
34177         "adcq    $0, %%rdx\n"
34178         "movq    %%rdx, %%rcx\n"
34179         "mulq    %%r9\n"
34180         "addq    %%rax, %%rcx\n"
34181         "adcq    $0, %%rdx\n"
34182         "movq    48(%%rsi), %%rax\n"
34183         "addq    %%rcx, 136(%%rdi)\n"
34184         "adcq    $0, %%rdx\n"
34185         "movq    %%rdx, %%rcx\n"
34186         "mulq    %%r9\n"
34187         "addq    %%rax, %%rcx\n"
34188         "adcq    $0, %%rdx\n"
34189         "movq    56(%%rsi), %%rax\n"
34190         "addq    %%rcx, 144(%%rdi)\n"
34191         "adcq    $0, %%rdx\n"
34192         "movq    %%rdx, %%rcx\n"
34193         "mulq    %%r9\n"
34194         "addq    %%rax, %%rcx\n"
34195         "adcq    $0, %%rdx\n"
34196         "movq    64(%%rsi), %%rax\n"
34197         "addq    %%rcx, 152(%%rdi)\n"
34198         "adcq    $0, %%rdx\n"
34199         "movq    %%rdx, %%rcx\n"
34200         "mulq    %%r9\n"
34201         "addq    %%rax, %%rcx\n"
34202         "adcq    $0, %%rdx\n"
34203         "movq    72(%%rsi), %%rax\n"
34204         "addq    %%rcx, 160(%%rdi)\n"
34205         "adcq    $0, %%rdx\n"
34206         "movq    %%rdx, %%rcx\n"
34207         "mulq    %%r9\n"
34208         "addq    %%rax, %%rcx\n"
34209         "adcq    $0, %%rdx\n"
34210         "movq    80(%%rsi), %%rax\n"
34211         "addq    %%rcx, 168(%%rdi)\n"
34212         "adcq    $0, %%rdx\n"
34213         "movq    %%rdx, %%rcx\n"
34214         "mulq    %%r9\n"
34215         "addq    %%rax, %%rcx\n"
34216         "adcq    $0, %%rdx\n"
34217         "movq    88(%%rsi), %%rax\n"
34218         "addq    %%rcx, 176(%%rdi)\n"
34219         "adcq    $0, %%rdx\n"
34220         "movq    %%rdx, %%rcx\n"
34221         "mulq    %%r9\n"
34222         "addq    %%rax, %%rcx\n"
34223         "adcq    $0, %%rdx\n"
34224         "movq    96(%%rsi), %%rax\n"
34225         "addq    %%rcx, 184(%%rdi)\n"
34226         "adcq    $0, %%rdx\n"
34227         "movq    %%rdx, %%rcx\n"
34228         "mulq    %%r9\n"
34229         "addq    %%rax, %%rcx\n"
34230         "adcq    $0, %%rdx\n"
34231         "movq    104(%%rsi), %%rax\n"
34232         "addq    %%rcx, 192(%%rdi)\n"
34233         "adcq    $0, %%rdx\n"
34234         "movq    %%rdx, %%rcx\n"
34235         "mulq    %%r9\n"
34236         "addq    %%rax, %%rcx\n"
34237         "adcq    $0, %%rdx\n"
34238         "movq    112(%%rsi), %%rax\n"
34239         "addq    %%rcx, 200(%%rdi)\n"
34240         "adcq    $0, %%rdx\n"
34241         "movq    %%rdx, %%rcx\n"
34242         "mulq    %%r9\n"
34243         "addq    %%rax, %%rcx\n"
34244         "adcq    $0, %%rdx\n"
34245         "addq    %%rcx, 208(%%rdi)\n"
34246         "adcq    $0, %%rdx\n"
34247         "movq    %%rdx, 216(%%rdi)\n"
34248         "### x*y[13]\n"
34249         "movq    104(%%r8), %%r9\n"
34250         "movq    0(%%rsi), %%rax\n"
34251         "mulq    %%r9\n"
34252         "addq    %%rax, 104(%%rdi)\n"
34253         "movq    8(%%rsi), %%rax\n"
34254         "adcq    $0, %%rdx\n"
34255         "movq    %%rdx, %%rcx\n"
34256         "mulq    %%r9\n"
34257         "addq    %%rax, %%rcx\n"
34258         "adcq    $0, %%rdx\n"
34259         "movq    16(%%rsi), %%rax\n"
34260         "addq    %%rcx, 112(%%rdi)\n"
34261         "adcq    $0, %%rdx\n"
34262         "movq    %%rdx, %%rcx\n"
34263         "mulq    %%r9\n"
34264         "addq    %%rax, %%rcx\n"
34265         "adcq    $0, %%rdx\n"
34266         "movq    24(%%rsi), %%rax\n"
34267         "addq    %%rcx, 120(%%rdi)\n"
34268         "adcq    $0, %%rdx\n"
34269         "movq    %%rdx, %%rcx\n"
34270         "mulq    %%r9\n"
34271         "addq    %%rax, %%rcx\n"
34272         "adcq    $0, %%rdx\n"
34273         "movq    32(%%rsi), %%rax\n"
34274         "addq    %%rcx, 128(%%rdi)\n"
34275         "adcq    $0, %%rdx\n"
34276         "movq    %%rdx, %%rcx\n"
34277         "mulq    %%r9\n"
34278         "addq    %%rax, %%rcx\n"
34279         "adcq    $0, %%rdx\n"
34280         "movq    40(%%rsi), %%rax\n"
34281         "addq    %%rcx, 136(%%rdi)\n"
34282         "adcq    $0, %%rdx\n"
34283         "movq    %%rdx, %%rcx\n"
34284         "mulq    %%r9\n"
34285         "addq    %%rax, %%rcx\n"
34286         "adcq    $0, %%rdx\n"
34287         "movq    48(%%rsi), %%rax\n"
34288         "addq    %%rcx, 144(%%rdi)\n"
34289         "adcq    $0, %%rdx\n"
34290         "movq    %%rdx, %%rcx\n"
34291         "mulq    %%r9\n"
34292         "addq    %%rax, %%rcx\n"
34293         "adcq    $0, %%rdx\n"
34294         "movq    56(%%rsi), %%rax\n"
34295         "addq    %%rcx, 152(%%rdi)\n"
34296         "adcq    $0, %%rdx\n"
34297         "movq    %%rdx, %%rcx\n"
34298         "mulq    %%r9\n"
34299         "addq    %%rax, %%rcx\n"
34300         "adcq    $0, %%rdx\n"
34301         "movq    64(%%rsi), %%rax\n"
34302         "addq    %%rcx, 160(%%rdi)\n"
34303         "adcq    $0, %%rdx\n"
34304         "movq    %%rdx, %%rcx\n"
34305         "mulq    %%r9\n"
34306         "addq    %%rax, %%rcx\n"
34307         "adcq    $0, %%rdx\n"
34308         "movq    72(%%rsi), %%rax\n"
34309         "addq    %%rcx, 168(%%rdi)\n"
34310         "adcq    $0, %%rdx\n"
34311         "movq    %%rdx, %%rcx\n"
34312         "mulq    %%r9\n"
34313         "addq    %%rax, %%rcx\n"
34314         "adcq    $0, %%rdx\n"
34315         "movq    80(%%rsi), %%rax\n"
34316         "addq    %%rcx, 176(%%rdi)\n"
34317         "adcq    $0, %%rdx\n"
34318         "movq    %%rdx, %%rcx\n"
34319         "mulq    %%r9\n"
34320         "addq    %%rax, %%rcx\n"
34321         "adcq    $0, %%rdx\n"
34322         "movq    88(%%rsi), %%rax\n"
34323         "addq    %%rcx, 184(%%rdi)\n"
34324         "adcq    $0, %%rdx\n"
34325         "movq    %%rdx, %%rcx\n"
34326         "mulq    %%r9\n"
34327         "addq    %%rax, %%rcx\n"
34328         "adcq    $0, %%rdx\n"
34329         "movq    96(%%rsi), %%rax\n"
34330         "addq    %%rcx, 192(%%rdi)\n"
34331         "adcq    $0, %%rdx\n"
34332         "movq    %%rdx, %%rcx\n"
34333         "mulq    %%r9\n"
34334         "addq    %%rax, %%rcx\n"
34335         "adcq    $0, %%rdx\n"
34336         "movq    104(%%rsi), %%rax\n"
34337         "addq    %%rcx, 200(%%rdi)\n"
34338         "adcq    $0, %%rdx\n"
34339         "movq    %%rdx, %%rcx\n"
34340         "mulq    %%r9\n"
34341         "addq    %%rax, %%rcx\n"
34342         "adcq    $0, %%rdx\n"
34343         "movq    112(%%rsi), %%rax\n"
34344         "addq    %%rcx, 208(%%rdi)\n"
34345         "adcq    $0, %%rdx\n"
34346         "movq    %%rdx, %%rcx\n"
34347         "mulq    %%r9\n"
34348         "addq    %%rax, %%rcx\n"
34349         "adcq    $0, %%rdx\n"
34350         "addq    %%rcx, 216(%%rdi)\n"
34351         "adcq    $0, %%rdx\n"
34352         "movq    %%rdx, 224(%%rdi)\n"
34353         "### x*y[14]\n"
34354         "movq    112(%%r8), %%r9\n"
34355         "movq    0(%%rsi), %%rax\n"
34356         "mulq    %%r9\n"
34357         "addq    %%rax, 112(%%rdi)\n"
34358         "movq    8(%%rsi), %%rax\n"
34359         "adcq    $0, %%rdx\n"
34360         "movq    %%rdx, %%rcx\n"
34361         "mulq    %%r9\n"
34362         "addq    %%rax, %%rcx\n"
34363         "adcq    $0, %%rdx\n"
34364         "movq    16(%%rsi), %%rax\n"
34365         "addq    %%rcx, 120(%%rdi)\n"
34366         "adcq    $0, %%rdx\n"
34367         "movq    %%rdx, %%rcx\n"
34368         "mulq    %%r9\n"
34369         "addq    %%rax, %%rcx\n"
34370         "adcq    $0, %%rdx\n"
34371         "movq    24(%%rsi), %%rax\n"
34372         "addq    %%rcx, 128(%%rdi)\n"
34373         "adcq    $0, %%rdx\n"
34374         "movq    %%rdx, %%rcx\n"
34375         "mulq    %%r9\n"
34376         "addq    %%rax, %%rcx\n"
34377         "adcq    $0, %%rdx\n"
34378         "movq    32(%%rsi), %%rax\n"
34379         "addq    %%rcx, 136(%%rdi)\n"
34380         "adcq    $0, %%rdx\n"
34381         "movq    %%rdx, %%rcx\n"
34382         "mulq    %%r9\n"
34383         "addq    %%rax, %%rcx\n"
34384         "adcq    $0, %%rdx\n"
34385         "movq    40(%%rsi), %%rax\n"
34386         "addq    %%rcx, 144(%%rdi)\n"
34387         "adcq    $0, %%rdx\n"
34388         "movq    %%rdx, %%rcx\n"
34389         "mulq    %%r9\n"
34390         "addq    %%rax, %%rcx\n"
34391         "adcq    $0, %%rdx\n"
34392         "movq    48(%%rsi), %%rax\n"
34393         "addq    %%rcx, 152(%%rdi)\n"
34394         "adcq    $0, %%rdx\n"
34395         "movq    %%rdx, %%rcx\n"
34396         "mulq    %%r9\n"
34397         "addq    %%rax, %%rcx\n"
34398         "adcq    $0, %%rdx\n"
34399         "movq    56(%%rsi), %%rax\n"
34400         "addq    %%rcx, 160(%%rdi)\n"
34401         "adcq    $0, %%rdx\n"
34402         "movq    %%rdx, %%rcx\n"
34403         "mulq    %%r9\n"
34404         "addq    %%rax, %%rcx\n"
34405         "adcq    $0, %%rdx\n"
34406         "movq    64(%%rsi), %%rax\n"
34407         "addq    %%rcx, 168(%%rdi)\n"
34408         "adcq    $0, %%rdx\n"
34409         "movq    %%rdx, %%rcx\n"
34410         "mulq    %%r9\n"
34411         "addq    %%rax, %%rcx\n"
34412         "adcq    $0, %%rdx\n"
34413         "movq    72(%%rsi), %%rax\n"
34414         "addq    %%rcx, 176(%%rdi)\n"
34415         "adcq    $0, %%rdx\n"
34416         "movq    %%rdx, %%rcx\n"
34417         "mulq    %%r9\n"
34418         "addq    %%rax, %%rcx\n"
34419         "adcq    $0, %%rdx\n"
34420         "movq    80(%%rsi), %%rax\n"
34421         "addq    %%rcx, 184(%%rdi)\n"
34422         "adcq    $0, %%rdx\n"
34423         "movq    %%rdx, %%rcx\n"
34424         "mulq    %%r9\n"
34425         "addq    %%rax, %%rcx\n"
34426         "adcq    $0, %%rdx\n"
34427         "movq    88(%%rsi), %%rax\n"
34428         "addq    %%rcx, 192(%%rdi)\n"
34429         "adcq    $0, %%rdx\n"
34430         "movq    %%rdx, %%rcx\n"
34431         "mulq    %%r9\n"
34432         "addq    %%rax, %%rcx\n"
34433         "adcq    $0, %%rdx\n"
34434         "movq    96(%%rsi), %%rax\n"
34435         "addq    %%rcx, 200(%%rdi)\n"
34436         "adcq    $0, %%rdx\n"
34437         "movq    %%rdx, %%rcx\n"
34438         "mulq    %%r9\n"
34439         "addq    %%rax, %%rcx\n"
34440         "adcq    $0, %%rdx\n"
34441         "movq    104(%%rsi), %%rax\n"
34442         "addq    %%rcx, 208(%%rdi)\n"
34443         "adcq    $0, %%rdx\n"
34444         "movq    %%rdx, %%rcx\n"
34445         "mulq    %%r9\n"
34446         "addq    %%rax, %%rcx\n"
34447         "adcq    $0, %%rdx\n"
34448         "movq    112(%%rsi), %%rax\n"
34449         "addq    %%rcx, 216(%%rdi)\n"
34450         "adcq    $0, %%rdx\n"
34451         "movq    %%rdx, %%rcx\n"
34452         "mulq    %%r9\n"
34453         "addq    %%rax, %%rcx\n"
34454         "adcq    $0, %%rdx\n"
34455         "addq    %%rcx, 224(%%rdi)\n"
34456       : "+m" (z)
34457       : "m" (x), "m" (y)
34458       : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "%r8", "%r9", "memory");
34459 }
34460 
34461 /* x has 14.5 words, z has 29. Put x*y in z. */
34462 /* *Mpfq::fixmp::x86_64::code_for__fixmp_sqr */
34463 static inline
mpfq_fixmp_14_5_sqr(mp_limb_t * z,const mp_limb_t * x)34464 void mpfq_fixmp_14_5_sqr(mp_limb_t * z, const mp_limb_t * x)
34465 {
34466     mpfq_fixmp_14_5_mul(z, x, x);
34467 }
34468 
34469 /* x has 14.5 words, z has 16. Put x*y in z. */
34470 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul1 */
34471 static inline
mpfq_fixmp_14_5_mul1(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)34472 void mpfq_fixmp_14_5_mul1(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
34473 {
34474     __asm__ __volatile__(
34475         "movq    %[z], %%rdi\n"
34476         "movq    %[x], %%rsi\n"
34477         "movq    0(%%rsi), %%rax\n"
34478         "mulq    %[mult]\n"
34479         "movq    %%rax, 0(%%rdi)\n"
34480         "movq    8(%%rsi), %%rax\n"
34481         "movq    %%rdx, %%rcx\n"
34482         "mulq    %[mult]\n"
34483         "addq    %%rax, %%rcx\n"
34484         "adcq    $0, %%rdx\n"
34485         "movq    16(%%rsi), %%rax\n"
34486         "movq    %%rcx, 8(%%rdi)\n"
34487         "movq    %%rdx, %%rcx\n"
34488         "mulq    %[mult]\n"
34489         "addq    %%rax, %%rcx\n"
34490         "adcq    $0, %%rdx\n"
34491         "movq    24(%%rsi), %%rax\n"
34492         "movq    %%rcx, 16(%%rdi)\n"
34493         "movq    %%rdx, %%rcx\n"
34494         "mulq    %[mult]\n"
34495         "addq    %%rax, %%rcx\n"
34496         "adcq    $0, %%rdx\n"
34497         "movq    32(%%rsi), %%rax\n"
34498         "movq    %%rcx, 24(%%rdi)\n"
34499         "movq    %%rdx, %%rcx\n"
34500         "mulq    %[mult]\n"
34501         "addq    %%rax, %%rcx\n"
34502         "adcq    $0, %%rdx\n"
34503         "movq    40(%%rsi), %%rax\n"
34504         "movq    %%rcx, 32(%%rdi)\n"
34505         "movq    %%rdx, %%rcx\n"
34506         "mulq    %[mult]\n"
34507         "addq    %%rax, %%rcx\n"
34508         "adcq    $0, %%rdx\n"
34509         "movq    48(%%rsi), %%rax\n"
34510         "movq    %%rcx, 40(%%rdi)\n"
34511         "movq    %%rdx, %%rcx\n"
34512         "mulq    %[mult]\n"
34513         "addq    %%rax, %%rcx\n"
34514         "adcq    $0, %%rdx\n"
34515         "movq    56(%%rsi), %%rax\n"
34516         "movq    %%rcx, 48(%%rdi)\n"
34517         "movq    %%rdx, %%rcx\n"
34518         "mulq    %[mult]\n"
34519         "addq    %%rax, %%rcx\n"
34520         "adcq    $0, %%rdx\n"
34521         "movq    64(%%rsi), %%rax\n"
34522         "movq    %%rcx, 56(%%rdi)\n"
34523         "movq    %%rdx, %%rcx\n"
34524         "mulq    %[mult]\n"
34525         "addq    %%rax, %%rcx\n"
34526         "adcq    $0, %%rdx\n"
34527         "movq    72(%%rsi), %%rax\n"
34528         "movq    %%rcx, 64(%%rdi)\n"
34529         "movq    %%rdx, %%rcx\n"
34530         "mulq    %[mult]\n"
34531         "addq    %%rax, %%rcx\n"
34532         "adcq    $0, %%rdx\n"
34533         "movq    80(%%rsi), %%rax\n"
34534         "movq    %%rcx, 72(%%rdi)\n"
34535         "movq    %%rdx, %%rcx\n"
34536         "mulq    %[mult]\n"
34537         "addq    %%rax, %%rcx\n"
34538         "adcq    $0, %%rdx\n"
34539         "movq    88(%%rsi), %%rax\n"
34540         "movq    %%rcx, 80(%%rdi)\n"
34541         "movq    %%rdx, %%rcx\n"
34542         "mulq    %[mult]\n"
34543         "addq    %%rax, %%rcx\n"
34544         "adcq    $0, %%rdx\n"
34545         "movq    96(%%rsi), %%rax\n"
34546         "movq    %%rcx, 88(%%rdi)\n"
34547         "movq    %%rdx, %%rcx\n"
34548         "mulq    %[mult]\n"
34549         "addq    %%rax, %%rcx\n"
34550         "adcq    $0, %%rdx\n"
34551         "movq    104(%%rsi), %%rax\n"
34552         "movq    %%rcx, 96(%%rdi)\n"
34553         "movq    %%rdx, %%rcx\n"
34554         "mulq    %[mult]\n"
34555         "addq    %%rax, %%rcx\n"
34556         "adcq    $0, %%rdx\n"
34557         "movq    112(%%rsi), %%rax\n"
34558         "movq    %%rcx, 104(%%rdi)\n"
34559         "movq    %%rdx, %%rcx\n"
34560         "mulq    %[mult]\n"
34561         "addq    %%rax, %%rcx\n"
34562         "adcq    $0, %%rdx\n"
34563         "movq    %%rcx, 112(%%rdi)\n"
34564         "movq    %%rdx, 120(%%rdi)\n"
34565     :
34566     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
34567     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
34568 }
34569 
34570 /* x has 14.5 words, z has 15. c is 0.5 word.
34571  * Put (z+x*c) in z. Return carry bit. */
34572 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05 */
34573 static inline
mpfq_fixmp_14_5_addmul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)34574 mp_limb_t mpfq_fixmp_14_5_addmul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
34575 {
34576     mp_limb_t carry;
34577     __asm__ __volatile__(
34578         "movq    %[z], %%rdi\n"
34579         "movq    %[x], %%rsi\n"
34580         "movq    0(%%rsi), %%rax\n"
34581         "mulq    %[mult]\n"
34582         "addq    %%rax, 0(%%rdi)\n"
34583         "movq    8(%%rsi), %%rax\n"
34584         "adcq    $0, %%rdx\n"
34585         "movq    %%rdx, %%rcx\n"
34586         "mulq    %[mult]\n"
34587         "addq    %%rax, %%rcx\n"
34588         "adcq    $0, %%rdx\n"
34589         "movq    16(%%rsi), %%rax\n"
34590         "addq    %%rcx, 8(%%rdi)\n"
34591         "adcq    $0, %%rdx\n"
34592         "movq    %%rdx, %%rcx\n"
34593         "mulq    %[mult]\n"
34594         "addq    %%rax, %%rcx\n"
34595         "adcq    $0, %%rdx\n"
34596         "movq    24(%%rsi), %%rax\n"
34597         "addq    %%rcx, 16(%%rdi)\n"
34598         "adcq    $0, %%rdx\n"
34599         "movq    %%rdx, %%rcx\n"
34600         "mulq    %[mult]\n"
34601         "addq    %%rax, %%rcx\n"
34602         "adcq    $0, %%rdx\n"
34603         "movq    32(%%rsi), %%rax\n"
34604         "addq    %%rcx, 24(%%rdi)\n"
34605         "adcq    $0, %%rdx\n"
34606         "movq    %%rdx, %%rcx\n"
34607         "mulq    %[mult]\n"
34608         "addq    %%rax, %%rcx\n"
34609         "adcq    $0, %%rdx\n"
34610         "movq    40(%%rsi), %%rax\n"
34611         "addq    %%rcx, 32(%%rdi)\n"
34612         "adcq    $0, %%rdx\n"
34613         "movq    %%rdx, %%rcx\n"
34614         "mulq    %[mult]\n"
34615         "addq    %%rax, %%rcx\n"
34616         "adcq    $0, %%rdx\n"
34617         "movq    48(%%rsi), %%rax\n"
34618         "addq    %%rcx, 40(%%rdi)\n"
34619         "adcq    $0, %%rdx\n"
34620         "movq    %%rdx, %%rcx\n"
34621         "mulq    %[mult]\n"
34622         "addq    %%rax, %%rcx\n"
34623         "adcq    $0, %%rdx\n"
34624         "movq    56(%%rsi), %%rax\n"
34625         "addq    %%rcx, 48(%%rdi)\n"
34626         "adcq    $0, %%rdx\n"
34627         "movq    %%rdx, %%rcx\n"
34628         "mulq    %[mult]\n"
34629         "addq    %%rax, %%rcx\n"
34630         "adcq    $0, %%rdx\n"
34631         "movq    64(%%rsi), %%rax\n"
34632         "addq    %%rcx, 56(%%rdi)\n"
34633         "adcq    $0, %%rdx\n"
34634         "movq    %%rdx, %%rcx\n"
34635         "mulq    %[mult]\n"
34636         "addq    %%rax, %%rcx\n"
34637         "adcq    $0, %%rdx\n"
34638         "movq    72(%%rsi), %%rax\n"
34639         "addq    %%rcx, 64(%%rdi)\n"
34640         "adcq    $0, %%rdx\n"
34641         "movq    %%rdx, %%rcx\n"
34642         "mulq    %[mult]\n"
34643         "addq    %%rax, %%rcx\n"
34644         "adcq    $0, %%rdx\n"
34645         "movq    80(%%rsi), %%rax\n"
34646         "addq    %%rcx, 72(%%rdi)\n"
34647         "adcq    $0, %%rdx\n"
34648         "movq    %%rdx, %%rcx\n"
34649         "mulq    %[mult]\n"
34650         "addq    %%rax, %%rcx\n"
34651         "adcq    $0, %%rdx\n"
34652         "movq    88(%%rsi), %%rax\n"
34653         "addq    %%rcx, 80(%%rdi)\n"
34654         "adcq    $0, %%rdx\n"
34655         "movq    %%rdx, %%rcx\n"
34656         "mulq    %[mult]\n"
34657         "addq    %%rax, %%rcx\n"
34658         "adcq    $0, %%rdx\n"
34659         "movq    96(%%rsi), %%rax\n"
34660         "addq    %%rcx, 88(%%rdi)\n"
34661         "adcq    $0, %%rdx\n"
34662         "movq    %%rdx, %%rcx\n"
34663         "mulq    %[mult]\n"
34664         "addq    %%rax, %%rcx\n"
34665         "adcq    $0, %%rdx\n"
34666         "movq    104(%%rsi), %%rax\n"
34667         "addq    %%rcx, 96(%%rdi)\n"
34668         "adcq    $0, %%rdx\n"
34669         "movq    %%rdx, %%rcx\n"
34670         "mulq    %[mult]\n"
34671         "addq    %%rax, %%rcx\n"
34672         "adcq    $0, %%rdx\n"
34673         "movq    112(%%rsi), %%rax\n"
34674         "addq    %%rcx, 104(%%rdi)\n"
34675         "adcq    $0, %%rdx\n"
34676         "movq    %%rdx, %%rcx\n"
34677         "imulq    %[mult], %%rax\n"
34678         "xorq    %%rdx, %%rdx\n"
34679         "addq    %%rcx, %%rax\n"
34680         "adcq    $0, %%rdx\n"
34681         "addq    %%rax, 112(%%rdi)\n"
34682         "adcq    $0, %%rdx\n"
34683         "movq    %%rdx, %[carry]\n"
34684     : [carry]"=g"(carry), [z] "+m" (z)
34685     : [mult] "r" (c), [x] "m" (x)
34686     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
34687     return carry;
34688 }
34689 
34690 /* x has 14.5 words, z has 15. c is 0.5 word.
34691  * Put (z+x*c) in z. Carry bit is lost. */
34692 /* *Mpfq::fixmp::x86_64::code_for__fixmp_addmul05_nc */
34693 static inline
mpfq_fixmp_14_5_addmul05_nc(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)34694 void mpfq_fixmp_14_5_addmul05_nc(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
34695 {
34696     __asm__ __volatile__(
34697         "movq    %[z], %%rdi\n"
34698         "movq    %[x], %%rsi\n"
34699         "movq    0(%%rsi), %%rax\n"
34700         "mulq    %[mult]\n"
34701         "addq    %%rax, 0(%%rdi)\n"
34702         "movq    8(%%rsi), %%rax\n"
34703         "adcq    $0, %%rdx\n"
34704         "movq    %%rdx, %%rcx\n"
34705         "mulq    %[mult]\n"
34706         "addq    %%rax, %%rcx\n"
34707         "adcq    $0, %%rdx\n"
34708         "movq    16(%%rsi), %%rax\n"
34709         "addq    %%rcx, 8(%%rdi)\n"
34710         "adcq    $0, %%rdx\n"
34711         "movq    %%rdx, %%rcx\n"
34712         "mulq    %[mult]\n"
34713         "addq    %%rax, %%rcx\n"
34714         "adcq    $0, %%rdx\n"
34715         "movq    24(%%rsi), %%rax\n"
34716         "addq    %%rcx, 16(%%rdi)\n"
34717         "adcq    $0, %%rdx\n"
34718         "movq    %%rdx, %%rcx\n"
34719         "mulq    %[mult]\n"
34720         "addq    %%rax, %%rcx\n"
34721         "adcq    $0, %%rdx\n"
34722         "movq    32(%%rsi), %%rax\n"
34723         "addq    %%rcx, 24(%%rdi)\n"
34724         "adcq    $0, %%rdx\n"
34725         "movq    %%rdx, %%rcx\n"
34726         "mulq    %[mult]\n"
34727         "addq    %%rax, %%rcx\n"
34728         "adcq    $0, %%rdx\n"
34729         "movq    40(%%rsi), %%rax\n"
34730         "addq    %%rcx, 32(%%rdi)\n"
34731         "adcq    $0, %%rdx\n"
34732         "movq    %%rdx, %%rcx\n"
34733         "mulq    %[mult]\n"
34734         "addq    %%rax, %%rcx\n"
34735         "adcq    $0, %%rdx\n"
34736         "movq    48(%%rsi), %%rax\n"
34737         "addq    %%rcx, 40(%%rdi)\n"
34738         "adcq    $0, %%rdx\n"
34739         "movq    %%rdx, %%rcx\n"
34740         "mulq    %[mult]\n"
34741         "addq    %%rax, %%rcx\n"
34742         "adcq    $0, %%rdx\n"
34743         "movq    56(%%rsi), %%rax\n"
34744         "addq    %%rcx, 48(%%rdi)\n"
34745         "adcq    $0, %%rdx\n"
34746         "movq    %%rdx, %%rcx\n"
34747         "mulq    %[mult]\n"
34748         "addq    %%rax, %%rcx\n"
34749         "adcq    $0, %%rdx\n"
34750         "movq    64(%%rsi), %%rax\n"
34751         "addq    %%rcx, 56(%%rdi)\n"
34752         "adcq    $0, %%rdx\n"
34753         "movq    %%rdx, %%rcx\n"
34754         "mulq    %[mult]\n"
34755         "addq    %%rax, %%rcx\n"
34756         "adcq    $0, %%rdx\n"
34757         "movq    72(%%rsi), %%rax\n"
34758         "addq    %%rcx, 64(%%rdi)\n"
34759         "adcq    $0, %%rdx\n"
34760         "movq    %%rdx, %%rcx\n"
34761         "mulq    %[mult]\n"
34762         "addq    %%rax, %%rcx\n"
34763         "adcq    $0, %%rdx\n"
34764         "movq    80(%%rsi), %%rax\n"
34765         "addq    %%rcx, 72(%%rdi)\n"
34766         "adcq    $0, %%rdx\n"
34767         "movq    %%rdx, %%rcx\n"
34768         "mulq    %[mult]\n"
34769         "addq    %%rax, %%rcx\n"
34770         "adcq    $0, %%rdx\n"
34771         "movq    88(%%rsi), %%rax\n"
34772         "addq    %%rcx, 80(%%rdi)\n"
34773         "adcq    $0, %%rdx\n"
34774         "movq    %%rdx, %%rcx\n"
34775         "mulq    %[mult]\n"
34776         "addq    %%rax, %%rcx\n"
34777         "adcq    $0, %%rdx\n"
34778         "movq    96(%%rsi), %%rax\n"
34779         "addq    %%rcx, 88(%%rdi)\n"
34780         "adcq    $0, %%rdx\n"
34781         "movq    %%rdx, %%rcx\n"
34782         "mulq    %[mult]\n"
34783         "addq    %%rax, %%rcx\n"
34784         "adcq    $0, %%rdx\n"
34785         "movq    104(%%rsi), %%rax\n"
34786         "addq    %%rcx, 96(%%rdi)\n"
34787         "adcq    $0, %%rdx\n"
34788         "movq    %%rdx, %%rcx\n"
34789         "mulq    %[mult]\n"
34790         "addq    %%rax, %%rcx\n"
34791         "adcq    $0, %%rdx\n"
34792         "movq    112(%%rsi), %%rax\n"
34793         "addq    %%rcx, 104(%%rdi)\n"
34794         "adcq    $0, %%rdx\n"
34795         "movq    %%rdx, %%rcx\n"
34796         "imulq    %[mult], %%rax\n"
34797         "addq    %%rcx, %%rax\n"
34798         "addq    %%rax, 112(%%rdi)\n"
34799     : [z] "+m" (z)
34800     : [mult] "r" (c), [x] "m" (x)
34801     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
34802 }
34803 
34804 /* x has 14.5 words, z has 15. c is 0.5 word.
34805  * Put (x*c) in z. No carry. */
34806 /* *Mpfq::fixmp::x86_64::code_for__fixmp_mul05 */
34807 static inline
mpfq_fixmp_14_5_mul05(mp_limb_t * z,const mp_limb_t * x,mp_limb_t c)34808 void mpfq_fixmp_14_5_mul05(mp_limb_t * z, const mp_limb_t * x, mp_limb_t c)
34809 {
34810     __asm__ __volatile__(
34811         "movq    %[z], %%rdi\n"
34812         "movq    %[x], %%rsi\n"
34813         "movq    0(%%rsi), %%rax\n"
34814         "mulq    %[mult]\n"
34815         "movq    %%rax, 0(%%rdi)\n"
34816         "movq    8(%%rsi), %%rax\n"
34817         "movq    %%rdx, %%rcx\n"
34818         "mulq    %[mult]\n"
34819         "addq    %%rax, %%rcx\n"
34820         "adcq    $0, %%rdx\n"
34821         "movq    16(%%rsi), %%rax\n"
34822         "movq    %%rcx, 8(%%rdi)\n"
34823         "movq    %%rdx, %%rcx\n"
34824         "mulq    %[mult]\n"
34825         "addq    %%rax, %%rcx\n"
34826         "adcq    $0, %%rdx\n"
34827         "movq    24(%%rsi), %%rax\n"
34828         "movq    %%rcx, 16(%%rdi)\n"
34829         "movq    %%rdx, %%rcx\n"
34830         "mulq    %[mult]\n"
34831         "addq    %%rax, %%rcx\n"
34832         "adcq    $0, %%rdx\n"
34833         "movq    32(%%rsi), %%rax\n"
34834         "movq    %%rcx, 24(%%rdi)\n"
34835         "movq    %%rdx, %%rcx\n"
34836         "mulq    %[mult]\n"
34837         "addq    %%rax, %%rcx\n"
34838         "adcq    $0, %%rdx\n"
34839         "movq    40(%%rsi), %%rax\n"
34840         "movq    %%rcx, 32(%%rdi)\n"
34841         "movq    %%rdx, %%rcx\n"
34842         "mulq    %[mult]\n"
34843         "addq    %%rax, %%rcx\n"
34844         "adcq    $0, %%rdx\n"
34845         "movq    48(%%rsi), %%rax\n"
34846         "movq    %%rcx, 40(%%rdi)\n"
34847         "movq    %%rdx, %%rcx\n"
34848         "mulq    %[mult]\n"
34849         "addq    %%rax, %%rcx\n"
34850         "adcq    $0, %%rdx\n"
34851         "movq    56(%%rsi), %%rax\n"
34852         "movq    %%rcx, 48(%%rdi)\n"
34853         "movq    %%rdx, %%rcx\n"
34854         "mulq    %[mult]\n"
34855         "addq    %%rax, %%rcx\n"
34856         "adcq    $0, %%rdx\n"
34857         "movq    64(%%rsi), %%rax\n"
34858         "movq    %%rcx, 56(%%rdi)\n"
34859         "movq    %%rdx, %%rcx\n"
34860         "mulq    %[mult]\n"
34861         "addq    %%rax, %%rcx\n"
34862         "adcq    $0, %%rdx\n"
34863         "movq    72(%%rsi), %%rax\n"
34864         "movq    %%rcx, 64(%%rdi)\n"
34865         "movq    %%rdx, %%rcx\n"
34866         "mulq    %[mult]\n"
34867         "addq    %%rax, %%rcx\n"
34868         "adcq    $0, %%rdx\n"
34869         "movq    80(%%rsi), %%rax\n"
34870         "movq    %%rcx, 72(%%rdi)\n"
34871         "movq    %%rdx, %%rcx\n"
34872         "mulq    %[mult]\n"
34873         "addq    %%rax, %%rcx\n"
34874         "adcq    $0, %%rdx\n"
34875         "movq    88(%%rsi), %%rax\n"
34876         "movq    %%rcx, 80(%%rdi)\n"
34877         "movq    %%rdx, %%rcx\n"
34878         "mulq    %[mult]\n"
34879         "addq    %%rax, %%rcx\n"
34880         "adcq    $0, %%rdx\n"
34881         "movq    96(%%rsi), %%rax\n"
34882         "movq    %%rcx, 88(%%rdi)\n"
34883         "movq    %%rdx, %%rcx\n"
34884         "mulq    %[mult]\n"
34885         "addq    %%rax, %%rcx\n"
34886         "adcq    $0, %%rdx\n"
34887         "movq    104(%%rsi), %%rax\n"
34888         "movq    %%rcx, 96(%%rdi)\n"
34889         "movq    %%rdx, %%rcx\n"
34890         "mulq    %[mult]\n"
34891         "addq    %%rax, %%rcx\n"
34892         "adcq    $0, %%rdx\n"
34893         "movq    112(%%rsi), %%rax\n"
34894         "movq    %%rcx, 104(%%rdi)\n"
34895         "movq    %%rdx, %%rcx\n"
34896         "imulq    %[mult], %%rax\n"
34897         "addq    %%rcx, %%rax\n"
34898         "movq    %%rax, 112(%%rdi)\n"
34899     :
34900     : [mult] "r" (c), [z] "m" (z), [x] "m" (x)
34901     : "%rax", "%rcx", "%rdx", "%rsi", "%rdi", "memory");
34902 }
34903 
34904 
34905 #endif  /* MPFQ_FIXMP_X86_64_H_ */
34906 
34907 /* vim:set ft=cpp: */
34908