キャリーレス乗算(CLMUL)は、IntelとAMDのマイクロプロセッサで使用されるx86命令セットの拡張であり、2008年3月にIntelによって提案され[ 1 ] 、2010年初頭に発表されたIntel Westmereプロセッサで利用可能になりました。数学的には、この命令は 有限体 GF(2)上の多項式の乗算を実装します。ここで、ビット文字列は多項式を表します。CLMUL命令はまた、従来の命令セットよりも、密接に関連するより大きな有限体GF(2 k )の乗算をより効率的に実装することを可能にします。[ 2 ]
これらの命令の用途の一つは、有限体GF(2 k )乗算に依存するガロア/カウンタモードのブロック暗号暗号化を行うアプリケーションの速度向上です。もう一つの用途はCRC値の高速計算です。 [ 3 ]これには、zlibおよびpngcrushにおけるLZ77スライディングウィンドウDEFLATEアルゴリズムの実装に使用されるものも含まれます。[ 4 ]
ARMv8 にも CLMUL のバージョンがあります。SPARC では、そのバージョンを「XOR 乗算」の略である XMULX と呼びます。
この命令は、2つの64ビット値の128ビットのキャリーレス積を計算します。デスティネーションは128ビットのXMMレジスタです。ソースは別のXMMレジスタまたはメモリです。即値オペランドは、128ビットオペランドのどの半分を乗算するかを指定します。 即値オペランドの特定の値を指定するニーモニックも定義されています
| 命令 | オペコード | 説明 |
|---|---|---|
PCLMULQDQ xmmreg,xmmrm,imm | [rmi: 66 0f 3a 44 /r ib] | 有限体GF (2)[ X ] 上の2つの64ビット多項式のキャリーレス乗算を実行します |
PCLMULLQLQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 00] | 2 つのレジスタの下位半分を乗算します。 |
PCLMULHQLQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 01] | 宛先レジスタの上位半分とソースレジスタの下位半分を乗算します。 |
PCLMULLQHQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 10] | 宛先レジスタの下位半分とソースレジスタの上位半分を乗算します。 |
PCLMULHQHQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 11] | 2 つのレジスタの上位半分を乗算します。 |
EVEX ベクトル化バージョン (VPCLMULQDQ) はAVX-512で見られます。
CLMUL 命令セットの存在は、CPU 機能ビットの 1 つをテストすることによって確認できます。