Gcc 抱怨 vstmia - 为什么?
Gcc complains about vstmia - why?
我正在尝试为 Raspberry Pi 2B (ARMv7 / Neon) 编译一个程序,但是我从内联汇编代码中得到一个错误:
Error: VFP single precision register expected -- `vstmia.64
r9,{d16-d31}'
密码是:
asm volatile (
"vstmia.64 %[reg]!, {d0 - d15} @ read all regs\n\t"
"vstmia.64 %[reg], {d16 - d31} @ read all regs\n\t"
::[reg] "r" (&vregs):
);
有趣的是它没有抱怨第一个 vstmia
。
我首先尝试使用单个 {d0 - d32}
,我认为可能有太多 64 位寄存器,但这显然不是问题所在。
vregs
为8字节对齐存储。
我正在使用 arm-linux-gnueabihf-gcc 4.8.3,命令行如下:
arm-linux-gnueabihf-gcc -mcpu=cortex-a7 -marm -O2 -g -std=gnu11 -MMD -MP -MF"ARM_decode_table.d" -MT"ARM_decode_table.o" -c -o "ARM_decode_table.o" "../ARM_decode_table.c"
通过不指定适当的 -mfpu
选项,您将获得编译器默认配置提供的任何 FPU 支持。在这种情况下,根据您的配置,即 --with-fpu=vfp
,这意味着只有 16 个 D 寄存器覆盖 32 个 S 寄存器的硬壳旧 VFPv2。因此,针对 d0
-d15
的第一条指令很好,但是 assembler 拒绝 assemble 它知道不会在所选目标上运行的第二条指令。
对于带有 NEON 的 Cortex-A7,-mfpu=neon-vfpv4
会让工具链知道它可以撕裂并使用您拥有的一切。
我正在尝试为 Raspberry Pi 2B (ARMv7 / Neon) 编译一个程序,但是我从内联汇编代码中得到一个错误:
Error: VFP single precision register expected -- `vstmia.64 r9,{d16-d31}'
密码是:
asm volatile (
"vstmia.64 %[reg]!, {d0 - d15} @ read all regs\n\t"
"vstmia.64 %[reg], {d16 - d31} @ read all regs\n\t"
::[reg] "r" (&vregs):
);
有趣的是它没有抱怨第一个 vstmia
。
我首先尝试使用单个 {d0 - d32}
,我认为可能有太多 64 位寄存器,但这显然不是问题所在。
vregs
为8字节对齐存储。
我正在使用 arm-linux-gnueabihf-gcc 4.8.3,命令行如下:
arm-linux-gnueabihf-gcc -mcpu=cortex-a7 -marm -O2 -g -std=gnu11 -MMD -MP -MF"ARM_decode_table.d" -MT"ARM_decode_table.o" -c -o "ARM_decode_table.o" "../ARM_decode_table.c"
通过不指定适当的 -mfpu
选项,您将获得编译器默认配置提供的任何 FPU 支持。在这种情况下,根据您的配置,即 --with-fpu=vfp
,这意味着只有 16 个 D 寄存器覆盖 32 个 S 寄存器的硬壳旧 VFPv2。因此,针对 d0
-d15
的第一条指令很好,但是 assembler 拒绝 assemble 它知道不会在所选目标上运行的第二条指令。
对于带有 NEON 的 Cortex-A7,-mfpu=neon-vfpv4
会让工具链知道它可以撕裂并使用您拥有的一切。