3
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
4

1 回答 1

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

于 2016-11-03T21:57:12.593 回答