- // VL = n + 1
- // sv.madded product.v, vn.v, qhat.s, carry.s
- for (int i = 0; i <= n; i++)
- {
- uint32_t vn_v = i < n ? vn[i] : 0;
- uint64_t value = (uint64_t)vn_v * (uint64_t)qhat + carry;
- carry = (uint32_t)(value >> 32);
- product[i] = (uint32_t)value;
- }
- bool ca = true;
- uint32_t *un_j = &un[j];
- // VL = n + 1
- // sv.subfe un_j.v, product.v, un_j.v
- for (int i = 0; i <= n; i++)
- {
- uint64_t value = (uint64_t)~product[i] + (uint64_t)un_j[i] + ca;
- ca = value >> 32 != 0;
- un_j[i] = value;
- }
+ bigmul(qhat, product, vn, m, n);
+ bool ca = bigsub(un, product, un, m, n, true);