如何让ARM MULL指令在gcc中的uint64_t中产生输出?

时间:2010-02-03 16:34:35

标签: gcc assembly arm 32bit-64bit

我想在c99代码库中引入一些汇编代码。我想使用ARM CPU的UMULL指令乘以2 uint32_t并立即将结果输入uint64_t。

现在uint64_t需要2个寄存器,那么如何指定asm块的输出和约束呢?

2 个答案:

答案 0 :(得分:2)

好问题!

以下代码使用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位寄存器和高32位寄存器。见gcc / config / arm / arm.md - >以umulsidi3为例。

但是,如果你能留在C中,那么优化者就有机会做更多事情,对你的程序的读者更友善。

答案 1 :(得分:1)

umull指令将其结果生成两个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;

编译器优化器应该注意到左移是纯数据路由,结果代码应该没问题。可以肯定的是,只需使用-S来检查编译器输出。