0

我有一个 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 编译器或我的代码有问题吗?

4

1 回答 1

2

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

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

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

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

于 2018-02-26T19:18:11.800 回答