CLMUL
# CLMUL

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(2^k)$ 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.

## Nuove istruzioni

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(2^k).$ |
| 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. |

## CPU con CLMUL

* Intel
   * Westmere
   * Sandy Bridge
   * Ivy Bridge
   * Haswell
   * Broadwell (con una maggiore produttività e una minore latenza)
   * Skylake
   * Kaby Lake
   * Coffee Lake
* AMD
   * Jaguar
   * Puma
   * Processore per "lavori pesanti"
      * Bulldozer
      * Piledriver
      * Steamroller
      * Excavator
   * Zen
   * Zen+

La presenza del set di istruzioni CLMUL può essere verificata testando uno dei bit delle caratteristiche della CPU.

