データの読み書きをします。movdqa は、128bit(16byte) アライメントされていないと エラーとなります。
キャッシュを通さずに、メモリに書き込みます。
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 に 変えたものが引き算です
各符号無し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
|
符号無し 32bit 整数の乗算
レジスタ
|
内容
|
xmm0
|
[D3, D2, D1, D0]
|
xmm1
|
[D'3, D'2 , D'1, D'0]
|
xmm0 * xmm1
|
[D2 * D'2, D'0* D0]
|
積和演算
レジスタ
|
内容
|
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. 比較
各要素が等しい場合に、1を格納します。
符号付き比較です。大きければ 1 を格納します。
5. 平均/最大/最小
符号無し平均の計算です。
pmax( s / us )w, pmin(
s / us )w
|
各要素の大きいほう/小さいほうを格納します。
6. ビット演算
各ビットに対して、ビット演算を行います。
psll(w, d, q, dq)
/ psrl(w, d, q, dq)
|
それぞれ、論理左/右シフトです。dq では、8bit 単位となります。
算術シフトです。
7. バイトマスク
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 をさす