menu_bar

SSE2 整数命令一覧
Intel アーキテクチャ ソフトウェア デベロッパーズ マニュアル 中
付録 B 6.1 P833 表 B-19 参照

  SSE レジスタを使った整数演算のときに使用するSSE/SSE2命令一覧です。

1. 読み込み/書き込み

movd m32/xmm, m32/xmm
movq  m64/xmm, m64/xmm
movdqa  m128/xmm , xmm/m128
movdqu xmm/m128, xmm/m128
データの読み書きをします。movdqa は、128bit(16byte) アライメントされていないと エラーとなります。

movntdq m128, xmm
キャッシュを通さずに、メモリに書き込みます。

movq2dq xmm, mm
movdq2q mm, xmm
MMX レジスタとのデータ読み書きをします。下位64ビットのデータが対象になります。

pextrw r32, xmm, 即値 / pinsrw xmm, r32, 即値
xmm の 0から7番目の 要素(16bit整数)について、レジスタに読み/書きします。即値で場所を指定します。

2. 足し算/引き算

padd(b/w/d/q) xmm , xmm/m128
padds(b/w) xmm, xmm/m128
paddus(b/w) xmm, xmm/m128
通常の足し算、符号付き足し算、符号無し足し算 です。b/w/d/q は、それぞれ 8 / 16 / 32/ 64 byte の整数での処理です。
add を sub に 変えたものが引き算です

psadbw
各符号無し8bit 整数の絶対値の差 を計算して、上位8個と下位8個の 積算をする。結果は、16bit 整数にそれぞれ格納される。

3.かけ算

pmul(l/h)(w/uw) xmm, xmm/m128
符号付き(無し)16bit 演算で、それぞれ 上位と下位の 16bit を取り出します。

レジスタ
内容
xmm0
[W7, W6, W5, W4, W3, W2, W1,W0]
xmm1
[W'7, W'6, W'5, W'4, W'3, W'2, W'2, W'0]
xmm0 * xmm1
[D7, D6, D5, D4, D3, D2, D1, D0] Di = Wi * W'i

pmuludq xmm, xmm/m128
符号無し 32bit 整数の乗算


レジスタ
内容
xmm0
[D3, D2, D1, D0]
xmm1
[D'3, D'2 , D'1, D'0]
xmm0 * xmm1
[D2 * D'2, D'0* D0]


pmaddwd
積和演算

レジスタ
内容
xmm0
[W7, W6, W5, W4, W3, W2, W1,W0]
xmm1
[W'7, W'6, W'5, W'4, W'3, W'2, W'2, W'0]
xmm0
[W7*W'7+W6*W'6, W5*W'5+W4*W'4, W3*W'3+ W2*W'2, W1*W'1+W0*W'0 ]



4. 比較


pcmpeq(b/w/d)
各要素が等しい場合に、1を格納します。

pcmpgt(b/w/d)
符号付き比較です。大きければ 1 を格納します。

5. 平均/最大/最小

pavg(b/w)
符号無し平均の計算です。

pmax( s / us )w, pmin( s / us )w
各要素の大きいほう/小さいほうを格納します。


6. ビット演算
pand, pandn, por, pxor
各ビットに対して、ビット演算を行います。

psll(w, d, q, dq) / psrl(w, d, q, dq)
それぞれ、論理左/右シフトです。dq では、8bit 単位となります。

psra(w/d)
算術シフトです。


7. バイトマスク

pmovmskb r32, xmm
xmm の各バイトの最上位ビットを取り出し、16bit 整数として書き出す。

8. パック演算
packss(dw / wb) xmm, xmm
packuswb xmm, xmm
符号付き(無し)パック演算です。

paccuswb xmm0, xmm1
レジスタ
内容
xmm0
[W7:W6:W5:W4:W3:W2:W1:W0]
xmm1
[W'7:W'6:W'5:W'4:W'3:W'2:W'1:W'0]

Bi = min((unsigned)Wi, 255) として
xmm0
[B7,B6,B5,B4,B3,B2,B1,B0,B'7,B'6,B'5,B'4,B'3,B'2,B'1,B'0]



9. アンパック演算
punpck(l/h)(bw/wd/dq/qdq)
上位/下位データを交互に混ぜます。

punpcklbw xmm0, xmm1
レジスタ
内容
xmm0
[B15,B14,B13,B12,B11,B10,B9,B8,B7,B6,B5,B4,B3,B2,B1,B0]
xmm1
[B'15, B'14, B'13, B'12, B'11, B'10, B'9, B'8, B'7, B'6, B'5, B'4, B'3, B'2, B'1, B'0]

xmm0
[B7, B6, B5, B4, B3, B2, B1, B0, B'7, B'6, B'7, B'6, B'5, B'4, B'3, B'2, B'1, B'0]

それぞれ、扱う各要素が大きく(b,w,d,q)なり、h とすることで 上位が 入れ替わります。

10. シャッフル演算

pshuf(l/h)w xmm1, xmm2/m128, Order(a,b,c,d)
データの上位/下位 16bit 整数をシャッフルします。

pshufd xmm1, xmm2/m128, Order(a,b,c,d)
32bit 整数をシャッフルします。

Order(a,b,c,d)
(a<<6) + (b <<4) + (c <<2) + d  (各 a,b,c,d は 2bit データ)

pshufd xmm0, xmm1, Order(a,b,c,d)
xmm0
[D3, D2, D1, D0]
xmm1
[D'3, D'2, D'1, D'0]
xmm0
[D'a, D'b, D'c, D'd]
a,b,c,d は、0〜3 をさす



単純リンク・相互リンク 大歓迎です
ご意見、ご感想は、umeda@tele.ucl.ac.beまで
履歴書など TEL +32 10 47 80 74 (オフィス)