diff options
| author | serpilliere <fabrice.desclaux@cea.fr> | 2015-10-18 18:04:14 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2015-10-23 10:47:24 +0200 |
| commit | d71411450ea11bff5fcaad165fa2fa06483783ee (patch) | |
| tree | ef834784eb0dcc0f94aed3e6793e81c67c90afc7 | |
| parent | 915ad8950a21c688a8c147c8d7ccda78d10306fe (diff) | |
| download | miasm-d71411450ea11bff5fcaad165fa2fa06483783ee.tar.gz miasm-d71411450ea11bff5fcaad165fa2fa06483783ee.zip | |
Arch/x86/sem: add fcmovcc
| -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, |