Gcc抱怨发病 - 为什么?

时间:2015-11-24 21:01:52

标签: gcc arm inline-assembly raspberry-pi2 neon

我正在尝试为Raspberry Pi 2B(ARMv7 / Neon)编译程序,但我从内联汇编代码中得到错误:

  

错误:预期VFP单精度寄存器 - `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“

1 个答案:

答案 0 :(得分:3)

如果没有指定适当的-mfpu选项,您将获得编译器默认配置提供的任何FPU支持。从这种情况下的配置,即--with-fpu=vfp,这意味着硬件旧的VFPv2只有16个D寄存器覆盖32个S寄存器。因此,第一条针对d0 - d15的指令很好,但是汇编程序拒绝汇编它知道不会对所选目标起作用的第二条指令。

对于带NEON的Cortex-A7,-mfpu=neon-vfpv4会让工具链知道它可以让你翻录并使用你所拥有的一切。