我正在尝试在 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++ 一样进行编译?
在我的 POV 上:您遇到的错误是由于 Clang 和 GCC 处理某些 ARM 汇编语法的方式不同造成的。导致问题的行是:
mov r0, r0, lsr 16
此语法使用 ARM 汇编的“灵活第二操作数”功能,GCC 接受该功能,但 Clang 在此上下文中不接受。为了使其与两个编译器兼容,您需要使用 Clang 能够理解的更明确的语法。
以下是如何修改该行以与 Clang 和 GCC 一起使用:
lsr r0, r0, #16
此修改执行完全相同的操作(逻辑右移 16 位),但使用两个编译器都能理解的语法。显式使用
lsr
指令,而不是依赖于 mov
灵活的第二个操作数。
要在 x265 版本中修复此问题:
blockcopy8.S
文件。mov r0, r0, lsr 16
的行。lsr r0, r0, #16
。如果该模式在程序集文件中多次出现,您可能还需要在其他地方进行类似的更改。
值得注意的是,这是 GCC 和 Clang 在处理 ARM 汇编方面的已知差异。如果可以的话,您可能希望向 x265 开发人员报告此问题,以便他们可以更新其汇编代码以与两个编译器兼容。