def _sdiv(term, smt): if isinstance(smt.type(term), FloatType): return z3.fpDiv(z3.get_current_rounding_mode(), smt.eval(term.x), smt.eval(term.y)) x = smt.eval(term.x) y = smt.eval(term.y) smt.add_safe(y != 0) return x / y
def _op_raw_fpDiv(self, rm, a, b): return z3.fpDiv(rm, a, b, ctx=self._context)
def _sdiv(term, smt): if isinstance(smt.type(term), FloatType): return z3.fpDiv(z3.get_current_rounding_mode(), smt.eval(term.x), smt.eval(term.y)) return smt.eval(term.x) / smt.eval(term.y)
defined = lambda x,y: [z3.ULT(y, y.size())], poisons = {'exact': lambda x,y: z3.LShR(x, y) << y == x})) eval.register(AndInst, BaseSMTTranslator, binop(operator.and_)) eval.register(OrInst, BaseSMTTranslator, binop(operator.or_)) eval.register(XorInst, BaseSMTTranslator, binop(operator.xor)) def fbinop(op): return lambda term,smt: smt._float_binary_operator(term, op) eval.register(FAddInst, BaseSMTTranslator, fbinop(operator.add)) eval.register(FSubInst, BaseSMTTranslator, fbinop(operator.sub)) eval.register(FMulInst, BaseSMTTranslator, fbinop(operator.mul)) eval.register(FDivInst, BaseSMTTranslator, fbinop( lambda x,y: z3.fpDiv(z3.get_default_rounding_mode(), x, y))) eval.register(FRemInst, BaseSMTTranslator, fbinop(z3.fpRem)) @doubledispatch def _eval_bitcast(src, tgt, v): """ Return SMT expression converting v from src to tgt. Assumes src and tgt have the same bit width. """ raise NotImplementedError @_eval_bitcast.register(IntType, IntType) @_eval_bitcast.register(IntType, PtrType) @_eval_bitcast.register(PtrType, IntType)
eval.register(AndInst, BaseSMTTranslator, binop(operator.and_)) eval.register(OrInst, BaseSMTTranslator, binop(operator.or_)) eval.register(XorInst, BaseSMTTranslator, binop(operator.xor)) def fbinop(op): return lambda term, smt: smt._float_binary_operator(term, op) eval.register(FAddInst, BaseSMTTranslator, fbinop(operator.add)) eval.register(FSubInst, BaseSMTTranslator, fbinop(operator.sub)) eval.register(FMulInst, BaseSMTTranslator, fbinop(operator.mul)) eval.register( FDivInst, BaseSMTTranslator, fbinop(lambda x, y: z3.fpDiv(z3.get_default_rounding_mode(), x, y))) eval.register(FRemInst, BaseSMTTranslator, fbinop(z3.fpRem)) @doubledispatch def _eval_bitcast(src, tgt, v): """ Return SMT expression converting v from src to tgt. Assumes src and tgt have the same bit width. """ raise NotImplementedError @_eval_bitcast.register(IntType, IntType) @_eval_bitcast.register(IntType, PtrType)
def __div__(self,other): assert isinstance(other,Float) and other.ne == self.ne and other.ns == self.ns return Float(val=z3.simplify(z3.fpDiv(rnd, self.z3_ds, other.z3_ds)),ne=self.ne,ns=self.ns)