def do_F2I(op, stack, state): prev_type = state.esil["type"] state.esil["type"] = FLOAT val, = pop_values(stack, state) stack.append(z3.fpToUBV(FPM, val, z3.BitVecSort(SIZE))) state.esil["type"] = prev_type
def _fptoui(term, smt): v = smt.eval(term.arg) src = smt.type(term.arg) tgt = smt.type(term) # TODO: don't generate trivial conds return smt._conditional_conv_value([0 <= v, v <= (2**tgt.width) - 1], z3.fpToUBV(z3.RTZ(), v, _ty_sort(tgt)), term.name)
def _fptoui(term, smt): v = smt.eval(term.arg) src = smt.type(term.arg) tgt = smt.type(term) # TODO: don't generate trivial conds return smt._conditional_conv_value( [0 <= v, v <= (2**tgt.width)-1], z3.fpToUBV(z3.RTZ(), v, _ty_sort(tgt)), term.name)
def do_I2F(op, stack, state): val, = pop_values(stack, state) if z3.is_bv_value(val): fp = z3.FPVal(val.as_long(), FSIZE) else: fp = z3.FP("fp%d" % float_data["count"], FSIZE) state.solver.add(z3.fpToUBV(FPM, fp, z3.BitVecSort(SIZE)) == val) float_data["count"] += 1 stack.append(fp)
def _op_raw_fpToUBV(self, rm, fp, bv_len): return z3.fpToUBV(rm, fp, z3.BitVecSort(bv_len, ctx=self._context))
def fpToUBV(rm, fp, bv_len): return z3.fpToUBV(rm, fp, z3.BitVecSort(bv_len))
def _fptoui(term, smt): x = smt.eval(term._args[0]) tgt = smt.type(term) return z3.fpToUBV(z3.RTZ(), x, _ty_sort(tgt))