在x86_64中,我知道mul和div opp代碼支持128個整數,方法是將較低的64位置於rax中,將較高的位置置於rdx寄存器中。我在intel內部指南中尋找某種內在因素來做到這一點,而我找不到它。我正在寫一個大字庫,其中字大小是64位。現在我正在用這樣的單詞進行劃分。用於128乘法和除法的內在函數
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。
由於asm已經是編譯器特有的,所以你可以使用'__int128'類型,它會自動執行你想要的。 – Jester
看看_mulx_u64。看起來非常適合您的使用,儘管它會生成僅存在於新型x86處理器上的mulx指令。 – ScottD
鑑於體系結構特定內在函數和體系結構特定程序集之間的選擇;後者有更好的文檔記錄,更好的支持,更廣泛的理解和更容易維護(不需要猜測編譯器實際做了什麼)。 – Brendan