在 ARMv7 上编译汇编代码:CLang 与 GNU

问题描述 投票:0回答:1

我正在尝试在 ARMv7 系统上构建 x265,并且在其中一个汇编源中出现以下错误:

/usr/bin/c++ -mcpu=native -mfloat-abi=hard -mfpu=vfp -marm -DPIC -c .../source/common/arm/blockcopy8.S -o blockcopy8.S.o
.../source/common/arm/blockcopy8.S:835:21: error: expected immediate or register in shift operand

编译器 -

/usr/bin/c++
是 clang-16.0.6。使用 g++ 13.2.0 相同的代码编译没有问题,这一定是开发人员从未见过该问题的原因。 有问题的行内容为:

mov             r0, r0, lsr 16

如何更正它,使其使用 clang 进行编译就像使用 g++ 一样进行编译?

assembly clang neon armv7
1个回答
0
投票

在我的 POV 上:您遇到的错误是由于 Clang 和 GCC 处理某些 ARM 汇编语法的方式不同造成的。导致问题的行是:

mov             r0, r0, lsr 16

此语法使用 ARM 汇编的“灵活第二操作数”功能,GCC 接受该功能,但 Clang 在此上下文中不接受。为了使其与两个编译器兼容,您需要使用 Clang 能够理解的更明确的语法。

以下是如何修改该行以与 Clang 和 GCC 一起使用:

lsr             r0, r0, #16

此修改执行完全相同的操作(逻辑右移 16 位),但使用两个编译器都能理解的语法。显式使用

lsr
指令,而不是依赖于
mov
灵活的第二个操作数。

要在 x265 版本中修复此问题:

  1. 在 x265 源目录中找到
    blockcopy8.S
    文件。
  2. 找到包含
    mov             r0, r0, lsr 16
    的行。
  3. 将其替换为
    lsr             r0, r0, #16
  4. 保存文件并再次尝试编译。

如果该模式在程序集文件中多次出现,您可能还需要在其他地方进行类似的更改。

值得注意的是,这是 GCC 和 Clang 在处理 ARM 汇编方面的已知差异。如果可以的话,您可能希望向 x265 开发人员报告此问题,以便他们可以更新其汇编代码以与两个编译器兼容。

© www.soinside.com 2019 - 2024. All rights reserved.