Carry-less Multiplication (CLMUL) è un'estensione del set di istruzioni x86 utilizzato dai microprocessori Intel e AMD, proposto da Intel nel marzo 2008 e reso disponibile nei processori Intel Westmere annunciati all'inizio del 2010.
Un uso di queste istruzioni è quello di migliorare la velocità delle applicazioni di cifratura a blocchi in modalità Galois/Counter, che dipende dalla moltiplicazione GF(2k) a campo finito, che può essere implementata in modo più efficiente con le nuove istruzioni CLMUL rispetto al tradizionale set di istruzioni. Un'altra applicazione è il calcolo veloce dei valori CRC, compresi quelli utilizzati per implementare l'algoritmo DEFLATE in zlib e pngcrush della finestra scorrevole LZ77.
L'istruzione calcola il prodotto carry-less a 128 bit di due valori a 64 bit. La destinazione è un registro XMMM a 128 bit. La sorgente può essere un altro registro XMMM o memoria. Un operando immediato specifica quali metà degli operandi a 128 bit vengono moltiplicati. Sono inoltre definite delle mnemoniche che specificano valori specifici dell'operando immediato:
| Istruzione | Opcode | Descrizione |
|---|---|---|
PCLMULQDQ xmmreg,xmmrm,imm | [rmi: 66 0f 3a 44 /r ib] |
Eseguire una moltiplicazione carry-less di due polinomi a 64 bit sul campo finito GF(2k). |
PCLMULLQLQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 00] |
Moltiplicare le metà basse dei due registri. |
PCLMULHQLQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 01] |
Moltiplicare la metà alta del registro di destinazione per la metà bassa del registro di origine. |
PCLMULLQHQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 10] |
Moltiplicare la metà bassa del registro di destinazione per la metà alta del registro di origine. |
PCLMULHQHQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 11] |
Moltiplicare le metà alte dei due registri. |
La presenza del set di istruzioni CLMUL può essere verificata testando uno dei bit delle caratteristiche della CPU.