【问题标题】:AMD64 ABI Function Calling Sequence for arguments of type __m256__m256 类型参数的 AMD64 ABI 函数调用序列
【发布时间】:2017-05-20 07:22:27
【问题描述】:

我已经阅读了这部分有一段时间了,但我似乎无法弄清楚。我在 AMD64 ABI Draft 0.99.6,第 18 页,3.32 Parameter Passing 部分,有以下文字:

__m256 类型的参数被分成四个八字节的块。最不重要的一个属于 SSE 类,其他所有属于 SSEUP 类。

我很困惑,因为听起来我使用了三个 SSEUP 寄存器而只使用了一个 SSE,但这似乎浪费了与 SSEUP 关联的其他两个 SSE 寄存器。我误读了吗?我什至可能不会使用这种数据类型,但我已经对这篇文章感到困惑很长一段时间了。有人可以举例说明这将如何工作吗?我可能遗漏了一些明显的东西。

【问题讨论】:

    标签: x86-64 abi


    【解决方案1】:

    第 18 页仅包含稍后讨论用于传递函数参数的算法所需的定义列表。

    特别是,SSE 类总是在一个新的 vector 寄存器中传递,第一个可用的 %xmm0-%xmm7
    请注意,这些名称指的是寄存器的低 128 位部分,但最好根据可变大小向量寄存器来考虑它们%v0-%v7
    SSEUP 类在使用的 last 向量寄存器的下一个可用 64 位(八字节)中传递。

    __m256 然后在支持 AVX 的处理器中使用单个 %ymm 寄存器传递:低 64 位获得 SSE 类 - 因此是一个新的 %v0 寄存器 - 而其他三个 64 位块获得 SSEUP 从而重用%v0 寄存器。

    这是文档中的相关引述:

    1. 如果类是 SSE,则使用下一个可用向量寄存器,即寄存器 从 %xmm0 到 %xmm7 的顺序。
    2. 如果类是 SSEUP,则在下一个可用的八字节中传递八字节 最后使用的向量寄存器的块。

    SSEUP 类是在 ABI 中较早引入的,今天仍然存在。
    您可以快速查阅 Version 0.9 以查看差异:例如,_m256_m512 类型不存在。

    对于不支持 _m256 类型的新 ABI 的编译器,或者对于支持它但目标处理器不支持 AVX 的编译器,该类型通常是 an aggregate of two _m128,因此遵循后面描述的规则(特别是合并后规则)它在内存中传递:

    1. 如果对象的大小大于两个八字节,或者在 C++ 中,是非 POD 结构或联合类型,或者包含未对齐的字段,则它具有类 记忆。

    对于使用旧 ABI 的编译器

    如果聚合的大小超过两个八字节和前八字节 不是 SSE 或任何其他八字节不是 SSEUP,整个论点 在内存中传递。

    对于使用新 ABI 的编译器

    该标准确实令人困惑,主要是由于需要解决向后兼容性问题,SSESSEUP 分类在向量寄存器不断扩大和已经有各种不同尺寸的产品。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      相关资源
      最近更新 更多