@@ -86,16 +86,42 @@ pub(crate) fn gen<'ctx, 'a>(
8686 result. as_basic_value_enum ( )
8787 }
8888
89- ( BasicValueEnum :: FloatValue ( l) , BasicValueEnum :: FloatValue ( r) ) => match operator {
90- Operator :: Greater => env. builder . build_float_compare ( FloatPredicate :: OGT , l, r, "fcmpgt" ) . unwrap ( ) . as_basic_value_enum ( ) ,
91- Operator :: Less => env. builder . build_float_compare ( FloatPredicate :: OLT , l, r, "fcmplt" ) . unwrap ( ) . as_basic_value_enum ( ) ,
92- Operator :: Equal => env. builder . build_float_compare ( FloatPredicate :: OEQ , l, r, "fcmpeq" ) . unwrap ( ) . as_basic_value_enum ( ) ,
93- Operator :: NotEqual => env. builder . build_float_compare ( FloatPredicate :: ONE , l, r, "fcmpne" ) . unwrap ( ) . as_basic_value_enum ( ) ,
94- Operator :: GreaterEqual => env. builder . build_float_compare ( FloatPredicate :: OGE , l, r, "fcmpge" ) . unwrap ( ) . as_basic_value_enum ( ) ,
95- Operator :: LessEqual => env. builder . build_float_compare ( FloatPredicate :: OLE , l, r, "fcmple" ) . unwrap ( ) . as_basic_value_enum ( ) ,
96- Operator :: Remainder => env. builder . build_float_rem ( l, r, "modtmp" ) . unwrap ( ) . as_basic_value_enum ( ) ,
97- _ => panic ! ( "Unsupported float operator" ) ,
98- } ,
89+ ( BasicValueEnum :: FloatValue ( l) , BasicValueEnum :: FloatValue ( r) ) => {
90+ let mut result: BasicValueEnum < ' ctx > = match operator {
91+ Operator :: Add => env. builder . build_float_add ( l, r, "faddtmp" ) . unwrap ( ) . as_basic_value_enum ( ) ,
92+ Operator :: Subtract => env. builder . build_float_sub ( l, r, "fsubtmp" ) . unwrap ( ) . as_basic_value_enum ( ) ,
93+ Operator :: Multiply => env. builder . build_float_mul ( l, r, "fmultmp" ) . unwrap ( ) . as_basic_value_enum ( ) ,
94+ Operator :: Divide => env. builder . build_float_div ( l, r, "fdivtmp" ) . unwrap ( ) . as_basic_value_enum ( ) ,
95+ Operator :: Remainder => env. builder . build_float_rem ( l, r, "fmodtmp" ) . unwrap ( ) . as_basic_value_enum ( ) ,
96+
97+ Operator :: Greater => env. builder . build_float_compare ( FloatPredicate :: OGT , l, r, "fcmpgt" ) . unwrap ( ) . as_basic_value_enum ( ) ,
98+ Operator :: Less => env. builder . build_float_compare ( FloatPredicate :: OLT , l, r, "fcmplt" ) . unwrap ( ) . as_basic_value_enum ( ) ,
99+ Operator :: Equal => env. builder . build_float_compare ( FloatPredicate :: OEQ , l, r, "fcmpeq" ) . unwrap ( ) . as_basic_value_enum ( ) ,
100+ Operator :: NotEqual => env. builder . build_float_compare ( FloatPredicate :: ONE , l, r, "fcmpne" ) . unwrap ( ) . as_basic_value_enum ( ) ,
101+ Operator :: GreaterEqual => env. builder . build_float_compare ( FloatPredicate :: OGE , l, r, "fcmpge" ) . unwrap ( ) . as_basic_value_enum ( ) ,
102+ Operator :: LessEqual => env. builder . build_float_compare ( FloatPredicate :: OLE , l, r, "fcmple" ) . unwrap ( ) . as_basic_value_enum ( ) ,
103+
104+ _ => panic ! ( "Unsupported float operator" ) ,
105+ } ;
106+
107+ if let Some ( exp) = expected_type {
108+ match ( result, exp) {
109+ ( BasicValueEnum :: FloatValue ( fv) , inkwell:: types:: BasicTypeEnum :: FloatType ( target_ty) ) => {
110+ if fv. get_type ( ) != target_ty {
111+ result = env. builder . build_float_cast ( fv, target_ty, "fcast_result" ) . unwrap ( ) . as_basic_value_enum ( ) ;
112+ }
113+ }
114+ ( BasicValueEnum :: IntValue ( iv) , inkwell:: types:: BasicTypeEnum :: IntType ( target_ty) ) => {
115+ if iv. get_type ( ) != target_ty {
116+ result = env. builder . build_int_cast ( iv, target_ty, "icast_result" ) . unwrap ( ) . as_basic_value_enum ( ) ;
117+ }
118+ }
119+ _ => { }
120+ }
121+ }
122+
123+ result
124+ }
99125
100126 ( BasicValueEnum :: IntValue ( int_val) , BasicValueEnum :: FloatValue ( float_val) ) => {
101127 let casted = env
0 commit comments