@@ -54,8 +54,7 @@ exprt update_bit_exprt::lower() const
54
54
typecast_exprt (src (), src_bv_type), bitnot_exprt (mask_shifted));
55
55
56
56
// zero-extend the replacement bit to match src
57
- auto new_value_casted = typecast_exprt (
58
- typecast_exprt (new_value (), unsignedbv_typet (width)), src_bv_type);
57
+ auto new_value_casted = zero_extend_exprt{new_value (), src_bv_type};
59
58
60
59
// shift the replacement bits
61
60
auto new_value_shifted = shl_exprt (new_value_casted, index ());
@@ -85,7 +84,7 @@ exprt update_bits_exprt::lower() const
85
84
bitand_exprt (typecast_exprt (src (), src_bv_type), mask_shifted);
86
85
87
86
// zero-extend or shrink the replacement bits to match src
88
- auto new_value_casted = typecast_exprt ( new_value (), src_bv_type) ;
87
+ auto new_value_casted = zero_extend_exprt{ new_value (), src_bv_type} ;
89
88
90
89
// shift the replacement bits
91
90
auto new_value_shifted = shl_exprt (new_value_casted, index ());
@@ -279,3 +278,19 @@ exprt find_first_set_exprt::lower() const
279
278
280
279
return typecast_exprt::conditional_cast (result, type ());
281
280
}
281
+
282
+ exprt zero_extend_exprt::lower () const
283
+ {
284
+ const auto old_width = to_bitvector_type (op ().type ()).get_width ();
285
+ const auto new_width = to_bitvector_type (type ()).get_width ();
286
+
287
+ if (new_width > old_width)
288
+ {
289
+ return concatenation_exprt{
290
+ bv_typet{new_width - old_width}.all_zeros_expr (), op (), type ()};
291
+ }
292
+ else // new_width <= old_width
293
+ {
294
+ return extractbits_exprt{op (), 0 , type ()};
295
+ }
296
+ }
0 commit comments