armcc抱怨说`q0`没有定义编译霓虹组件

时间:2016-10-28 18:32:42

标签: assembly arm neon armcc

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

1 个答案:

答案 0 :(得分:3)

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

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

看看第7.3节,其中说明:

  

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

     

编译器中的内联汇编程序不支持多个   说明。具体来说,内联汇编程序不支持:

     

•没有Thumb-2技术的处理器中的Thumb汇编语言。 •   在VFPv3或更高版本中添加的VFP指令。 •NEON   说明。 •ARMv6 SETEND指令和部分系统   扩展。 •ARMv5 BX,BLX和BXJ指令。

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

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