@@ -182,13 +182,14 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
182
182
) -> InterpResult < ' tcx , ImmTy < ' tcx , M :: Provenance > > {
183
183
use rustc_type_ir:: TyKind :: * ;
184
184
185
- let val = match src. layout . ty . kind ( ) {
186
- // Floating point
187
- Float ( FloatTy :: F32 ) => self . cast_from_float ( src. to_scalar ( ) . to_f32 ( ) ?, cast_to. ty ) ,
188
- Float ( FloatTy :: F64 ) => self . cast_from_float ( src. to_scalar ( ) . to_f64 ( ) ?, cast_to. ty ) ,
189
- _ => {
190
- bug ! ( "Can't cast 'Float' type into {}" , cast_to. ty) ;
191
- }
185
+ let Float ( fty) = src. layout . ty . kind ( ) else {
186
+ bug ! ( "FloatToFloat/FloatToInt cast: source type {} is not a float type" , src. layout. ty)
187
+ } ;
188
+ let val = match fty {
189
+ FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
190
+ FloatTy :: F32 => self . cast_from_float ( src. to_scalar ( ) . to_f32 ( ) ?, cast_to. ty ) ,
191
+ FloatTy :: F64 => self . cast_from_float ( src. to_scalar ( ) . to_f64 ( ) ?, cast_to. ty ) ,
192
+ FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
192
193
} ;
193
194
Ok ( ImmTy :: from_scalar ( val, cast_to) )
194
195
}
@@ -275,6 +276,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
275
276
trace ! ( "cast_from_scalar: {}, {} -> {}" , v, src_layout. ty, cast_ty) ;
276
277
277
278
Ok ( match * cast_ty. kind ( ) {
279
+ // int -> int
278
280
Int ( _) | Uint ( _) => {
279
281
let size = match * cast_ty. kind ( ) {
280
282
Int ( t) => Integer :: from_int_ty ( self , t) . size ( ) ,
@@ -285,15 +287,26 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
285
287
Scalar :: from_uint ( v, size)
286
288
}
287
289
288
- Float ( FloatTy :: F32 ) if signed => Scalar :: from_f32 ( Single :: from_i128 ( v as i128 ) . value ) ,
289
- Float ( FloatTy :: F64 ) if signed => Scalar :: from_f64 ( Double :: from_i128 ( v as i128 ) . value ) ,
290
- Float ( FloatTy :: F32 ) => Scalar :: from_f32 ( Single :: from_u128 ( v) . value ) ,
291
- Float ( FloatTy :: F64 ) => Scalar :: from_f64 ( Double :: from_u128 ( v) . value ) ,
292
-
293
- Char => {
294
- // `u8` to `char` cast
295
- Scalar :: from_u32 ( u8:: try_from ( v) . unwrap ( ) . into ( ) )
290
+ // signed int -> float
291
+ Float ( fty) if signed => {
292
+ let v = v as i128 ;
293
+ match fty {
294
+ FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
295
+ FloatTy :: F32 => Scalar :: from_f32 ( Single :: from_i128 ( v) . value ) ,
296
+ FloatTy :: F64 => Scalar :: from_f64 ( Double :: from_i128 ( v) . value ) ,
297
+ FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
298
+ }
296
299
}
300
+ // unsigned int -> float
301
+ Float ( fty) => match fty {
302
+ FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
303
+ FloatTy :: F32 => Scalar :: from_f32 ( Single :: from_u128 ( v) . value ) ,
304
+ FloatTy :: F64 => Scalar :: from_f64 ( Double :: from_u128 ( v) . value ) ,
305
+ FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
306
+ } ,
307
+
308
+ // u8 -> char
309
+ Char => Scalar :: from_u32 ( u8:: try_from ( v) . unwrap ( ) . into ( ) ) ,
297
310
298
311
// Casts to bool are not permitted by rustc, no need to handle them here.
299
312
_ => span_bug ! ( self . cur_span( ) , "invalid int to {} cast" , cast_ty) ,
@@ -339,14 +352,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> {
339
352
let v = f. to_i128 ( size. bits_usize ( ) ) . value ;
340
353
Scalar :: from_int ( v, size)
341
354
}
342
- // float -> f32
343
- Float ( FloatTy :: F32 ) => {
344
- Scalar :: from_f32 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) )
345
- }
346
- // float -> f64
347
- Float ( FloatTy :: F64 ) => {
348
- Scalar :: from_f64 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) )
349
- }
355
+ // float -> float
356
+ Float ( fty) => match fty {
357
+ FloatTy :: F16 => unimplemented ! ( "f16_f128" ) ,
358
+ FloatTy :: F32 => Scalar :: from_f32 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) ) ,
359
+ FloatTy :: F64 => Scalar :: from_f64 ( adjust_nan ( self , f, f. convert ( & mut false ) . value ) ) ,
360
+ FloatTy :: F128 => unimplemented ! ( "f16_f128" ) ,
361
+ } ,
350
362
// That's it.
351
363
_ => span_bug ! ( self . cur_span( ) , "invalid float to {} cast" , dest_ty) ,
352
364
}
0 commit comments