armcc 抱怨 `q0` 未定义编译 neon 程序集

armcc complains that `q0` is not defined compiling neon assembly

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

虽然我不使用 armcc,但我认为您的编译器不支持 NEON 的内联汇编。

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

看看第 7.3 节,其中指出:

7.3 Restrictions on inline assembler support in the compiler

The inline assembler in the compiler does not support a number of instructions. Specifically, the inline assembler does not support:

• Thumb assembly language in processors without Thumb-2 technology. • VFP instructions that were added in VFPv3 or higher. • NEON instructions. • The ARMv6 SETEND instruction and some of the system extensions. • ARMv5 BX , BLX , and BXJ instructions.

它几乎可以正常工作的原因是 vld 是受支持的 VFPv2 的一部分,直到它到达 "q" 才变得混乱。

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