Fix float to int compiler builtin call abi
This commit is contained in:
parent
c6a0d3716b
commit
29ad465127
17
src/cast.rs
17
src/cast.rs
@ -96,12 +96,29 @@ pub(crate) fn clif_int_or_float_cast(
|
|||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
if fx.tcx.sess.target.is_like_windows {
|
||||||
|
let ret = fx.lib_call(
|
||||||
|
&name,
|
||||||
|
vec![AbiParam::new(from_ty)],
|
||||||
|
vec![AbiParam::new(types::I64X2)],
|
||||||
|
&[from],
|
||||||
|
)[0];
|
||||||
|
// FIXME use bitcast instead of store to get from i64x2 to i128
|
||||||
|
let stack_slot = fx.bcx.create_sized_stack_slot(StackSlotData {
|
||||||
|
kind: StackSlotKind::ExplicitSlot,
|
||||||
|
size: 16,
|
||||||
|
});
|
||||||
|
let ret_ptr = Pointer::stack_slot(stack_slot);
|
||||||
|
ret_ptr.store(fx, ret, MemFlags::trusted());
|
||||||
|
ret_ptr.load(fx, types::I128, MemFlags::trusted())
|
||||||
|
} else {
|
||||||
fx.lib_call(
|
fx.lib_call(
|
||||||
&name,
|
&name,
|
||||||
vec![AbiParam::new(from_ty)],
|
vec![AbiParam::new(from_ty)],
|
||||||
vec![AbiParam::new(types::I128)],
|
vec![AbiParam::new(types::I128)],
|
||||||
&[from],
|
&[from],
|
||||||
)[0]
|
)[0]
|
||||||
|
}
|
||||||
} else if to_ty == types::I8 || to_ty == types::I16 {
|
} else if to_ty == types::I8 || to_ty == types::I16 {
|
||||||
// FIXME implement fcvt_to_*int_sat.i8/i16
|
// FIXME implement fcvt_to_*int_sat.i8/i16
|
||||||
let val = if to_signed {
|
let val = if to_signed {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user