Я бы хотел, чтобы моя функция C эффективно вычисляла 64-разрядные биты продукта из двух 64-битных подписных int. Я знаю, как это сделать в сборке x86-64, с imulq и вытягивая результат из% rdx. Но я не понимаю, как написать это в C вообще, не говоря уже о коаксиальном компиляторе, чтобы сделать это эффективно.
Есть ли у кого-нибудь предложения по написанию этого в C? Это чувствительно к производительности, поэтому "ручные методы" (например, русские крестьянки или библиотеки bignum) отсутствуют.
Эта dorky встроенная функция сборки Я написал работы и примерно это codegen, я после:
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;
}