207 {
210
213
214 cl = 0;
216 for (i = 0; i + 4 <= na; i += 4) {
217 mp_limb_t u0 = numa[i + 0], u1 = numa[i + 1], u2 = numa[i + 2], u3 = numa[i + 3];
218 mp_limb_t l0, h0, l1, h1, l2, h2, l3, h3;
219
221 l0 += cl;
222 cl = (l0 < cl) + h0;
224 l1 += cl;
225 cl = (l1 < cl) + h1;
227 l2 += cl;
228 cl = (l2 < cl) + h2;
230 l3 += cl;
231 cl = (l3 < cl) + h3;
232
233 dst[i + 0] = l0;
234 dst[i + 1] = l1;
235 dst[i + 2] = l2;
236 dst[i + 3] = l3;
237 }
238 for (; i < na; i++) {
241 l += cl;
242 cl = (l < cl) + h;
243 dst[i] = l;
244 }
245 dst[na] = cl;
246 dst++;
247 numb++;
248 nb--;
249
250 while (nb >= 2) {
251
252 cl = 0;
253 x = numb[0];
254 for (i = 0; i + 4 <= na; i += 4) {
255 mp_limb_t u0 = numa[i + 0], d0 = dst[i + 0];
256 mp_limb_t u1 = numa[i + 1], d1 = dst[i + 1];
257 mp_limb_t u2 = numa[i + 2], d2 = dst[i + 2];
258 mp_limb_t u3 = numa[i + 3], d3 = dst[i + 3];
259 mp_limb_t l0, h0, l1, h1, l2, h2, l3, h3;
260
262 l0 += cl;
263 cl = (l0 < cl) + h0;
264 l0 += d0;
265 cl += (l0 < d0);
266 dst[i + 0] = l0;
268 l1 += cl;
269 cl = (l1 < cl) + h1;
270 l1 += d1;
271 cl += (l1 < d1);
272 dst[i + 1] = l1;
274 l2 += cl;
275 cl = (l2 < cl) + h2;
276 l2 += d2;
277 cl += (l2 < d2);
278 dst[i + 2] = l2;
280 l3 += cl;
281 cl = (l3 < cl) + h3;
282 l3 += d3;
283 cl += (l3 < d3);
284 dst[i + 3] = l3;
285 }
286 for (; i < na; i++) {
289 l += cl;
290 cl = (l < cl) + h;
291 l += d;
292 cl += (l < d);
293 dst[i] = l;
294 }
295 dst[na] = cl;
296
297 dst++;
298 cl = 0;
299 x = numb[1];
300 for (i = 0; i + 4 <= na; i += 4) {
301 mp_limb_t u0 = numa[i + 0], d0 = dst[i + 0];
302 mp_limb_t u1 = numa[i + 1], d1 = dst[i + 1];
303 mp_limb_t u2 = numa[i + 2], d2 = dst[i + 2];
304 mp_limb_t u3 = numa[i + 3], d3 = dst[i + 3];
305 mp_limb_t l0, h0, l1, h1, l2, h2, l3, h3;
306
308 l0 += cl;
309 cl = (l0 < cl) + h0;
310 l0 += d0;
311 cl += (l0 < d0);
312 dst[i + 0] = l0;
314 l1 += cl;
315 cl = (l1 < cl) + h1;
316 l1 += d1;
317 cl += (l1 < d1);
318 dst[i + 1] = l1;
320 l2 += cl;
321 cl = (l2 < cl) + h2;
322 l2 += d2;
323 cl += (l2 < d2);
324 dst[i + 2] = l2;
326 l3 += cl;
327 cl = (l3 < cl) + h3;
328 l3 += d3;
329 cl += (l3 < d3);
330 dst[i + 3] = l3;
331 }
332 for (; i < na; i++) {
335 l += cl;
336 cl = (l < cl) + h;
337 l += d;
338 cl += (l < d);
339 dst[i] = l;
340 }
341 dst[na] = cl;
342
343 dst++;
344 numb += 2;
345 nb -= 2;
346 }
347
348 while (nb >= 1) {
349 cl = 0;
350 x = numb[0];
351 for (i = 0; i + 4 <= na; i += 4) {
352 mp_limb_t u0 = numa[i + 0], d0 = dst[i + 0];
353 mp_limb_t u1 = numa[i + 1], d1 = dst[i + 1];
354 mp_limb_t u2 = numa[i + 2], d2 = dst[i + 2];
355 mp_limb_t u3 = numa[i + 3], d3 = dst[i + 3];
356 mp_limb_t l0, h0, l1, h1, l2, h2, l3, h3;
357
359 l0 += cl;
360 cl = (l0 < cl) + h0;
361 l0 += d0;
362 cl += (l0 < d0);
363 dst[i + 0] = l0;
365 l1 += cl;
366 cl = (l1 < cl) + h1;
367 l1 += d1;
368 cl += (l1 < d1);
369 dst[i + 1] = l1;
371 l2 += cl;
372 cl = (l2 < cl) + h2;
373 l2 += d2;
374 cl += (l2 < d2);
375 dst[i + 2] = l2;
377 l3 += cl;
378 cl = (l3 < cl) + h3;
379 l3 += d3;
380 cl += (l3 < d3);
381 dst[i + 3] = l3;
382 }
383 for (; i < na; i++) {
386 l += cl;
387 cl = (l < cl) + h;
388 l += d;
389 cl += (l < d);
390 dst[i] = l;
391 }
392 dst[na] = cl;
393 dst++;
394 numb++;
395 nb--;
396 }
397}
#define lmmp_param_assert(x)
static void _umul64to128_(uint64_t a, uint64_t b, uint64_t *low, uint64_t *high)