【问题标题】:how can I get the ARM MULL instruction to produce its output in a uint64_t in gcc?如何让 ARM MULL 指令在 gcc 的 uint64_t 中生成其输出?
【发布时间】:2011-01-12 16:57:52
【问题描述】:

我想在 c99 代码库中引入一些汇编代码。我想使用 ARM CPU 的 UMULL 指令将 2 uint32_t 相乘,然后立即将结果转换为 uint64_t。

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

【问题讨论】:

    标签: gcc assembly arm 32bit-64bit


    【解决方案1】:

    好问题!

    以下代码使用 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 -> umulsidi3。

    但是,如果您可以留在 C 中,那么优化器就有机会做更多事情,并且对您的程序的读者更友善。

    【讨论】:

    • 感谢您的回答!事实上,C 版本做了我想做的事,非常酷。非常感谢 %Q 和 %R 语法,这就是我一开始所寻找的。​​span>
    【解决方案2】:

    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 来检查编译器输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-22
      • 2011-01-03
      相关资源
      最近更新 更多