我有一个 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 编译器或我的代码有问题吗?
我有一个 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 编译器或我的代码有问题吗?
与 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 范围内,这可能会启用一些优化。)