1. 程式人生 > 其它 >關於 SSE(單精度浮點運算) 指令

關於 SSE(單精度浮點運算) 指令

轉自:SSE指令_百度百科 (baidu.com) 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位元組.

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