11use std:: assert_matches:: assert_matches;
22
3- use rustc_apfloat:: ieee:: { Double , Single } ;
3+ use rustc_apfloat:: ieee:: { Double , Half , Quad , Single } ;
44use rustc_apfloat:: { Float , FloatConvert } ;
55use rustc_middle:: mir:: interpret:: { InterpResult , PointerArithmetic , Scalar } ;
66use rustc_middle:: mir:: CastKind ;
@@ -189,10 +189,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
189189 bug ! ( "FloatToFloat/FloatToInt cast: source type {} is not a float type" , src. layout. ty)
190190 } ;
191191 let val = match fty {
192- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
192+ FloatTy :: F16 => self . cast_from_float ( src . to_scalar ( ) . to_f16 ( ) ? , cast_to . ty ) ,
193193 FloatTy :: F32 => self . cast_from_float ( src. to_scalar ( ) . to_f32 ( ) ?, cast_to. ty ) ,
194194 FloatTy :: F64 => self . cast_from_float ( src. to_scalar ( ) . to_f64 ( ) ?, cast_to. ty ) ,
195- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
195+ FloatTy :: F128 => self . cast_from_float ( src . to_scalar ( ) . to_f128 ( ) ? , cast_to . ty ) ,
196196 } ;
197197 Ok ( ImmTy :: from_scalar ( val, cast_to) )
198198 }
@@ -298,18 +298,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
298298 Float ( fty) if signed => {
299299 let v = v as i128 ;
300300 match fty {
301- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
301+ FloatTy :: F16 => Scalar :: from_f16 ( Half :: from_i128 ( v ) . value ) ,
302302 FloatTy :: F32 => Scalar :: from_f32 ( Single :: from_i128 ( v) . value ) ,
303303 FloatTy :: F64 => Scalar :: from_f64 ( Double :: from_i128 ( v) . value ) ,
304- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
304+ FloatTy :: F128 => Scalar :: from_f128 ( Quad :: from_i128 ( v ) . value ) ,
305305 }
306306 }
307307 // unsigned int -> float
308308 Float ( fty) => match fty {
309- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
309+ FloatTy :: F16 => Scalar :: from_f16 ( Half :: from_u128 ( v ) . value ) ,
310310 FloatTy :: F32 => Scalar :: from_f32 ( Single :: from_u128 ( v) . value ) ,
311311 FloatTy :: F64 => Scalar :: from_f64 ( Double :: from_u128 ( v) . value ) ,
312- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
312+ FloatTy :: F128 => Scalar :: from_f128 ( Quad :: from_u128 ( v ) . value ) ,
313313 } ,
314314
315315 // u8 -> char
@@ -323,7 +323,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
323323 /// Low-level cast helper function. Converts an apfloat `f` into int or float types.
324324 fn cast_from_float < F > ( & self , f : F , dest_ty : Ty < ' tcx > ) -> Scalar < M :: Provenance >
325325 where
326- F : Float + Into < Scalar < M :: Provenance > > + FloatConvert < Single > + FloatConvert < Double > ,
326+ F : Float
327+ + Into < Scalar < M :: Provenance > >
328+ + FloatConvert < Half >
329+ + FloatConvert < Single >
330+ + FloatConvert < Double >
331+ + FloatConvert < Quad > ,
327332 {
328333 use rustc_type_ir:: TyKind :: * ;
329334
@@ -360,10 +365,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
360365 }
361366 // float -> float
362367 Float ( fty) => match fty {
363- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
368+ FloatTy :: F16 => Scalar :: from_f16 ( adjust_nan ( self , f , f . convert ( & mut false ) . value ) ) ,
364369 FloatTy :: F32 => Scalar :: from_f32 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) ) ,
365370 FloatTy :: F64 => Scalar :: from_f64 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) ) ,
366- FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
371+ FloatTy :: F128 => {
372+ Scalar :: from_f128 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) )
373+ }
367374 } ,
368375 // That's it.
369376 _ => span_bug ! ( self . cur_span( ) , "invalid float to {} cast" , dest_ty) ,
0 commit comments