我想在禁用sse的情况下编译glibc

时间:2018-11-20 05:14:03

标签: gcc x86-64 sse glibc

我认为我不想在strcpy()之类的libc库函数中使用SSE指令。

因此,我尝试使用选项-mno-sse从源代码进行构建。 但是,出现如下错误,我无法做到。

 ../stdlib/bits/stdlib-float.h: In function ‘atof’:
 ../stdlib/bits/stdlib-float.h:26:1: error: SSE register return with SSE disabled

有人知道原因吗? 有谁能解决这个问题?

1 个答案:

答案 0 :(得分:0)

x86-64 System V ABI的调用约定在XMM寄存器中返回floatdouble

SSE2是x86-64的基线。 64位代码无需假设即可假定它,因此标准调用约定使用它。您无需禁用SSE2即可与硬件兼容。

要在不使用x86-64的SSE的情况下进行编译,您需要一个可以对浮点使用备用调用约定的编译器,或者您需要在没有任何浮点args的情况下构建glibc或如果可能,则返回值。 (函数中的FP代码很好;即使没有64位代码的SSE,gcc也知道如何降级到x87。)

即使那样,在glibc中没有SSE2的strcpy手写x86-64 asm版本可能也不会,仅适用于32位x86。因此,即使您确实避免了float / double问题,glibc也可能不会因此而编译。如果这样做的话,与SSE2相比,通用C strcpy的性能会降低。


在没有SSE的情况下为32位x86构建glibc应该可以正常工作。 i386 System V ABI的调用约定将FP args传递到堆栈上,并以x87 st0的形式返回它们。

SSE是对32位x86的可选扩展;并非所有仅32位的CPU都有它,因此工具链和库确实需要支持在没有它的情况下进行编译。