PMULDQ

Multiply Packed Doubleword Integers

estableVMJITAOTinstruccion

Codificaciones

OpcodeInstruccionOp/En64 bitsCompat/LegacyDescripcion
66 0F 38 28 /rPMULDQ xmm1, xmm2/m128AValidoValidoMultiply empaquetado integers de doble palabra firmados enxmm1por los enteros de doblepapa firmados enxmm2/m128, y almacenar los resultados de cuadripado enxmm1.
VEX.128.66.0F38.WIG 28 /rVPMULDQ xmm1, xmm2, xmm3/m128BValidoValidoMultiply empaquetado integers de doble palabra firmados enxmm2por los enteros de doblepapa firmados enxmm3/m128, y almacenar los resultados de cuadripado enxmm1.
VEX.256.66.0F38.WIG 28 /rVPMULDQ ymm1, ymm2, ymm3/m256BValidoValidoMultiply empaquetado integers de doble palabra firmados enymm2por los enteros de doblepapa firmados enymm3/m256, y almacenar los resultados de cuadripado enymm1.
EVEX.128.66.0F38.W1 28 /rVPMULDQ xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcstCValidoValidoMultiply empaquetado integers de doble palabra firmados enxmm2porAVX512F) O empaquetado integers de doble palabra firmado enAVX10.1 xmm3/m128/m64bcst, y almacenar los resultados de quadword enxmm1utilizandomáscara de escritura k1.
EVEX.256.66.0F38.W1 28 /rVPMULDQ ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcstCValidoValidoMultiply empaquetado integers de doble palabra firmados enymm2porAVX512F) O empaquetado integers de doble palabra firmado enAVX10.1 ymm3/m256/m64bcst, y almacenar los resultados de quadword enymm1utilizandomáscara de escritura k1.
EVEX.512.66.0F38.W1 28 /rVPMULDQ zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcstCValidoValidoMultiply empaquetado integers de doble palabra firmados enzmm2por ORAVX10.1empaquetado de enteros de doble palabra firmados enzmm3/m512/m64bcst, y almacenar los resultados de quadword enzmm1utilizandomá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

  1. modrm.reg lectura y escriturabyte ModRM, campo reg (bits 5-3)
  2. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

B

  1. modrm.reg escriturabyte ModRM, campo reg (bits 5-3)
  2. vex.vvvv lecturaprefijo VEX, campo vvvv (invertido)
  3. modrm.rm lecturabyte ModRM, campo r/m (bits 2-0); con el byte SIB y el desplazamiento cuando el campo mod los pide

C

  1. modrm.reg escriturabyte ModRM, campo reg (bits 5-3)
  2. evex.vvvv lecturaprefijo EVEX, campo vvvv (invertido)
  3. modrm.rm lecturabyte 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

Multiplicas empaquetados de integers de doble palabra firmados en los elementos de referencia uniformemente numerados (con base en cero) del primer operando de origen con los enteros de doble palabra firmados empaquetados en los elementos correspondientes del segundo operando de origen y las tiendas empaquetadas firmadas cuádwords resultados en el operando de destino.

128-bit Legacy SSE versión: Los enteros de doble palabra firmados son tomados de los elementos numerados de los operandos de origen, es decir, el primer (bajo) y tercer elemento de doble palabra. Para 128 bits operandos de memoria, 128 bits son sacados de la memoria, pero sólo las primeras y terceras palabras dobles se utilizan en el cálculo. El primer operando de origen y el destino XMM operando es el mismo. El segundo operando de origen puede ser un registro XMM o ubicación de memoria de 128 bits. Bits (MAXVL-1:128) del registro de destino correspondiente no se modifican.

VEX.128 versión codificada: Los enteros de doble palabra firmados son tomados de los elementos numerados de los operandos de origen, es decir, el primer (bajo) y tercer elemento de doble palabra. Para 128 bits operandos de memoria, 128 bits son sacados de la memoria, pero sólo las primeras y terceras palabras dobles se utilizan en el cálculo.el primer operando de origen y el operando de destino son registros XMM. El segundo operando de origen puede ser un registro XMM o ubicación de memoria de 128 bits. Bits (MAXVL-1:128) del registro de destino correspondiente se ponen a cero.

