我希望我的C函數有效地計算兩個64位帶符號整數的乘積的高64位。我知道如何在x86-64程序集中做到這一點,並使用imulq並將結果從%rdx中提取出來。但是我完全不知道如何用C編寫它,更不用說哄編譯器來高效地完成它了。計算64×64 int產品的高64位C
有沒有人有任何建議在C寫這個?這是對性能敏感的,所以「手動方法」(如俄羅斯農民或者bignum庫)已經不在了。
這傻乎乎的內聯彙編函數我寫的作品和大致經過我的代碼生成:
static long mull_hi(long inp1, long inp2) {
long output = -1;
__asm__("movq %[inp1], %%rax;"
"imulq %[inp2];"
"movq %%rdx, %[output];"
: [output] "=r" (output)
: [inp1] "r" (inp1), [inp2] "r" (inp2)
:"%rax", "%rdx");
return output;
}
我喜歡用因子h。這給出(ha + b)*(hc + d)= hhac + had + hbc + bd。 'h'基本上是一種跟蹤32位的方式。每個術語都需要64位(忽略h因子),給出32位格雷克斯,但是(2^n)-1 *(2^n)-1 =(2^2n)-2(2^n)+ 1,這是<(2^2n)-1,留下淨空以增加一個較低期限的進位。 hhac術語是純粹的溢出,正如had和hbc術語中的那樣。你可以使用h(ad + bc)而不是+ hbc - 它的超過64位,但溢出並不重要 - 你放棄了它。 – Steve314 2009-10-09 02:38:50
Steve314:你以前做過!好點。我昨晚輸入了一個實現,並將其作爲新的答案發送。 – DigitalRoss 2009-10-09 22:00:11