手臂gcc组件与FPU寄存器内联

时间:2018-08-22 11:07:05

标签: gcc assembly arm cortex-m fpu

我想使用称为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

1 个答案:

答案 0 :(得分:4)

对于初学者来说,编译器完全能够生成该指令。不仅有能力,而且实际上一个简单的return value就会产生这种效果。尽管如此,constraints are documented in the manual。特别是:

  

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

     

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

您还意外地指定了两个输出约束。 value当然应该是输入。