Gcc抱怨vstmia-为什么?

Gcc抱怨vstmia-为什么?,gcc,arm,inline-assembly,raspberry-pi2,neon,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" ::[re

我正试图为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\u decode\u table.d”-MT“arm\u decode\u table.o”-c-o“arm\u decode\u table.o”“../arm


通过不指定适当的
-mfpu
选项,可以获得编译器默认配置提供的任何FPU支持。从本例中的配置来看,这是
——fpu=vfp
,这意味着陈旧的VFPv2只有16个D寄存器覆盖在32个S寄存器上。因此,目标为
d0
-
d15
的第一条指令可以,但汇编程序拒绝汇编第二条指令,因为它知道第二条指令在所选目标上不起作用


对于带有NEON的Cortex-A7,
-mfpu=NEON-vfpv4
将让工具链知道它可以让rip和使用所有可用的东西。

通过不指定适当的
-mfpu
选项,可以获得编译器默认配置提供的任何FPU支持。从本例中的配置来看,这是
——fpu=vfp
,这意味着陈旧的VFPv2只有16个D寄存器覆盖在32个S寄存器上。因此,目标为
d0
-
d15
的第一条指令可以,但汇编程序拒绝汇编第二条指令,因为它知道第二条指令在所选目标上不起作用


对于带有霓虹灯的Cortex-A7,
-mfpu=NEON-vfpv4
将让工具链知道它可以让您翻录和使用所有可用的东西。

您要传递什么
-mfpu=
选项?arm linux gnueabihf gcc-mcpu=Cortex-A7-marm-O2-g-std=gnu11-MMD-MP-MF“arm\u decode\u table.d”—MT“arm\u decode\u table.o”—c-o“arm\u decode\u table.o”“./ARM_decode_table.c”好的,如果你不指定FPU,你将得到编译器配置的默认值(你可以用
-v
检查GCC的配置)。我猜这恰好是
vfpv3-d16
)-v给我的(其中有很多东西)--使用fpu=vfp——使用float=hard,我应该将fpu更改为neon-vfpv4?您要传递什么
-mfpu=
选项?arm linux gnueabihf gcc-mcpu=cortex-a7-marm-O2-g-std=gnu11-MMD-MP-MF“arm\u decode\u table.d”-MT“arm\u decode\u table.o”--c-o”arm\u decode\u\table.o”“../arm“好的,如果您不指定FPU,您将得到编译器配置的默认值(您可以使用
-v
检查GCC的配置)。我要胡乱猜测一下,那正好是
vfpv3-d16
;)-v给了我(其中有很多东西)——fpu=vfp——float=hard,我应该把fpu换成neon-vfpv4?a-ha。看起来eclipse没有添加该标志,即使我选择了它。手动添加它就行了。如果你能满足对齐条件,你应该考虑用VLD1.64替换VLDMIa。当与对齐说明符结合时,VLD1/VST1的速度会快很多。a-ha。看起来eclipse没有添加该标志,即使我选择了它。手动添加它就行了。如果你能满足对齐条件,你应该考虑用VLD1.64替换VLDMIa。当与对齐说明符结合使用时,VLD1/VST1的速度要快很多。