1
1
use std:: assert_matches:: assert_matches;
2
2
3
- use rustc_apfloat:: ieee:: { Double , Single } ;
3
+ use rustc_apfloat:: ieee:: { Double , Half , Quad , Single } ;
4
4
use rustc_apfloat:: { Float , FloatConvert } ;
5
5
use rustc_middle:: mir:: interpret:: { InterpResult , PointerArithmetic , Scalar } ;
6
6
use rustc_middle:: mir:: CastKind ;
@@ -189,10 +189,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
189
189
bug ! ( "FloatToFloat/FloatToInt cast: source type {} is not a float type" , src. layout. ty)
190
190
} ;
191
191
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 ) ,
193
193
FloatTy :: F32 => self . cast_from_float ( src. to_scalar ( ) . to_f32 ( ) ?, cast_to. ty ) ,
194
194
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 ) ,
196
196
} ;
197
197
Ok ( ImmTy :: from_scalar ( val, cast_to) )
198
198
}
@@ -298,18 +298,18 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
298
298
Float ( fty) if signed => {
299
299
let v = v as i128 ;
300
300
match fty {
301
- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
301
+ FloatTy :: F16 => Scalar :: from_f16 ( Half :: from_i128 ( v ) . value ) ,
302
302
FloatTy :: F32 => Scalar :: from_f32 ( Single :: from_i128 ( v) . value ) ,
303
303
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 ) ,
305
305
}
306
306
}
307
307
// unsigned int -> float
308
308
Float ( fty) => match fty {
309
- FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
309
+ FloatTy :: F16 => Scalar :: from_f16 ( Half :: from_u128 ( v ) . value ) ,
310
310
FloatTy :: F32 => Scalar :: from_f32 ( Single :: from_u128 ( v) . value ) ,
311
311
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 ) ,
313
313
} ,
314
314
315
315
// u8 -> char
@@ -323,7 +323,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
323
323
/// Low-level cast helper function. Converts an apfloat `f` into int or float types.
324
324
fn cast_from_float < F > ( & self , f : F , dest_ty : Ty < ' tcx > ) -> Scalar < M :: Provenance >
325
325
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 > ,
327
332
{
328
333
use rustc_type_ir:: TyKind :: * ;
329
334
@@ -360,10 +365,12 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
360
365
}
361
366
// float -> float
362
367
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 ) ) ,
364
369
FloatTy :: F32 => Scalar :: from_f32 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) ) ,
365
370
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
+ }
367
374
} ,
368
375
// That's it.
369
376
_ => span_bug ! ( self . cur_span( ) , "invalid float to {} cast" , dest_ty) ,
0 commit comments