24 std::size_t old_size = bv0.size();
25 std::size_t new_size = old_size * 2;
28 const bvt &bv0_extended = bv_utils.extension(bv0, new_size, rep);
29 const bvt &bv1_extended = bv_utils.extension(bv1, new_size, rep);
31 bvt result_extended = bv_utils.multiplier(bv0_extended, bv1_extended, rep);
32 bvt bv{result_extended.begin(), result_extended.begin() + old_size};
33 bvt bv_overflow{result_extended.begin() + old_size, result_extended.end()};
37 bv.push_back(prop.
lor(bv_overflow));
42 bv_overflow.push_back(bv.back());
47 bv.push_back(!prop.
lor(all_one, all_zero));
62 std::size_t old_size = bv0.size();
63 std::size_t new_size = old_size * 2;
65 bvt result_extended = bv_utils.shift(
66 bv_utils.extension(bv0, new_size, rep0),
69 bvt bv{result_extended.begin(), result_extended.begin() + old_size};
70 bvt bv_overflow{result_extended.begin() + old_size, result_extended.end()};
75 : bv_utils.sign_bit(bv1);
78 std::size_t cmp_width = std::max(bv1.size(),
address_bits(old_size) + 1);
80 bv_utils.extension(bv1, cmp_width, rep1),
82 bv_utils.build_constant(old_size, cmp_width),
88 bv.push_back(prop.
lor(bv_overflow));
93 bv_overflow.push_back(bv.back());
97 !prop.
lequal(bv_utils.sign_bit(bv0), bv_utils.sign_bit(bv));
103 bv.push_back(prop.
lor(sign_change, !prop.
lor(all_one, all_zero)));
109 prop.
land(!neg_shift, prop.
lselect(undef, prop.
lor(bv0), bv.back()));
129 const auto plus_overflow = expr_try_dynamic_cast<plus_overflow_exprt>(expr))
131 if(bv0.size() != bv1.size())
136 if(
const auto minus = expr_try_dynamic_cast<minus_overflow_exprt>(expr))
138 if(bv0.size() != bv1.size())
144 const auto mult_overflow = expr_try_dynamic_cast<mult_overflow_exprt>(expr))
154 mult_overflow->lhs().type() == mult_overflow->rhs().type(),
155 "operands of overflow_mult expression shall have same type");
162 const auto shl_overflow = expr_try_dynamic_cast<shl_overflow_exprt>(expr))
183 const auto unary_minus_overflow =
184 expr_try_dynamic_cast<unary_minus_overflow_exprt>(expr))
199 if(expr.
id() == ID_overflow_result_unary_minus)
207 else if(expr.
operands().size() != 2)
219 if(expr.
id() == ID_overflow_result_plus)
244 for(std::size_t i = 0; i < bv0.size(); i++)
253 else if(expr.
id() == ID_overflow_result_minus)
287 for(std::size_t i = 0; i < bv0.size(); i++)
290 bv.push_back(!carry);
298 else if(expr.
id() == ID_overflow_result_mult)
307 else if(expr.
id() == ID_overflow_result_shl)