2017-05-20 128 views
1

我一直在阅读本节的一段时间,但似乎无法弄清楚。我在AMD64 ABI草案0.99.6,第18页,部分3.32 Parameter Passing和以下文本:AMD64 ABI函数__m256类型的参数的调用序列

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

我很困惑,因为它听起来像我使用三个SSEUP寄存器和只有一个SSE,但似乎浪费了与SSEUP相关的其他两个SSE寄存器。我误读了吗?我可能甚至不会使用这种数据类型,但我已经在这段文字中困惑了很长一段时间。有人可以举例说明这将如何工作?我可能错过了一些明显的东西。

回答

3

只包含一个定义列表,用于稍后讨论用于传递函数参数的算法。

特别地,SSE类中一个新的矢量寄存器总是传递,第一个可用的%xmm0-%xmm7
请注意,这些名称是指寄存器的低128位部分,但更好的方法是使用可变大小的向量寄存器%v0-%v7
SSEUP类传递在下一个可用的64位(八字节)的最后矢量寄存器使用。然后

__m256通过,在支持AVX处理器,利用单个%ymm寄存器:低64位得到SSE类 - 并且因此新%v0寄存器 - 而其他三个64比特的块得到SSEUP从而重新使用%v0寄存器。

下面是从文档的相关报价:

  • 如果类SSE,下一个可用的向量寄存器时,寄存器 采取的顺序从%xmm0到%xmm7。
  • 如果类是SSEUP,则在最后一个使用的向量寄存器的下一个可用的8字节 块中传递该八字节。
  • SSEUP类先前在ABI推出,它今天仍然存在。
    您可以快速查阅Version 0.9以查看差异:例如,_m256_m512类型不存在。

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

    1. 如果一个物体的尺寸是多于两个eightbytes更大,或在C++中,是一个nonPOD结构或联合型,或包含未对齐字段,它具有 类记忆。

    对于如果总的尺寸超过2个eightbytes和第一eightbyte 不是SSE或任何其他eightbyte不SSEUP使用旧ABI

    编译器,整个论点 是记忆中传递。

    对于使用新ABI

    该标准承认混淆主要是由于需要解决向后兼容,SSESSEUP分类编译器是在一个体系结构方便的分类,其中矢量寄存器不断扩大,不同大小的广泛范围已经出现在那里。