@@ -359,26 +359,6 @@ fn codegen_float_intrinsic_call<'tcx>(
359359 sym:: copysignf32 => ( "copysignf" , 2 , fx. tcx . types . f32 , types:: F32 ) ,
360360 sym:: copysignf64 => ( "copysign" , 2 , fx. tcx . types . f64 , types:: F64 ) ,
361361 sym:: copysignf128 => ( "copysignf128" , 2 , fx. tcx . types . f128 , types:: F128 ) ,
362- sym:: floorf16 => ( "floorf16" , 1 , fx. tcx . types . f16 , types:: F16 ) ,
363- sym:: floorf32 => ( "floorf" , 1 , fx. tcx . types . f32 , types:: F32 ) ,
364- sym:: floorf64 => ( "floor" , 1 , fx. tcx . types . f64 , types:: F64 ) ,
365- sym:: floorf128 => ( "floorf128" , 1 , fx. tcx . types . f128 , types:: F128 ) ,
366- sym:: ceilf16 => ( "ceilf16" , 1 , fx. tcx . types . f16 , types:: F16 ) ,
367- sym:: ceilf32 => ( "ceilf" , 1 , fx. tcx . types . f32 , types:: F32 ) ,
368- sym:: ceilf64 => ( "ceil" , 1 , fx. tcx . types . f64 , types:: F64 ) ,
369- sym:: ceilf128 => ( "ceilf128" , 1 , fx. tcx . types . f128 , types:: F128 ) ,
370- sym:: truncf16 => ( "truncf16" , 1 , fx. tcx . types . f16 , types:: F16 ) ,
371- sym:: truncf32 => ( "truncf" , 1 , fx. tcx . types . f32 , types:: F32 ) ,
372- sym:: truncf64 => ( "trunc" , 1 , fx. tcx . types . f64 , types:: F64 ) ,
373- sym:: truncf128 => ( "truncf128" , 1 , fx. tcx . types . f128 , types:: F128 ) ,
374- sym:: round_ties_even_f16 => ( "rintf16" , 1 , fx. tcx . types . f16 , types:: F16 ) ,
375- sym:: round_ties_even_f32 => ( "rintf" , 1 , fx. tcx . types . f32 , types:: F32 ) ,
376- sym:: round_ties_even_f64 => ( "rint" , 1 , fx. tcx . types . f64 , types:: F64 ) ,
377- sym:: round_ties_even_f128 => ( "rintf128" , 1 , fx. tcx . types . f128 , types:: F128 ) ,
378- sym:: roundf16 => ( "roundf16" , 1 , fx. tcx . types . f16 , types:: F16 ) ,
379- sym:: roundf32 => ( "roundf" , 1 , fx. tcx . types . f32 , types:: F32 ) ,
380- sym:: roundf64 => ( "round" , 1 , fx. tcx . types . f64 , types:: F64 ) ,
381- sym:: roundf128 => ( "roundf128" , 1 , fx. tcx . types . f128 , types:: F128 ) ,
382362 sym:: sinf16 => ( "sinf16" , 1 , fx. tcx . types . f16 , types:: F16 ) ,
383363 sym:: sinf32 => ( "sinf" , 1 , fx. tcx . types . f32 , types:: F32 ) ,
384364 sym:: sinf64 => ( "sin" , 1 , fx. tcx . types . f64 , types:: F64 ) ,
@@ -429,10 +409,6 @@ fn codegen_float_intrinsic_call<'tcx>(
429409 sym:: copysignf16 => codegen_f16_f128:: copysign_f16 ( fx, args[ 0 ] , args[ 1 ] ) ,
430410 sym:: copysignf128 => codegen_f16_f128:: copysign_f128 ( fx, args[ 0 ] , args[ 1 ] ) ,
431411 sym:: copysignf32 | sym:: copysignf64 => fx. bcx . ins ( ) . fcopysign ( args[ 0 ] , args[ 1 ] ) ,
432- sym:: floorf32 | sym:: floorf64 => fx. bcx . ins ( ) . floor ( args[ 0 ] ) ,
433- sym:: ceilf32 | sym:: ceilf64 => fx. bcx . ins ( ) . ceil ( args[ 0 ] ) ,
434- sym:: truncf32 | sym:: truncf64 => fx. bcx . ins ( ) . trunc ( args[ 0 ] ) ,
435- sym:: round_ties_even_f32 | sym:: round_ties_even_f64 => fx. bcx . ins ( ) . nearest ( args[ 0 ] ) ,
436412 sym:: sqrtf32 | sym:: sqrtf64 => fx. bcx . ins ( ) . sqrt ( args[ 0 ] ) ,
437413
438414 // These intrinsics aren't supported natively by Cranelift.
@@ -1143,24 +1119,54 @@ fn codegen_regular_intrinsic_call<'tcx>(
11431119 ret. write_cvalue ( fx, old) ;
11441120 }
11451121
1146- sym:: fabs => {
1122+ // Float unop intrinsics
1123+ sym:: fabs
1124+ | sym:: floor
1125+ | sym:: ceil
1126+ | sym:: trunc
1127+ | sym:: round_ties_even
1128+ | sym:: round => {
11471129 intrinsic_args ! ( fx, args => ( arg) ; intrinsic) ;
11481130 let layout = arg. layout ( ) ;
11491131 let ty:: Float ( float_ty) = layout. ty . kind ( ) else {
11501132 span_bug ! (
11511133 source_info. span,
1152- "expected float type for fabs intrinsic: {:?}" ,
1134+ "expected float type for float unop intrinsic {:?}: {:?}" ,
1135+ intrinsic,
11531136 layout. ty
11541137 ) ;
11551138 } ;
11561139 let x = arg. load_scalar ( fx) ;
1157- let val = match float_ty {
1158- FloatTy :: F32 | FloatTy :: F64 => fx. bcx . ins ( ) . fabs ( x) ,
1140+
1141+ use FloatTy :: * ;
1142+ let val = match ( intrinsic, float_ty) {
1143+ ( sym:: fabs, F32 | F64 ) => Ok ( fx. bcx . ins ( ) . fabs ( x) ) ,
11591144 // FIXME(bytecodealliance/wasmtime#8312): Use `fabsf16` once Cranelift
11601145 // backend lowerings are implemented.
1161- FloatTy :: F16 => codegen_f16_f128:: abs_f16 ( fx, x) ,
1162- FloatTy :: F128 => codegen_f16_f128:: abs_f128 ( fx, x) ,
1146+ ( sym:: fabs, F16 ) => Ok ( codegen_f16_f128:: abs_f16 ( fx, x) ) ,
1147+ ( sym:: fabs, F128 ) => Ok ( codegen_f16_f128:: abs_f128 ( fx, x) ) ,
1148+ ( sym:: floor, F32 | F64 ) => Ok ( fx. bcx . ins ( ) . floor ( x) ) ,
1149+ ( sym:: floor, F16 ) => Err ( "floorf16" ) ,
1150+ ( sym:: floor, F128 ) => Err ( "floorf128" ) ,
1151+ ( sym:: ceil, F32 | F64 ) => Ok ( fx. bcx . ins ( ) . ceil ( x) ) ,
1152+ ( sym:: ceil, F16 ) => Err ( "ceilf16" ) ,
1153+ ( sym:: ceil, F128 ) => Err ( "ceilf128" ) ,
1154+ ( sym:: trunc, F32 | F64 ) => Ok ( fx. bcx . ins ( ) . trunc ( x) ) ,
1155+ ( sym:: trunc, F16 ) => Err ( "truncf16" ) ,
1156+ ( sym:: trunc, F128 ) => Err ( "truncf128" ) ,
1157+ ( sym:: round_ties_even, F32 | F64 ) => Ok ( fx. bcx . ins ( ) . nearest ( x) ) ,
1158+ ( sym:: round_ties_even, F16 ) => Err ( "rintf16" ) ,
1159+ ( sym:: round_ties_even, F128 ) => Err ( "rintf128" ) ,
1160+ ( sym:: round, F16 ) => Err ( "roundf16" ) ,
1161+ ( sym:: round, F32 ) => Err ( "roundf" ) ,
1162+ ( sym:: round, F64 ) => Err ( "round" ) ,
1163+ ( sym:: round, F128 ) => Err ( "roundf128" ) ,
1164+ _ => unreachable ! ( ) ,
11631165 } ;
1166+ let val = val. unwrap_or_else ( |name| {
1167+ let ty = fx. clif_type ( layout. ty ) . unwrap ( ) ;
1168+ fx. lib_call ( name, vec ! [ AbiParam :: new( ty) ] , vec ! [ AbiParam :: new( ty) ] , & [ x] ) [ 0 ]
1169+ } ) ;
11641170 let val = CValue :: by_val ( val, layout) ;
11651171 ret. write_cvalue ( fx, val) ;
11661172 }
0 commit comments