我正在尝试为 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
,这意味着硬壳旧的 VFPv2 只有 16 个 D 寄存器覆盖了 32 个 S 寄存器。因此,针对 d0
-d15
的第一条指令没问题,但汇编器拒绝汇编第二条指令,它知道该指令无法在所选目标上运行。
对于带有 NEON 的 Cortex-A7,-mfpu=neon-vfpv4
会让工具链知道它可以释放并使用您可用的所有内容。
关于Gcc 提示 vstmia - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33903723/