VPERMQ
Qwords Element Permutation
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
VEX.256.66.0F3A.W1 00 /r ib | VPERMQ ymm1, ymm2/m256, imm8 | A | Valido | Valido | Permute qwords en ymm2/m256 utilizando índices en imm8 y almacenar el resultado en ymm1. |
EVEX.256.66.0F3A.W1 00 /r ib | VPERMQ ymm1 {k1}{z}, ymm2/m256/m64bcst, imm8 | B | Valido | Valido | Permute qwords en ymm2/m256/m64bcst AVX512F) O utilizando índices en imm8 y almacenar el resultado en AVX10.1 ymm1. |
EVEX.512.66.0F3A.W1 00 /r ib | VPERMQ zmm1 {k1}{z}, zmm2/m512/m64bcst, imm8 | B | Valido | Valido | Permute qwords en zmm2/m512/m64bcst OR AVX10.1 utilizando índices en imm8 y almacenar el resultado en zmm1. |
EVEX.256.66.0F38.W1 36 /r | VPERMQ ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst | C | Valido | Valido | Permute qwords en ymm3/m256/m64bcst AVX512F) O utilizando índices en ymm2 y almacenar el resultado en AVX10.1 ymm1. |
EVEX.512.66.0F38.W1 36 /r | VPERMQ zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst | C | Valido | Valido | Permute qwords en zmm3/m512/m64bcst OR AVX10.1 utilizando índices en zmm2 y almacenar el resultado en zmm1. |
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.regescriturabyte 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)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
Tupla: Full
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 pide
Tupla: Full
Coste medido
Cargando las mediciones de arch-data...
Descripción
La versión imm8: Copies quadwords del operando de origen (el segundo operando) al operando de destino (el primer operando) según los índices especificados por el operando inmediato (el tercer operando). Cada valor de dos bits en el byte inmediato selecciona un elemento qword en el operando de origen.
VEX versión: El operando de origen puede ser un registro YMM o una ubicación de memoria. Bits (MAXVL-1:256) del registro de destino correspondiente se ponen a cero.
En EVEX.512 versión codificada, los elementos del destino se actualizan utilizando la máscara de escritura k1 y los bits imm8 se reutilizan como bits de control para la mitad superior de 256 bits cuando los bits de control vienen de inmediato. El operando de origen puede ser un registro ZMM, una ubicación de memoria de 512 bits o un vector de 512 bits emitido desde una ubicación de memoria de 64 bits.
Versión de control inmediata: VEX.vvvv y EVEX.vvvv están reservados y deben ser 1111b instrucciones de lo contrario
#UD.La versión de control vectorial: Copies quadwords desde el segundo operando de origen (el tercer operando) al operando de destino (el primer operando) según los índices en el primer operando de origen (el segundo operando). Los primeros 3 bits de cada elemento de 64 bits en el índice operando selecciona qué cuadword en el segundo operando de origen para copiar. El primero y segundo operandos son los registros ZMM, el tercer operando puede ser un registro ZMM, una ubicación de memoria de 512 bits o un vector de 512 bits emitido desde una ubicación de memoria de 64 bits. Los elementos del destino se actualizan utilizando la máscara de escritura k1.
Tenga en cuenta que esta instrucción permite que un qword en el operando de origen sea copiado a múltiples ubicaciones en el operando de destino.
Si VPERMPQ está codificado con VEX.L= 0 o EVEX.128, un intento de ejecutar la instrucción causará una excepción #UD.
Operación
VPERMQ (EVEX - imm8 control forms)
(KL, VL) = (4, 256), (8, 512)
FOR j := 0 TO KL-1
i := j * 64
IF (EVEX.b = 1) AND (SRC *is memory*)
THEN TMP_SRC[i+63:i] := SRC[63:0];
ELSE TMP_SRC[i+63:i] := SRC[i+63:i];
FI;
ENDFOR;
TMP_DEST[63:0] := (TMP_SRC[255:0] >> (IMM8[1:0] * 64))[63:0];
TMP_DEST[127:64] := (TMP_SRC[255:0] >> (IMM8[3:2] * 64))[63:0];
TMP_DEST[191:128] := (TMP_SRC[255:0] >> (IMM8[5:4] * 64))[63:0];
TMP_DEST[255:192] := (TMP_SRC[255:0] >> (IMM8[7:6] * 64))[63:0];
IF VL >= 512
TMP_DEST[319:256] := (TMP_SRC[511:256] >> (IMM8[1:0] * 64))[63:0];
TMP_DEST[383:320] := (TMP_SRC[511:256] >> (IMM8[3:2] * 64))[63:0];
TMP_DEST[447:384] := (TMP_SRC[511:256] >> (IMM8[5:4] * 64))[63:0];
TMP_DEST[511:448] := (TMP_SRC[511:256] >> (IMM8[7:6] * 64))[63:0];
FI;
FOR j := 0 TO KL-1
i := j * 64
IF k1[j] OR *no writemask*
THEN DEST[i+63:i] := TMP_DEST[i+63:i]
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+63:i] remains unchanged*
ELSE ; zeroing-masking
DEST[i+63:i] := 0 ;zeroing-masking
FI;
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0
VPERMQ (EVEX - vector control forms)
(KL, VL) = (4, 256), (8, 512)
FOR j := 0 TO KL-1
i := j * 64
IF (EVEX.b = 1) AND (SRC2 *is memory*)
THEN TMP_SRC2[i+63:i] := SRC2[63:0];
ELSE TMP_SRC2[i+63:i] := SRC2[i+63:i];
FI;
ENDFOR;
IF VL = 256
TMP_DEST[63:0] := (TMP_SRC2[255:0] >> (SRC1[1:0] * 64))[63:0];
TMP_DEST[127:64] := (TMP_SRC2[255:0] >> (SRC1[65:64] * 64))[63:0];
TMP_DEST[191:128] := (TMP_SRC2[255:0] >> (SRC1[129:128] * 64))[63:0];
TMP_DEST[255:192] := (TMP_SRC2[255:0] >> (SRC1[193:192] * 64))[63:0];
FI;
IF VL = 512
TMP_DEST[63:0] := (TMP_SRC2[511:0] >> (SRC1[2:0] * 64))[63:0];
TMP_DEST[127:64] := (TMP_SRC2[511:0] >> (SRC1[66:64] * 64))[63:0];
TMP_DEST[191:128] := (TMP_SRC2[511:0] >> (SRC1[130:128] * 64))[63:0];
TMP_DEST[255:192] := (TMP_SRC2[511:0] >> (SRC1[194:192] * 64))[63:0];
TMP_DEST[319:256] := (TMP_SRC2[511:0] >> (SRC1[258:256] * 64))[63:0];
TMP_DEST[383:320] := (TMP_SRC2[511:0] >> (SRC1[322:320] * 64))[63:0];
TMP_DEST[447:384] := (TMP_SRC2[511:0] >> (SRC1[386:384] * 64))[63:0];
TMP_DEST[511:448] := (TMP_SRC2[511:0] >> (SRC1[450:448] * 64))[63:0];
FI;
FOR j := 0 TO KL-1
i := j * 64
IF k1[j] OR *no writemask*
THEN DEST[i+63:i] := TMP_DEST[i+63:i]
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+63:i] remains unchanged*
ELSE ; zeroing-masking
DEST[i+63:i] := 0 ;zeroing-masking
FI;
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0
VPERMQ (VEX.256 encoded version)
DEST[63:0] := (SRC[255:0] >> (IMM8[1:0] * 64))[63:0];
DEST[127:64] := (SRC[255:0] >> (IMM8[3:2] * 64))[63:0];
DEST[191:128] := (SRC[255:0] >> (IMM8[5:4] * 64))[63:0];
DEST[255:192] := (SRC[255:0] >> (IMM8[7:6] * 64))[63:0];
DEST[MAXVL-1:256] := 0Intel C/C++ compilador intrínseco
VPERMQ __m512i _mm512_permutex_epi64( __m512i a, int imm);
VPERMQ __m512i _mm512_mask_permutex_epi64(__m512i s, __mmask8 k, __m512i a, int imm);
VPERMQ __m512i _mm512_maskz_permutex_epi64( __mmask8 k, __m512i a, int imm);
VPERMQ __m512i _mm512_permutexvar_epi64( __m512i a, __m512i b);
VPERMQ __m512i _mm512_mask_permutexvar_epi64(__m512i s, __mmask8 k, __m512i a, __m512i b);
VPERMQ __m512i _mm512_maskz_permutexvar_epi64( __mmask8 k, __m512i a, __m512i b);
VPERMQ __m256i _mm256_permutex_epi64( __m256i a, int imm);
VPERMQ __m256i _mm256_mask_permutex_epi64(__m256i s, __mmask8 k, __m256i a, int imm);
VPERMQ __m256i _mm256_maskz_permutex_epi64( __mmask8 k, __m256i a, int imm);
VPERMQ __m256i _mm256_permutexvar_epi64( __m256i a, __m256i b);
VPERMQ __m256i _mm256_mask_permutexvar_epi64(__m256i s, __mmask8 k, __m256i a, __m256i b);
VPERMQ __m256i _mm256_maskz_permutexvar_epi64( __mmask8 k, __m256i a, __m256i b);SIMD coma flotante Excepciones
None.
Otras excepciones
Instrucciones no codificadas por EVEX, ver Tabla 2-21, "Tipo 4 Condiciones de Excepción de Clase".
Additionally:
#UD If VEX.L = 0.If VEX.vvvv != 1111B.
Instrucciones codificadas por EVEX, ver Tabla 2-52, "Tipo E4NF Clase Condiciones de Excepción."
Additionally:
#UD If encoded with EVEX.128.Si EVEX.vvvv != 1111B y con imm8.