diff --git a/miasm/arch/x86/arch.py b/miasm/arch/x86/arch.py index 32265f5f..5f5aba45 100644 --- a/miasm/arch/x86/arch.py +++ b/miasm/arch/x86/arch.py @@ -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] + diff --git a/miasm/arch/x86/sem.py b/miasm/arch/x86/sem.py index a48748b0..a5e54635 100644 --- a/miasm/arch/x86/sem.py +++ b/miasm/arch/x86/sem.py @@ -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,