@@ -354,10 +354,11 @@ uadd(mpz_t *z, mpz_t *x, mpz_t *y)
|
354 | 354 | /* Core multi-limb addition with carry propagation */ |
355 | 355 | mp_dbl_limb c = 0; |
356 | 356 | size_t i; |
| 357 | +size_t min_sz = (x->sz < y->sz) ? x->sz : y->sz; |
357 | 358 | |
358 | 359 | /* Add overlapping limbs from both operands */ |
359 | 360 | /* 4x unrolled loop for better performance */ |
360 | | -for (i = 0; i + 4 <= x->sz; i += 4) { |
| 361 | +for (i = 0; i + 4 <= min_sz; i += 4) { |
361 | 362 | c += (mp_dbl_limb)y->p[i] + (mp_dbl_limb)x->p[i]; |
362 | 363 | z->p[i] = LOW(c); |
363 | 364 | c >>= DIG_SIZE; |
@@ -375,13 +376,20 @@ uadd(mpz_t *z, mpz_t *x, mpz_t *y)
|
375 | 376 | c >>= DIG_SIZE; |
376 | 377 | } |
377 | 378 | |
378 | | -/* Handle remaining elements */ |
379 | | -for (; i < x->sz; i++) { |
| 379 | +/* Handle remaining elements in overlap */ |
| 380 | +for (; i < min_sz; i++) { |
380 | 381 | c += (mp_dbl_limb)y->p[i] + (mp_dbl_limb)x->p[i]; |
381 | 382 | z->p[i] = LOW(c); |
382 | 383 | c >>= DIG_SIZE; |
383 | 384 | } |
384 | 385 | |
| 386 | +/* Add remaining limbs from x if it's larger */ |
| 387 | +for (; i < x->sz; i++) { |
| 388 | +c += x->p[i]; |
| 389 | +z->p[i] = LOW(c); |
| 390 | +c >>= DIG_SIZE; |
| 391 | + } |
| 392 | + |
385 | 393 | /* Add remaining limbs from larger operand */ |
386 | 394 | /* 4x unrolled loop for better performance */ |
387 | 395 | for (; i + 4 <= y->sz; i += 4) { |
|