如何让ARM MULL指令在gcc中的uint64_t中生成其输出?
我想在c99代码库中引入一些汇编代码。我想使用ARM CPU的UMULL指令将2个uint32_t相乘,并将结果立即输入uint64_t如何让ARM MULL指令在gcc中的uint64_t中生成其输出?,gcc,assembly,arm,32bit-64bit,Gcc,Assembly,Arm,32bit 64bit,我想在c99代码库中引入一些汇编代码。我想使用ARM CPU的UMULL指令将2个uint32_t相乘,并将结果立即输入uint64_t 现在一个uint64需要2个寄存器,那么如何指定asm块的输出和约束?指令将其结果生成两个32位寄存器。我建议显式地重新组合64位值,如下所示: /* assuming the 64-bit result was stored in "hi" (upper half) and "lo" (lower half) */ uint64_t v = ((uin
现在一个uint64需要2个寄存器,那么如何指定asm块的输出和约束?指令将其结果生成两个32位寄存器。我建议显式地重新组合64位值,如下所示:
/* assuming the 64-bit result was stored in "hi" (upper
half) and "lo" (lower half) */
uint64_t v = ((uint64_t)hi << 32) | (uint64_t)lo;
/*假设64位结果存储在“hi”(上限)中
一半)和“lo”(下半部分)*/
uint64_t v=((uint64_t)hi问得好
以下代码使用GCC-O
或更高版本输出所需内容,而无需借助汇编程序:
uint32_t a,b;
uint64_t c;
...
c=(uint64_t)a*(uint64_t)b;
或者,如果您觉得必须使用特定于机器的asm,您可以:
uint32_t a,b;
uint64_t c
asm(“umull%Q0、%R0、%1、%2”:“=r”(c):“r”(a),“r”(b));
c
的寄存器名是寄存器对的第一个,并且%Q和%R选择寄存器对的上下32位寄存器。有关示例,请参阅gcc/config/arm/arm.md->umulsid3
但是,如果您可以继续使用C,那么优化器就有机会做更多的事情,并且对您的程序的读者更友好。谢谢您的回答!事实上,C版本做了我希望它做的事情,非常酷。非常感谢%Q和%R语法,这正是我一开始想要的。
uint32_t a, b;
uint64_t c;
...
c = (uint64_t)a * (uint64_t)b;
uint32_t a, b;
uint64_t c;
asm ("umull %Q0, %R0, %1, %2" : "=r"(c) : "r"(a), "r"(b));