我正在尝试为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“
答案 0 :(得分:3)
如果没有指定适当的-mfpu
选项,您将获得编译器默认配置提供的任何FPU支持。从这种情况下的配置,即--with-fpu=vfp
,这意味着硬件旧的VFPv2只有16个D寄存器覆盖32个S寄存器。因此,第一条针对d0
- d15
的指令很好,但是汇编程序拒绝汇编它知道不会对所选目标起作用的第二条指令。
对于带NEON的Cortex-A7,-mfpu=neon-vfpv4
会让工具链知道它可以让你翻录并使用你所拥有的一切。