def movz(ir, instr, a, b, c): lbl_do = m2_expr.ExprId(ir.gen_label(), 32) lbl_skip = m2_expr.ExprId(ir.get_next_instr(instr), 32) e_do = [] e_do.append(m2_expr.ExprAff(a, b)) e_do.append(m2_expr.ExprAff(ir.IRDst, lbl_skip)) e = [] e.append(m2_expr.ExprAff(ir.IRDst, m2_expr.ExprCond(c, lbl_skip, lbl_do))) return e, [irbloc(lbl_do.name, [e_do], [])]
def add_condition_expr(ir, instr, cond, instr_ir): if cond == COND_AL: return instr_ir, [] if not cond in tab_cond: raise ValueError('unknown condition %r' % cond) cond = tab_cond[cond] lbl_next = ExprId(ir.get_next_label(instr), 32) lbl_do = ExprId(ir.gen_label(), 32) dst_cond = ExprCond(cond, lbl_do, lbl_next) assert(isinstance(instr_ir, list)) has_irdst = False for e in instr_ir: if e.dst == ir.IRDst: has_irdst = True break if not has_irdst: instr_ir.append(ExprAff(ir.IRDst, lbl_next)) e_do = irbloc(lbl_do.name, [instr_ir]) e = [ExprAff(ir.IRDst, dst_cond)] return e, [e_do]