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

2022-03-24 01:22:20 字數 3918 閱讀 3530

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

mm指64位mmx暫存器

xmm指128xmm暫存器

m32 指32位記憶體變數

m128指128位記憶體變數

本小結主要描述雙精度浮點運算指令

1.  資料搬移指令

movapdxmm,xmm/m128

movapdxmm/m128,xmm

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

位址必須

16位元組對齊.

movupd

xmm,xmm/m128 

movupd

xmm/m128,xmm

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

位址不必對齊16位元組.

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

movlpd

xmm,m64 

movlpdm64,xmm

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

movhpd

xmm,m64 

movhpdm64,xmm

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

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

addpdxmm,xmm/m128     

addsdxmm,xmm/m128

subpdxmm,xmm/m128

subsdxmm,xmm/m128

mulpdxmm,xmm/m128          

mulsdxmm,xmm/m128    

divpdxmm,xmm/m128        

divsdxmm,xmm/m128

sqrtpdxmm,xmm/m128       

sqrtsdxmm,xmm/m128

maxpdxmm,xmm/m128     

maxsdxmm,xmm/m128

minpdxmm,xmm/m128

minsdxmm,xmm/m128

小結: 

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

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

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

3. 位運算指令

andpdxmm,xmm/m128

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

andnpdxmm,xmm/m128

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

orpdxmm,xmm/m128

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

xorpdxmm,xmm/m128

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

4. 資料型別轉換指令

4.1 32位浮點與64位浮點之間的轉換

cvtps2pdxmm,xmm/m64

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

cvtss2sdxmm,xmm/m32

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

cvtpd2psxmm,xmm/m128

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

cvtsd2ssxmm,xmm/m64

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

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

4.2.1 雙精度與整數之間轉換

cvtpd2pimm,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(有符號整數)

cvtpi2pdxmm,mm/m64

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

cvtpd2dqxmm,xmm/m128

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

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

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

cvtdq2pdxmm,xmm/m128

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

cvtsd2sir32,xmm/m64

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

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

cvtsi2sdxmm,r32/m32

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

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

cvtps2dqxmm,xmm/m128

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

cvtdq2psxmm,xmm/m128

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

SSE2指令集系列之一

sse2與sse1使用相同暫存器,指令描述約定 mm指64位mmx暫存器 xmm指128xmm暫存器 m32 指32位記憶體變數 m128指128位記憶體變數 sse2主要是雙精度浮點運算指令 1.資料搬移指令 movapd xmm,xmm m128 movapd xmm 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...