首页 > 解决方案 > 与 FPU 寄存器内联的 arm gcc 程序集

问题描述

我想使用称为 VCVTR 的 Cortex-M7 的 FPU 指令将双精度浮点数转换为整数。

int double_to_int(double value)
{
    int result;
    __asm("VCVTR.S32.F64 %0, %1" : "=r"(result), "r"(value));
    return result;
}

但是我从编译器那里得到错误信息。

错误:需要 VFP 单精度、双精度或 Neon 四精度寄存器 -- `vcvtr.s32.f64 r3,r3'

如何解决这个问题。

也许约束“=r”和“r”不正确。但我不知道 FPU 寄存器的其他限制。

我的编译器是 arm-none-eabi-gcc,版本是 7.2.1

我的编译器选项是

-mcpu=cortex-m7 -mthumb -mfloat-abi=hard -mfpu=fpv5-d16 -O3 -g -munaligned-access

标签: gccassemblyarmcortex-mfpu

解决方案


对于初学者来说,编译器完全有能力生成该指令。不仅有能力,而且实际上很简单return value。尽管如此,这些限制都记录在手册中。尤其是:

t VFP 浮点寄存器 s0-s31。用于 32 位值。

w VFP 浮点寄存器 d0-d31 和基于命令行选项的适当子集 d0-d15。仅用于 64 位值。

此外,您不小心指定了两个输出约束。value当然应该是输入。


推荐阅读