2010-02-09 140 views
9

是否有更快的方法將兩個x86 32位寄存器存儲在一個128位xmm寄存器中?將兩個x86 32位寄存器存儲到128位xmm寄存器中

movd xmm0, edx 
    movd xmm1, eax 
    pshufd xmm0, xmm0, $1 
    por xmm0, xmm1 

所以,如果EAX是0×12345678和EDX是0×87654321的結果在XMM0必須0x8765432112345678。

謝謝

+0

哇!這是一個很酷的彙編程序...最後我看到的是32位...不知道你可以買一個128位的PC ...:P :) – t0mm13b 2010-02-09 19:07:36

+0

流式SIMD擴展(SSE)是對x86架構的SIMD指令集擴展,由英特爾設計並於1999年推出。 – 2010-02-09 19:22:45

+3

直到SSE指令集版本允許爲止? – PhiS 2010-02-09 21:11:08

回答

15

對於SSE 4.1,您可以使用movd xmm0, eax/pinsrd xmm0, edx, 1並按照2條說明操作。

對於較舊的CPU,可以使用2×movd,然後punpckldq共3個指令:

movd xmm0, edx 
movd xmm1, eax 
punpckldq xmm0, xmm1 
+0

謝謝。但這是自2007年以來相對較新的擴展集,速度和代碼大小几乎相同。 – 2010-02-09 19:45:43

+2

確定 - 現在已經爲SSE2/SSE3添加了3個指令序列。 – 2010-02-09 21:04:24

+1

超級...這就是我需要的!謝謝。 – 2010-02-09 21:47:13

1

我不太瞭解MMX,但也許你想要PACKSSDW指令。

的PACKSSDW指令取入源操作數和兩個 雙字 兩個雙字在 目的地操作數,並通過轉換飽和這些 四個符號字。 指令將這四個字 打包在一起並將結果存儲在目標MMX寄存器的 中。

(從http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html

編輯:我剛剛意識到這些是SSE寄存器。好吧。

編輯:我現在要閉嘴了。

+0

我喜歡xmm寄存器,而不是mmx(64位),因爲它們在使用後不需要'emms'指令。 – 2010-02-09 19:50:20

+0

是的,也許更好的專用寄存器.. – 2010-02-10 01:39:25

+0

+1閉嘴現在:-) – hirschhornsalz 2011-12-14 16:44:56