我认为我不想在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
有人知道原因吗? 有谁能解决这个问题?
答案 0 :(得分:0)
x86-64 System V ABI的调用约定在XMM寄存器中返回float
和double
。
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都有它,因此工具链和库确实需要支持在没有它的情况下进行编译。