目前,我正在开发具有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。
因此,这里的任何建议都将受到欢迎!
预先感谢
答案 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。