【发布时间】:2016-02-23 16:59:11
【问题描述】:
我必须在我的 C 程序中使用 Ubuntu 上的 GCC 编译器将以下语句作为内联汇编代码编写。
__int128 X = (__int128)F[0]*T[0]+(__int128)F[1]*T[1]+(__int128)F[2]*T[2]);
其中 F 是无符号 64 位整数数组,T 是有符号 64 位整数数组。数组 F 作为参数通过引用传递,而 T 是本地数组。我将上述声明翻译如下
__asm__("movq %0, %%rax; imulq %1; movq %%rax, %%xmm0; movq %%rdx, %%xmm1;"
::"m"(F[0]), "m"(T[0]));
__asm__("movq %0, %%rax; imulq %1; movq %%xmm0, %%rcx; addq %%rcx, %%rax;"
"movq %%rax, %%xmm0; movq %%xmm1, %%rcx; adcq %%rcx, %%rdx;"
"movq %%rdx, %%xmm1;"
::"m"(F[1]), "m"(T[1]));
__asm__("movq %2, %%rax; imulq %3; movq %%xmm0, %%rcx; addq %%rcx, %%rax;"
"movq %%rax, %?; movq %%xmm1, %%rcx; adcq %%rcx, %%rdx;"
"movq %%rdx, %?;"
:"=m"(??), "=m"(??):"m"(F[2]), "m"(T[2]));
首要的问题是我做得对吗?如果是,那么我不知道如何将结果存储到 X 中,因为结果的低 64 位在 rax 中,而高 64 位在 rdx 中。我已经检查过是否可以替换?? X,那么我得到了错误的结果。
使用 xmm 寄存器进行存储是有原因的。由于我对内联汇编很天真,因此我认为有更好的方法来做到这一点。我用上面的内联汇编代码检查了我的程序,没有错误。任何帮助或改进建议将不胜感激。
【问题讨论】:
标签: c gcc inline-assembly