@@ -139,12 +139,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
139
139
Scalar :: from_uint ( 1u128 << ( num_bits - 1 ) , Size :: from_bits ( num_bits) )
140
140
}
141
141
} 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) )
148
143
} ;
149
144
self . write_scalar ( val, dest) ?;
150
145
} else {
@@ -158,12 +153,17 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M>
158
153
if overflowed {
159
154
let first_term: u128 = l. to_scalar ( ) ?. to_bits ( l. layout . size ) ?;
160
155
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
+ }
164
164
} 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) )
167
167
} ;
168
168
self . write_scalar ( val, dest) ?;
169
169
} else {
0 commit comments