PowerPC GCC浮点指令

时间:2018-11-20 22:06:19

标签: gcc powerpc

目前,我正在开发具有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。

因此,这里的任何建议都将受到欢迎!

预先感谢

1 个答案:

答案 0 :(得分:0)

万一有人遇到类似的问题,我已经通过使用三个标志修复了该问题:

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

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

-Wdouble-promotion在gcc尝试将单个float转换为double float时启用编译器警告

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

我同时使用-fsingle-precision-constant-Wdouble-promotion,因为100%不会使用double。