1
1
use either:: Either ;
2
2
use rustc_abi:: Endian ;
3
- use rustc_apfloat:: ieee:: { Double , Single } ;
3
+ use rustc_apfloat:: ieee:: { Double , Half , Quad , Single } ;
4
4
use rustc_apfloat:: { Float , Round } ;
5
5
use rustc_middle:: mir:: interpret:: { InterpErrorKind , UndefinedBehaviorInfo } ;
6
6
use rustc_middle:: ty:: FloatTy ;
@@ -120,10 +120,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
120
120
let op = op. to_scalar ( ) ;
121
121
// "Bitwise" operation, no NaN adjustments
122
122
match float_ty {
123
- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
123
+ FloatTy :: F16 => Scalar :: from_f16 ( op . to_f16 ( ) ? . abs ( ) ) ,
124
124
FloatTy :: F32 => Scalar :: from_f32 ( op. to_f32 ( ) ?. abs ( ) ) ,
125
125
FloatTy :: F64 => Scalar :: from_f64 ( op. to_f64 ( ) ?. abs ( ) ) ,
126
- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
126
+ FloatTy :: F128 => Scalar :: from_f128 ( op . to_f128 ( ) ? . abs ( ) ) ,
127
127
}
128
128
}
129
129
Op :: Round ( rounding) => {
@@ -136,10 +136,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
136
136
} ;
137
137
let op = op. to_scalar ( ) ;
138
138
match float_ty {
139
- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
139
+ FloatTy :: F16 => self . float_round :: < Half > ( op , rounding ) ? ,
140
140
FloatTy :: F32 => self . float_round :: < Single > ( op, rounding) ?,
141
141
FloatTy :: F64 => self . float_round :: < Double > ( op, rounding) ?,
142
- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
142
+ FloatTy :: F128 => self . float_round :: < Quad > ( op , rounding ) ? ,
143
143
}
144
144
}
145
145
Op :: Numeric ( name) => {
@@ -716,10 +716,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
716
716
} ;
717
717
718
718
let val = match float_ty {
719
- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
719
+ FloatTy :: F16 => self . float_muladd :: < Half > ( a , b , c , typ ) ? ,
720
720
FloatTy :: F32 => self . float_muladd :: < Single > ( a, b, c, typ) ?,
721
721
FloatTy :: F64 => self . float_muladd :: < Double > ( a, b, c, typ) ?,
722
- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
722
+ FloatTy :: F128 => self . float_muladd :: < Quad > ( a , b , c , typ ) ? ,
723
723
} ;
724
724
self . write_scalar ( val, & dest) ?;
725
725
}
@@ -747,10 +747,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
747
747
let left = left. to_scalar ( ) ;
748
748
let right = right. to_scalar ( ) ;
749
749
interp_ok ( match float_ty {
750
- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
750
+ FloatTy :: F16 => self . float_minmax :: < Half > ( left , right , op ) ? ,
751
751
FloatTy :: F32 => self . float_minmax :: < Single > ( left, right, op) ?,
752
752
FloatTy :: F64 => self . float_minmax :: < Double > ( left, right, op) ?,
753
- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
753
+ FloatTy :: F128 => self . float_minmax :: < Quad > ( left , right , op ) ? ,
754
754
} )
755
755
}
756
756
}
0 commit comments