@@ -43,7 +43,7 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M>
43
43
bin_op : mir:: BinOp ,
44
44
l : char ,
45
45
r : char ,
46
- ) -> InterpResult < ' tcx , ( Scalar < M :: PointerTag > , bool ) > {
46
+ ) -> ( Scalar < M :: PointerTag > , bool ) {
47
47
use rustc:: mir:: BinOp :: * ;
48
48
49
49
let res = match bin_op {
@@ -55,15 +55,15 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M>
55
55
Ge => l >= r,
56
56
_ => bug ! ( "Invalid operation on char: {:?}" , bin_op) ,
57
57
} ;
58
- return Ok ( ( Scalar :: from_bool ( res) , false ) ) ;
58
+ return ( Scalar :: from_bool ( res) , false ) ;
59
59
}
60
60
61
61
fn binary_bool_op (
62
62
& self ,
63
63
bin_op : mir:: BinOp ,
64
64
l : bool ,
65
65
r : bool ,
66
- ) -> InterpResult < ' tcx , ( Scalar < M :: PointerTag > , bool ) > {
66
+ ) -> ( Scalar < M :: PointerTag > , bool ) {
67
67
use rustc:: mir:: BinOp :: * ;
68
68
69
69
let res = match bin_op {
@@ -78,44 +78,32 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M>
78
78
BitXor => l ^ r,
79
79
_ => bug ! ( "Invalid operation on bool: {:?}" , bin_op) ,
80
80
} ;
81
- return Ok ( ( Scalar :: from_bool ( res) , false ) ) ;
81
+ return ( Scalar :: from_bool ( res) , false ) ;
82
82
}
83
83
84
- fn binary_float_op (
84
+ fn binary_float_op < F : Float + Into < Scalar < M :: PointerTag > > > (
85
85
& self ,
86
86
bin_op : mir:: BinOp ,
87
- fty : FloatTy ,
88
- // passing in raw bits
89
- l : u128 ,
90
- r : u128 ,
91
- ) -> InterpResult < ' tcx , ( Scalar < M :: PointerTag > , bool ) > {
87
+ l : F ,
88
+ r : F ,
89
+ ) -> ( Scalar < M :: PointerTag > , bool ) {
92
90
use rustc:: mir:: BinOp :: * ;
93
91
94
- macro_rules! float_math {
95
- ( $ty: path, $from_float: ident) => { {
96
- let l = <$ty>:: from_bits( l) ;
97
- let r = <$ty>:: from_bits( r) ;
98
- let val = match bin_op {
99
- Eq => Scalar :: from_bool( l == r) ,
100
- Ne => Scalar :: from_bool( l != r) ,
101
- Lt => Scalar :: from_bool( l < r) ,
102
- Le => Scalar :: from_bool( l <= r) ,
103
- Gt => Scalar :: from_bool( l > r) ,
104
- Ge => Scalar :: from_bool( l >= r) ,
105
- Add => Scalar :: $from_float( ( l + r) . value) ,
106
- Sub => Scalar :: $from_float( ( l - r) . value) ,
107
- Mul => Scalar :: $from_float( ( l * r) . value) ,
108
- Div => Scalar :: $from_float( ( l / r) . value) ,
109
- Rem => Scalar :: $from_float( ( l % r) . value) ,
110
- _ => bug!( "invalid float op: `{:?}`" , bin_op) ,
111
- } ;
112
- return Ok ( ( val, false ) ) ;
113
- } } ;
114
- }
115
- match fty {
116
- FloatTy :: F32 => float_math ! ( Single , from_f32) ,
117
- FloatTy :: F64 => float_math ! ( Double , from_f64) ,
118
- }
92
+ let val = match bin_op {
93
+ Eq => Scalar :: from_bool ( l == r) ,
94
+ Ne => Scalar :: from_bool ( l != r) ,
95
+ Lt => Scalar :: from_bool ( l < r) ,
96
+ Le => Scalar :: from_bool ( l <= r) ,
97
+ Gt => Scalar :: from_bool ( l > r) ,
98
+ Ge => Scalar :: from_bool ( l >= r) ,
99
+ Add => ( l + r) . value . into ( ) ,
100
+ Sub => ( l - r) . value . into ( ) ,
101
+ Mul => ( l * r) . value . into ( ) ,
102
+ Div => ( l / r) . value . into ( ) ,
103
+ Rem => ( l % r) . value . into ( ) ,
104
+ _ => bug ! ( "invalid float op: `{:?}`" , bin_op) ,
105
+ } ;
106
+ return ( val, false ) ;
119
107
}
120
108
121
109
fn binary_int_op (
@@ -284,21 +272,24 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> InterpretCx<'a, 'mir, 'tcx, M>
284
272
match left. layout . ty . sty {
285
273
ty:: Char => {
286
274
assert_eq ! ( left. layout. ty, right. layout. ty) ;
287
- let left = left. to_scalar ( ) ?. to_char ( ) ? ;
288
- let right = right. to_scalar ( ) ?. to_char ( ) ? ;
289
- self . binary_char_op ( bin_op, left, right)
275
+ let left = left. to_scalar ( ) ?;
276
+ let right = right. to_scalar ( ) ?;
277
+ Ok ( self . binary_char_op ( bin_op, left. to_char ( ) ? , right. to_char ( ) ? ) )
290
278
}
291
279
ty:: Bool => {
292
280
assert_eq ! ( left. layout. ty, right. layout. ty) ;
293
- let left = left. to_scalar ( ) ?. to_bool ( ) ? ;
294
- let right = right. to_scalar ( ) ?. to_bool ( ) ? ;
295
- self . binary_bool_op ( bin_op, left, right)
281
+ let left = left. to_scalar ( ) ?;
282
+ let right = right. to_scalar ( ) ?;
283
+ Ok ( self . binary_bool_op ( bin_op, left. to_bool ( ) ? , right. to_bool ( ) ? ) )
296
284
}
297
285
ty:: Float ( fty) => {
298
286
assert_eq ! ( left. layout. ty, right. layout. ty) ;
299
- let left = left. to_bits ( ) ?;
300
- let right = right. to_bits ( ) ?;
301
- self . binary_float_op ( bin_op, fty, left, right)
287
+ let left = left. to_scalar ( ) ?;
288
+ let right = right. to_scalar ( ) ?;
289
+ Ok ( match fty {
290
+ FloatTy :: F32 => self . binary_float_op ( bin_op, left. to_f32 ( ) ?, right. to_f32 ( ) ?) ,
291
+ FloatTy :: F64 => self . binary_float_op ( bin_op, left. to_f64 ( ) ?, right. to_f64 ( ) ?) ,
292
+ } )
302
293
}
303
294
_ => {
304
295
// Must be integer(-like) types. Don't forget about == on fn pointers.
0 commit comments