PSIGNB, PSIGNW, PSIGND
Embalado SIGN
estableVMJITAOTinstruccion
Codificaciones
| Opcode | Instruccion | Op/En | 64 bits | Compat/Legacy | Descripcion |
|---|---|---|---|---|---|
NP 0F 38 08 /r1 | PSIGNB mm1, mm2/m64 | RM | Valido | Valido | Negate/zero/preserve empaquetado porte integers en mm1 dependiendo del signo correspondiente en mm2/m64. |
66 0F 38 08 /r | PSIGNB xmm1, xmm2/m128 | RM | Valido | Valido | Negate/zero/preserve empaquetado porte integers en xmm1 dependiendo del signo correspondiente en xmm2/m128. |
NP 0F 38 09 /r1 | PSIGNW mm1, mm2/m64 | RM | Valido | Valido | Negate/zero/preserve integers de palabras empaquetadas en mm1 dependiendo del signo correspondiente en mm2/m128. |
66 0F 38 09 /r | PSIGNW xmm1, xmm2/m128 | RM | Valido | Valido | Negate/zero/preserve integers de palabras empaquetadas en xmm1 dependiendo del signo correspondiente en xmm2/m128. |
NP 0F 38 0A /r1 | PSIGND mm1, mm2/m64 | RM | Valido | Valido | Negate/zero/preserve empaquetaron enteros de doble palabra en mm1 dependiendo del signo correspondiente en mm2/m128. |
66 0F 38 0A /r | PSIGND xmm1, xmm2/m128 | RM | Valido | Valido | Negate/zero/preserve empaquetaron enteros de doble palabra en xmm1 dependiendo del signo correspondiente en xmm2/m128. |
VEX.128.66.0F38.WIG 08 /r | VPSIGNB xmm1, xmm2, xmm3/m128 | RVM | Valido | Valido | Negate/zero/preserve empaquetado porte integers en xmm2 dependiendo del signo correspondiente en xmm3/m128. |
VEX.128.66.0F38.WIG 09 /r | VPSIGNW xmm1, xmm2, xmm3/m128 | RVM | Valido | Valido | Negate/zero/preserve integers de palabras empaquetadas en xmm2 dependiendo del signo correspondiente en xmm3/m128. |
VEX.128.66.0F38.WIG 0A /r | VPSIGND xmm1, xmm2, xmm3/m128 | RVM | Valido | Valido | Negate/zero/preserve empaquetaron enteros de doble palabra en xmm2 dependiendo del signo correspondiente en xmm3/m128. |
VEX.256.66.0F38.WIG 08 /r | VPSIGNB ymm1, ymm2, ymm3/m256 | RVM | Valido | Valido | Negate packed byte integers in ymm2 si el signo correspondiente en ymm3/m256 es inferior a cero. |
VEX.256.66.0F38.WIG 09 /r | VPSIGNW ymm1, ymm2, ymm3/m256 | RVM | Valido | Valido | Negate empacó 16 bits enteros en ymm2 si el signo correspondiente en ymm3/m256 es inferior a cero. |
VEX.256.66.0F38.WIG 0A /r | VPSIGND ymm1, ymm2, ymm3/m256 | RVM | Valido | Valido | Los enteros de doblepapato Negate en ymm2 si el signo correspondiente en ymm3/m256 es inferior a cero. |
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.
RM
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
RVM
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
Coste medido
Cargando las mediciones de arch-data...
Descripción
(V)PSIGNB/(V)PSIGNW/(V)PSIGND niega cada elemento de datos del operando de destino (el primer operando) si el valor entero firmado del elemento de datos correspondiente en el operando de origen (el segundo operando) es inferior a cero. Si el valor entero firmado de un elemento de datos en el operando de origen es positivo, el elemento de datos correspondiente en el operando de destino no se cambia. Si un elemento de datos en el operando de origen es cero, el elemento de datos correspondiente en el operando de destino se establece a cero.
(V)PSIGNB opera en bytes firmados. (V)PSIGNW funciona con palabras firmadas de 16 bits. (V)PSIGND opera en enteros firmados de 32 bits.
Legacy SSE instrucciones: Ambos operandos pueden ser registros MMX. En modo de 64 bits, utilice el prefijo REX para acceder a registros adicionales.
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 correspondiente registro de destino YMM no se modifican.
VEX.128 versión codificada: 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 destino YMM registro se ponen a cero. VEX.L debe ser 0, de lo contrario las instrucciones #UD.
VEX.256 versión codificada: La primera fuente y operandos de destino son registros YMM. El segundo operando de origen es un registro YMM o una ubicación de memoria de 256 bits.
Operación
def byte_sign(control, input_val):
if control<0:
return negate(input_val)
elif control==0:
return 0
return input_val
def word_sign(control, input_val):
if control<0:
return negate(input_val)
elif control==0:
return 0
return input_val
def dword_sign(control, input_val):
if control<0:
return negate(input_val)
elif control==0:
return 0
return input_val
PSIGNB srcdest, src // MMX 64-bit Operands
VL=64
KL := VL/8
for i in 0...KL-1:
srcdest.byte[i] := byte_sign(src.byte[i], srcdest.byte[i])
PSIGNW srcdest, src // MMX 64-bit Operands
VL=64
KL := VL/16
FOR i in 0...KL-1:
srcdest.word[i] := word_sign(src.word[i], srcdest.word[i])
PSIGND srcdest, src // MMX 64-bit Operands
VL=64
KL := VL/32
FOR i in 0...KL-1:
srcdest.dword[i] := dword_sign(src.dword[i], srcdest.dword[i])
PSIGNB srcdest, src // SSE 128-bit Operands
VL=128
KL := VL/8
FOR i in 0...KL-1:
srcdest.byte[i] := byte_sign(src.byte[i], srcdest.byte[i])
PSIGNW srcdest, src // SSE 128-bit Operands
VL=128
KL := VL/16
FOR i in 0...KL-1:
srcdest.word[i] := word_sign(src.word[i], srcdest.word[i])
PSIGND srcdest, src // SSE 128-bit Operands
VL=128
KL := VL/32
FOR i in 0...KL-1:
srcdest.dword[i] := dword_sign(src.dword[i], srcdest.dword[i])
VPSIGNB dest, src1, src2 // AVX 128-bit or 256-bit Operands
VL=(128,256)
KL := VL/8
FOR i in 0...KL-1:
dest.byte[i] := byte_sign(src2.byte[i], src1.byte[i])
DEST[MAXVL-1:VL] := 0
VPSIGNW dest, src1, src2 // AVX 128-bit or 256-bit Operands
VL=(128,256)
KL := VL/16
FOR i in 0...KL-1:
dest.word[i] := word_sign(src2.word[i], src1.word[i])
DEST[MAXVL-1:VL] := 0
VPSIGND dest, src1, src2 // AVX 128-bit or 256-bit Operands
VL=(128,256)
KL := VL/32
FOR i in 0...KL-1:
dest.dword[i] := dword_sign(src2.dword[i], src1.dword[i])
DEST[MAXVL-1:VL] := 0Intel C/C++ compilador intrínseco
PSIGNB __m64 _mm_sign_pi8 (__m64 a, __m64 b) (V)PSIGNB __m128i _mm_sign_epi8 (__m128i a, __m128i b) VPSIGNB __m256i _mm256_sign_epi8 (__m256i a, __m256i b) PSIGNW __m64 _mm_sign_pi16 (__m64 a, __m64 b) (V)PSIGNW __m128i _mm_sign_epi16 (__m128i a, __m128i b) VPSIGNW __m256i _mm256_sign_epi16 (__m256i a, __m256i b) PSIGND __m64 _mm_sign_pi32 (__m64 a, __m64 b) (V)PSIGND __m128i _mm_sign_epi32 (__m128i a, __m128i b) VPSIGND __m256i _mm256_sign_epi32 (__m256i a, __m256i b);SIMD coma flotante Excepciones
None.
Otras excepciones
Ver Tabla 2-21, "Tipo 4 Condiciones de Excepción", además:
#UD If VEX.L = 1.