def expr_simp_equal(expr_simp, e): """(x - y)?(0:1) == (x == y)""" to_match = m2_expr.ExprCond(jok1 + jok2, m2_expr.ExprInt1(0), m2_expr.ExprInt1(1)) r = __MatchExprWrap(e, to_match, [jok1, jok2]) if r is False: return e return ExprOp_equal(r[jok1], expr_simp(-r[jok2]))
def bgtz(ir, instr, a, b): """Branches on @b if the register @a is greater than zero""" e = [] n = m2_expr.ExprId(ir.get_next_break_label(instr)) cond = m2_expr.ExprCond(a, m2_expr.ExprInt1(1), m2_expr.ExprInt1(0)) | a.msb() dst_o = m2_expr.ExprCond(cond, n, b) e = [m2_expr.ExprAff(PC, dst_o), m2_expr.ExprAff(ir.IRDst, dst_o) ] return e, []
def exec_equal(expr_simp, e): "Compute x == y" if e.op != m2_expr.TOK_EQUAL: return e arg1, arg2 = e.args if isinstance(arg1, m2_expr.ExprInt) and isinstance(arg2, m2_expr.ExprInt): return m2_expr.ExprInt1(1) if (arg1.arg == arg2.arg) else m2_expr.ExprInt1(0) else: return e
def exec_inf_unsigned(expr_simp, e): "Compute x <u y" if e.op != m2_expr.TOK_INF_UNSIGNED: return e arg1, arg2 = e.args if isinstance(arg1, m2_expr.ExprInt) and isinstance(arg2, m2_expr.ExprInt): return m2_expr.ExprInt1(1) if ( arg1.arg < arg2.arg) else m2_expr.ExprInt1(0) else: return e
def __comp_signed(arg1, arg2): """Return ExprInt1(1) if arg1 <s arg2 else ExprInt1(0) @arg1, @arg2: ExprInt""" val1 = arg1.arg if val1 >> (arg1.size - 1) == 1: val1 = -(arg1.mask.arg ^ val1 + 1) val2 = arg2.arg if val2 >> (arg2.size - 1) == 1: val2 = -(arg2.mask.arg ^ val2 + 1) return m2_expr.ExprInt1(1) if (val1 < val2) else m2_expr.ExprInt1(0)
def __comp_signed(arg1, arg2): """Return ExprInt1(1) if arg1 <s arg2 else ExprInt1(0) @arg1, @arg2: ExprInt""" val1 = int(arg1) if val1 >> (arg1.size - 1) == 1: val1 = -((int(arg1.mask) ^ val1) + 1) val2 = int(arg2) if val2 >> (arg2.size - 1) == 1: val2 = -((int(arg2.mask) ^ val2) + 1) return m2_expr.ExprInt1(1) if (val1 < val2) else m2_expr.ExprInt1(0)
def update_flag_sub_cf(op1, op2, res): "Compote CF in @res = @op1 - @op2" return m2_expr.ExprAff(cf, ((((op1 ^ op2) ^ res) ^ ((op1 ^ res) & (op1 ^ op2))).msb()) ^ m2_expr.ExprInt1(1))
def update_flag_zf(a): return [ m2_expr.ExprAff( zf, m2_expr.ExprCond(a, m2_expr.ExprInt1(0), m2_expr.ExprInt1(1))) ]
return e # z = x-y (+cf?) def update_flag_sub(x, y, z): e = [] e.append(update_flag_sub_cf(x, y, z)) e.append(update_flag_sub_of(x, y, z)) return e cond2expr = { 'EQ': zf, 'NE': zf ^ m2_expr.ExprInt1(1), 'CS': cf, 'CC': cf ^ m2_expr.ExprInt1(1), 'MI': nf, 'PL': nf ^ m2_expr.ExprInt1(1), 'VS': of, 'VC': of ^ m2_expr.ExprInt1(1), 'HI': cf & (zf ^ m2_expr.ExprInt1(1)), 'LS': (cf ^ m2_expr.ExprInt1(1)) | zf, 'GE': nf ^ of ^ m2_expr.ExprInt1(1), 'LT': nf ^ of, 'GT': ((zf ^ m2_expr.ExprInt1(1)) & (nf ^ of ^ m2_expr.ExprInt1(1))), 'LE': zf | (nf ^ of), 'AL': m2_expr.ExprInt1(1), 'NV': m2_expr.ExprInt1(0) }
def to_constraint(self): cst1, cst2 = m2_expr.ExprInt1(0), m2_expr.ExprInt1(1) return m2_expr.ExprAff(cst1, m2_expr.ExprCond(self.expr, cst1, cst2))