[arch/x86] add (some) pmovsx familly instructions support

This commit is contained in:
w4kfu 2026-03-20 13:53:18 +01:00
parent 3ca7226793
commit ff24b44fdf
No known key found for this signature in database
2 changed files with 62 additions and 1 deletions

View file

@ -4611,6 +4611,18 @@ addop("pmovmskb", [bs8(0x0f), bs8(0xd7), no_xmm_pref] +
addop("pmovmskb", [bs8(0x0f), bs8(0xd7), pref_66] +
rmmod(reg_modrm, rm_arg_xmm_reg))
addop("pmovsxwd", [bs8(0x0f), bs8(0x38), bs8(0x23), pref_66] +
rmmod(xmm_reg, rm_arg_xmm_m64))
addop("pmovsxwq", [bs8(0x0f), bs8(0x38), bs8(0x24), pref_66] +
rmmod(xmm_reg, rm_arg_xmm_m32))
addop("pmovsxbd", [bs8(0x0f), bs8(0x38), bs8(0x21), pref_66] +
rmmod(xmm_reg, rm_arg_xmm_m32))
addop("pmovsxdq", [bs8(0x0f), bs8(0x38), bs8(0x25), pref_66] +
rmmod(xmm_reg, rm_arg_xmm_m64))
addop("shufps", [bs8(0x0f), bs8(0xc6), no_xmm_pref] +
rmmod(xmm_reg, rm_arg_xmm) + [u08])
addop("shufpd", [bs8(0x0f), bs8(0xc6), pref_66] +

View file

@ -4619,7 +4619,6 @@ def punpckldq(ir, instr, dst, src):
def punpcklqdq(ir, instr, dst, src):
return punpck(ir, instr, dst, src, 64, 0)
def pinsr(_, instr, dst, src, imm, size):
e = []
@ -4707,6 +4706,52 @@ def unpcklpd(_, instr, dst, src):
e.append(m2_expr.ExprAssign(dst, src))
return e, []
def pmovsxwd(ir, instr, dst, src):
out = []
for i in range(4):
lane = src[16 * i:16 * (i + 1)]
out.append(lane.signExtend(32))
return [m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out))], []
def pmovsxwq(ir, instr, dst, src):
e = []
if dst.size != 128:
raise RuntimeError("Unsupported size %d" % dst.size)
out = []
for i in range(2):
w = src[16 * i:16 * (i + 1)]
out.append(w.signExtend(64))
e.append(m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out)))
return e, []
def pmovmskb(ir, instr, dst, src):
e = []
e.append(m2_expr.ExprAssign(dst, src.zeroExtend(dst.size)))
return e, []
def pmovsxbd(ir, instr, dst, src):
e = []
if dst.size != 128:
raise RuntimeError("Unsupported size %d" % dst.size)
out = []
for i in range(4):
b = src[8 * i: 8 * (i + 1)]
out.append(b.signExtend(32))
e.append(m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out)))
return e, []
def pmovsxdq(_, instr, dst, src):
e = []
if dst.size != 128:
raise RuntimeError("Unsupported size %d" % dst.size)
out = []
for i in range(2):
d = src[32 * i: 32 * (i + 1)]
out.append(d.signExtend(64))
e.append(m2_expr.ExprAssign(dst, m2_expr.ExprCompose(*out)))
return e, []
def movlpd(_, instr, dst, src):
e = []
@ -5783,6 +5828,10 @@ mnemo_func = {'mov': mov,
"sqrtss": sqrtss,
"pmovmskb": pmovmskb,
"pmovsxwd": pmovsxwd,
"pmovsxwq": pmovsxwq,
"pmovsxbd": pmovsxbd,
"pmovsxdq": pmovsxdq,
"phminposuw": phminposuw,