【问题标题】:arm gcc assembly inline with FPU register与 FPU 寄存器内联的 arm gcc 程序集
【发布时间】:2019-01-28 15:14:18
【问题描述】:

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

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

【问题讨论】:

标签: gcc assembly arm cortex-m fpu


【解决方案1】:

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

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

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

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

【讨论】:

  • 为什么有两个输出约束。 value 没有“=”。我尝试 __asm("VCVTR.S32.F64 %0, %1" : "=t"(result) : "w"(value));,编译器显示错误消息:错误:操作数大小必须匹配寄存器宽度-- `vcvtr.s32.f64 s13,s14'。似乎“w”约束不会生成“d”寄存器。它生成“s”寄存器
  • 两个输出,因为语法是 outputs : inputs : clobbers 并且您使用的是逗号而不是冒号。不知道为什么它生成 s 而不是 d 与文档相反。无论如何,让编译器发出指令有什么问题?
  • 通过添加加载指令,似乎可行。 __asm("VLDR.F64 d0, %1\r\n" "VCVT.S32.F64 %0, d0" : "=t"(结果) : "m"(值) : "d0");谢谢:-)
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 2020-04-11
相关资源
最近更新 更多