Gcc 提示 vstmia - 为什么?

标签 gcc arm inline-assembly raspberry-pi2 neon

我正在尝试为 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,这意味着硬壳旧的 VFPv2 只有 16 个 D 寄存器覆盖了 32 个 S 寄存器。因此,针对 d0-d15 的第一条指令没问题,但汇编器拒绝汇编第二条指令,它知道该指令无法在所选目标上运行。

对于带有 NEON 的 Cortex-A7,-mfpu=neon-vfpv4 会让工具链知道它可以释放并使用您可用的所有内容。

关于Gcc 提示 vstmia - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33903723/

相关文章:

c - 未定义的乘法引用

c++ - 在 Eclipse 上安装 pdcurses

ubuntu - Ubuntu下连接X11

c - Sleep() 内联汇编调用可以工作,但会生成运行时检查失败

c - 内联汇编堆栈行为

C++ 异常开销

amazon-web-services - 在 x86 桌面上运行使用 ARMv7 基础镜像构建的 Docker 镜像时出现问题

arm - Android Studio 无法在配备 32 位 Ubuntu 12.04 w/JDK-8 的 Samsung ARM Chromebook 上加载

c - 如何初始化 GNU C 全局寄存器变量

c++ - C/C++ 将 int 转换为 short 和内联 asm(特定于 ARM)