diff options
Diffstat (limited to 'miasm2/arch/x86/sem.py')
| -rw-r--r-- | miasm2/arch/x86/sem.py | 88 |
1 files changed, 88 insertions, 0 deletions
diff --git a/miasm2/arch/x86/sem.py b/miasm2/arch/x86/sem.py index f3ede000..f9204b6b 100644 --- a/miasm2/arch/x86/sem.py +++ b/miasm2/arch/x86/sem.py @@ -2448,6 +2448,86 @@ def fwait(ir, instr): return [], None +def fcmovb(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cf, lbl_do, lbl_skip))) + return e, [irbloc(lbl_do.name, [e_do])] + + +def fcmove(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(zf, lbl_do, lbl_skip))) + return e, [irbloc(lbl_do.name, [e_do])] + + +def fcmovbe(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cf | zf, lbl_do, lbl_skip))) + return e, [irbloc(lbl_do.name, [e_do])] + + +def fcmovu(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(pf, lbl_do, lbl_skip))) + return e, [irbloc(lbl_do.name, [e_do])] + + +def fcmovnb(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cf, lbl_skip, lbl_do))) + return e, [irbloc(lbl_do.name, [e_do])] + + +def fcmovne(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(zf, lbl_skip, lbl_do))) + return e, [irbloc(lbl_do.name, [e_do])] + + +def fcmovnbe(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(cf | zf, lbl_skip, lbl_do))) + return e, [irbloc(lbl_do.name, [e_do])] + + +def fcmovnu(ir, instr, a, b): + e = [] + lbl_do = m2_expr.ExprId(ir.gen_label(), instr.mode) + lbl_skip = m2_expr.ExprId(ir.get_next_label(instr), instr.mode) + e_do, extra_irs = [m2_expr.ExprAff(a, b)], [] + e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) + e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(pf, lbl_skip, lbl_do))) + return e, [irbloc(lbl_do.name, [e_do])] + + def nop(ir, instr, a=None): return [], [] @@ -3636,6 +3716,14 @@ mnemo_func = {'mov': mov, 'fnstcw': fnstcw, 'fldcw': fldcw, 'fwait': fwait, + 'fcmovb': fcmovb, + 'fcmove': fcmove, + 'fcmovbe': fcmovbe, + 'fcmovu': fcmovu, + 'fcmovnb': fcmovnb, + 'fcmovne': fcmovne, + 'fcmovnbe': fcmovnbe, + 'fcmovnu': fcmovnu, 'fnstenv': fnstenv, 'sidt': sidt, 'sldt': sldt, |