@@ -23,7 +23,7 @@ use rustc_middle::ty::layout::{HasParamEnv, ValidityRequirement};
2323use rustc_middle:: ty:: print:: { with_no_trimmed_paths, with_no_visible_paths} ;
2424use rustc_middle:: ty:: GenericArgsRef ;
2525use rustc_span:: source_map:: Spanned ;
26- use rustc_span:: symbol:: { kw , sym, Symbol } ;
26+ use rustc_span:: symbol:: { sym, Symbol } ;
2727
2828pub ( crate ) use self :: llvm:: codegen_llvm_intrinsic_call;
2929use crate :: prelude:: * ;
@@ -1132,7 +1132,7 @@ fn codegen_regular_intrinsic_call<'tcx>(
11321132 ret. write_cvalue ( fx, val) ;
11331133 }
11341134
1135- kw :: Try => {
1135+ sym :: catch_unwind => {
11361136 intrinsic_args ! ( fx, args => ( f, data, catch_fn) ; intrinsic) ;
11371137 let f = f. load_scalar ( fx) ;
11381138 let data = data. load_scalar ( fx) ;
@@ -1152,17 +1152,26 @@ fn codegen_regular_intrinsic_call<'tcx>(
11521152 ret. write_cvalue ( fx, ret_val) ;
11531153 }
11541154
1155- sym:: fadd_fast | sym:: fsub_fast | sym:: fmul_fast | sym:: fdiv_fast | sym:: frem_fast => {
1155+ sym:: fadd_fast
1156+ | sym:: fsub_fast
1157+ | sym:: fmul_fast
1158+ | sym:: fdiv_fast
1159+ | sym:: frem_fast
1160+ | sym:: fadd_algebraic
1161+ | sym:: fsub_algebraic
1162+ | sym:: fmul_algebraic
1163+ | sym:: fdiv_algebraic
1164+ | sym:: frem_algebraic => {
11561165 intrinsic_args ! ( fx, args => ( x, y) ; intrinsic) ;
11571166
11581167 let res = crate :: num:: codegen_float_binop (
11591168 fx,
11601169 match intrinsic {
1161- sym:: fadd_fast => BinOp :: Add ,
1162- sym:: fsub_fast => BinOp :: Sub ,
1163- sym:: fmul_fast => BinOp :: Mul ,
1164- sym:: fdiv_fast => BinOp :: Div ,
1165- sym:: frem_fast => BinOp :: Rem ,
1170+ sym:: fadd_fast | sym :: fadd_algebraic => BinOp :: Add ,
1171+ sym:: fsub_fast | sym :: fsub_algebraic => BinOp :: Sub ,
1172+ sym:: fmul_fast | sym :: fmul_algebraic => BinOp :: Mul ,
1173+ sym:: fdiv_fast | sym :: fdiv_algebraic => BinOp :: Div ,
1174+ sym:: frem_fast | sym :: frem_algebraic => BinOp :: Rem ,
11661175 _ => unreachable ! ( ) ,
11671176 } ,
11681177 x,
@@ -1246,7 +1255,17 @@ fn codegen_regular_intrinsic_call<'tcx>(
12461255
12471256 // Unimplemented intrinsics must have a fallback body. The fallback body is obtained
12481257 // by converting the `InstanceDef::Intrinsic` to an `InstanceDef::Item`.
1249- _ => return Err ( Instance :: new ( instance. def_id ( ) , instance. args ) ) ,
1258+ _ => {
1259+ let intrinsic = fx. tcx . intrinsic ( instance. def_id ( ) ) . unwrap ( ) ;
1260+ if intrinsic. must_be_overridden {
1261+ span_bug ! (
1262+ source_info. span,
1263+ "intrinsic {} must be overridden by codegen_cranelift, but isn't" ,
1264+ intrinsic. name,
1265+ ) ;
1266+ }
1267+ return Err ( Instance :: new ( instance. def_id ( ) , instance. args ) ) ;
1268+ }
12501269 }
12511270
12521271 let ret_block = fx. get_block ( destination. unwrap ( ) ) ;
0 commit comments