@@ -54,8 +54,7 @@ exprt update_bit_exprt::lower() const
5454 typecast_exprt (src (), src_bv_type), bitnot_exprt (mask_shifted));
5555
5656 // 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};
5958
6059 // shift the replacement bits
6160 auto new_value_shifted = shl_exprt (new_value_casted, index ());
@@ -85,7 +84,7 @@ exprt update_bits_exprt::lower() const
8584 bitand_exprt (typecast_exprt (src (), src_bv_type), mask_shifted);
8685
8786 // 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} ;
8988
9089 // shift the replacement bits
9190 auto new_value_shifted = shl_exprt (new_value_casted, index ());
@@ -279,3 +278,19 @@ exprt find_first_set_exprt::lower() const
279278
280279 return typecast_exprt::conditional_cast (result, type ());
281280}
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