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 会让工具链知道它可以撕裂并使用您拥有的一切。