2011-07-13 87 views
22

我在尋找英特爾數據表:英特爾®64和IA-32架構 軟件開發人員手冊,我無法找到的區別MOVDQA和MOVAPS x86指令之間的區別?

  • MOVDQA:移動對準雙四字
  • MOVAPS:移動對齊壓縮單精度

在英特爾數據表中,我可以找到兩個指令:

此指令可用於從128位 存儲器位置加載XMM寄存器,以XMM寄存器的內容存儲到 128位存儲器位置或兩個XMM寄存器之間移動數據。

唯一的區別是:

要移動一個雙四字或從未對齊的存儲位置,使用 的MOVDQU指令。

要移動壓縮單精度浮點值或從 未對齊的存儲單元,使用MOVUPS指令。

但我無法找到兩個不同的指令的原因?

那麼有誰能解釋一下這個區別嗎?

+0

另外,MOVAPD與它們看起來完全相同。 – Calmarius

回答

38

在功能上,它們是相同的。

一些(但不是全部)微體系結構,由於「域跨越罰款」,有時間差異。因此,當數據與整數SSE指令一起使用時,通常應使用movdqa;當數據與浮點指令一起使用時,應使用movaps。有關此主題的更多信息,請參閱英特爾優化手冊或Agner Fog出色的微體系結構指南。請注意,這些延遲通常與寄存器移位相關,而不是加載或存儲。

+1

你能鏈接到特定的手冊條目嗎?我很難相信這一點,因爲SSE寄存器沒有與它們相關的類型(類型在指令中編碼),所以我不認爲有不同的浮點和整數路徑。但是,它們具有不同的操作碼,並在不同的指令集中引入。 MOVAPS是SSE1,而MOVDQA是SSE2。根據http://www.intel.com/Assets/PDF/manual/248966.pdf –

+2

,它們也具有相同的延遲和吞吐量。您的答案比我的更正確。我刪除它。 –

+16

@Jasper Bekkers:你不能相信你喜歡的一切,但它依然如此。有關域的一般性討論以及它們之間的旁路延遲,請參閱「英特爾優化手冊」(例如,2.2.3討論Nehalem微架構上的域)。有關危害的具體實例,請參閱Agner Fog出色的參考文獻第86和87頁http://www.agner.org/optimize/microarchitecture.pdf –