From e58bb2acbd3a2c61d4c492c322e9c53ed3068489 Mon Sep 17 00:00:00 2001 From: bjorn3 <17426603+bjorn3@users.noreply.github.com> Date: Mon, 6 Feb 2023 16:58:05 +0000 Subject: [PATCH] Use new abi for 128bit int to float cast intrinsics on Windows --- src/cast.rs | 28 ++++++++++++++++++++++------ src/lib.rs | 2 +- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/cast.rs b/src/cast.rs index 8c23152cda78..0ab29f335a0f 100644 --- a/src/cast.rs +++ b/src/cast.rs @@ -64,12 +64,28 @@ pub(crate) fn clif_int_or_float_cast( }, ); - return fx.lib_call( - &name, - vec![AbiParam::new(types::I128)], - vec![AbiParam::new(to_ty)], - &[from], - )[0]; + if fx.tcx.sess.target.is_like_windows { + let arg_place = CPlace::new_stack_slot( + fx, + fx.layout_of(if from_signed { fx.tcx.types.i128 } else { fx.tcx.types.u128 }), + ); + let arg_ptr = arg_place.to_ptr(); + arg_ptr.store(fx, from, MemFlags::trusted()); + let args = [arg_ptr.get_addr(fx)]; + return fx.lib_call( + &name, + vec![AbiParam::new(fx.pointer_type)], + vec![AbiParam::new(to_ty)], + &args, + )[0]; + } else { + return fx.lib_call( + &name, + vec![AbiParam::new(types::I128)], + vec![AbiParam::new(to_ty)], + &[from], + )[0]; + } } // int-like -> float diff --git a/src/lib.rs b/src/lib.rs index c7fe382bac4e..5b69bc7cc9b3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -188,7 +188,7 @@ impl CodegenBackend for CraneliftCodegenBackend { } fn target_features(&self, _sess: &Session, _allow_unstable: bool) -> Vec { - vec![] + vec![Symbol::intern("llvm14-builtins-abi")] } fn print_version(&self) {