代码之家  ›  专栏  ›  技术社区  ›  bdonlan

在x86 linux上使用软件浮点

  •  8
  • bdonlan  · 技术社区  · 17 年前

    在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
    
    4 回复  |  直到 17 年前
        1
  •  10
  •   user1059432    14 年前

    令人惊讶的是,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
    

    libsoft-fp.a 他们现在可以使用我们的源文件编译到目录中 -msoft-float

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

    使用

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

    正如预期的那样,没有调用x87浮点指令,代码运行速度也相当慢,在我使用大量除法的示例中是8倍。

    注: 我更愿意用

    $ 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浮动 奇怪的或幸运的是 arm 这个版本在一个特定的平台上编译得很好 i386 而且似乎效果很好。

        2
  •  5
  •   Alexander ZaLar    15 年前

    如果没有一些额外的库,GCC不支持这一点。从…起 the 386 documentation :

    指向 警告 :必要的 库不是GCC的一部分。 通常情况下 使用机器常用的C编译器, 但这不能直接在计算机中完成 自行安排提供合适的 交叉汇编。

    在函数返回的计算机上 浮点运算的结果是80387 寄存器堆栈,一些浮点 即使在以下情况下,也可能会发出操作码: -使用msoft float

    但是根据 this gnu wiki page ,有fp软键和 ieee . 还有 SoftFloat

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

    变矩器离合器

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

        3
  •  4
  •   Alex Martelli    17 年前

    除非你 希望 要手动引导整个工具链,可以从 uclibc toolchain (我想是i386版本)——soft float(AFAIK)不直接支持debian及其衍生产品上的“本机”编译,但它可以通过uclibc工具链的“嵌入式”方法使用。

        4
  •  0
  •   Rob Wells    17 年前

    G'day,

    除非您针对的是一个没有内置FP支持的平台,否则我想不出您想要模拟FP支持的原因。

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

    这就是为什么我最终用Ada编写了一个包来标记板载68k FPU,而不是使用编译器制造商当时提供的软仿真。事实上,他们最终将其捆绑在编译器中。

    编辑: 刚刚看到你下面的评论。嗯,如果你不需要全套的FP支持,你可以自己开发一些你需要的数学函数吗?这就是我提到的Ada软件包是如何开始的。

    干杯