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