PowerPC GCC 浮点指令

PowerPC GCC floating point instructions

目前我正在开发具有 e200z7 内核的 MPC5777 板。大多数事情进展顺利,但我遇到了一个已经让我很烦的问题。 我正在尝试使用嵌入式硬件支持对部分代码使用浮点运算。我的工具链是 GCC 6.3 (powerpc-gcc),为此我使用了以下标志:

ASFLAGS_BASE = -g -a32 -mbooke -me500 --fatal-warnings

ARCH_FLAGS   = -mpowerpc-gpopt -mfprnd -misel -m32 -mhard-float -mabi=spe -mmfpgpr -mfloat-gprs=single

请注意 -mfloat-gprs=single 标志。就是那个出问题的。

当我使用 -mfloat-gprs=single 时,我无法正确编译,因为某些功能未实现:

undefined reference to `__extendsfdf2`,
undefined reference to `__adddf3`,
undefined reference to `__divdf3`,

-等等。

现在,如果我使用 -mfloat-gprs=double 进行编译,它会一直运行到最后并生成我所有的执行文件。但是,使用此标志还会生成 e200z7 未实现的额外功能。我不能确定所有这些,因为代码越来越大,而且几乎不可能跟踪所有生成的程序集。例如,目前我的执行在到达 efscfd 指令时卡住了,该指令由 e500 内核实现,具有双精度浮点支持,但对于仅支持单精度浮点的 e200 则不然。

因此,我们非常欢迎您提出任何建议!

提前致谢,

如果有人在这里遇到类似的问题,我已经使用三个标志修复了它:

-mfloat-gprs=single -Wdouble-promotion -fsingle-precision-constant

他们所做的是: -mfloat-gprs=single 告诉编译器使用通用寄存器进行浮点运算,而不是浮点寄存器。 =single 表示它具有单精度

-Wdouble-promotion 当 gcc 尝试将单浮点数转换为双浮点数时启用编译器警告

-fsingle-precision-constant 强制 GCC 不将单浮点数转换为双浮点数

我同时使用-fsingle-precision-constant-Wdouble-promotion是100%不会用double的