VPERMD, VPERMW
Permute Packed Doubleword/Word Elements
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
VEX.256.66.0F38.W0 36 /r | VPERMD ymm1, ymm2, ymm3/m256 | A | Valido | Valido | Palabras dobles Permute en ymm3/m256 utilizando índices en ymm2 y almacenar el resultado en ymm1. |
EVEX.256.66.0F38.W0 36 /r | VPERMD ymm1 {k1}{z}, ymm2, ymm3/m256/m32bcst | B | Valido | Valido | Palabras dobles de riesgo en ymm3/m256/m32bcst AVX512F) O utilizando índices en ymm2 y almacenar el resultado en AVX10.1 ymm1 utilizando máscara de escritura k1. |
EVEX.512.66.0F38.W0 36 /r | VPERMD zmm1 {k1}{z}, zmm2, zmm3/m512/m32bcst | B | Valido | Valido | Palabras dobles de riesgo en zmm3/m512/m32bcst OR AVX10.1 usando índices en zmm2 y almacenar el resultado en zmm1 utilizando máscara de escritura k1. |
EVEX.128.66.0F38.W1 8D /r | VPERMW xmm1 {k1}{z}, xmm2, xmm3/m128 | C | Valido | Valido | Permute word integers in xmm3/m128 using AVX512BW) OR indexes en xmm2 y almacenar el resultado en xmm1 AVX10.1 utilizando máscara de escritura k1. |
EVEX.256.66.0F38.W1 8D /r | VPERMW ymm1 {k1}{z}, ymm2, ymm3/m256 | C | Valido | Valido | Permute word integers in ymm3/m256 using AVX512BW) OR indexes en ymm2 y almacenar el resultado en ymm1 AVX10.1 utilizando máscara de escritura k1. |
EVEX.512.66.0F38.W1 8D /r | VPERMW zmm1 {k1}{z}, zmm2, zmm3/m512 | C | Valido | Valido | Permute word integers in zmm3/m512 using OR AVX10.1 indexes en zmm2 y almacenar el resultado en zmm1 utilizando máscara de escritura k1. |
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)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 pide
B
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
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 Mem
Coste medido
Cargando las mediciones de arch-data...
Descripción
Copies doublewords (o palabras) del 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). Tenga en cuenta que esta instrucción permite copiar una palabra doble (palabra) en el operando de origen a más de una ubicación en el operando de destino.
VEX.256 codificado VPERMD: El primero y segundo operandos son registros YMM, el tercer operando puede ser un registro YMM o ubicación de memoria. Bits (MAXVL-1:256) del registro de destino correspondiente se ponen a cero.
EVEX codificado VPERMD: El primero y segundo operandos son los registros ZMM/YMM, el tercer operando puede ser un registro ZMM/YMM, una ubicación de memoria de 512/256 bits o un vector de 512/256 bits emitido desde una ubicación de memoria de 32 bits. Los elementos del destino se actualizan utilizando la máscara de escritura k1.
VPERMW: primero y segundo operandos son ZMM/YMM/XMM registros, el tercer operando puede ser un ZMM/YMM/XMM registro, o un 512/256/128-bit ubicación de memoria. El destino se actualiza utilizando la máscara de escritura k1.
EVEX.128 versiones codificadas: Bits (MAXVL-1:128) del registro ZMM correspondiente se ponen a cero.
Operación
VPERMD (EVEX encoded versions)
(KL, VL) = (8, 256), (16, 512)
IF VL = 256 THEN n := 2; FI;
IF VL = 512 THEN n := 3; FI;
FOR j := 0 TO KL-1
i := j * 32
id := 32*SRC1[i+n:i]
IF k1[j] OR *no writemask*
THEN
IF (EVEX.b = 1) AND (SRC2 *is memory*)
THEN DEST[i+31:i] := SRC2[31:0];
ELSE DEST[i+31:i] := SRC2[id+31:id];
FI;
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+31:i] remains unchanged*
ELSE ; zeroing-masking
DEST[i+31:i] := 0
FI
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0
VPERMD (VEX.256 encoded version)
DEST[31:0] := (SRC2[255:0] >> (SRC1[2:0] * 32))[31:0];
DEST[63:32] := (SRC2[255:0] >> (SRC1[34:32] * 32))[31:0];
DEST[95:64] := (SRC2[255:0] >> (SRC1[66:64] * 32))[31:0];
DEST[127:96] := (SRC2[255:0] >> (SRC1[98:96] * 32))[31:0];
DEST[159:128] := (SRC2[255:0] >> (SRC1[130:128] * 32))[31:0];
DEST[191:160] := (SRC2[255:0] >> (SRC1[162:160] * 32))[31:0];
DEST[223:192] := (SRC2[255:0] >> (SRC1[194:192] * 32))[31:0];
DEST[255:224] := (SRC2[255:0] >> (SRC1[226:224] * 32))[31:0];
DEST[MAXVL-1:256] := 0
VPERMW (EVEX encoded versions)
(KL, VL) = (8, 128), (16, 256), (32, 512)
IF VL = 128 THEN n := 2; FI;
IF VL = 256 THEN n := 3; FI;
IF VL = 512 THEN n := 4; FI;
FOR j := 0 TO KL-1
i := j * 16
id := 16*SRC1[i+n:i]
IF k1[j] OR *no writemask*
THEN DEST[i+15:i] := SRC2[id+15:id]
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+15:i] remains unchanged*
ELSE ; zeroing-masking
DEST[i+15:i] := 0
FI
FI;
ENDFOR
DEST[MAXVL-1:VL] := 0Intel C/C++ compilador intrínseco
VPERMD __m512i _mm512_permutexvar_epi32( __m512i idx, __m512i a);
VPERMD __m512i _mm512_mask_permutexvar_epi32(__m512i s, __mmask16 k, __m512i idx, __m512i a);
VPERMD __m512i _mm512_maskz_permutexvar_epi32( __mmask16 k, __m512i idx, __m512i a);
VPERMD __m256i _mm256_permutexvar_epi32( __m256i idx, __m256i a);
VPERMD __m256i _mm256_mask_permutexvar_epi32(__m256i s, __mmask8 k, __m256i idx, __m256i a);
VPERMD __m256i _mm256_maskz_permutexvar_epi32( __mmask8 k, __m256i idx, __m256i a);
VPERMW __m512i _mm512_permutexvar_epi16( __m512i idx, __m512i a);
VPERMW __m512i _mm512_mask_permutexvar_epi16(__m512i s, __mmask32 k, __m512i idx, __m512i a);
VPERMW __m512i _mm512_maskz_permutexvar_epi16( __mmask32 k, __m512i idx, __m512i a);
VPERMW __m256i _mm256_permutexvar_epi16( __m256i idx, __m256i a);
VPERMW __m256i _mm256_mask_permutexvar_epi16(__m256i s, __mmask16 k, __m256i idx, __m256i a);
VPERMW __m256i _mm256_maskz_permutexvar_epi16( __mmask16 k, __m256i idx, __m256i a);
VPERMW __m128i _mm_permutexvar_epi16( __m128i idx, __m128i a);
VPERMW __m128i _mm_mask_permutexvar_epi16(__m128i s, __mmask8 k, __m128i idx, __m128i a);
VPERMW __m128i _mm_maskz_permutexvar_epi16( __mmask8 k, __m128i idx, __m128i a);SIMD coma flotante Excepciones
None
Otras excepciones
Non-EVEX- instrucción codificada, ver Tabla 2-21, "Tipo 4 Condiciones de Excepción".EVEX- codificadoVPERMD, ver Tabla 2-52, "TipoE4NFCondiciones de Excepción de Clase".EVEX- codificadoVPERMW, ver Tipo de ExcepcionesE4NF.nben la tabla 2-52, "TipoE4NFCondiciones de Excepción de Clase".
Additionally:
#UD If VEX.L = 0.If EVEX.L'L = 0 for VPERMD.