PMADDUBSW
Multiply y Add Packed Signed and Unsigned Bytes
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
NP 0F 38 04 /r1 | PMADDUBSW mm1, mm2/m64 | A | Valido | Valido | Multiply firmado y sin firma, añadir par horizontal de palabras firmadas, empaquetar las palabras firmadas saturadas a mm1. |
66 0F 38 04 /r | PMADDUBSW xmm1, xmm2/m128 | A | Valido | Valido | Multiply firmado y sin firma, añadir par horizontal de palabras firmadas, empaquetar las palabras firmadas saturadas a xmm1. |
VEX.128.66.0F38.WIG 04 /r | VPMADDUBSW xmm1, xmm2, xmm3/m128 | B | Valido | Valido | Multiply firmado y sin firma, añadir par horizontal de palabras firmadas, empaquetar las palabras firmadas saturadas a xmm1. |
VEX.256.66.0F38.WIG 04 /r | VPMADDUBSW ymm1, ymm2, ymm3/m256 | B | Valido | Valido | Multiply firmado y sin firma, añadir par horizontal de palabras firmadas, empaquetar las palabras firmadas saturadas a ymm1. |
EVEX.128.66.0F38.WIG 04 /r | VPMADDUBSW xmm1 {k1}{z}, xmm2, xmm3/m128 | C | Valido | Valido | Multiply firmado y sin firma, añadir AVX512BW) O par horizontal de palabras firmadas, empaquetar las palabras firmadas AVX10.1 a xmm1 bajo máscara de escritura k1. |
EVEX.256.66.0F38.WIG 04 /r | VPMADDUBSW ymm1 {k1}{z}, ymm2, ymm3/m256 | C | Valido | Valido | Multiply firmado y sin firma, añadir AVX512BW) O par horizontal de palabras firmadas, empaquetar las palabras firmadas AVX10.1 a ymm1 bajo máscara de escritura k1. |
EVEX.512.66.0F38.WIG 04 /r | VPMADDUBSW zmm1 {k1}{z}, zmm2, zmm3/m512 | C | Valido | Valido | Multiply firmado y sin firma de bytes, añadir OR AVX10.1 par horizontal de palabras firmadas, empaquetar las palabras firmadas saturadas a zmm1 bajo 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.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 pide
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 pide
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
(V)PMADDUBSW multiplica verticalmente cada byte no firmado del operando de destino (primer operando) con el byte firmado correspondiente del operando de origen (segundo operando), produciendo enteros intermedios firmados de 16 bits. Cada par adyacente de palabras firmadas se añade y el resultado saturado se empaca al operando de destino. Por ejemplo, los bytes de orden más bajo (bits 7-0) en la fuente y operandos de destino se multiplican y el resultado de palabra firmado intermedio se añade con el resultado intermedio correspondiente de los 2do bytes de orden más bajo (bits 15-8) de los operandos; el resultado saturado de signo se almacena en la palabra más baja del registro de destino (15-0). La misma operación se realiza en los otros pares de bytes adyacentes. Ambos operandos pueden ser registro MMX o registros XMM. Cuando el operando de origen es un operando de memoria de 128 bits, el operando debe estar alineado en un límite de 16 bytes o una excepción de protección general (#GP) se generará.
En modo de 64 bits y no codificado con VEX/EVEX, utilice el prefijo REX para acceder a XMM8-XMM15.
128-bit Legacy SSE versión: La primera fuente y operandos de destino son registros XMM. El segundo operando de origen es un registro XMM o una ubicación de memoria de 128 bits. Bits (MAXVL-1:128) del registro de destino correspondiente no se modifican.
VEX.128 y EVEX.128 versiones codificadas: La primera fuente y operandos de destino son registros XMM. El segundo operando de origen es un registro XMM o una ubicación de memoria de 128 bits. Bits (MAXVL-1:128) del registro de destino correspondiente se ponen a cero.
VEX.256 y EVEX.256 versiones codificadas: El segundo operando de origen puede ser un registro YMM o una ubicación de memoria de 256 bits. La primera fuente y operandos de destino son registros YMM. Bits (MAXVL-1:256) del registro ZMM correspondiente se ponen a cero.
EVEX.512 versión codificada: El segundo operando de origen puede ser un registro ZMM o una ubicación de memoria de 512 bits. La primera fuente y operandos de destino son registros ZMM.
Operación
PMADDUBSW (With 64-bit Operands)
DEST[15-0] = SaturateToSignedWord(SRC[15-8]*DEST[15-8]+SRC[7-0]*DEST[7-0]);
DEST[31-16] = SaturateToSignedWord(SRC[31-24]*DEST[31-24]+SRC[23-16]*DEST[23-16]);
DEST[47-32] = SaturateToSignedWord(SRC[47-40]*DEST[47-40]+SRC[39-32]*DEST[39-32]);
DEST[63-48] = SaturateToSignedWord(SRC[63-56]*DEST[63-56]+SRC[55-48]*DEST[55-48]);
PMADDUBSW (With 128-bit Operands)
DEST[15-0] = SaturateToSignedWord(SRC[15-8]* DEST[15-8]+SRC[7-0]*DEST[7-0]);
// Repeat operation for 2nd through 7th word
SRC1/DEST[127-112] = SaturateToSignedWord(SRC[127-120]*DEST[127-120]+ SRC[119-112]* DEST[119-112]);
VPMADDUBSW (VEX.128 Encoded Version)
DEST[15:0] := SaturateToSignedWord(SRC2[15:8]* SRC1[15:8]+SRC2[7:0]*SRC1[7:0])
// Repeat operation for 2nd through 7th word
DEST[127:112] := SaturateToSignedWord(SRC2[127:120]*SRC1[127:120]+ SRC2[119:112]* SRC1[119:112])
DEST[MAXVL-1:128] := 0
VPMADDUBSW (VEX.256 Encoded Version)
DEST[15:0] := SaturateToSignedWord(SRC2[15:8]* SRC1[15:8]+SRC2[7:0]*SRC1[7:0])
// Repeat operation for 2nd through 15th word
DEST[255:240] := SaturateToSignedWord(SRC2[255:248]*SRC1[255:248]+ SRC2[247:240]* SRC1[247:240])
DEST[MAXVL-1:256] := 0
VPMADDUBSW (EVEX Encoded Versions)
(KL, VL) = (8, 128), (16, 256), (32, 512)
FOR j := 0 TO KL-1
i := j * 16
IF k1[j] OR *no writemask*
THEN DEST[i+15:i] := SaturateToSignedWord(SRC2[i+15:i+8]* SRC1[i+15:i+8] + SRC2[i+7:i]*SRC1[i+7:i])
ELSE
IF *merging-masking* ; merging-masking
THEN *DEST[i+15:i] remains unchanged*
ELSE *zeroing-masking* ; zeroing-masking
DEST[i+15:i] = 0
FI
FI;
ENDFOR;
DEST[MAXVL-1:VL] := 0Intel C/C++ compilador intrínseco
VPMADDUBSW __m512i _mm512_maddubs_epi16( __m512i a, __m512i b);
VPMADDUBSW __m512i _mm512_mask_maddubs_epi16(__m512i s, __mmask32 k, __m512i a, __m512i b);
VPMADDUBSW __m512i _mm512_maskz_maddubs_epi16( __mmask32 k, __m512i a, __m512i b);
VPMADDUBSW __m256i _mm256_mask_maddubs_epi16(__m256i s, __mmask16 k, __m256i a, __m256i b);
VPMADDUBSW __m256i _mm256_maskz_maddubs_epi16( __mmask16 k, __m256i a, __m256i b);
VPMADDUBSW __m128i _mm_mask_maddubs_epi16(__m128i s, __mmask8 k, __m128i a, __m128i b);
VPMADDUBSW __m128i _mm_maskz_maddubs_epi16( __mmask8 k, __m128i a, __m128i b);
PMADDUBSW __m64 _mm_maddubs_pi16 (__m64 a, __m64 b) (V)PMADDUBSW __m128i _mm_maddubs_epi16 (__m128i a, __m128i b) VPMADDUBSW __m256i _mm256_maddubs_epi16 (__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".
EVEX-encoded instruction, ver Excepciones Tipo E4NF.nb en la tabla 2-52, "Tipo E4NF Clase Condiciones de Excepción."