ブール環(、、“足し算”がxorで“掛け算”がandであるような演算体系、“2で割ったあまり”)に関係する命令群です。
clmul
, clmulh
, clmulr
繰上りなしの掛け算です。ビット列の畳み込みと考えることもできます。
clmul
は掛け算の結果の下32/64ビットを返します。
clmulh
は掛け算の結果の上32/64ビット(下から32~63/64~127ビット目)を返します。
ここで、繰上りがないため、clmulh
の最上位ビットは常に0です。
clmulr
はその再上位ビットを除いた上32/64ビット(下から31~62/63~126ビット目)を返します。
名前のrは、reverseに由来します。clmulr
の結果は、ビット順序逆転した結果同士のclmul
の結果のビット順序逆転と同じになるからです。
巡回冗長検査(Cyclic Redundancy Check, CRC)やハッシュ関数の実装などに有用だそうです。
自分自身とのclmul
/clmulh
を使うと、0を00に、1を01に変換する(32/64ビットのビット列の各ビットの間に0を挿入して64/128ビットのビット列にする)操作を実現します。
また、-1
とのclmul
はprefix sum(ここで言うsumはxor)を求めるのに使えます(グレイコードのデコードに使えます)。
crc32
, crc32c
巡回冗長検査(CRC)をまさにそのまま計算する命令です。
bmatxor
, bmator
, bmatflip
64bitのレジスタを、8×8のビット行列だとみなして、行列演算を行う命令です。
bmatxor
は、“足し算”がxorであるような行列乗算、bmator
は“足し算”がorであるような凝結乗算、bmatflip
は行列転置です。
bmatflip
は、zip
三回分に相当します。