【问题标题】:I want to compile glibc with sse disabled我想在禁用 sse 的情况下编译 glibc
【发布时间】:2019-04-22 12:29:40
【问题描述】:

我以为我不想在 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

有人知道原因吗? 有谁可以解决吗?

【问题讨论】:

  • 为什么你认为你不想使用 SSE 指令?
  • @GradyPlayer 我唯一能想到的是 OP 正在编写某种内核代码,其中 SIMD 寄存器的使用被禁止或强烈反对。
  • 不管怎样,系统调用的调用约定是不同的......也许有一个属性装饰器......你也可以让它们成为可变参数,所有东西都会被压入堆栈
  • @GradyPlayer 这就是我现在正在做的事情。 stackoverflow.com/questions/53312772/…在解决这个问题的过程中,遇到了一个问题,问了一个问题。

标签: gcc x86-64 sse glibc


【解决方案1】:

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

SSE2 是 x86-64 的基准。 64 位代码无需检查即可假定它,因此标准调用约定使用它。您永远不需要为了与硬件兼容而禁用 SSE2。

要在不使用 SSE 的情况下为 x86-64 编译,您需要一个可以为浮点使用替代调用约定的编译器,或者您需要构建不带 any 浮点参数的 glibc 或如果可能的话,返回值。 (函数中的 FP 代码很好;如果 SSE 不可用,gcc 知道如何回退到 x87,即使在 64 位代码中也是如此。)

即便如此,在 glibc 中也可能没有没有 SSE2 的手写 x86-64 asm 版本的strcpy,仅适用于 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 都有它,因此工具链和库确实需要支持在没有它的情况下进行编译。

【讨论】:

  • 感谢您的评论。是不是只能把编译器换成别的了,或者改glibc的源码...
  • @pinenight:我不知道是否有办法让 gcc 为 x86-64 使用替代的非 SSE ABI。即使有,您也无法从普通代码中调用任何 floatdouble 函数,因此许多想要使用此自定义 libc 的程序也必须重新编译。 (libm 是一个单独的文件,但许多使用 FP 的程序完全使用带有 FP 格式的 printf,并且在 libc 中。)
  • 如果您只想对某些特定的手写 asm 函数(如 memcpy 和 strcpy)禁用 SSE/SSE2,您可以保持二进制兼容性,但您可能需要调整源代码以禁用可用时正常调度到 AVX / SSE 版本。没有 SSE2 的 strcpy 不会有效率,但有 rep movsbmemcpy 在带有 ERMSB 的 CPU 上还不错。
猜你喜欢
  • 2016-09-30
  • 1970-01-01
  • 2014-12-23
  • 2016-09-21
  • 2011-09-12
  • 2017-11-02
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多