2017-05-20 179 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分類編譯器是在一個體繫結構方便的分類,其中矢量寄存器不斷擴大,不同大小的廣泛範圍已經出現在那裏。