def do_F2F(op, stack, state): prev_type = state.esil["type"] state.esil["type"] = FLOAT val, size = pop_values(stack, state, 2) fp_sort = fp_size_to_sort(size) stack.append(z3.fpFPToFP(FPM, val, fp_sort)) state.esil["type"] = prev_type
def do_D2F(op, stack, state): prev_type = state.esil["type"] state.esil["type"] = FLOAT val, = pop_values(stack, state) state.esil["type"] = prev_type size, = pop_values(stack, state) fp_sort = fp_size_to_sort(size) if val.sort() != fp_sort: stack.append(z3.fpFPToFP(FPM, val, fp_sort)) else: stack.append(val)
def do_F2D(op, stack, state): prev_type = state.esil["type"] state.esil["type"] = FLOAT val, = pop_values(stack, state) state.esil["type"] = prev_type size, = pop_values(stack, state) #val = z3.fpFPToFP(FPM, val, fp_sort) if val.sort() != FSIZE: #fp_sort = fp_size_to_sort(size) stack.append(z3.fpFPToFP(FPM, val, FSIZE)) else: stack.append(val)
def prepare_float(val, signext=False, size=SIZE) -> z3.FPRef: size_class = fp_size_to_sort(size) if z3.is_fp(val): result = val elif type(val) in (int, float): result = z3.FPVal(float(val), size_class) else: bv_val = z3.simplify(prepare(val, signext, size)) if bv_val.decl().name() == "fp.to_ieee_bv": result = bv_val.arg(0) else: result = z3.fpToFP(bv_val, size_class) if result.sort() != size_class: result = z3.fpFPToFP(result, size_class) return result