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