def _translate_bsh(self, oprnd1, oprnd2, oprnd3): """Return a formula representation of a BSH instruction. """ assert oprnd1.size and oprnd2.size and oprnd3.size assert oprnd1.size == oprnd2.size op1_var = self._translate_src_oprnd(oprnd1) op2_var = self._translate_src_oprnd(oprnd2) op3_var, _ = self._translate_dst_oprnd(oprnd3) if oprnd3.size > oprnd1.size: op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size) op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size) op2_var_neg = (-op2_var) op2_var_neg_sx = smtlibv2.SEXTEND(op2_var_neg, oprnd2.size, oprnd3.size) shl = smtlibv2.EXTRACT(op1_var_zx >> op2_var_neg_sx, 0, op3_var.size) shr = smtlibv2.EXTRACT(op1_var_zx << op2_var_zx, 0, op3_var.size) elif oprnd3.size < oprnd1.size: shl = smtlibv2.EXTRACT(op1_var >> (-op2_var), 0, op3_var.size) shr = smtlibv2.EXTRACT(op1_var << op2_var, 0, op3_var.size) else: shl = op1_var >> (-op2_var) shr = op1_var << op2_var return [(op3_var == smtlibv2.ITEBV(oprnd3.size, op2_var >= 0, shr, shl))]
def _translate_mod(self, oprnd1, oprnd2, oprnd3): """Return a formula representation of an MOD instruction. """ assert oprnd1.size and oprnd2.size and oprnd3.size assert oprnd1.size == oprnd2.size # assert oprnd2.size == oprnd3.size op1_var = self._translate_src_oprnd(oprnd1) op2_var = self._translate_src_oprnd(oprnd2) op3_var, parent_reg_constrs = self._translate_dst_oprnd(oprnd3) if oprnd1.size == oprnd3.size: expr = [(op3_var == (op1_var % op2_var))] elif oprnd3.size > oprnd1.size: op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size) op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size) expr = [(op3_var == (op1_var_zx % op2_var_zx))] else: raise Exception("Error") rv = expr if parent_reg_constrs: rv += parent_reg_constrs return rv
def _translate_mul(self, oprnd1, oprnd2, oprnd3): """Return a formula representation of an MUL instruction. """ assert oprnd1.size and oprnd2.size and oprnd3.size assert oprnd1.size == oprnd2.size op1_var = self._translate_src_oprnd(oprnd1) op2_var = self._translate_src_oprnd(oprnd2) op3_var, parent_reg_constrs = self._translate_dst_oprnd(oprnd3) if oprnd3.size > oprnd1.size: op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size) op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size) expr = (op3_var == op1_var_zx * op2_var_zx) elif oprnd3.size < oprnd1.size: mul_extract = smtlibv2.EXTRACT(op1_var * op2_var, 0, oprnd3.size) expr = (op3_var == mul_extract) else: expr = (op3_var == (op1_var * op2_var)) rv = [expr] if parent_reg_constrs: rv += parent_reg_constrs return rv
def _translate_sub(self, oprnd1, oprnd2, oprnd3): """Return a formula representation of an SUB instruction. """ assert oprnd1.size and oprnd2.size and oprnd3.size assert oprnd1.size == oprnd2.size op1_var = self._translate_src_oprnd(oprnd1) op2_var = self._translate_src_oprnd(oprnd2) op3_var, _ = self._translate_dst_oprnd(oprnd3) if oprnd3.size > oprnd1.size: op1_var_zx = smtlibv2.ZEXTEND(op1_var, oprnd3.size) op2_var_zx = smtlibv2.ZEXTEND(op2_var, oprnd3.size) expr = (op3_var == (op1_var_zx - op2_var_zx)) elif oprnd3.size < oprnd1.size: sub_extract = smtlibv2.EXTRACT(op1_var - op2_var, 0, oprnd3.size) expr = (op3_var == sub_extract) else: expr = (op3_var == (op1_var - op2_var)) return [expr]