其他分享
首页 > 其他分享> > c-128乘法和除法的内在函数

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