SSE2與SSE1使用相同寄存器厦章,指令描述約定:
MM指64位MMX寄存器
XMM指128XMM寄存器
m32 指32位內(nèi)存變量
m128指128位內(nèi)存變量
本小結主要描述雙精度浮點運算指令
1. ?數(shù)據(jù)搬移指令
??? ? ??movapd?XMM,XMM/m128
? ? ? ??movapd?XMM/m128,XMM
? ? ? ??把源存儲器內(nèi)容值送入目的寄存器,當有m128時,內(nèi)存變量地址必須16字節(jié)對齊.
? ? ? ??movupd?XMM,XMM/m128?
? ? ? ??movupd?XMM/m128,XMM
? ? ? ??把源存儲器內(nèi)容值送入目的寄存器,內(nèi)存變量地址不必對齊16字節(jié).
? ? ? ??兩條指令同SSE1的浮點搬移指令movaps 和 movups 指令類似
? ? ? ??movlpd?XMM,m64?
? ? ? ??movlpd?m64,XMM
? ? ???把源存儲器64位內(nèi)容送入目的寄存器低64位,高64位不變,內(nèi)存變量地址不必對齊16字節(jié).
? ? ? ??movhpd?XMM,m64?
? ? ? ??movhpd?m64,XMM
? ? ? ??把源存儲器64位內(nèi)容送入目的寄存器高64位,低64位不變,內(nèi)存變量地址不必對齊16字節(jié).
2. ? ?浮點常用算數(shù)運算指令
? ? ? ??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結尾的指令對兩個雙精度浮點數(shù)執(zhí)行相同的運算
? ? ? 2. 以sd結尾的指令只對低64位雙精度執(zhí)行運算,高64位保持不變兜材。
? ? ? 3. 當有m128存儲器是要求內(nèi)存地址必須為16字節(jié)對齊躯保。
?3. 位運算指令
andpd?XMM,XMM/m128
源存儲器128個二進制位'與'目的寄存器128個二進制位,結果送入目的寄存器,內(nèi)存變量地址必須對齊16字節(jié)邊界.
andnpd?XMM,XMM/m128
目的寄存器128個二進制位先取'非',再'與'源存儲器128個二進制位,結果送入目的寄存器,內(nèi)存變量地址必須對齊16字節(jié)邊界
orpd?XMM,XMM/m128
源存儲器128個二進制位'或'目的寄存器128個二進制位,結果送入目的寄存器,內(nèi)存變量地址必須對齊16字節(jié)邊界
xorpd?XMM,XMM/m128
源存儲器128個二進制位'異或'目的寄存器128個二進制位,結果送入目的寄存器,內(nèi)存變量地址必須對齊16字節(jié)邊界
4. 數(shù)據(jù)類型轉換指令
? ? ?4.1?32位浮點與64位浮點之間的轉換
? ? ? ??cvtps2pd?XMM,XMM/m64
? ? ? ? 把源存儲器低64位兩個單精度浮點數(shù)變成兩個雙精度浮點數(shù),結果送入目的寄存器.
? ? ? ??cvtss2sd?XMM,XMM/m32
? ? ? ? 把源存儲器低32位1個單精度浮點數(shù)變成1個雙精度浮點數(shù),結果送入目的寄存器的低64位,高64位不變.
? ? ? ??cvtpd2ps?XMM,XMM/m128
? ? ? ? 把源存儲器兩個雙精度浮點數(shù)變成兩個單精度浮點數(shù),結果送入目的寄存器的低64位,高64位清零,
? ? ? ??cvtsd2ss?XMM,XMM/m64
? ? ? ? 把源存儲器低64位1個雙精度浮點數(shù)變成1個單精度浮點數(shù),結果送入目的寄存器的低32位,高96位不變.
? ? ?4.2 ?浮點數(shù)與32位整數(shù)之間的轉換
? ? ??4.2.1 雙精度與整數(shù)之間轉換
?? ? ???cvtpd2pi?MM,XMM/m128
?? ? ? ?把源存儲器兩個雙精度浮點數(shù)變成兩個雙字有符號整數(shù),結果送入目的寄存器,內(nèi)存變量必須對齊內(nèi)存16字節(jié).
? ? ? ? 如果結果大于所能表示的范圍,那么轉化為80000000h(正數(shù)也轉為此值).
? ? ? ? 當XMM1 = 0x 0dd1a5e1f35aec736 ? 41132a4000000000,執(zhí)行cvtpd2pi MM0,XMM1
? ? ? ? 則 MM0 = 0x 80000000 0004ca90
? ? ? ? 因為0dd1a5e1f35aec736h(雙精度浮點數(shù)) = -3.14E140 超過 80000000h所以變?yōu)?0000000h
? ? ? ? 而41132a4000000000h(雙精度浮點數(shù)) = 3.14E5,所以轉為314000 = 0004ca90h(有符號整數(shù))
?cvtpi2pd?XMM,MM/m64
?? ? ? ?把源存儲器兩個雙字有符號整數(shù)變成兩個雙精度浮點數(shù),結果送入目的寄存器.
? ? ? ??cvtpd2dq?XMM,XMM/m128
? ? ? ? 把源存儲器兩個雙精度浮點數(shù)變成兩個雙字有符號整數(shù)
? ? ? ? 結果送入目的寄存器的低64位,高64位清零,內(nèi)存變量必須對齊內(nèi)存16字節(jié).
? ? ? ??此運算與cvtpd2pi類似但目的寄存器變?yōu)閄MM.
? ? ? ??cvtdq2pd?XMM,XMM/m128
? ? ? ? 把源存儲器低64位兩個雙字有符號整數(shù)變成兩個雙精度浮點數(shù),結果送入目的寄存器,內(nèi)存變量必須對齊內(nèi)存16字節(jié).
???cvtsd2si?r32,XMM/m64
? ? ? ? ?把源存儲器低64位1個雙精度浮點數(shù)變成1個雙字有符號整數(shù),結果送入目的寄存器.
? ? ? ? ?此指令目的寄存器是32位通用寄存器
cvtsi2sd?XMM,r32/m32
? ? ? ? 把源存儲器1個雙字有符號整數(shù)變成1個雙精度浮點數(shù),結果送入目的寄存器的低64位,高64位不變.
?4.2.2 單精度浮點與整數(shù)之間轉換
? ? ? ??cvtps2dq?XMM,XMM/m128
? ? ? ? 把源存儲器4個單精度浮點數(shù)變成4個雙字有符號整數(shù),結果送入目的寄存器,內(nèi)存變量必須對齊內(nèi)存16字節(jié).
? ? ? ??cvtdq2ps?XMM,XMM/m128
? ? ? ? 把源存儲器4個雙字有符號整數(shù)變成4個單精度浮點數(shù),結果送入目的寄存器,內(nèi)存變量必須對齊內(nèi)存16字節(jié).
---------------------
作者:celerychen2009
來源:CSDN
原文:https://blog.csdn.net/celerychen2009/article/details/8934972
版權聲明:本文為博主原創(chuàng)文章翻斟,轉載請附上博文鏈接匿垄!