在x86 linux上使用软件浮点

在i386 linux上使用软件浮点(很容易)是可能的,而不会导致在每次调用时陷入内核的开销? 我试过了-msoft-float,但是看起来正常的(ubuntu)C库没有包含FP库:

$ gcc -m32 -msoft-float -lm -o test test.c /tmp/cc8RXn8F.o: In function `main': test.c:(.text+0x39): undefined reference to `__muldf3' collect2: ld returned 1 exit status 

Solutions Collecting From Web of "在x86 linux上使用软件浮点"

除非你引导你的整个工具链,你可以从uclibc工具链 (i386版本,我想象)开始 – 软浮动(AFAIK)不直接支持debian和衍生工具上的“native”编译,但它可以通过uclibc工具链的“嵌入”方法使用。

令人惊讶的是,gcc并不支持这种本地代码,因为代码在名为soft-fp的目录中的源代码中显然是可用的。 可以手动编译这个库:

 $ svn co svn://gcc.gnu.org/svn/gcc/trunk/libgcc/ libgcc $ cd libgcc/soft-fp/ $ gcc -c -O2 -msoft-float -m32 -I../config/arm/ -I.. *.c $ ar -crv libsoft-fp.a *.o 

有几个c文件由于错误而不能编译,但大多数编译。 在将libsoft-fp.a复制到我们的源文件的目录之后,它们现在可以用-msoft-float编译:

 $ gcc -g -m32 -msoft-float test.c -lsoft-fp -L. 

使用快速检查

 $ objdump -D --disassembler-options=intel a.out | less 

表明,如预期的那样,没有调用x87浮点指令,代码的运行速度也相当慢,在我的例子中,使用了大量的除法运算。

注意:我宁愿编译软浮点库

 $ gcc -c -O2 -msoft-float -m32 -I../config/i386/ -I.. *.c 

但是会导致大量的错误消息

 adddf3.c: In function '__adddf3': adddf3.c:46: error: unknown register name 'st(1)' in 'asm' 

似乎i386版本没有得到很好的维护,因为st(1)指向x87寄存器之一,当使用-msoft-float时显然不可用。 奇怪或幸运的arm版本在i386编译罚款,似乎工作得很好。

没有一些额外的库,GCC不支持这个。 从386文档 :

-msoft-float生成包含用于浮点的库调用的输出。 警告 :必要的库不是GCC的一部分。 通常使用机器通常的C编译器的功能,但这不能直接在交叉编译中完成。 您必须自行安排提供合适的库函数进行交叉编译。

在80387寄存器堆栈中函数返回浮点的机器上,即使使用-msoft-float,也可能会发出一些浮点操作码

另外,你不能把-mfpmath = unit设置为“none”,它必须是sse,387或者两者兼而有之。

但是,根据这个GNU wiki页面 ,有fp-soft和ieee 。 还有SoftFloat 。

(对于ARM,有-mfloat-abi = softfp,但是对于386 SX,似乎没有类似的东西)。

它似乎并不像tcc支持软件浮点数字。

祝你好运找到一个适合你的图书馆。

天儿真好,

除非你的目标是没有内置FP支持的平台,否则我想不出你为什么要模仿FP支持。

你的x386平台不支持外部FPU吗? 可惜它不是内置FPU的x486!

根据我的经验,任何软仿真都必然比硬件等效。

这就是为什么我最终在Ada编写一个程序包来完成板载68k FPU的工作,而不是使用编译器制造商提供的软仿真。 事实上,他们把它捆绑在编译器中。

编辑:刚刚在下面看到您的评论。 嗯,如果你不需要全套的FP支持,你可以推出自己的几个数学函数,你需要吗? 那我提到的Ada包怎么开始了。

HTH

干杯,