關於 SSE(單精度浮點運算) 指令
指令介紹
movaps XMM,XMM/m128 movaps XMM/128,XMM
把源儲存器內容值送入目的暫存器,當有m128時,必須對齊記憶體16位元組,也就是記憶體地址低4位為0.
movups XMM,XMM/m128 movaps XMM/128,XMM
把源儲存器內容值送入目的暫存器,但不必對齊記憶體16位元組.
movlps XMM,m64
把源儲存器64位內容送入目的暫存器低64位,高64位不變,
movhps XMM,m64
把源儲存器64位內容送入目的暫存器高64位,低64位不變,記憶體變數不必對齊記憶體16位元組.
movhlps XMM,XMM
把源暫存器高64位送入目的暫存器低64位,高64位不變.
movlhps XMM,XMM
把源暫存器低64位送入目的暫存器高64位,低64位不變.
movss XMM,m32/XMM
原運算元為m32時:
dest[31-00] <== m32
dest[127-32] <== 0
原運算元為XMM時:
dest[31-00] <== src[31-00]
dest[127-32]不變
movmskpd r32,XMM
r32[0] <== XMM[63]
r32[1] <== XMM[127]
r32[31-2] <== 0
movmskps r32,XMM
r32[0] <== XMM[31]
r32[1] <== XMM[63]
r32[2] <== XMM[95]
r32[3] <== XMM[127]
r32[31-4] <== 0
pmovmskb r32,XMM
r[0] <== XMM[7]
r[1] <== XMM[15]
r[2] <== XMM[23]
r[3] <== XMM[31]
r[4] <== XMM[39]
r[5] <== XMM[47]
r[6] <== XMM[55]
r[7] <== XMM[63]
r[8] <== XMM[71]
r[9] <== XMM[79]
r[10] <== XMM[87]
r[11] <== XMM[95]
r[12] <== XMM[103]
r[13] <== XMM[111]
r[14] <== XMM[119]
r[15] <== XMM[127]
r[31-16] <== 0
movntps m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不經過cache,必須對齊16位元組.
movntpd m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不經過cache,必須對齊16位元組.
movnti m32,r32
m32 <== r32 把32暫存器的值送入m32,不經過cache.
addps XMM,XMM/m128
源儲存器內容按雙字對齊,共4個單精度浮點數與目的暫存器相加,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addps XMM0,XMM1
則XMM0 = 045992000 44350ccd 4a5b52e0 3c59018e h
因為XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2 'xEy'指x * 10^y,如 1.0E2 = 100,1.0E-2 = 0.01,
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4 當中'E'不是16進制中的'e',而是指數'EXP'
結果XMM0 = 4.9E3 7.242E2 3.5934E6 1.3245E-2
addss XMM,XMM/m32
源儲存器的低32位1個單精度浮點數與目的暫存器的低32位1個單精度浮點數相加,結果送入目的暫存器的低32位
高96位不變,記憶體變數不必對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addss XMM0,XMM1
則XMM0 = 0c517e000 44290000 46b6d000 3c59018e h
subps XMM,XMM/m128
源儲存器內容按雙字對齊,共4個單精度浮點數與目的暫存器相減(目的減去源),結果送入目的暫存器,
記憶體變數必須對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addss XMM0,XMM1
則XMM0 = 0c6188000 441cf333 ca5877a0 3c3a0a52 h
因為XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = -9.76E3 6.278E2 -3.5466E6 1.1355E-2
subss XMM,XMM/m32
源儲存器的低32位1個單精度浮點數與目的暫存器的低32位1個單精度浮點數相減(目的減去源),
結果送入目的暫存器的低32位,高96位不變,記憶體變數不必對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addss XMM0,XMM1
則XMM0 = 0c517e000 44290000 46b6d000 3c3a0a52 h
maxps XMM,XMM/m128
源儲存器4個單精度浮點數與目的暫存器4個單精度浮點數比較,較大數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行maxps XMM0,XMM1
則XMM0 = 045e51000 44290000 4a59e540 3c4985f0 h
因為XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = 7.33E3 6.76E2 3.57E6 1.23E-2
maxss XMM,XMM/m32
源儲存器低32位1個單精度浮點數與目的暫存器低32位1個單精度浮點數比較,較大數放入目的暫存器低32位,高96位不變
記憶體變數不必對齊記憶體16位元組.
例:
當XMM0 = 045e51000 4240cccd 4a59e540 3a77b9e0 h
XMM1 = 0c517e000 44290000 46b6d000 3c4985f0 h,當執行maxss XMM0,XMM1
則XMM0 = 045e51000 4240cccd 4a59e540 3c4985f0 h
minps XMM,XMM/m128
源儲存器4個單精度浮點數與目的暫存器4個單精度浮點數比較,較小數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
minss XMM,XMM/m32
源儲存器低32位1個單精度浮點數與目的暫存器低32位1個單精度浮點數比較,較小數放入目的暫存器低32位,高96位不變
記憶體變數不必對齊記憶體16位元組.
cmpps XMM0,XMM1,imm8 imm8是立即數範圍是0~7
根據imm8的值進行4對單精度浮點數的比較,符合imm8的就置目的暫存器對應的32位全1,否則全0
當imm8 = 0時,目的暫存器等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 1 時,目的暫存器小於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 2 時,目的暫存器小於等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 4 時,目的暫存器不等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 5 時,目的暫存器大於等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 6 時,目的暫存器大於原暫存器數時,置目的暫存器對應的32位全1,否則全0
rcpps XMM,XMM/m128
源儲存器4個單精度浮點數的倒數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
注:比如2.0E0的倒數為1÷2.0E0 = 5.0E-1
例:
當XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行rcpps XMM0,XMM1
則XMM0 = 0390f0800 3ca9f800 34966000 44844800 h
因為XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = 1.36E-4 2.075E-2 2.8E-7 1.06E3
這操作只有12bit的精度.
用這種方法可以提高精度到23bit(牛頓-拉弗森方法):
x0 = RCPSS(d)
x1 = x0 * (2 - d * x0) = 2*x0 - d * x0 * x0
x0是直接用倒數指令得到的除數d的倒數的逼近;x1則是更精確的逼近。
以下操作:XMM0=DIVIDENDS / DIVISORS(這種方法比直接用divps更快速)
MOVAPS XMM1,[DIVISORS];載入除數
RCPPS XMM0,XMM1;求得倒數的逼近
MULPS XMM1,XMM0;牛頓-Raphson公式
MULPS XMM1,XMM0
ADDPS XMM0,XMM0
SUBPS XMM0,XMM1
MULPS XMM0,[DIVIDENDS];結果在XMM0中
rcpss XMM,XMM/32
源儲存器低32位1個單精度浮點數的倒數放入目的暫存器低32位,高96位不變
例:
當XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行rcpss XMM0,XMM1
則XMM0 = 045e51000 4240cccd 4a59e540 44844800 h
精度同rcpps
rsqrtps XMM,XMM/m128
源儲存器4個單精度浮點數的開方的倒數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
比如2.0E0的開方的倒數為1÷√2.0E0 ≈ 7.0711E-1
例:
當XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行rsqrtps XMM0,XMM1
則XMM0 = 03c3f6000 3e138000 3a0ab800 42022000 h
因為XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = 1.17E-2 1.44E-1 5.29E-4 3.25E1
這操作只有12bit的精度.
用這種方法可以提高精度到23bit(牛頓-拉弗森方法).
x0 = RSQRTSS(a)
x1 = 0.5 * x0 * (3 - (a * x0)) * x0)
rsqrtss XMM,XMM/32
源儲存器低32位1個單精度浮點數的開方的倒數放入目的暫存器低32位,高96位不變,記憶體變數不必對齊記憶體16位元組.
mulps XMM,XMM/m128
源儲存器內容按雙字對齊,共4個單精度浮點數與目的暫存器相乘,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
mulss XMM,XMM/32
源儲存器的低32位1個單精度浮點數與目的暫存器的低32位1個單精度浮點數相乘,結果送入目的暫存器的低32位,
高96位不變,記憶體變數不必對齊記憶體16位元組.
divps XMM,XMM/m128
目的暫存器共4個單精度浮點數除以源儲存器4個單精度浮點數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
divss XMM,XMM/32
目的暫存器低32位1個單精度浮點數除以源儲存器低32位1個單精度浮點數,結果送入目的暫存器的低32位,
高96位不變,記憶體變數不必對齊記憶體16位元組.
andps XMM,XMM/m128
源儲存器128個二進位制位'與'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
orps XMM,XMM/m128
源儲存器128個二進位制位'或'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
xorps XMM,XMM/m128
源儲存器128個二進位制位'異或'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
unpckhps XMM,XMM/m128
源儲存器與目的暫存器高64位按雙字交錯排列,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源儲存器: b0 | b1 | b2 | b3
目的暫存器結果: b0 | a0 | b1 | a1
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行unpckhps XMM0,XMM1
則XMM0 = 045e51000 c517e000 4240cccd 44290000 h
unpcklps XMM,XMM/m128
源儲存器與目的暫存器低64位按雙字交錯排列,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源儲存器: b0 | b1 | b2 | b3
目的暫存器結果: b2 | a2 | b3 | a3
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行unpcklps XMM0,XMM1
則XMM0 = 04a59e540 46b6d000 3a77b9e0 3c4985f0 h
cvtpi2ps XMM,MM/m64
源儲存器64位兩個32位有符號(補碼)整數轉為兩個單精度浮點數,放入目的暫存器低64中,高64位不變.
例:
當XMM0 = 2315d4d7 930d9761 82748383 ed2782cb h
MM0 = 0001e240 fffe1dc0 h,執行cvtpi2ps XMM0,MM0
則XMM0 = 2315d4d7 930d9761 c7f12000 47f12000 h
因為0001e240h(有符號整數) = 123456 = 1.23456E5 = 47f12000h(單精浮點)
fffe1dc0h(有符號整數) = -123456 = -1.23456E5 = 0c7f12000h(單精浮點)
cvtsi2ss XMM,r32/m32
源儲存器1個32位有符號(補碼)整數轉為1個單精度浮點數,放入目的暫存器低32中,高96位不變.
cvtps2pi MM,XMM/m64
把源儲存器低64位兩個32位單精度浮點數轉為兩個32位有符號(補碼)整數,放入目的暫存器.
cvttps2pi MM,XMM/m64
類似於cvtps2pi,截斷取整.
cvtss2si r32,XMM/m32
把源儲存器低32位1個單精度浮點數轉為1個32位有符號(補碼)整數,放入目的暫存器.
cvttss2si r32,XMM/m32
類似cvtss2si,截斷取整.
pavgb MM,MM/m64 pavgb XMM,XMM/m128
把源儲存器與目的暫存器按位元組無符號整數相加,再除以2,結果四捨五入為整數放入目的暫存器,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
注:此運算不會產生溢位.
例:
當MM0 = 9a bc de f0 12 34 56 78 h
MM1 = 8d ec 5b f8 98 25 71 47 h,執行pavgb MM0,MM1
則MM0 = 94 d4 9d f4 55 2d 64 60 h
9ah = 154,8dh = 141,154+141 = 295,295÷2 = 147.5 ≈ 148(四捨五入) = 94h
pavgw MM,MM/m64 pavgw XMM,XMM/m128
把源儲存器與目的暫存器按字無符號整數相加,再除以2,結果四捨五入為整數放入目的暫存器,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pextrw r32,MM,imm8 pextrw r32,XMM,imm8 imm8為8位立即數(無符號)
從源暫存器中選第imm8(0~3 或 0~7)個字送入目的暫存器的低16位,高16位清零.
★注:imm8範圍為 0~255,當源暫存器為'MM'時,有效值= imm8 mod 4,當目的暫存器為'XMM'時,有效值= imm8 mod 8
pinsrw MM,r32/m32,imm8 pinsrw XMM,r32/m32,imm8
把源儲存器的低16位內容送入目的暫存器第imm8(0~3 或 0~7)個字,其餘字不變.
注:imm8範圍為 0~255,當目的暫存器為'MM'時,有效值= imm8 mod 4,當目的暫存器為'XMM'時,有效值= imm8 mod 8
例:
7 6 5 4 3 2 1 0
當XMM0 = 0ffff ffff ffff ffff ffff ffff ffff ffff h
eax = 01234 5678 h,執行pinsrw XMM0,eax,3
﹌﹌
則XMM0 = 0ffff ffff ffff ffff 5678 ffff ffff ffff h
﹌﹌
執行pinsrw XMM0,eax,9
則XMM0 = 0ffff ffff ffff ffff ffff ffff 5678 ffff h
pmaxsw MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按字有符號(補碼)整數比較,大數放入目的暫存器對應字,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pmaxub MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按位元組無符號整數比較,大數放入目的暫存器對應位元組,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pminsw MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按字有符號(補碼)整數比較,較小數放入目的暫存器對應字,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pminub MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按位元組無符號整數比較,較小數放入目的暫存器對應位元組,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
SSE有8個128位獨立暫存器(XMM0~XMM7).
MM指64位MMX暫存器
XMM指XMM暫存器
m128指128位記憶體變數
movaps XMM,XMM/m128 movaps XMM/128,XMM
把源儲存器內容值送入目的暫存器,當有m128時,必須對齊記憶體16位元組,也就是記憶體地址低4位為0.
movups XMM,XMM/m128 movaps XMM/128,XMM
把源儲存器內容值送入目的暫存器,但不必對齊記憶體16位元組.
movlps XMM,m64
把源儲存器64位內容送入目的暫存器低64位,高64位不變,記憶體變數不必對齊記憶體16位元組.
movhps XMM,m64
把源儲存器64位內容送入目的暫存器高64位,低64位不變,記憶體變數不必對齊記憶體16位元組.
movhlps XMM,XMM
把源暫存器高64位送入目的暫存器低64位,高64位不變.
movlhps XMM,XMM
把源暫存器低64位送入目的暫存器高64位,低64位不變.
movss XMM,m32/XMM
原運算元為m32時:
dest[31-00] <== m32
dest[127-32] <== 0
原運算元為XMM時:
dest[31-00] <== src[31-00]
dest[127-32]不變
movmskpd r32,XMM
r32[0] <== XMM[63]
r32[1] <== XMM[127]
r32[31-2] <== 0
movmskps r32,XMM
r32[0] <== XMM[31]
r32[1] <== XMM[63]
r32[2] <== XMM[95]
r32[3] <== XMM[127]
r32[31-4] <== 0
pmovmskb r32,XMM
r[0] <== XMM[7]
r[1] <== XMM[15]
r[2] <== XMM[23]
r[3] <== XMM[31]
r[4] <== XMM[39]
r[5] <== XMM[47]
r[6] <== XMM[55]
r[7] <== XMM[63]
r[8] <== XMM[71]
r[9] <== XMM[79]
r[10] <== XMM[87]
r[11] <== XMM[95]
r[12] <== XMM[103]
r[13] <== XMM[111]
r[14] <== XMM[119]
r[15] <== XMM[127]
r[31-16] <== 0
movntps m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不經過cache,必須對齊16位元組.
movntpd m128,XMM
m128 <== XMM 直接把XMM中的值送入m128,不經過cache,必須對齊16位元組.
movnti m32,r32
m32 <== r32 把32暫存器的值送入m32,不經過cache.
addps XMM,XMM/m128
源儲存器內容按雙字對齊,共4個單精度浮點數與目的暫存器相加,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addps XMM0,XMM1
則XMM0 = 045992000 44350ccd 4a5b52e0 3c59018e h
因為XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2 'xEy'指x * 10^y,如 1.0E2 = 100,1.0E-2 = 0.01,
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4 當中'E'不是16進制中的'e',而是指數'EXP'
結果XMM0 = 4.9E3 7.242E2 3.5934E6 1.3245E-2
addss XMM,XMM/m32
源儲存器的低32位1個單精度浮點數與目的暫存器的低32位1個單精度浮點數相加,結果送入目的暫存器的低32位
高96位不變,記憶體變數不必對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addss XMM0,XMM1
則XMM0 = 0c517e000 44290000 46b6d000 3c59018e h
subps XMM,XMM/m128
源儲存器內容按雙字對齊,共4個單精度浮點數與目的暫存器相減(目的減去源),結果送入目的暫存器,
記憶體變數必須對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addss XMM0,XMM1
則XMM0 = 0c6188000 441cf333 ca5877a0 3c3a0a52 h
因為XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = -9.76E3 6.278E2 -3.5466E6 1.1355E-2
subss XMM,XMM/m32
源儲存器的低32位1個單精度浮點數與目的暫存器的低32位1個單精度浮點數相減(目的減去源),
結果送入目的暫存器的低32位,高96位不變,記憶體變數不必對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行addss XMM0,XMM1
則XMM0 = 0c517e000 44290000 46b6d000 3c3a0a52 h
maxps XMM,XMM/m128
源儲存器4個單精度浮點數與目的暫存器4個單精度浮點數比較,較大數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行maxps XMM0,XMM1
則XMM0 = 045e51000 44290000 4a59e540 3c4985f0 h
因為XMM0 = -2.43E3 6.76E2 2.34E4 1.23E-2
XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = 7.33E3 6.76E2 3.57E6 1.23E-2
maxss XMM,XMM/m32
源儲存器低32位1個單精度浮點數與目的暫存器低32位1個單精度浮點數比較,較大數放入目的暫存器低32位,高96位不變
記憶體變數不必對齊記憶體16位元組.
例:
當XMM0 = 045e51000 4240cccd 4a59e540 3a77b9e0 h
XMM1 = 0c517e000 44290000 46b6d000 3c4985f0 h,當執行maxss XMM0,XMM1
則XMM0 = 045e51000 4240cccd 4a59e540 3c4985f0 h
minps XMM,XMM/m128
源儲存器4個單精度浮點數與目的暫存器4個單精度浮點數比較,較小數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
minss XMM,XMM/m32
源儲存器低32位1個單精度浮點數與目的暫存器低32位1個單精度浮點數比較,較小數放入目的暫存器低32位,高96位不變
記憶體變數不必對齊記憶體16位元組.
cmpps XMM0,XMM1,imm8 imm8是立即數範圍是0~7
根據imm8的值進行4對單精度浮點數的比較,符合imm8的就置目的暫存器對應的32位全1,否則全0
當imm8 = 0時,目的暫存器等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 1 時,目的暫存器小於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 2 時,目的暫存器小於等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 4 時,目的暫存器不等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 5 時,目的暫存器大於等於原暫存器數時,置目的暫存器對應的32位全1,否則全0
imm8 = 6 時,目的暫存器大於原暫存器數時,置目的暫存器對應的32位全1,否則全0
rcpps XMM,XMM/m128
源儲存器4個單精度浮點數的倒數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
注:比如2.0E0的倒數為1÷2.0E0 = 5.0E-1
例:
當XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行rcpps XMM0,XMM1
則XMM0 = 0390f0800 3ca9f800 34966000 44844800 h
因為XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = 1.36E-4 2.075E-2 2.8E-7 1.06E3
這操作只有12bit的精度.
用這種方法可以提高精度到23bit(牛頓-拉弗森方法):
x0 = RCPSS(d)
x1 = x0 * (2 - d * x0) = 2*x0 - d * x0 * x0
x0是直接用倒數指令得到的除數d的倒數的逼近;x1則是更精確的逼近。
以下操作:XMM0=DIVIDENDS / DIVISORS(這種方法比直接用divps更快速)
MOVAPS XMM1,[DIVISORS];載入除數
RCPPS XMM0,XMM1;求得倒數的逼近
MULPS XMM1,XMM0;牛頓-Raphson公式
MULPS XMM1,XMM0
ADDPS XMM0,XMM0
SUBPS XMM0,XMM1
MULPS XMM0,[DIVIDENDS];結果在XMM0中
rcpss XMM,XMM/32
源儲存器低32位1個單精度浮點數的倒數放入目的暫存器低32位,高96位不變
例:
當XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行rcpss XMM0,XMM1
則XMM0 = 045e51000 4240cccd 4a59e540 44844800 h
精度同rcpps
rsqrtps XMM,XMM/m128
源儲存器4個單精度浮點數的開方的倒數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
比如2.0E0的開方的倒數為1÷√2.0E0 ≈ 7.0711E-1
例:
當XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行rsqrtps XMM0,XMM1
則XMM0 = 03c3f6000 3e138000 3a0ab800 42022000 h
因為XMM1 = 7.33E3 4.82E1 3.57E6 9.45E-4
結果XMM0 = 1.17E-2 1.44E-1 5.29E-4 3.25E1
這操作只有12bit的精度.
用這種方法可以提高精度到23bit(牛頓-拉弗森方法).
x0 = RSQRTSS(a)
x1 = 0.5 * x0 * (3 - (a * x0)) * x0)
rsqrtss XMM,XMM/32
源儲存器低32位1個單精度浮點數的開方的倒數放入目的暫存器低32位,高96位不變,記憶體變數不必對齊記憶體16位元組.
mulps XMM,XMM/m128
源儲存器內容按雙字對齊,共4個單精度浮點數與目的暫存器相乘,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
mulss XMM,XMM/32
源儲存器的低32位1個單精度浮點數與目的暫存器的低32位1個單精度浮點數相乘,結果送入目的暫存器的低32位,
高96位不變,記憶體變數不必對齊記憶體16位元組.
divps XMM,XMM/m128
目的暫存器共4個單精度浮點數除以源儲存器4個單精度浮點數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
divss XMM,XMM/32
目的暫存器低32位1個單精度浮點數除以源儲存器低32位1個單精度浮點數,結果送入目的暫存器的低32位,
高96位不變,記憶體變數不必對齊記憶體16位元組.
andps XMM,XMM/m128
源儲存器128個二進位制位'與'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
orps XMM,XMM/m128
源儲存器128個二進位制位'或'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
xorps XMM,XMM/m128
源儲存器128個二進位制位'異或'目的暫存器128個二進位制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
unpckhps XMM,XMM/m128
源儲存器與目的暫存器高64位按雙字交錯排列,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源儲存器: b0 | b1 | b2 | b3
目的暫存器結果: b0 | a0 | b1 | a1
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,當執行unpckhps XMM0,XMM1
則XMM0 = 045e51000 c517e000 4240cccd 44290000 h
unpcklps XMM,XMM/m128
源儲存器與目的暫存器低64位按雙字交錯排列,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源儲存器: b0 | b1 | b2 | b3
目的暫存器結果: b2 | a2 | b3 | a3
例:
當XMM0 = 0c517e000 44290000 46b6d000 3c4985f0 h
XMM1 = 045e51000 4240cccd 4a59e540 3a77b9e0 h,執行unpcklps XMM0,XMM1
則XMM0 = 04a59e540 46b6d000 3a77b9e0 3c4985f0 h
cvtpi2ps XMM,MM/m64
源儲存器64位兩個32位有符號(補碼)整數轉為兩個單精度浮點數,放入目的暫存器低64中,高64位不變.
例:
當XMM0 = 2315d4d7 930d9761 82748383 ed2782cb h
MM0 = 0001e240 fffe1dc0 h,執行cvtpi2ps XMM0,MM0
則XMM0 = 2315d4d7 930d9761 c7f12000 47f12000 h
因為0001e240h(有符號整數) = 123456 = 1.23456E5 = 47f12000h(單精浮點)
fffe1dc0h(有符號整數) = -123456 = -1.23456E5 = 0c7f12000h(單精浮點)
cvtsi2ss XMM,r32/m32
源儲存器1個32位有符號(補碼)整數轉為1個單精度浮點數,放入目的暫存器低32中,高96位不變.
cvtps2pi MM,XMM/m64
把源儲存器低64位兩個32位單精度浮點數轉為兩個32位有符號(補碼)整數,放入目的暫存器.
cvttps2pi MM,XMM/m64
類似於cvtps2pi,截斷取整.
cvtss2si r32,XMM/m32
把源儲存器低32位1個單精度浮點數轉為1個32位有符號(補碼)整數,放入目的暫存器.
cvttss2si r32,XMM/m32
類似cvtss2si,截斷取整.
pavgb MM,MM/m64 pavgb XMM,XMM/m128
把源儲存器與目的暫存器按位元組無符號整數相加,再除以2,結果四捨五入為整數放入目的暫存器,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
注:此運算不會產生溢位.
例:
當MM0 = 9a bc de f0 12 34 56 78 h
MM1 = 8d ec 5b f8 98 25 71 47 h,執行pavgb MM0,MM1
則MM0 = 94 d4 9d f4 55 2d 64 60 h
9ah = 154,8dh = 141,154+141 = 295,295÷2 = 147.5 ≈ 148(四捨五入) = 94h
pavgw MM,MM/m64 pavgw XMM,XMM/m128
把源儲存器與目的暫存器按字無符號整數相加,再除以2,結果四捨五入為整數放入目的暫存器,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pextrw r32,MM,imm8 pextrw r32,XMM,imm8 imm8為8位立即數(無符號)
從源暫存器中選第imm8(0~3 或 0~7)個字送入目的暫存器的低16位,高16位清零.
★注:imm8範圍為 0~255,當源暫存器為'MM'時,有效值= imm8 mod 4,當目的暫存器為'XMM'時,有效值= imm8 mod 8
pinsrw MM,r32/m32,imm8 pinsrw XMM,r32/m32,imm8
把源儲存器的低16位內容送入目的暫存器第imm8(0~3 或 0~7)個字,其餘字不變.
注:imm8範圍為 0~255,當目的暫存器為'MM'時,有效值= imm8 mod 4,當目的暫存器為'XMM'時,有效值= imm8 mod 8
例:
7 6 5 4 3 2 1 0
當XMM0 = 0ffff ffff ffff ffff ffff ffff ffff ffff h
eax = 01234 5678 h,執行pinsrw XMM0,eax,3
﹌﹌
則XMM0 = 0ffff ffff ffff ffff 5678 ffff ffff ffff h
﹌﹌
執行pinsrw XMM0,eax,9
則XMM0 = 0ffff ffff ffff ffff ffff ffff 5678 ffff h
pmaxsw MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按字有符號(補碼)整數比較,大數放入目的暫存器對應字,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pmaxub MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按位元組無符號整數比較,大數放入目的暫存器對應位元組,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pminsw MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按字有符號(補碼)整數比較,較小數放入目的暫存器對應字,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.
pminub MM,MM/m64 pmaxsw XMM,XMM/m128
把源儲存器與目的暫存器按位元組無符號整數比較,較小數放入目的暫存器對應位元組,
源儲存器為m128時,記憶體變數必須對齊記憶體16位元組.