Carry-less Multiplication (CLMUL) és una extensió del conjunt d'instruccions x86 utilitzat pels microprocessadors d'Intel i AMD que va ser proposat per Intel el març de 2008 [1] i disponible als processadors Intel Westmere anunciats a principis de 2010. Matemàticament, la instrucció implementa la multiplicació de polinomis sobre el camp finit GF(2) on la cadena de bits representa el polinomi . La instrucció CLMUL també permet una implementació més eficient de la multiplicació estretament relacionada de camps finits més grans GF(2k) que el conjunt d'instruccions tradicional.[2]
Un ús d'aquestes instruccions és millorar la velocitat de les aplicacions que fan xifratge de blocs en mode Galois/Comptador, que depèn de la multiplicació de camp finit GF(2k). Una altra aplicació és el càlcul ràpid dels valors CRC,[3] inclosos els utilitzats per implementar l'algorisme LZ77 DEFLATE de la finestra lliscant en zlib i pngcrush.[4]
ARMv8 també té una versió de CLMUL. SPARC anomena la seva versió XMULX, per "multiplicació XOR".
La instrucció calcula el producte sense transport de 128 bits de dos valors de 64 bits. La destinació és un registre XMM de 128 bits. La font pot ser un altre registre o memòria XMM. Un operand immediat especifica quines meitats dels operands de 128 bits es multipliquen. També es defineixen mnemotècniques que especifiquen valors específics de l'operand immediat:
Instrucció | Opcode | Descripció |
---|---|---|
PCLMULQDQ xmmreg,xmmrm,imm
|
[rmi: 66 0f 3a 44 /r ib]
|
Realitzeu una multiplicació sense transport de dos polinomis de 64 bits sobre el camp finit GF (2)[ X ]. |
PCLMULLQLQDQ xmmreg,xmmrm
|
[rm: 66 0f 3a 44 /r 00]
|
Multiplica les meitats baixes dels dos registres. |
PCLMULHQLQDQ xmmreg,xmmrm
|
[rm: 66 0f 3a 44 /r 01]
|
Multipliqueu la meitat alta del registre de destinació per la meitat baixa del registre d'origen. |
PCLMULLQHQDQ xmmreg,xmmrm
|
[rm: 66 0f 3a 44 /r 10]
|
Multipliqueu la meitat baixa del registre de destinació per la meitat alta del registre d'origen. |
PCLMULHQHQDQ xmmreg,xmmrm
|
[rm: 66 0f 3a 44 /r 11]
|
Multiplica les meitats altes dels dos registres. |
Una versió vectoritzada EVEX (VPCLMULQDQ) es veu a AVX-512.