c-128乘法和除法的内在函数
作者:互联网
在x86_64中,我知道mul和div opp代码通过将低64位放在rax中并将高64位放在rdx寄存器中来支持128个整数.我在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,那就太好了.
解决方法:
gcc具有__int128和__uint128类型.
它们存在时,应使用正确的汇编指令进行算术运算;我过去曾使用它们来获得产品的高64位,尽管我从未将其用于除法.如果使用的不是正确的,请相应地提交错误报告/功能请求.
标签:c-3,c,assembly,gcc,intrinsics 来源: https://codeday.me/bug/20191013/1907003.html