与 FPU 寄存器内联的 arm gcc 汇编
arm gcc assembly inline with FPU register
我想使用Cortex-M7的FPU指令,称为VCVTR,将双精度浮点数转换为整数。
int double_to_int(double value)
{
int result;
__asm("VCVTR.S32.F64 %0, %1" : "=r"(result), "r"(value));
return result;
}
但是我从编译器那里得到了错误信息。
Error: VFP single, double or Neon quad precision register expected -- `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
就可以产生。尽管如此,constraints are documented in the manual。特别是:
t VFP floating-point registers s0-s31. Used for 32 bit values.
w VFP floating-point registers d0-d31 and the appropriate subset d0-d15 based on command line options. Used for 64 bit values only.
您还不小心指定了两个输出约束。 value
当然应该是一个输入。
我想使用Cortex-M7的FPU指令,称为VCVTR,将双精度浮点数转换为整数。
int double_to_int(double value)
{
int result;
__asm("VCVTR.S32.F64 %0, %1" : "=r"(result), "r"(value));
return result;
}
但是我从编译器那里得到了错误信息。
Error: VFP single, double or Neon quad precision register expected -- `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
就可以产生。尽管如此,constraints are documented in the manual。特别是:
t VFP floating-point registers s0-s31. Used for 32 bit values.
w VFP floating-point registers d0-d31 and the appropriate subset d0-d15 based on command line options. Used for 64 bit values only.
您还不小心指定了两个输出约束。 value
当然应该是一个输入。