PSIGNB, PSIGNW, PSIGND
包装的 SIGN
stableVMJITAOTinstruction
编码
| 操作码 | 指令 | Op/En | 64 位 | 兼容/传统 | 说明 |
|---|---|---|---|---|---|
NP 0F 38 08 /r1 | PSIGNB mm1, mm2/m64 | RM | 有效 | 有效 | 根据mm2/m64中相应的符号,在mm1中忽略/零/保留包装的字节整数. |
66 0F 38 08 /r | PSIGNB xmm1, xmm2/m128 | RM | 有效 | 有效 | 根据xmm2/m128中相应的符号,在xmm1中忽略/零/保留包装的字节整数. |
NP 0F 38 09 /r1 | PSIGNW mm1, mm2/m64 | RM | 有效 | 有效 | 根据mm2/m128中相应的符号,在mm1中忽略/零/保留打包的单词整数. |
66 0F 38 09 /r | PSIGNW xmm1, xmm2/m128 | RM | 有效 | 有效 | 根据xmm2/m128中相应的符号,在xmm1中忽略/零/保留打包的单词整数. |
NP 0F 38 0A /r1 | PSIGND mm1, mm2/m64 | RM | 有效 | 有效 | 根据mm2/m128中相应的符号,在mm1中忽略/零/保留包装的双字整数. |
66 0F 38 0A /r | PSIGND xmm1, xmm2/m128 | RM | 有效 | 有效 | 根据xmm2/m128中相应的符号,在xmm1中忽略/零/保留包装的双字整数. |
VEX.128.66.0F38.WIG 08 /r | VPSIGNB xmm1, xmm2, xmm3/m128 | RVM | 有效 | 有效 | 根据xmm3/m128中相应的符号,在xmm2中忽略/零/保留包装的字节整数. |
VEX.128.66.0F38.WIG 09 /r | VPSIGNW xmm1, xmm2, xmm3/m128 | RVM | 有效 | 有效 | 根据xmm3/m128中相应的符号,在xmm2中忽略/零/保留打包的单词整数. |
VEX.128.66.0F38.WIG 0A /r | VPSIGND xmm1, xmm2, xmm3/m128 | RVM | 有效 | 有效 | 根据xmm3/m128中相应的符号,在xmm2中忽略/零/保留包装的双字整数. |
VEX.256.66.0F38.WIG 08 /r | VPSIGNB ymm1, ymm2, ymm3/m256 | RVM | 有效 | 有效 | 如果 ymm3/m256 中的相应符号小于零,则在 ymm2 中忽略已打包的字节整数. |
VEX.256.66.0F38.WIG 09 /r | VPSIGNW ymm1, ymm2, ymm3/m256 | RVM | 有效 | 有效 | 如果ymm3/m256中的相应符号小于零,则忽略了ymm2中装入的16位整数. |
VEX.256.66.0F38.WIG 0A /r | VPSIGND ymm1, ymm2, ymm3/m256 | RVM | 有效 | 有效 | 如果ymm3/m256中的相应符号小于零,则在ymm2中忽略已打包的双字整数. |
操作数编码
每个模式对应上表 Op/En 列的一个取值,说明各操作数按书写顺序分别编码在指令的哪个字段,以及指令对它是读、是写还是两者兼有。
RM
modrm.reglectura y escrituraModRM 字节的 reg 字段(第 5-3 位)modrm.rmlecturaModRM 字节的 r/m 字段(第 2-0 位);当 mod 字段要求时,还包括 SIB 字节和位移
RVM
modrm.regescrituraModRM 字节的 reg 字段(第 5-3 位)vex.vvvvlecturaVEX 前缀的 vvvv 字段(按位取反)modrm.rmlecturaModRM 字节的 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] := 0Intel 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.