Exemplo n.º 1
0
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]))
Exemplo n.º 2
0
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, []
Exemplo n.º 3
0
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
Exemplo n.º 4
0
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
Exemplo n.º 5
0
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)
Exemplo n.º 6
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)
Exemplo n.º 7
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))
Exemplo n.º 8
0
def update_flag_zf(a):
    return [
        m2_expr.ExprAff(
            zf, m2_expr.ExprCond(a, m2_expr.ExprInt1(0), m2_expr.ExprInt1(1)))
    ]
Exemplo n.º 9
0
    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)
}
Exemplo n.º 10
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))