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
答案 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和浮点单元扩展,但仅限于使用编译器内在函数,而不是内联汇编。 (如评论中所述)。