我想在禁用 sse 的情况下编译 glibc
I want to compile glibc with sse disabled
我认为我不想在像 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
有谁知道原因吗?
有谁能解决吗?
XMM 寄存器中 x86-64 System V ABI 的调用约定 returns float
和 double
。
SSE2 是 x86-64 的基准。 64 位代码无需检查即可采用它,因此标准调用约定使用它。您永远不需要禁用 SSE2 来与硬件兼容。
要在没有 SSE 的情况下为 x86-64 进行编译,您需要一个可以使用浮点替代调用约定的编译器,或者您需要在没有 any[=33= 的情况下构建 glibc ] 浮点参数或 return 值,如果可能的话。 (函数内的 FP 代码很好;即使在 64 位代码中,gcc 知道如何在 SSE 不可用时回退到 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,并 return 在 x87 st0
.
中传递它们
SSE 是 32 位 x86 的可选扩展;并非所有 32 位 CPU 都有它,因此工具链和库确实需要支持在没有它的情况下进行编译。
我认为我不想在像 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
有谁知道原因吗? 有谁能解决吗?
XMM 寄存器中 x86-64 System V ABI 的调用约定 returns float
和 double
。
SSE2 是 x86-64 的基准。 64 位代码无需检查即可采用它,因此标准调用约定使用它。您永远不需要禁用 SSE2 来与硬件兼容。
要在没有 SSE 的情况下为 x86-64 进行编译,您需要一个可以使用浮点替代调用约定的编译器,或者您需要在没有 any[=33= 的情况下构建 glibc ] 浮点参数或 return 值,如果可能的话。 (函数内的 FP 代码很好;即使在 64 位代码中,gcc 知道如何在 SSE 不可用时回退到 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,并 return 在 x87 st0
.
SSE 是 32 位 x86 的可选扩展;并非所有 32 位 CPU 都有它,因此工具链和库确实需要支持在没有它的情况下进行编译。