SSE2指令集系列之一

2022-03-24 01:41:42 字數 4853 閱讀 7474

sse2與sse1使用相同暫存器,指令描述約定:

mm指64位mmx暫存器

xmm指128xmm暫存器

m32 指32位記憶體變數

m128指128位記憶體變數

sse2主要是雙精度浮點運算指令

1.  資料搬移指令

movapd xmm,xmm/m128

movapd xmm/m128,xmm

把源儲存器內容值送入目的暫存器,當有m128時,記憶體變數

位址必須

16位元組對齊.

movupdxmm,xmm/m128

movupd

xmm/m128,xmm

把源儲存器內容值送入目的暫存器,記憶體變數

位址不必對齊16位元組.

兩條指令同sse1的浮點搬移指令movaps 和 movups 指令類似

movlpdxmm,m64

movlpd m64,xmm

把源儲存器64位內容送入目的暫存器低64位,高64位不變,記憶體變數位址不必對齊16位元組.

movhpdxmm,m64

movhpd m64,xmm

把源儲存器64位內容送入目的暫存器高64位,低64位不變,記憶體變數位址不必對齊16位元組.

2.    浮點常用算數運算指令

addpd xmm,xmm/m128

addsd xmm,xmm/m128

subpd xmm,xmm/m128

subsd xmm,xmm/m128

mulpd xmm,xmm/m128

mulsd xmm,xmm/m128

divpd xmm,xmm/m128        

divsd xmm,xmm/m128

sqrtpd xmm,xmm/m128       

sqrtsd xmm,xmm/m128

maxpd xmm,xmm/m128

maxsd xmm,xmm/m128

minpd xmm,xmm/m128

minsd xmm,xmm/m128

小結:

1. 以pd結尾的指令對兩個雙精度浮點數執行相同的運算

2. 以sd結尾的指令只對低64位雙精度執行運算,高64位保持不變。

3. 當有m128儲存器是要求記憶體位址必須為16位元組對齊。

3. 位運算指令

andpd xmm,xmm/m128

源儲存器128個二進位制位'與'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數位址必須對齊16位元組邊界.

andnpd xmm,xmm/m128

目的暫存器128個二進位制位先取'非',再'與'源儲存器128個二進位制位,結果送入目的暫存器,記憶體變數位址必須對齊16位元組邊界

orpd xmm,xmm/m128

源儲存器128個二進位制位'或'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數位址必須對齊16位元組邊界

xorpd xmm,xmm/m128

源儲存器128個二進位制位'異或'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數位址必須對齊16位元組邊界

4. 資料型別轉換指令

4.132位浮點與64位浮點之間的轉換

cvtps2pd xmm,xmm/m64

把源儲存器低64位兩個單精度浮點數變成兩個雙精度浮點數,結果送入目的暫存器.

cvtss2sd xmm,xmm/m32

把源儲存器低32位1個單精度浮點數變成1個雙精度浮點數,結果送入目的暫存器的低64位,高64位不變.

cvtpd2ps xmm,xmm/m128

把源儲存器兩個雙精度浮點數變成兩個單精度浮點數,結果送入目的暫存器的低64位,高64位清零,

cvtsd2ss xmm,xmm/m64

把源儲存器低64位1個雙精度浮點數變成1個單精度浮點數,結果送入目的暫存器的低32位,高96位不變.

4.2  浮點數與32位整數之間的轉換

4.2.1 雙精度與整數之間轉換

cvtpd2pi mm,xmm/m128

把源儲存器兩個雙精度浮點數變成兩個雙字有符號整數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.

如果結果大於所能表示的範圍,那麼轉化為80000000h(正數也轉為此值).

當xmm1 = 0x 0dd1a5e1f35aec736   41132a4000000000,執行cvtpd2pi mm0,xmm1

則 mm0 = 0x 80000000 0004ca90

因為0dd1a5e1f35aec736h(雙精度浮點數) = -3.14e140 超過 80000000h所以變為80000000h

而41132a4000000000h(雙精度浮點數) = 3.14e5,所以轉為314000 = 0004ca90h(有符號整數)

cvtpi2pd xmm,mm/m64

把源儲存器兩個雙字有符號整數變成兩個雙精度浮點數,結果送入目的暫存器.

cvtpd2dq xmm,xmm/m128

把源儲存器兩個雙精度浮點數變成兩個雙字有符號整數

結果送入目的暫存器的低64位,高64位清零,記憶體變數必須對齊記憶體16位元組.

此運算與cvtpd2pi類似但目的暫存器變為xmm.

cvtdq2pd xmm,xmm/m128

把源儲存器低64位兩個雙字有符號整數變成兩個雙精度浮點數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.

cvtsd2si r32,xmm/m64

把源儲存器低64位1個雙精度浮點數變成1個雙字有符號整數,結果送入目的暫存器.

此指令目的暫存器是32位通用暫存器

cvtsi2sd xmm,r32/m32

把源儲存器1個雙字有符號整數變成1個雙精度浮點數,結果送入目的暫存器的低64位,高64位不變.

4.2.2 單精度浮點與整數之間轉換

cvtps2dq xmm,xmm/m128

把源儲存器4個單精度浮點數變成4個雙字有符號整數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.

cvtdq2ps xmm,xmm/m128

把源儲存器4個雙字有符號整數變成4個單精度浮點數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.

小結:1. sse1浮點指令一般以後綴ps,ss結尾。

2. sse2浮點指令一般以後綴pd,sd結尾。

SSE2指令集系列之一 浮點運算指令

sse2與sse1使用相同暫存器,指令描述約定 mm指64位mmx暫存器 xmm指128xmm暫存器 m32 指32位記憶體變數 m128指128位記憶體變數 本小結主要描述雙精度浮點運算指令 1.資料搬移指令 movapdxmm,xmm m128 movapdxmm m128,xmm 把源儲存器內...

SSE2指令集系列之二

本小結描述的是sse2整數運算指令。5.資料搬移指令 movdqa xmm,xmm m128 movdqa xmm m128,xmm 把源儲存器內容值送入目的暫存器,當有m128時,記憶體位址必須16位元組對齊.movdqu xmm,xmm m128 movdqu xmm m128,xmm 把源儲存...

SSE3指令集系列

1.資料載入儲存指令 lddquxmm,m128 從非對齊的記憶體位址中載入128位數到xmm暫存器,此條指令比sse2的非對齊載入指令movdqu要快。movddup xmm,xmm m64 載入64bit資料到xmm暫存器的低64位,同時複製到其高64位。movshdup xmm,xmm m12...