目前,我正在开发一个MPC5777板,带有e200z7内核。大部分事情都进行得很顺利,但我被一个问题困住了,这个问题已经让我很烦了。使用嵌入式硬件支持,我尝试在代码的部分上使用浮点操作。我的工具链是GCC 6.3 (Powerpc),为此我使用了以下旗子:
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则不支持。
因此,这里的任何建议都将是令人惊讶的欢迎!
提前谢谢你,
发布于 2018-11-28 20:48:51
如果有人在这里遇到类似的问题,我已经使用了三个标志来解决这个问题:
-mfloat-gprs=single -Wdouble-promotion -fsingle-precision-constant
他们所做的是:-mfloat-gprs=single告诉编译器使用通用寄存器进行浮点操作,而不是浮点寄存器。=单一意味着它具有单一精度
-Wdouble-promotion为gcc尝试将单个浮点数转换为双浮点数时启用了编译器警告。
-fsingle-precision-constant强制GCC不要将单个浮点数转换为双浮点数。
我正在使用-fsingle-precision-constant和-Wdouble-promotion同时100%的双倍将不会被使用。
https://stackoverflow.com/questions/53402307
复制相似问题