Opmaskレジスタ命令

  ニモニック △のところに入る文字
Q D W B
下位64bit 下位32bit 下位16bit 下位8bit
add KADD△ k1, k2, k3
k1 ← k2 + k3
(V5+BW (V5+BW (V5+DQ (V5+DQ
and KAND△ k1, k2, k3
k1 ← k2 & k3
(V5+BW (V5+BW (V5 (V5+DQ
and not KANDN△ k1, k2, k3
k1 ← (~k2) & k3
(V5+BW (V5+BW (V5 (V5+DQ
move
kレジスタ/メモリから
KMOV△ k1, k2/mem
k1 ← k2/mem
(V5+BW
memはm64
(V5+BW
memはm32
(V5
memはm16
(V5+DQ
memはm8
move
汎用レジスタから
KMOV△ k1, reg
k1 ← reg
(V5+BW#
regはr64
(V5+BW
regはr32
(V5
regはr32
(V5+DQ
regはr32
move
メモリへ
KMOV△ mem, k1
mem ← k1
(V5+BW
memはm64
(V5+BW
memはm32
(V5
memはm16
(V5+DQ
memはm8
move
汎用レジスタへ
KMOV△ reg, k1
reg ← k1
(V5+BW#
regはr64
(V5+BW
regはr32
(V5
regはr32
(V5+DQ
regはr32
not KNOT△ k1, k2
k1 ← ~k2
(V5+BW (V5+BW (V5 (V5+DQ
or KOR△ k1, k2, k3
k1 ← k2 | k3
(V5+BW (V5+BW (V5 (V5+DQ
or test KORTEST△ k1, k2
※1
(V5+BW (V5+BW (V5 (V5+DQ
shift left KSHIFTL△ k1, k2, imm8
k1 ← k2 << imm8
(V5+BW (V5+BW (V5 (V5+DQ
shift right KSHIFTR△ k1, k2, imm8
k1 ← k2 >> imm8
(V5+BW (V5+BW (V5 (V5+DQ
test KTEST△ k1, k2
※2
(V5+BW (V5+BW (V5+DQ (V5+DQ
unpack KUNPCK△□ k1, k2, k3
※3
なし KUNPCKDQ
(V5+BW
KUNPCKWD
(V5+BW
KUNPCKBW
(V5
xnor KXNOR△ k1, k2, k3
k1 ← ~(k2 ^ k3)
(V5+BW (V5+BW (V5 (V5+DQ
xor KXOR△ k1, k2, k3
k1 ← k2 ^ k3
(V5+BW (V5+BW (V5 (V5+DQ

※1 or test…(k1 | k2)が全ビット0であればZFをセット、全ビット1であればCFをセット

※2 test…(k1 & k2)が全ビット0であればZFをセット、((~k1) & k2)が全ビット0であればCFをセット

※3 unpack…k2の最下位△と、k3の最下位△を連結した倍の長さのビット列をk1の下位にセット(k2側が上位になるように結合)

デスティネーションのkレジスタの上位ビットは0クリアされる。

小ネタ: xnor命令は全ビットを立てるのに使えます。(3オペランドとも同じKレジスタを指定)


x86/x64 SIMD命令一覧表 フィードバック