무자리수 곱셈(Carry-less Multiplication, CLMUL)은 인텔과 AMD의 마이크로프로세서에 사용되는 X86 명령어 집합의 확장으로, 2008년 3월 인텔이 제안했고 2010년 초에 발표된 인텔 웨스트미어 프로세서에서 사용할 수 있게 되었다. 수학적으로 이 명령어는 비트열 이 다항식 을 나타내는 유한체 GF(2)에 대한 다항식 곱셈을 구현한다. CLMUL 명령어는 또한 전통적인 명령어 집합보다 훨씬 더 효율적으로 밀접하게 관련된 더 큰 유한체 GF(2k)의 곱셈을 구현할 수 있게 해준다.
이 명령어들의 한 가지 용도는 유한체 GF(2k) 곱셈에 의존하는 갈루와/카운터 모드에서 블록 암호화 애플리케이션의 속도를 향상시키는 것이다. 또 다른 적용 분야는 CRC 값의 빠른 계산인데, 여기에는 Zlib 및 pngcrush에서 LZ77 슬라이딩 윈도우 DEFLATE 알고리즘을 구현하는 데 사용되는 CRC 값도 포함된다.
ARMv8에도 CLMUL 버전이 있다. SPARC는 그들의 버전을 "XOR 곱셈"을 의미하는 XMULX라고 부른다.
이 명령어는 두 개의 64비트 값에 대한 128비트 무자리수 곱셈을 계산한다. 대상은 128비트 XMM 레지스터이다. 소스는 다른 XMM 레지스터 또는 메모리일 수 있다. 즉시 피연산자는 128비트 피연산자의 어느 절반이 곱해지는지를 지정한다. 즉시 피연산자의 특정 값을 지정하는 니모닉도 정의되어 있다.
| 명령어 | 옵코드 | 설명 |
|---|---|---|
PCLMULQDQ xmmreg,xmmrm,imm | [rmi: 66 0f 3a 44 /r ib] |
유한체 GF(2)[X]에 대한 두 개의 64비트 다항식의 무자리수 곱셈을 수행한다. |
PCLMULLQLQDQ xmmreg,xmmrm | [rm: 66 0f 3a 44 /r 00] |
두 레지스터의 하위 절반을 곱한다. |
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] |
두 레지스터의 상위 절반을 곱한다. |
EVEX 벡터화 버전(VPCLMULQDQ)은 AVX-512에서 볼 수 있다.
CLMUL 명령어 집합의 존재 여부는 CPU 기능 비트 중 하나를 테스트하여 확인할 수 있다.