@@ -55,6 +55,17 @@ pub fn clif_int_or_float_cast(
55
55
) -> Value {
56
56
let from_ty = fx. bcx . func . dfg . value_type ( from) ;
57
57
58
+ macro call_float_cvt_intrinsic ( $fmt: literal, $sign_name: literal, $from_ty: expr, $to_ty: expr) {
59
+ let intrinsic_sign_name = if from_signed { "" } else { $sign_name } ;
60
+ let intrinsic_float_name = match to_ty {
61
+ types:: F32 => "s" ,
62
+ types:: F64 => "d" ,
63
+ _ => unreachable ! ( "{:?}" , to_ty) ,
64
+ } ;
65
+ let intrinsic_name = format ! ( $fmt, sign=intrinsic_sign_name, flt=intrinsic_float_name) ;
66
+ return fx. easy_call ( & intrinsic_name, & [ CValue :: by_val ( from, fx. layout_of ( $from_ty) ) ] , $to_ty) . load_scalar ( fx) ;
67
+ }
68
+
58
69
if from_ty. is_int ( ) && to_ty. is_int ( ) {
59
70
// int-like -> int-like
60
71
clif_intcast (
@@ -65,7 +76,21 @@ pub fn clif_int_or_float_cast(
65
76
)
66
77
} else if from_ty. is_int ( ) && to_ty. is_float ( ) {
67
78
if from_ty == types:: I128 {
68
- unimpl ! ( "u/i128 -> float" ) ;
79
+ // _______ss__f_
80
+ // __float tisf: i128 -> f32
81
+ // __float tidf: i128 -> f64
82
+ // __floatuntisf: u128 -> f32
83
+ // __floatuntidf: u128 -> f64
84
+ call_float_cvt_intrinsic ! ( "__float{sign}ti{flt}f" , "un" , if from_signed {
85
+ fx. tcx. types. i128
86
+ } else {
87
+ fx. tcx. types. u128
88
+ } ,
89
+ match to_ty {
90
+ types:: F32 => fx. tcx. types. f32 ,
91
+ types:: F64 => fx. tcx. types. f64 ,
92
+ _ => unreachable!( ) ,
93
+ } ) ;
69
94
}
70
95
71
96
// int-like -> float
@@ -76,7 +101,21 @@ pub fn clif_int_or_float_cast(
76
101
}
77
102
} else if from_ty. is_float ( ) && to_ty. is_int ( ) {
78
103
if to_ty == types:: I128 {
79
- unimpl ! ( "float -> u/i128" ) ;
104
+ // _____sssf___
105
+ // __fix sfti: f32 -> i128
106
+ // __fix dfti: f64 -> i128
107
+ // __fixunssfti: f32 -> u128
108
+ // __fixunsdfti: f64 -> u128
109
+ call_float_cvt_intrinsic ! ( "__fix{sign}{flt}fti" , "uns" , match from_ty {
110
+ types:: F32 => fx. tcx. types. f32 ,
111
+ types:: F64 => fx. tcx. types. f64 ,
112
+ _ => unreachable!( ) ,
113
+ } ,
114
+ if to_signed {
115
+ fx. tcx. types. i128
116
+ } else {
117
+ fx. tcx. types. u128
118
+ } ) ;
80
119
}
81
120
82
121
// float -> int-like
0 commit comments