PCLMULQDQ
Carry-Less Multiplication Quadword
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
66 0F 3A 44 /r ib | PCLMULQDQ xmm1, xmm2/m128, imm8 | A | Valido | Valido | Realiza la multiplicación sin carga de un cuádpago de xmm1 por un cuádpago de xmm2/m128, almacena el resultado de 128 bits en xmm1. El inmediato se utiliza para determinar qué cuádwords de xmm1 y xmm2/m128 deben ser utilizados. |
VEX.128.66.0F3A.WIG 44 /r ib | VPCLMULQDQ xmm1, xmm2, xmm3/m128, imm8 | B | Valido | Valido | Realiza la multiplicación sin carga de un cuádpago AVX de xmm2 por un cuádpapo de xmm3/m128, almacena el resultado de 128 bits en xmm1. El inmediato se utiliza para determinar qué cuádpagos de xmm2 y xmm3/m128 deben ser utilizados. |
VEX.256.66.0F3A.WIG 44 /r /ib | VPCLMULQDQ ymm1, ymm2, ymm3/m256, imm8 | B | Valido | Valido | Para cada carril de 128 bits, realiza dos multiplicaciones AVX sin carga de un cuadripa de ymm2 por un cuadpacio de ymm3/m256, almacena los dos resultados de 128 bits en ymm1. El inmediato se utiliza para determinar qué cuadripa en cada carril de 128 bits de ymm2 y ymm3/m256 debe ser utilizado. |
EVEX.128.66.0F3A.WIG 44 /r /ib | VPCLMULQDQ xmm1, xmm2, xmm3/m128, imm8 | C | Valido | Valido | Realiza una multiplicación sin carga de uno (AVX512VL OR AVX10.1) quadword de xmm2 por un cuadword de xmm3/m128, almacena el resultado de 128 bits en xmm1. El inmediato se utiliza para determinar qué cuadwords de xmm2 y xmm3/m128 debe ser utilizado. |
EVEX.256.66.0F3A.WIG 44 /r /ib | VPCLMULQDQ ymm1, ymm2, ymm3/m256, imm8 | C | Valido | Valido | Para cada carril de 128 bits, realiza dos sin carga (AVX512VLOAVX10.1) multiplicaciones de un quadword deymm2por una palabra cuádrupleymm3/m256, almacena los dos resultados de 128 bits enymm1. El inmediato se utiliza para determinar qué cuadword en cada carril de 128 bitsymm2yymm3/m256debería usarse. |
EVEX.512.66.0F3A.WIG 44 /r /ib | VPCLMULQDQ zmm1, zmm2, zmm3/m512, imm8 | C | Valido | Valido | Para cada carril de 128 bits, realiza dos sin carga (AVX512FOAVX10.1) multiplicaciones de un quadword dezmm2por una palabra cuádruplezmm3/m512, almacena los cuatro resultados de 128 bits enzmm1. El inmediato se utiliza para determinar qué cuadword en cada carril de 128 bitszmm2yzmm3/m512debería usarse. |
Codificacion de operandos
Cada modo es un valor de la columna Op/En de arriba. Dice en que campo de la instruccion codificada va cada operando, en el orden en que se escriben, y si la instruccion lo lee, lo escribe o ambas cosas.
A
modrm.reglectura y escriturabyte ModRM, campo reg (bits 5-3)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideimm8byte inmediato que sigue a la instruccion
B
modrm.regescriturabyte ModRM, campo reg (bits 5-3)vex.vvvvlecturaprefijo VEX, campo vvvv (invertido)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideimm8byte inmediato que sigue a la instruccion
C
modrm.regescriturabyte ModRM, campo reg (bits 5-3)evex.vvvvlecturaprefijo EVEX, campo vvvv (invertido)modrm.rmlecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pideimm8lecturabyte inmediato que sigue a la instruccion
Tupla: Full Mem
Coste medido
Cargando las mediciones de arch-data...
Descripción
Realiza una multiplicación sin carga de pares de cuadriláteros. Las versiones XMM realizan una sola multiplicación de un par de
quadwords. Las versiones de YMM realizan dos multiplicaciones empaquetadas de pares de quadwords. Las versiones de ZMM realizan cuatro multiplicaciones de pares de cuádpagos. Los bits 4 y 0 se utilizan para seleccionar qué 64 bits de cada operando para utilizar de acuerdo a la Tabla 4-14, se ignoran otros bits del byte inmediato.
La forma codificada EVEX de esta instrucción no soporta la supresión de falla de memoria.
PCLMULQDQ Quadword Selección de Byte Inmediato
| Imm[4] | Imm[0] | Operación PCLMULQDQ |
|---|---|---|
| 0 | CL_MUL( SRC21[ | 63:0], SRC1[63:0] ) |
Pseudo-Op and PCLMULQDQ Implementation Imm8 Encoding
| Pseudo-Op | Imm8 Encoding |
|---|---|
| PCLMULLQLQDQ xmm1, xmm2 | 0000_0000B |
| PCLMULHQLQDQ xmm1, xmm2 | 0000_0001B |
| PCLMULLQHQDQ xmm1, xmm2 | 0001_0000B |
| PCLMULHQHQDQ xmm1, xmm2 | 0001_0001B |
Operación
define PCLMUL128(X,Y): // helper function
FOR i := 0 to 63:
TMP [ i ] := X[ 0 ] and Y[ i ]
FOR j := 1 to i:
TMP [ i ] := TMP [ i ] xor (X[ j ] and Y[ i - j ])
DEST[ i ] := TMP[ i ]
FOR i := 64 to 126:
TMP [ i ] := 0
FOR j := i - 63 to 63:
TMP [ i ] := TMP [ i ] xor (X[ j ] and Y[ i - j ])
DEST[ i ] := TMP[ i ]
DEST[127] := 0;
RETURN DEST // 128b vector
PCLMULQDQ (SSE Version)
IF imm8[0] = 0:
TEMP1 := SRC1.qword[0]
ELSE:
TEMP1 := SRC1.qword[1]
IF imm8[4] = 0:
TEMP2 := SRC2.qword[0]
ELSE:
TEMP2 := SRC2.qword[1]
DEST[127:0] := PCLMUL128(TEMP1, TEMP2)
DEST[MAXVL-1:128] (Unmodified)
VPCLMULQDQ (128b and 256b VEX Encoded Versions)
(KL,VL) = (1,128), (2,256)
FOR i= 0 to KL-1:
IF imm8[0] = 0:
TEMP1 := SRC1.xmm[i].qword[0]
ELSE:
TEMP1 := SRC1.xmm[i].qword[1]
IF imm8[4] = 0:
TEMP2 := SRC2.xmm[i].qword[0]
ELSE:
TEMP2 := SRC2.xmm[i].qword[1]
DEST.xmm[i] := PCLMUL128(TEMP1, TEMP2)
DEST[MAXVL-1:VL] := 0
VPCLMULQDQ (EVEX Encoded Version)
(KL,VL) = (1,128), (2,256), (4,512)
FOR i = 0 to KL-1:
IF imm8[0] = 0:
TEMP1 := SRC1.xmm[i].qword[0]
ELSE:
TEMP1 := SRC1.xmm[i].qword[1]
IF imm8[4] = 0:
TEMP2 := SRC2.xmm[i].qword[0]
ELSE:
TEMP2 := SRC2.xmm[i].qword[1]
DEST.xmm[i] := PCLMUL128(TEMP1, TEMP2)
DEST[MAXVL-1:VL] := 0Intel C/C++ compilador intrínseco
(V)PCLMULQDQ __m128i _mm_clmulepi64_si128 (__m128i, __m128i, const int) VPCLMULQDQ __m256i _mm256_clmulepi64_epi128(__m256i, __m256i, const int);
VPCLMULQDQ __m512i _mm512_clmulepi64_epi128(__m512i, __m512i, const int);SIMD coma flotante Excepciones
None.
Otras excepciones
Ver Tabla 2-21, "Tipo 4 Condiciones de Excepción", además:
#UD If VEX.L = 1.EVEX-encoded: Ver Tabla 2-52, "Tipo E4NF Clase Condiciones de Excepción".