SSE指令

SSE指令集IntelPentium III處理器中率先推出的。其實,早在PIII正式推出之前,Intel公司就曾經通過各種渠道公布過所謂的KNI(Katmai New Instruction)指令集,這個指令集也就是SSE指令集的前身,並一度被很多傳媒稱之為MMX指令集的下一個版本,即MMX2指令集。

基本介紹

  • 中文名:SSE指令
  • 外文名:Streaming SIMD Extensions
  • 全稱:單指令多數據流擴展
  • 推出:Intel
簡介,SSE1,SSE2,SSE3,

簡介

大部分涉及到128位記憶體變數操作的,記憶體變數首地址必須要對齊16位元組,也就是記憶體地址低4位為0,否則會引起CPU異常,導致指令執行失敗,此錯誤編譯器不檢查.

SSE1

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位元組.

SSE2

SSE2主要是雙精度浮點運算
SSE2與SSE1使用相同暫存器
movapd XMM,XMM/m128 movapd XMM/m128,XMM
把源存儲器內容值送入目的暫存器,當有m128時,必須對齊記憶體16位元組.
movupd XMM,XMM/m128 movapd XMM/m128,XMM
把源存儲器內容值送入目的暫存器,但不必對齊記憶體16位元組.
我感覺這兩條指令同movaps 和 movups 指令一樣,不過又不確定.
movlpd XMM,m64 movlpd m64,XMM
把源存儲器64位內容送入目的暫存器低64位,高64位不變,記憶體變數不必對齊記憶體16位元組.
movhpd XMM,m64 movhpd m64,XMM
把源存儲器64位內容送入目的暫存器高64位,低64位不變,記憶體變數不必對齊記憶體16位元組.
addpd XMM,XMM/m128
源存儲器內容按四字對齊,共兩個雙精度浮點數與目的暫存器相加,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
addsd XMM,XMM/m64
源存儲器的低64位1個雙精度浮點數與目的暫存器的低64位1個雙精度浮點數相加,結果送入目的暫存器的低64位
高64位不變,記憶體變數不必對齊記憶體16位元組.
subpd XMM,XMM/m128
把目的暫存器內容按四字對齊,兩個雙精度浮點數,減去源存儲器兩個雙精度浮點數,
結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
subsd XMM,XMM/m128
把目的暫存器的低64位1個雙精度浮點數,減去源存儲器低64位1個雙精度浮點數,結果送入目的暫存器的低64位
高64位不變,記憶體變數不必對齊記憶體16位元組.
mulpd XMM,XMM/m128
源存儲器內容按四字對齊,共兩個雙精度浮點數與目的暫存器相乘,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
mulsd XMM,XMM/m128
源存儲器的低64位1個雙精度浮點數與目的暫存器的低64位1個雙精度浮點數相乘,結果送入目的暫存器的低64位,
高64位不變,記憶體變數不必對齊記憶體16位元組.
divpd XMM,XMM/m128
目的暫存器共兩個雙精度浮點數除以源存儲器兩個雙精度浮點數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
divsd XMM,XMM/m128
目的暫存器低64位1個雙精度浮點數除以源存儲器低64位1個雙精度浮點數,結果送入目的暫存器的低64位,
高64位不變,記憶體變數不必對齊記憶體16位元組.
sqrtpd XMM,XMM/m128
源存儲器兩個雙精度浮點數的開方放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
sqrtsd XMM,XMM/m128
源存儲器低64位1個雙精度浮點數的開方放入目的暫存器低64位,高64位不變,記憶體變數不必對齊記憶體16位元組.
maxpd XMM,XMM/m128
源存儲器兩個雙精度浮點數與目的暫存器兩個雙精度浮點數比較,較大數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
maxsd XMM,XMM/m128
存儲器低64位1個雙精度浮點數與目的暫存器低64位1個雙精度浮點數比較,較大數放入目的暫存器低64位,高64位不變
記憶體變數不必對齊記憶體16位元組.
minpd XMM,XMM/m128
源存儲器兩個雙精度浮點數與目的暫存器兩個雙精度浮點數比較,較小數放入對應目的暫存器,記憶體變數必須對齊記憶體16位元組.
minsd XMM,XMM/m128
源存儲器低64位1個雙精度浮點數與目的暫存器低64位1個雙精度浮點數比較,較小數放入目的暫存器低64位,高64位不變
記憶體變數不必對齊記憶體16位元組.
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位元組.
cvtps2pd XMM,XMM/m64
把源存儲器低64位兩個單精度浮點數變成兩個雙精度浮點數,結果送入目的暫存器.
cvtss2sd XMM,XMM/m32
把源存儲器低32位1個單精度浮點數變成1個雙精度浮點數,結果送入目的暫存器的低64位,高64位不變.
cvtpd2ps XMM,XMM/m128
把源存儲器兩個雙精度浮點數變成兩個單精度浮點數,結果送入目的暫存器的低64位,高64位清零,
記憶體變數必須對齊記憶體16位元組.
例:
當XMM0 = 011112222 33334444 55556666 77778888 h,
XMM1 = 0dd1a5e1f35aec736 41132a4000000000 h,執行cvtpd2ps XMM0,XMM1
則XMM0 = 000000000 00000000 ff800000 48995200 h
^特殊狀態 ^3.14E5(表示負無窮大)
因為XMM1 = -3.14E140 3.14E5
而單精浮點最小可表示1.18E-38(規格化),-3.14E140已遠超過,所以變成一種特殊狀態,
指數位全為1,尾數全為0,符號位不變,3.14E5則變為正常的單精度3.14E5
cvtsd2ss XMM,XMM/m64
把源存儲器低64位1個雙精度浮點數變成1個單精度浮點數,結果送入目的暫存器的低32位,高96位不變.
cvtpd2pi MM,XMM/m128
把源存儲器兩個雙精度浮點數變成兩個雙字有符號整數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
如果結果大於所能表示的範圍,那么轉化為80000000h(正數也轉為此值).
當XMM1 = 0dd1a5e1f35aec736 41132a4000000000 h,執行cvtpd2pi MM0,XMM1
則 MM0 = 80000000 0004ca90 h
因為0dd1a5e1f35aec736h(雙精度浮點數) = -3.14E140 超過 80000000h所以變為80000000h
而41132a4000000000h(雙精度浮點數) = 3.14E5,所以轉為314000 = 0004ca90h(有符號整數)
cvttpd2pi MM,XMM/m128
類似於cvtpd2pi,截斷取整.
cvtpi2pd XMM,MM/m64
把源存儲器兩個雙字有符號整數變成兩個雙精度浮點數,結果送入目的暫存器.
cvtpd2dq XMM,XMM/m128
把源存儲器兩個雙精度浮點數變成兩個雙字有符號整數(此運算與cvtpd2pi類似但目的暫存器變為XMM),
結果送入目的暫存器的低64位,高64位清零,記憶體變數必須對齊記憶體16位元組.
cvttpd2dq XMM,XMM/m128
類似於cvtpd2dq,為截斷取整.
cvtdq2pd XMM,XMM/m128
把源存儲器低64位兩個雙字有符號整數變成兩個雙精度浮點數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
cvtsd2si r32,XMM/m64
把源存儲器低64位1個雙精度浮點數變成1個雙字有符號整數,結果送入目的暫存器.
cvttsd2si r32,XMM/m64
類似於cvtsd2si,截斷取整.
cvtsi2sd XMM,r32/m32
把源存儲器1個雙字有符號整數變成1個雙精度浮點數,結果送入目的暫存器的低64位,高64位不變.
cvtps2dq XMM,XMM/m128
把源存儲器4個單精度浮點數變成4個雙字有符號整數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
cvttps2dq XMM,XMM/m128
類似於cvtps2dq,截斷取整.
cvtdq2ps XMM,XMM/m128
把源存儲器4個雙字有符號整數變成4個單精度浮點數,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
movdqa XMM,XMM/m128 movdqa XMM/m128,XMM
把源存儲器內容值送入目的暫存器,當有m128時,必須對齊記憶體16位元組.
movdqu XMM,XMM/m128 movdqu XMM/m128,XMM
把源存儲器內容值送入目的暫存器,但不必對齊記憶體16位元組.
paddd XMM,XMM/m128
把源存儲器與目的暫存器按雙字對齊無符號整數普通相加,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
paddq XMM,XMM/m128
把源存儲器與目的暫存器按四字對齊無符號整數普通相加,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
paddq MM,MM/m64
把源存儲器與目的暫存器四字無符號整數普通相加,結果送入目的暫存器.
psubd XMM,XMM/m128
把目的暫存器與源存儲器按雙字對齊無符號整數普通相減,結果送入目的暫存器,
記憶體變數必須對齊記憶體16位元組.(目的減去源)
psubq XMM,XMM/m128
把目的暫存器與源存儲器按四字對齊無符號整數普通相減,結果送入目的暫存器,
記憶體變數必須對齊記憶體16位元組.(目的減去源)
psubq MM,MM/m64
把目的暫存器與源存儲器四字無符號整數普通相減,結果送入目的暫存器.(目的減去源)
pmuludq XMM,XMM/m128
把源存儲器與目的暫存器的低32位無符號整數相乘,結果變為64位,送入目的暫存器低64位,
把源存儲器與目的暫存器的高64位的低32位無符號整數相乘,結果變為64位,送入目的暫存器高64位.
記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源存儲器: b0 | b1 | b2 | b3
目的暫存器結果: b1*a1 | b3*a3
pmuludq MM,MM/m64
把源存儲器與目的暫存器的低32位無符號整數相乘,結果變為64位,送入目的暫存器.
高32位 | 低32位
目的暫存器: a0 | a1
存儲器: b0 | b1
目的暫存器結果: b1*a1
pslldq XMM,imm8
把目的暫存器128位按imm8(立即數)指定位元組數邏輯左移,移出的位元組丟失.
imm8 == 1時,代表左移8位,imm8 == 2時,代表左移16位.
psrldq XMM,imm8
把目的暫存器128位按imm8(立即數)指定位元組數邏輯右移,移出的位元組丟失.
imm8 == 1時,代表右移8位,imm8 == 2時,代表右移16位.
psllw XMM,XMM/m128 psllw XMM,imm8
把目的暫存器按字由源存儲器(或imm8 立即數)指定位數邏輯左移,移出的位丟失.
低字移出的位不會移入高字,記憶體變數必須對齊記憶體16位元組.
psrlw XMM,XMM/m128 psrlw XMM,imm8
把目的暫存器按字由源存儲器(或imm8 立即數)指定位數邏輯右移,移出的位丟失.
高字移出的位不會移入低字,記憶體變數必須對齊記憶體16位元組.
pslld XMM,XMM/m128 pslld XMM,XMM imm8
把目的暫存器按雙字由源存儲器(或imm8 立即數)指定位數邏輯左移,移出的位丟失.
低雙字移出的位不會移入高雙字,記憶體變數必須對齊記憶體16位元組.
psrld XMM,XMM/m128 psrld XMM,imm8
把目的暫存器按雙字由源存儲器(或imm8 立即數)指定位數邏輯右移,移出的位丟失.
高雙字移出的位不會移入低雙字,記憶體變數必須對齊記憶體16位元組.
movq2dq XMM,MM
把源暫存器內容送入目的暫存器的低64位,高64位清零.
movdq2q MM,XMM
把源暫存器低64位內容送入目的暫存器.
pmaddwd XMM,XMM/m128
把源存儲器與目的暫存器分4組進行向量點乘(有符號補碼操作),記憶體變數必須對齊記憶體16位元組..
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源存儲器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的暫存器結果: a0*b0+a1*b1 | a2*b2+a3*b3 | a4*b4+a5*b5 | a6*b6+a7*b7
paddsb XMM,XMM/m128
存儲器與目的暫存器按位元組對齊有符號補碼飽和相加,記憶體變數必須對齊記憶體16位元組.
paddsw XMM,XMM/m128
源存儲器與目的暫存器按字對齊有符號補碼飽和相加,記憶體變數必須對齊記憶體16位元組.
psubsb XMM,XMM/m128
源存儲器與目的暫存器按位元組對齊有符號補碼飽和相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
psubsw XMM,XMM/m128
源存儲器與目的暫存器按字對齊有符號補碼飽和相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
paddusb XMM,XMM/m128
源存儲器與目的暫存器按位元組對齊無符號飽和相加,記憶體變數必須對齊記憶體16位元組.
paddusw XMM,XMM/m128
源存儲器與目的暫存器按字對齊無符號飽和相加,記憶體變數必須對齊記憶體16位元組.
psubusb XMM,XMM/m128
源存儲器與目的暫存器按位元組對齊無符號飽和相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
psubusw XMM,XMM/m128
存儲器與目的暫存器按字對齊無符號飽和相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
paddb XMM,XMM/m128
源存儲器與目的暫存器按位元組對齊無符號普通相加,記憶體變數必須對齊記憶體16位元組.
paddw XMM,XMM/m128
源存儲器與目的暫存器按字對齊無符號普通相加,記憶體變數必須對齊記憶體16位元組.
paddd XMM,XMM/m128
源存儲器與目的暫存器按雙字對齊無符號普通相加,記憶體變數必須對齊記憶體16位元組.
paddq XMM,XMM/m128
存儲器與目的暫存器按四字對齊無符號普通相加,記憶體變數必須對齊記憶體16位元組.
psubb XMM,XMM/m128
源存儲器與目的暫存器按位元組對齊無符號普通相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
psubw XMM,XMM/m128
源存儲器與目的暫存器按字對齊無符號普通相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
psubd XMM,XMM/m128
源存儲器與目的暫存器按雙字對齊無符號普通相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
psubq XMM,XMM/m128
存儲器與目的暫存器按四字對齊無符號普通相減(目的減去源),記憶體變數必須對齊記憶體16位元組.
pmulhw XMM,XMM/m128
源存儲器與目的暫存器按字對齊有符號補碼飽和相乘,取結果的高16位放入目的暫存器對應字中.
記憶體變數必須對齊記憶體16位元組.
pmullw XMM,XMM/m128
源存儲器與目的暫存器按字對齊有符號補碼飽和相乘,取結果的低16位放入目的暫存器對應字中.
記憶體變數必須對齊記憶體16位元組.
pcmpeqb XMM,XMM/m128
目的暫存器與源存儲器位元組比較,如果對應位元組相等,就置目的暫存器對應位元組為0ffh,否則為00h,
記憶體變數必須對齊記憶體16位元組.
pcmpeqw XMM,XMM/m128
目的暫存器與源存儲器按字比較,如果對應字相等,就置目的暫存器對應字為0ffffh,否則為0000h,
記憶體變數必須對齊記憶體16位元組.
pcmpeqd XMM,XMM/m128
目的暫存器與源存儲器按雙字比較,如果對應雙字相等,就置目的暫存器對應雙字為0ffffffffh,否則為00000000h,
記憶體變數必須對齊記憶體16位元組.
pcmpgtb XMM,XMM/m128
目的暫存器與源存儲器位元組(有符號補碼)比較,如果目的暫存器對應位元組大於源存儲器,就置目的暫存器對應位元組為0ffh,
否則為00h,記憶體變數必須對齊記憶體16位元組.
pcmpgtw XMM,XMM/m128
目的暫存器與源存儲器按字(有符號補碼)比較,如果目的暫存器對應字大於源存儲器,就置目的暫存器對應字為0ffffh,
否則為0000h,記憶體變數必須對齊記憶體16位元組.
pcmpgtd XMM,XMM/m128
目的暫存器與源存儲器按雙字(有符號補碼)比較,如果目的暫存器對應雙字大於源存儲器,
就置目的暫存器對應雙字為0ffffffffh,否則為00000000h,記憶體變數必須對齊記憶體16位元組.
movd XMM,r32/m32
把源存儲器32位內容送入目的暫存器的低32位,高96位清零.
movd r32/m32,XMM
把源暫存器的低32位內容送入目的存儲器32位.
movq XMM,XMM/m64
把源存儲器低64位內容送入目的暫存器的低64位,高64位清零.
movq m64,XMM
把源暫存器的低64位內容送入目的存儲器.
pand XMM,XMM/m128
源存儲器128個二進制位'與'目的暫存器128個二進制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
◎我發現與andpd功能差不多,就不知其它特性是否一樣.
pandn XMM,XMM/m128
目的暫存器128個二進制位先取'非',再'與'源存儲器128個二進制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
por XMM,XMM/m128
存儲器128個二進制位'或'目的暫存器128個二進制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
pxor XMM,XMM/m128
源存儲器128個二進制位'異或'目的暫存器128個二進制位,結果送入目的暫存器,記憶體變數必須對齊記憶體16位元組.
packuswb XMM,XMM/m128 (此指令與前面的MMX指令packuswb MM,MM/m64操作相同,只是變成了128位)
把目的暫存器按字有符號數壓縮為位元組無符號數放入目的暫存器低64位
把源暫存器按字有符號數壓縮為位元組無符號數放入目的暫存器高64位
壓縮時負數變為00h,大於255的正數變為0ffh,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
暫存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的暫存器壓縮結果: b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
packsswb XMM,XMM/m128 (此指令與前面的MMX指令packsswb MM,MM/m64操作相同,只是變成了128位)
把目的暫存器按字有符號數壓縮為位元組有符號數放入目的暫存器低64位
把源暫存器按字有符號數壓縮為位元組有符號數放入目的暫存器高64位
壓縮時小於-128負數變為80h,大於127的正數變為7fh,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源暫存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的暫存器壓縮結果: b0|b1| b2| b3| b4|b5| b6|b7| a0|a1| a2|a3| a4|a5| a6| a7
packssdw XMM,XMM/m128
把目的暫存器按雙字有符號數壓縮為字有符號數放入目的暫存器低64位
把源暫存器按雙字有符號數壓縮為字有符號數放入目的暫存器高64位
壓縮時小於-32768負數變為8000h,大於32767的正數變為7fffh,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器壓縮結果: b0 | b1 | b2 | b3 | a0 | a1 | a2 | a3
punpckldq XMM,XMM/m128
把源存儲器與目的暫存器低64位按雙字交錯排列,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器排列結果: b2 | a2 | b3 | a3
punpckhdq XMM,XMM/m128
把源存儲器與目的暫存器高64位按雙字交錯排列,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3
源暫存器: b0 | b1 | b2 | b3
目的暫存器排列結果: b0 | a0 | b1 | a1
punpcklwd XMM,XMM/m128
把源存儲器與目的暫存器低64位按字交錯排列,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源暫存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的暫存器排列結果: b4 | a4 | b5 | a5 | b6 | a6 | b7 | a7
punpckhwd XMM,XMM/m128
把源存儲器與目的暫存器高64位按字交錯排列,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0 | a1 | a2 | a3 | a4 | a5 | a6 | a7
源暫存器: b0 | b1 | b2 | b3 | b4 | b5 | b6 | b7
目的暫存器排列結果: b0 | a0 | b1 | a1 | b2 | a2 | b3 | a3
punpcklbw XMM,XMM/m128
把源存儲器與目的暫存器低64位按位元組交錯排列,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
源暫存器: b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
目的暫存器排列結果: b8|a8| b9| a9| bA|aA| bB|aB| bC|aC| bD|aD| bE|aE| bF| aF
punpckhbw XMM,XMM/m128
把源存儲器與目的暫存器高64位按位元組交錯排列,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
目的暫存器: a0|a1| a2| a3| a4|a5| a6|a7| a8|a9| aA|aB| aC|aD| aE| aF
源暫存器: b0|b1| b2| b3| b4|b5| b6|b7| b8|b9| bA|bB| bC|bD| bE| bF
目的暫存器排列結果: b0|a0| b1| a1| b2|a2| b3|a3| b4|a4| b5|a5| b6|a6| b7| a7
shufps XMM,XMM/m128,imm8(0~255) SSE1指令
把源存儲器與目的暫存器按雙字劃分,由imm8(立即數)八個二進制位(00~11,00^11,00~11,00~11)指定排列,
記憶體變數必須對齊記憶體16位元組.目的暫存器高64位放源存儲器被指定數,目的暫存器低64位放目的暫存器被指定數。'( )'中的都是二進制數.
高64位 | 低64位
目的暫存器: a(11) | a(10) | a(01) | a(00)
源暫存器: b(11) | b(10) | b(01) | b(00)
目的暫存器排列結果: b(00~11) | b(00~11) | a(00~11) | a(00~11)
目的暫存器壓縮結果'( )'中的值由imm8對應的兩位二進制位指定.
例:
( 11 ) ( 10 ) ( 01 ) ( 00 ) ( 11 ) ( 10 ) ( 01 ) ( 00 )
當XMM0 = 090a0b0c 0d0e0f11 01020304 05060708 h,XMM1 = 0aabbccdd eeff1234 22334455 66778899 h,
imm8 ══> (XMM1 10) (XMM1 01) (XMM0 11) (XMM0 00)
執行shufps XMM0,XMM1,10 01 11 00 b(二進制),則XMM0 = 0eeff1234 22334455 090a0b0c 05060708 h
由例子中我們發現imm8=10011100b,imm8的高4位選的是源存儲器,低4位選的是目的暫存器,imm8的最高兩位
為 10b 那么就選則XMM1中的第 2(從0開始選擇) 個雙字,發現為0eeff1234h,就放入XMM0的高32位(原來的
值已經自動保護起來了),01b就選擇XMM1中的第2個,11選擇XMM0中的第3個,00選擇XMM0中的第0個.
當然imm8中4個選則也可以相同,比如shufps XMM0,XMM1,10 10 10 10 b,那么結果為:
XMM0 = 0eeff1234 eeff1234 0d0e0f11 0d0e0f11 h.
shufpd XMM,XMM/m128,imm8(0~255) imm8(操作值) = imm8(輸入值) mod 4
把源存儲器與目的暫存器按四字劃分,由imm8(立即數)4個二進制位(0~1,0^1,0~1,0~1)指定排列,
記憶體變數必須對齊記憶體16位元組.目的暫存器高64位放源存儲器被指定數,目的暫存器低64位放目的暫存器被指定數.
高64位 | 低64位
目的暫存器: a(1) | a(0)
源暫存器: b(1) | b(0)
目的暫存器排列結果: b(0~1) | a(0~1)
例:
當XMM0 = 1111111122222222 3333333344444444 h
XMM1 = 5555555566666666 aaaaaaaacccccccc h,執行shufpd XMM0,XMM1,101001 1 0 b
則XMM0 = 5555555566666666 3333333344444444 h
因為101001 1 0 b mod 4(101001 1 0 b & 11b),得到操作值為1 0b,
1選擇XMM1的第1位5555555566666666h,0選擇XMM0的第0位3333333344444444.
pshuflw XMM,XMM/m128,imm8(0~255)
先把源存儲器的高64位內容送入目的暫存器的高64位,然後用imm8將源存儲器的低64位4個字選入
目的暫存器的低64位,記憶體變數必須對齊記憶體16位元組.
低64位
源暫存器低64位: b(11) | b(10) | b(01) | b(00)
目的暫存器低64位排列結果: b(00~11) | b(00~11) | b(00~11) | b(00~11)
例:
當XMM0 = 1111111122222222 3333 4444 5555 6666 h
XMM1 = 5555555566666666 7777 8888 9999 cccc h,執行pshuflw XMM0,XMM1,10 10 01 10 b
則XMM0 = 5555555566666666 8888 8888 9999 8888 h
pshufhw XMM,XMM/m128,imm8(0~255)
先把源存儲器的低64位內容送入目的暫存器的低64位,然後用imm8將源存儲器的高64位4個字選入
目的暫存器的高64位,記憶體變數必須對齊記憶體16位元組.
高64位
源暫存器高64位: b(11) | b(10) | b(01) | b(00)
目的暫存器高64位排列結果: b(00~11) | b(00~11) | b(00~11) | b(00~11)
例:
當XMM0 = 3333 4444 5555 6666 1111111122222222 h
XMM1 = 7777 8888 9999 cccc 5555555566666666 h,執行pshufhw XMM0,XMM1,10 10 01 10 b
則XMM0 = 8888 8888 9999 8888 5555555566666666 h
pshufd XMM,XMM/m128,imm8(0~255)
將源存儲器的4個雙字由imm8指定選入目的暫存器,記憶體變數必須對齊記憶體16位元組.
高64位 | 低64位
源暫存器: b(11) | b(10) | b(01) | b(00)
目的暫存器排列結果: b(00~11) | b(00~11) | b(00~11) | b(00~11)
例:
當XMM1 = 11111111 22222222 33333333 44444444 h,執行pshufd XMM0,XMM1,11 01 01 10b
則XMM0 = 11111111 33333333 33333333 22222222 h

