Mac ABI为什么要求x86-32的16字节堆栈对齐?

问题描述 投票:31回答:10

我可以理解对于旧的PPC RISC系统甚至x86-64的要求,但是对于旧的经过验证的x86?在这种情况下,堆栈仅需要在4个字节边界上对齐。是的,某些MMX / SSE指令要求16字节对齐,但是如果被调用方有此要求,则应确保对齐正确。为什么要给every呼叫者增加这项额外要求?实际上,这可能会导致性能下降,因为每个呼叫站点都必须管理此要求。我想念什么吗?

更新:在对此进行更多调查并与一些内部同事协商之后,我对这有了一些理论:

  1. PPC,x86和x64版本的操作系统之间的一致性
  2. 似乎现在GCC代码生成器始终执行sub esp,xxx,然后将数据“移动”到堆栈上,而不是简单地执行“ push”指令。实际上,这在某些硬件上可能会更快。
  3. 虽然这确实使调用站点复杂一些,但是使用默认的“ cdecl”约定(调用方清理堆栈)时,几乎没有额外的开销。

我关于最后一项的问题是,对于依赖于被调用方清洗堆栈的调用约定,上述要求确实“使代码生成变得难看”。例如,一些编译器决定为其内部使用实现更快的基于寄存器的调用样式(即,不打算从其他语言或来源调用的任何代码)?这种堆栈对齐方式可能会否定通过在寄存器中传递某些参数而获得的某些性能提升。

更新:到目前为止,唯一的真实答案就是一致性,但是对我来说,答案太简单了。我在x86架构上有20多年的经验,如果确实是一致性,而不是性能或其他具体原因,那么我谨此建议,对于开发人员来说,这有点天真。他们忽略了将近三十年的工具和支持。尤其是如果他们期望工具供应商能够快速轻松地将其工具调整为适合自己的平台(也许不是... [是] Apple ...),而不必跳过几个看似不必要的麻烦。我将在第二天左右给这个主题,然后将其关闭...

相关

  • 我可以理解对于旧的PPC RISC系统甚至x86-64的要求,但是对于旧的经过验证的x86?在这种情况下,堆栈仅需要在4个字节边界上对齐。是的,有些...
  • macos memory-alignment callstack calling-convention abi
    10个回答
    30
    投票
    摘自《英特尔®64和IA-32架构优化参考手册》,第4.4.2节:

    6
    投票
    我不确定,因为我没有第一手证明,但我相信原因是上交所。如果您的缓冲区已经在16字节边界上对齐(movs vs movups),并且任何x86的Mac OS X至少具有sse2,则SSE速度会更快。可以由应用程序用户来解决,但是成本非常可观。如果在ABI中强制执行该命令的总成本不太高,则可能值得。 SSE在Mac OS X中非常普遍地使用:加速框架等...

    5
    投票
    我相信是要使其与x86-64 ABI保持一致。

    3
    投票
    首先,请注意16字节对齐是Apple引入System V IA-32 ABI的例外。

    2
    投票
    这是效率问题。

    2
    投票
    我的猜测是,苹果公司相信每个人都只是使用XCode(gcc),它可以为您调整堆栈。因此,要求对堆栈进行对齐以使内核不必只是微优化。

    1
    投票
    虽然我无法真正回答您的问题的原因,但是您可能会在以下站点找到有用的手册:

    1
    投票
    嗯,OS X ABI也不像在寄存器中传递小结构那样做有趣的RISC吗?

    0
    投票
    为了保持内核的一致性。这样一来,同一内核就可以在多种架构上启动而无需修改。

    0
    投票
    不确定为什么没有人考虑过从基于PowerPC的旧平台轻松移植的可能性?
    © www.soinside.com 2019 - 2024. All rights reserved.