【发布时间】:2009-10-09 01:40:47
【问题描述】:
我希望我的 C 函数能够有效地计算两个 64 位有符号整数乘积的高 64 位。我知道如何在 x86-64 程序集中使用 imulq 并将结果从 %rdx 中提取出来。但是我完全不知道如何用 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;
}
【问题讨论】:
-
相关:Getting the high part of 64 bit integer multiplication,另一个答案是纯 C 代码,仅使用 uint64_t(尽管它的编译效率非常低)。