【问题标题】:Using software floating point on x86 linux在 x86 linux 上使用软件浮点
【发布时间】:2009-06-19 15:36:41
【问题描述】:

是否可以(轻松地)在 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

【问题讨论】:

    标签: linux floating-point x86


    【解决方案1】:

    令人惊讶的是,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 浮点指令,并且代码运行速度也相当慢,在我使用大量除法的示例中是 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-float 时显然不可用。 奇怪或幸运的是,arm 版本在 i386 上编译得很好,而且似乎工作得很好。

    【讨论】:

      【解决方案2】:

      除非您想要手动引导您的整个工具链,否则您可以从 uclibc toolchain(我想是 i386 版本)开始——软浮点(AFAIK)不直接支持“native” " 在 debian 和衍生产品上编译,但可以通过 uclibc 工具链的“嵌入式”方法使用。

      【讨论】:

      • 感谢您的回复。我尝试使用 buildroot 引导 uclibc,但它似乎忽略了我在 BR2_UCLIBC_CONFIG 下提供的 .config,至少对于 UCLIBC_HAS_FPU 选项:/
      • @Alex uclibc 工具链链接已损坏。 uclibc.org/toolchains.html 应该合适吗?
      【解决方案3】:

      如果没有一些额外的库,GCC 不支持这一点。来自the 386 documentation

      -msoft-float 生成包含浮动库调用的输出 观点。 警告:必要条件 库不是 GCC 的一部分。 通常的设施 使用机器通常的 C 编译器, 但这不能直接在 交叉编译。你必须让你的 自行安排以提供合适的 库函数 交叉编译。

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

      此外,您不能将 -mfpmath=unit 设置为“none”,它必须是 sse、387 或两者兼有。

      但是,根据this gnu wiki page,有fp-soft和ieee。还有SoftFloat

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

      tcc 似乎也不支持软件浮点数。

      祝你好运找到适合你的库。

      【讨论】:

        【解决方案4】:

        生日,

        除非你的目标是一个没有内置 FP 支持的平台,否则我想不出你想要模拟 FP 支持的理由。

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

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

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

        编辑:刚刚在下面看到您的评论。嗯,如果您不需要一整套 FP 支持,是否可以为您确实需要的少数数学函数推出自己的功能?我提到的 Ada 包就是这样开始的。

        HTH

        干杯,

        【讨论】:

        • 我们正在考虑将产品移植到嵌入式 x86 CPU,其中一些没有 F​​PU。我们目前在没有 FPU 的平台上运行,但我们也不会因陷入内核而受到惩罚:)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-23
        • 2023-03-18
        • 2012-10-23
        • 1970-01-01
        • 2021-10-26
        • 2011-08-20
        • 2012-06-08
        相关资源
        最近更新 更多