VEX.256 versión codificada: Los enteros de doblepalabra firmados son tomados de los elementos numerados de los operandos de origen, es decir, el primer, 3, 5to, 7o elemento de doblepalabra. Para 256-bit operandos de memoria, 256 bits son sacados de la memoria, pero sólo las cuatro dobles incluso numeradas se utilizan en la computación. El primer operando de origen y el operando de destino son registros YMM. El segundo operando de origen puede ser un registro YMM o 256-bit ubicación de memoria. Bits (MAXVL-1:256) del destino correspondiente ZMM registro se ponen a cero.

EVEX versión codificada: Los enteros de doble palabra firmados son tomados de los elementos numerados de los operandos de origen. El primer operando de origen es un registro ZMM/YMM/XMM. El segundo operando de origen puede ser un registro ZMM/YMM/XMM, un 512/256/128-bit ubicación de memoria o un vector 512/256/128-bit transmitido desde una ubicación de memoria de 64 bits. El destino es un registro ZMM/YMM/XMM y actualizado según la máscara de escritura a 64 bits de granularidad.

Operación

VPMULDQ (EVEX Encoded Versions)

(KL, VL) = (2, 128), (4, 256), (8, 512)

FOR j := 0 TO KL-1

i := j * 64

IF k1[j] OR *no writemask*

     THEN

             IF (EVEX.b = 1) AND (SRC2 *is memory*)

                  THEN DEST[i+63:i] := SignExtend64( SRC1[i+31:i]) * SignExtend64( SRC2[31:0])

                  ELSE DEST[i+63:i] := SignExtend64( SRC1[i+31:i]) * SignExtend64( SRC2[i+31:i])

             FI;

     ELSE

             IF *merging-masking*            ; merging-masking

                  THEN *DEST[i+63:i] remains unchanged*

                  ELSE *zeroing-masking*             ; zeroing-masking

                    DEST[i+63:i] := 0

             FI

FI;

ENDFOR

DEST[MAXVL-1:VL] := 0

VPMULDQ (VEX.256 Encoded Version)
DEST[63:0] := SignExtend64( SRC1[31:0]) * SignExtend64( SRC2[31:0])
DEST[127:64] := SignExtend64( SRC1[95:64]) * SignExtend64( SRC2[95:64])
DEST[191:128] := SignExtend64( SRC1[159:128]) * SignExtend64( SRC2[159:128])
DEST[255:192] := SignExtend64( SRC1[223:192]) * SignExtend64( SRC2[223:192])
DEST[MAXVL-1:256] := 0

VPMULDQ (VEX.128 Encoded Version)
DEST[63:0] := SignExtend64( SRC1[31:0]) * SignExtend64( SRC2[31:0])
DEST[127:64] := SignExtend64( SRC1[95:64]) * SignExtend64( SRC2[95:64])
DEST[MAXVL-1:128] := 0

PMULDQ (128-bit Legacy SSE Version)
DEST[63:0] := SignExtend64( DEST[31:0]) * SignExtend64( SRC[31:0])
DEST[127:64] := SignExtend64( DEST[95:64]) * SignExtend64( SRC[95:64])
DEST[MAXVL-1:128] (Unmodified)

Intel C/C++ compilador intrínseco

VPMULDQ __m512i _mm512_mul_epi32(__m512i a, __m512i b);
VPMULDQ __m512i _mm512_mask_mul_epi32(__m512i s, __mmask8 k, __m512i a, __m512i b);
VPMULDQ __m512i _mm512_maskz_mul_epi32( __mmask8 k, __m512i a, __m512i b);
VPMULDQ __m256i _mm256_mask_mul_epi32(__m256i s, __mmask8 k, __m256i a, __m256i b);
VPMULDQ __m256i _mm256_mask_mul_epi32( __mmask8 k, __m256i a, __m256i b);
VPMULDQ __m128i _mm_mask_mul_epi32(__m128i s, __mmask8 k, __m128i a, __m128i b);
VPMULDQ __m128i _mm_mask_mul_epi32( __mmask8 k, __m128i a, __m128i b);
(V)PMULDQ __m128i _mm_mul_epi32( __m128i a, __m128i b);
VPMULDQ __m256i _mm256_mul_epi32( __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".

Instrucciones codificadas por EVEX, ver Tabla 2-51, "Tipo E4 Clase Condiciones de Excepción."

Fuentes