@@ -139,12 +139,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
139139 Scalar :: from_uint ( 1u128 << ( num_bits - 1 ) , Size :: from_bits ( num_bits) )
140140 }
141141 } else {
142- if num_bits == 128 {
143- Scalar :: from_uint ( u128:: max_value ( ) , Size :: from_bits ( 128 ) )
144- } else {
145- Scalar :: from_uint ( u128:: max_value ( ) & ( ( 1 << num_bits) - 1 ) ,
146- Size :: from_bits ( num_bits) )
147- }
142+ Scalar :: from_uint ( u128:: max_value ( ) >> ( 128 - num_bits) , Size :: from_bits ( num_bits) )
148143 } ;
149144 self . write_scalar ( val, dest) ?;
150145 } else {
@@ -158,12 +153,17 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
158153 if overflowed {
159154 let first_term: u128 = l. to_scalar ( ) ?. to_bits ( l. layout . size ) ?;
160155 let num_bits = l. layout . size . bits ( ) ;
161- let val = if first_term & ( 1 << ( num_bits-1 ) ) == 0 { // first term is positive
162- // so overflow is positive
163- Scalar :: from_uint ( ( 1u128 << ( num_bits - 1 ) ) - 1 , Size :: from_bits ( num_bits) )
156+ let val = if l. layout . abi . is_signed ( ) {
157+ if first_term & ( 1 << ( num_bits-1 ) ) == 0 { // first term is positive
158+ // so overflow is positive
159+ Scalar :: from_uint ( ( 1u128 << ( num_bits - 1 ) ) - 1 , Size :: from_bits ( num_bits) )
160+ } else {
161+ // if first term negative, overflow must be negative
162+ Scalar :: from_uint ( 1u128 << ( num_bits - 1 ) , Size :: from_bits ( num_bits) )
163+ }
164164 } else {
165- // if first term negative, overflow must be negative
166- Scalar :: from_uint ( 1u128 << ( num_bits - 1 ) , Size :: from_bits ( num_bits) )
165+ // unsigned underflow saturates to 0
166+ Scalar :: from_uint ( 0u128 , Size :: from_bits ( num_bits) )
167167 } ;
168168 self . write_scalar ( val, dest) ?;
169169 } else {
0 commit comments