【问题标题】:ARM GCC inline assembly error on %w operand%w 操作数上的 ARM GCC 内联汇编错误
【发布时间】:2018-02-26 18:55:58
【问题描述】:

我有一个 ARMv8 内联汇编段:

/* get leading 0 of cache ways */
__asm__ __volatile__
(
  "CLZ %w[shift], %w[maxWay] \n"
  : [shift] "=r" (uiShift)
  : [maxWay] "r" (uiMaxWay)
);

ARM GCC编译器编译时:

有趣的是,如果我用 Linaro 编译器编译,那么没有问题。

ARM GCC 编译器或我的代码有问题吗?

【问题讨论】:

  • 使用__builtin_clz 代替汇编。无论如何,您的操作数类型是什么,为什么需要w。 PS:请勿将代码发布为图片。

标签: gcc assembly arm inline-assembly linaro


【解决方案1】:

与 x86 不同,在 x86 中,相同的编译器可以使用 -m32-m64 生成 x86-32 或 x86-64 代码,您需要为 ARM 和 AArch64 单独构建 gcc。

ARM gcc 接受 -march=armv8-a,但它仍在 32 位 ARM 模式下编译,而不是 AArch64。

我可以使用 AArch64 gcc 和 ARM gcc 重现您的问题 on the Godbolt compiler explorer。 (并且我包含了一个使用__builtin_clz(uiShift) 而不是内联asm 的示例,因此它可以在任一架构上编译为clz 指令。)

顺便说一句,您可以在两个操作数上省略 w 大小覆盖,而只需将 unsigned int 用于输入和输出。然后,相同的内联 asm 将适用于 ARM 和 AArch64。 (但__builtin_clz 仍然更好,因为编译器了解它的作用。例如,它知道结果在 0..31 范围内,这可能会启用一些优化。)

【讨论】:

  • 谢谢。我只是删除'w'然后。
  • @RayXu:为什么不__builtin_clz?它的编译效率至少与您的内联 asm 一样。
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多