SSE3

fisttp m16,m32,m64
將浮點堆疊st(0)的內容截斷小數格式化為有符號整數送入目的記憶體.
可以不必設定控制暫存器RC位.
addsubps dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
單精度浮點操作.
dest[31-00] <== dest[31-00] - src[31-00]
dest[63-32] <== dest[63-32] + src[63-32]
dest[95-64] <== dest[95-64] - src[95-64]
dest[127-96] <== dest[127-96] + src[127-96]
addsubpd dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
雙精度浮點操作.
dest[63-00] <== dest[63-00] - src[63-00]
dest[127-64] <== dest[127-64] + src[127-64]
movsldup dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
dest[31-00] <== src[31-00]
dest[63-32] <== src[31-00]
dest[95-64] <== src[95-64]
dest[127-96] <== src[95-64]
movshdup dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
dest[31-00] <== src[63-32]
dest[63-32] <== src[63-32]
dest[95-64] <== src[127-96]
dest[127-96] <== src[127-96]
movddup dest,src
當src為m64記憶體時:
dest[63-00] <== m64
dest[127-64] <== m64
當src為XMM暫存器時:
dest[63-00] <== src[63-00]
dest[127-64] <== src[63-00]
lddqu dest,src
SSE2指令movdqu的改進,使與記憶體操作時不必對齊16Byte.
dest[127-00] <== src[127-00]
haddps dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
單精度浮點操作.
dest[31-00] <== dest[31-00] + dest[63-32]
dest[63-32] <== dest[95-64] + dest[127-96]
dest[95-64] <== src[31-00] + src[63-32]
dest[127-96] <== src[95-64] + src[127-96]
hsubps dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
單精度浮點操作.
dest[31-00] <== dest[31-00] - dest[63-32]
dest[63-32] <== dest[95-64] - dest[127-96]
dest[95-64] <== src[31-00] - src[63-32]
dest[127-96] <== src[95-64] - src[127-96]
haddpd dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
雙精度浮點操作.
dest[63-00] <== dest[63-00] + dest[127-64]
dest[127-64] <== src[63-00] + src[127-64]
hsubpd dest,src
128bit XMM暫存器操作,與記憶體操作時要對齊地址16Byte.
雙精度浮點操作.
dest[63-00] <== dest[63-00] - dest[127-64]
dest[127-64] <== src[63-00] - src[127-64]
monitor
執行緒同步指令,r0下使用.
mwait
執行緒同步指令,r0下使用.

相關詞條

熱門詞條

聯絡我們