【问题标题】:armcc complains that `q0` is not defined compiling neon assemblyarmcc 抱怨编译 neon 程序集时未定义“q0”
【发布时间】:2017-03-11 16:59:08
【问题描述】:
int main(){
__asm volatile
{
    // load data
    vld1.16 {q0, q1}, [r0]!

...

使用命令

armcc --cpu=Cortex-A9 -O2 -Otime --vectorize --remarks -g --md --depend_format=unix_escaped --no_depend_system_headers -c -o test.o test.c

有错误提示

"test.c", line 7: Error:  #20: identifier "q0" is undefined
      vld1.16 {q0, q1}, [r0]!
               ^
"test.c", line 8: Error:  #20: identifier "q2" is undefined
          vld1.16 {q2, q3}, [r0]!
                   ^

我是否错过了armcc 命令中的任何标志?

armcc 版本是

Product: ARM Compiler 5.05
Component: ARM Compiler 5.05 (build 41)
Tool: armcc [4d0eb9]
For support see http://www.arm.com/support/
Software supplied by: ARM Limited

【问题讨论】:

  • 仅供参考,手动矢量化的内在函数通常是比内联汇编更好的选择,因为现在编译器可以很好地处理它们。 (至少 gcc 和 clang 可以;不知道 armcc。)请参阅 gcc.gnu.org/wiki/DontUseInlineAsm 了解原因,包括它实际上会通过阻止编译器传播常量或其他优化来导致代码变慢。

标签: assembly arm neon armcc


【解决方案1】:

虽然我不使用armcc,但我不相信你的编译器支持NEON的内联汇编。

https://static.docs.arm.com/dui0472/k/DUI0472K_armcc_user_guide.pdf

请看第 7.3 节,其中指出:

7.3 编译器中对内联汇编器支持的限制

编译器中的内联汇编器不支持一些 指示。具体来说,内联汇编器不支持:

• 没有Thumb-2 技术的处理器中的Thumb 汇编语言。 • 在 VFPv3 或更高版本中添加的 VFP 指令。 • 霓虹灯 指示。 • ARMv6 SETEND 指令和一些系统 扩展名。 • ARMv5 BX 、 BLX 和 BXJ 指令。

它可能几乎可以工作的原因是 vld 是受支持的 VFPv2 的一部分,直到它到达“q”时才会混淆。

如果您使用 gcc/clang 变体,那么是的,我建议您需要使用 -march=armv7-a -mfpu=neon 隐式编译目标 NEON,同时指定基本 ISA 和浮点单元扩展,但只能使用编译器内在函数,而不是内联汇编。 (如评论中所述)。

【讨论】:

  • 使用 gcc,inline-asm 从编译器传递到汇编器不变(只是替换了%[name] 操作数,等等),所以-march 选项只有在它们导致编译器的 asm 输出的某种指令。关于 ARM 的 IDK,但对于 x86,-msse4 或任何只是告诉编译器它可以自己使用这些指令的东西,并且不需要您从内联汇编中使用它们。 (使用相关的内在函数是必需的)
  • 谢谢,是的,我一直对 gcc 的基本/愚蠢的汇编程序感到惊讶。 IIR,ARM 的工具要好得多,并且可能会将架构标志传递给汇编程序以帮助检查 ISA 兼容性(尽管我自己使用它们已经 8 年了)。
  • 如果您是手写 asm,您可以使用 NASM 或 YASM 宏来检查 ISA 兼容性,就像 x264 项目一样。我还没有研究他们是如何做到的(无论是宏还是需要汇编程序支持),或者它是否可以适应gas。无论如何,-march 的目的是告诉编译器 it 可以发出什么,而不是限制内联汇编可以做什么。如果您避免使用-march=-msse4,则可以在使用 SSE4 指令之前手动检查 CPUID。 (当然,更好的方法是单独的编译单元,但 gcc/gas 设计在这种情况下是有意义的。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-03
相关资源
最近更新 更多