2011-06-08 46 views
2

的(微軟)x64 calling convention狀態:64位調用約定問題

的參數在寄存器RCX,RDX,R8和R9通過。如果參數是float/double,則它們以XMM0L,XMM1L,XMM2L和XMM3L的形式傳遞。

這很好,但爲什麼只是浮動/雙打?爲什麼不是整數(也可能是指針)也通過XMM寄存器傳遞?
似乎有點像浪費可用空間,不是嗎?

回答

3

因爲對非FP值(即整數和地址)的大多數操作都是爲了使用通用寄存器而設計的。

有整數SSE操作,但它們只是算術。因此,如果調用約定支持通過SSE寄存器傳遞整數和地址,則幾乎總是需要將值複製到通用寄存器。

+0

但是,它不是比潛在的溢出堆棧更好嗎? – Mehrdad 2011-06-08 06:28:16

+0

IIRC,在GP寄存器和SSE寄存器之間不存在用於移動數據的操作。這意味着通過SSE reg傳遞數據。需要(在最壞的情況下)複製值到內存(最好對齊)*兩次*。這比使用堆棧更糟糕。順便提一下,一些CPU供應商在寄存器文件上映射堆棧,所以堆棧訪問變得更便宜。不過,不知道英特爾或AMD是否會這樣做。 – 2011-06-08 06:41:20

+0

+1我完全不知道這個事實,這解釋了很多。 :) 謝謝! – Mehrdad 2011-06-08 06:44:31