gcc - 与 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
解决方案
对于初学者来说,编译器完全有能力生成该指令。不仅有能力,而且实际上很简单return value
。尽管如此,这些限制都记录在手册中。尤其是:
t VFP 浮点寄存器 s0-s31。用于 32 位值。
w VFP 浮点寄存器 d0-d31 和基于命令行选项的适当子集 d0-d15。仅用于 64 位值。
此外,您不小心指定了两个输出约束。value
当然应该是输入。
推荐阅读
- spring-boot - 如果在 spring boot hibernate 中违反 saveAll()
- python - asyncio 不正确地警告流对象被垃圾收集;显式调用“stream.close()”
- rust - 有没有一种简单的方法来找出一个 Vector 是否在 Rust 中被 None 填充?
- python-3.x - 尝试使用 python3 从 .pdf 文件中提取地理坐标
- c - 验证整数值;c程序
- python - 无法在python中比较两个对象的数组
- react-native - 使用本机反应中的数据导航到另一个页面
- html - CSS多级下拉菜单不起作用
- r - Dplyr mutate 示例包含多余的变量,但从未对其执行任何操作,为什么?
- java - 添加 System.out::print ,我无法理解