11use either:: Either ;
22use rustc_abi:: Endian ;
3- use rustc_apfloat:: ieee:: { Double , Single } ;
3+ use rustc_apfloat:: ieee:: { Double , Half , Quad , Single } ;
44use rustc_apfloat:: { Float , Round } ;
55use rustc_middle:: mir:: interpret:: { InterpErrorKind , UndefinedBehaviorInfo } ;
66use rustc_middle:: ty:: FloatTy ;
@@ -120,10 +120,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
120120 let op = op. to_scalar ( ) ;
121121 // "Bitwise" operation, no NaN adjustments
122122 match float_ty {
123- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
123+ FloatTy :: F16 => Scalar :: from_f16 ( op . to_f16 ( ) ? . abs ( ) ) ,
124124 FloatTy :: F32 => Scalar :: from_f32 ( op. to_f32 ( ) ?. abs ( ) ) ,
125125 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 ( ) ) ,
127127 }
128128 }
129129 Op :: Round ( rounding) => {
@@ -136,10 +136,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
136136 } ;
137137 let op = op. to_scalar ( ) ;
138138 match float_ty {
139- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
139+ FloatTy :: F16 => self . float_round :: < Half > ( op , rounding ) ? ,
140140 FloatTy :: F32 => self . float_round :: < Single > ( op, rounding) ?,
141141 FloatTy :: F64 => self . float_round :: < Double > ( op, rounding) ?,
142- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
142+ FloatTy :: F128 => self . float_round :: < Quad > ( op , rounding ) ? ,
143143 }
144144 }
145145 Op :: Numeric ( name) => {
@@ -716,10 +716,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
716716 } ;
717717
718718 let val = match float_ty {
719- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
719+ FloatTy :: F16 => self . float_muladd :: < Half > ( a , b , c , typ ) ? ,
720720 FloatTy :: F32 => self . float_muladd :: < Single > ( a, b, c, typ) ?,
721721 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 ) ? ,
723723 } ;
724724 self . write_scalar ( val, & dest) ?;
725725 }
@@ -747,10 +747,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
747747 let left = left. to_scalar ( ) ;
748748 let right = right. to_scalar ( ) ;
749749 interp_ok ( match float_ty {
750- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
750+ FloatTy :: F16 => self . float_minmax :: < Half > ( left , right , op ) ? ,
751751 FloatTy :: F32 => self . float_minmax :: < Single > ( left, right, op) ?,
752752 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 ) ? ,
754754 } )
755755 }
756756}
0 commit comments