【问题标题】:Gcc complains about vstmia - why?Gcc 抱怨 vstmia - 为什么?
【发布时间】:2016-02-27 11:43:15
【问题描述】:

我正在尝试为 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"

【问题讨论】:

  • 你通过什么-mfpu= 选项?
  • 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"
  • 好的,如果你不指定 FPU,你将得到编译器配置的任何默认值(你可以使用-v 检查 GCC 的配置)。我会大胆猜测那恰好是vfpv3-d16 ;)
  • -v 给了我(其中很多东西) --with-fpu=vfp --with-float=hard 我应该把fpu换成neon-vfpv4?

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


【解决方案1】:

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

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

【讨论】:

  • 啊哈。看起来即使我选择了 eclipse 也没有添加那个标志。手动添加就可以了。
  • 如果能满足对齐条件,应考虑将vldmia替换为vld1.64。与对齐说明符结合使用时,VLD1/VST1 速度更快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-25
  • 1970-01-01
  • 2017-01-17
  • 2013-05-08
  • 2015-06-09
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多