PSIGNB, PSIGNW, PSIGND

包装的 SIGN

stableVMJITAOTinstruction

编码

操作码指令Op/En64 位兼容/传统说明
NP 0F 38 08 /r1PSIGNB mm1, mm2/m64RM有效有效根据mm2/m64中相应的符号,在mm1中忽略/零/保留包装的字节整数.
66 0F 38 08 /rPSIGNB xmm1, xmm2/m128RM有效有效根据xmm2/m128中相应的符号,在xmm1中忽略/零/保留包装的字节整数.
NP 0F 38 09 /r1PSIGNW mm1, mm2/m64RM有效有效根据mm2/m128中相应的符号,在mm1中忽略/零/保留打包的单词整数.
66 0F 38 09 /rPSIGNW xmm1, xmm2/m128RM有效有效根据xmm2/m128中相应的符号,在xmm1中忽略/零/保留打包的单词整数.
NP 0F 38 0A /r1PSIGND mm1, mm2/m64RM有效有效根据mm2/m128中相应的符号,在mm1中忽略/零/保留包装的双字整数.
66 0F 38 0A /rPSIGND xmm1, xmm2/m128RM有效有效根据xmm2/m128中相应的符号,在xmm1中忽略/零/保留包装的双字整数.
VEX.128.66.0F38.WIG 08 /rVPSIGNB xmm1, xmm2, xmm3/m128RVM有效有效根据xmm3/m128中相应的符号,在xmm2中忽略/零/保留包装的字节整数.
VEX.128.66.0F38.WIG 09 /rVPSIGNW xmm1, xmm2, xmm3/m128RVM有效有效根据xmm3/m128中相应的符号,在xmm2中忽略/零/保留打包的单词整数.
VEX.128.66.0F38.WIG 0A /rVPSIGND xmm1, xmm2, xmm3/m128RVM有效有效根据xmm3/m128中相应的符号,在xmm2中忽略/零/保留包装的双字整数.
VEX.256.66.0F38.WIG 08 /rVPSIGNB ymm1, ymm2, ymm3/m256RVM有效有效如果 ymm3/m256 中的相应符号小于零,则在 ymm2 中忽略已打包的字节整数.
VEX.256.66.0F38.WIG 09 /rVPSIGNW ymm1, ymm2, ymm3/m256RVM有效有效如果ymm3/m256中的相应符号小于零,则忽略了ymm2中装入的16位整数.
VEX.256.66.0F38.WIG 0A /rVPSIGND ymm1, ymm2, ymm3/m256RVM有效有效如果ymm3/m256中的相应符号小于零,则在ymm2中忽略已打包的双字整数.

操作数编码

每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。

RM

  1. modrm.reg lectura y escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

RVM

  1. modrm.reg escrituraModRM 字节的 reg 字段(第 5-3 位)
  2. vex.vvvv lecturaVEX 前缀的 vvvv 字段(按位取反)
  3. modrm.rm lecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移

实测开销

正在从 arch-data 加载实测数据...

说明

(V)PSIGNB/(V)PSIGNW/(V)PSIGND 否定了目的地运行符(第一个运行符)中每个数据元素,如果源运行符(第二个运行符)中对应数据元素的签名整数值小于零. 如果源操作数中一个数据元素的签名整数值为正数,则目标操作数中相应的数据元素不变. 如果源操作数中的数据元素为零,则目标操作数中的相应数据元素被设定为零.

(V)PSIGNB运行在已签名的字节上. (V)PSIGNW在16位签名单词上运行. (V)PSIGND在签名的32位整数上运行.

遗产 SSE 指令 : 两个操作数都可以是MMX注册. 在64位模式中,使用REX前缀访问额外的注册.

128位遗产 SSE 版本 : 第一个来源和目标操作数是XMM登记册. 第二源操作数是一个XMM的寄存器或128位的内存位置. 相应的YMM目的地注册保持不变的位数(MAXVL-1:128).

VEX.128 编码版本 : 第一个来源和目标操作数是XMM登记册. 第二源操作数是一个XMM的寄存器或128位的内存位置. 目的地YMM的位数(MAXVL-1:128)登记被清零. VEX.L必须是0,否则指令会#UD.

VEX.256 编码版本 : 第一个来源和目标操作数是YMM登记册. 第二源操作数是一个YMM的寄存器或256位的内存位置.

行动

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] := 0

Intel C/C++ 内在编译器

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 浮点 例外

None.

其他例外

见表2-21,"第4类例外条件",另外:

#UD               If VEX.L = 1.

来源