在 x86_64 中,我知道 mul 和 div opp 代码支持 128 个整数,方法是将低 64 位放在 rax 中,将高位放在 rdx 寄存器中。我在 intel 内在函数指南中寻找某种内在函数来执行此操作,但我找不到。我正在编写一个字长为 64 位的大数字库。现在我正在用这样的一个词进行除法。
int ubi_div_i64(ubigint_t* a, ubi_i64_t b, ubi_i64_t* rem)
{
if(b == 0)
return UBI_MATH_ERR;
ubi_i64_t r = 0;
for(size_t i = a->used; i-- > 0;)
{
ubi_i64_t out;
__asm__("\t"
"div %[d] \n\t"
: "=a"(out), "=d"(r)
: "a"(a->data[i]), "d"(r), [d]"r"(b)
: "cc");
a->data[i] = out;
//ubi_i128_t top = (r << 64) + a->data[i];
//r = top % b;
//a->data[i] = top / b;
}
if(rem)
*rem = r;
return ubi_strip_leading_zeros(a);
}
如果我可以在 x86intrinsics.h 标头中使用某些东西而不是内联 asm,那就太好了。