Merge commit 'e39eacd2d4' into sync_cg_clif-2025-01-10
This commit is contained in:
parent
3998964879
commit
2c2d2a7e0d
15 changed files with 93 additions and 320 deletions
|
|
@ -62,9 +62,8 @@ pub(crate) fn maybe_codegen<'tcx>(
|
|||
}
|
||||
}
|
||||
|
||||
pub(crate) fn maybe_codegen_checked<'tcx>(
|
||||
pub(crate) fn maybe_codegen_mul_checked<'tcx>(
|
||||
fx: &mut FunctionCx<'_, '_, 'tcx>,
|
||||
bin_op: BinOp,
|
||||
lhs: CValue<'tcx>,
|
||||
rhs: CValue<'tcx>,
|
||||
) -> Option<CValue<'tcx>> {
|
||||
|
|
@ -78,32 +77,19 @@ pub(crate) fn maybe_codegen_checked<'tcx>(
|
|||
|
||||
let is_signed = type_sign(lhs.layout().ty);
|
||||
|
||||
match bin_op {
|
||||
BinOp::BitAnd | BinOp::BitOr | BinOp::BitXor => unreachable!(),
|
||||
BinOp::Add | BinOp::Sub => None,
|
||||
BinOp::Mul => {
|
||||
let out_ty = Ty::new_tup(fx.tcx, &[lhs.layout().ty, fx.tcx.types.bool]);
|
||||
let out_place = CPlace::new_stack_slot(fx, fx.layout_of(out_ty));
|
||||
let param_types = vec![
|
||||
AbiParam::special(fx.pointer_type, ArgumentPurpose::StructReturn),
|
||||
AbiParam::new(types::I128),
|
||||
AbiParam::new(types::I128),
|
||||
];
|
||||
let args = [out_place.to_ptr().get_addr(fx), lhs.load_scalar(fx), rhs.load_scalar(fx)];
|
||||
fx.lib_call(
|
||||
if is_signed { "__rust_i128_mulo" } else { "__rust_u128_mulo" },
|
||||
param_types,
|
||||
vec![],
|
||||
&args,
|
||||
);
|
||||
Some(out_place.to_cvalue(fx))
|
||||
}
|
||||
BinOp::AddUnchecked | BinOp::SubUnchecked | BinOp::MulUnchecked => unreachable!(),
|
||||
BinOp::AddWithOverflow | BinOp::SubWithOverflow | BinOp::MulWithOverflow => unreachable!(),
|
||||
BinOp::Offset => unreachable!("offset should only be used on pointers, not 128bit ints"),
|
||||
BinOp::Div | BinOp::Rem => unreachable!(),
|
||||
BinOp::Cmp => unreachable!(),
|
||||
BinOp::Lt | BinOp::Le | BinOp::Eq | BinOp::Ge | BinOp::Gt | BinOp::Ne => unreachable!(),
|
||||
BinOp::Shl | BinOp::ShlUnchecked | BinOp::Shr | BinOp::ShrUnchecked => unreachable!(),
|
||||
}
|
||||
let out_ty = Ty::new_tup(fx.tcx, &[lhs.layout().ty, fx.tcx.types.bool]);
|
||||
let out_place = CPlace::new_stack_slot(fx, fx.layout_of(out_ty));
|
||||
let param_types = vec![
|
||||
AbiParam::special(fx.pointer_type, ArgumentPurpose::StructReturn),
|
||||
AbiParam::new(types::I128),
|
||||
AbiParam::new(types::I128),
|
||||
];
|
||||
let args = [out_place.to_ptr().get_addr(fx), lhs.load_scalar(fx), rhs.load_scalar(fx)];
|
||||
fx.lib_call(
|
||||
if is_signed { "__rust_i128_mulo" } else { "__rust_u128_mulo" },
|
||||
param_types,
|
||||
vec![],
|
||||
&args,
|
||||
);
|
||||
Some(out_place.to_cvalue(fx))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,12 +73,14 @@ impl Drop for TimingGuard {
|
|||
|
||||
impl cranelift_codegen::timing::Profiler for MeasuremeProfiler {
|
||||
fn start_pass(&self, pass: cranelift_codegen::timing::Pass) -> Box<dyn std::any::Any> {
|
||||
let mut timing_guard =
|
||||
TimingGuard { profiler: std::mem::ManuallyDrop::new(self.0.clone()), inner: None };
|
||||
let mut timing_guard = Box::new(TimingGuard {
|
||||
profiler: std::mem::ManuallyDrop::new(self.0.clone()),
|
||||
inner: None,
|
||||
});
|
||||
timing_guard.inner = Some(
|
||||
unsafe { &*(&*timing_guard.profiler as &SelfProfilerRef as *const SelfProfilerRef) }
|
||||
.generic_activity(pass.description()),
|
||||
);
|
||||
Box::new(timing_guard)
|
||||
timing_guard
|
||||
}
|
||||
}
|
||||
|
|
|
|||
54
src/num.rs
54
src/num.rs
|
|
@ -2,10 +2,10 @@
|
|||
|
||||
use crate::prelude::*;
|
||||
|
||||
pub(crate) fn bin_op_to_intcc(bin_op: BinOp, signed: bool) -> Option<IntCC> {
|
||||
pub(crate) fn bin_op_to_intcc(bin_op: BinOp, signed: bool) -> IntCC {
|
||||
use BinOp::*;
|
||||
use IntCC::*;
|
||||
Some(match bin_op {
|
||||
match bin_op {
|
||||
Eq => Equal,
|
||||
Lt => {
|
||||
if signed {
|
||||
|
|
@ -36,8 +36,8 @@ pub(crate) fn bin_op_to_intcc(bin_op: BinOp, signed: bool) -> Option<IntCC> {
|
|||
UnsignedGreaterThan
|
||||
}
|
||||
}
|
||||
_ => return None,
|
||||
})
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
fn codegen_three_way_compare<'tcx>(
|
||||
|
|
@ -48,8 +48,8 @@ fn codegen_three_way_compare<'tcx>(
|
|||
) -> CValue<'tcx> {
|
||||
// This emits `(lhs > rhs) - (lhs < rhs)`, which is cranelift's preferred form per
|
||||
// <https://github.com/bytecodealliance/wasmtime/blob/8052bb9e3b792503b225f2a5b2ba3bc023bff462/cranelift/codegen/src/prelude_opt.isle#L41-L47>
|
||||
let gt_cc = crate::num::bin_op_to_intcc(BinOp::Gt, signed).unwrap();
|
||||
let lt_cc = crate::num::bin_op_to_intcc(BinOp::Lt, signed).unwrap();
|
||||
let gt_cc = crate::num::bin_op_to_intcc(BinOp::Gt, signed);
|
||||
let lt_cc = crate::num::bin_op_to_intcc(BinOp::Lt, signed);
|
||||
let gt = fx.bcx.ins().icmp(gt_cc, lhs, rhs);
|
||||
let lt = fx.bcx.ins().icmp(lt_cc, lhs, rhs);
|
||||
let val = fx.bcx.ins().isub(gt, lt);
|
||||
|
|
@ -63,11 +63,7 @@ fn codegen_compare_bin_op<'tcx>(
|
|||
lhs: Value,
|
||||
rhs: Value,
|
||||
) -> CValue<'tcx> {
|
||||
if bin_op == BinOp::Cmp {
|
||||
return codegen_three_way_compare(fx, signed, lhs, rhs);
|
||||
}
|
||||
|
||||
let intcc = crate::num::bin_op_to_intcc(bin_op, signed).unwrap();
|
||||
let intcc = crate::num::bin_op_to_intcc(bin_op, signed);
|
||||
let val = fx.bcx.ins().icmp(intcc, lhs, rhs);
|
||||
CValue::by_val(val, fx.layout_of(fx.tcx.types.bool))
|
||||
}
|
||||
|
|
@ -79,7 +75,7 @@ pub(crate) fn codegen_binop<'tcx>(
|
|||
in_rhs: CValue<'tcx>,
|
||||
) -> CValue<'tcx> {
|
||||
match bin_op {
|
||||
BinOp::Eq | BinOp::Lt | BinOp::Le | BinOp::Ne | BinOp::Ge | BinOp::Gt | BinOp::Cmp => {
|
||||
BinOp::Eq | BinOp::Lt | BinOp::Le | BinOp::Ne | BinOp::Ge | BinOp::Gt => {
|
||||
match in_lhs.layout().ty.kind() {
|
||||
ty::Bool | ty::Uint(_) | ty::Int(_) | ty::Char => {
|
||||
let signed = type_sign(in_lhs.layout().ty);
|
||||
|
|
@ -91,6 +87,16 @@ pub(crate) fn codegen_binop<'tcx>(
|
|||
_ => {}
|
||||
}
|
||||
}
|
||||
BinOp::Cmp => match in_lhs.layout().ty.kind() {
|
||||
ty::Bool | ty::Uint(_) | ty::Int(_) | ty::Char => {
|
||||
let signed = type_sign(in_lhs.layout().ty);
|
||||
let lhs = in_lhs.load_scalar(fx);
|
||||
let rhs = in_rhs.load_scalar(fx);
|
||||
|
||||
return codegen_three_way_compare(fx, signed, lhs, rhs);
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
|
||||
|
|
@ -200,10 +206,6 @@ pub(crate) fn codegen_checked_int_binop<'tcx>(
|
|||
let lhs = in_lhs.load_scalar(fx);
|
||||
let rhs = in_rhs.load_scalar(fx);
|
||||
|
||||
if let Some(res) = crate::codegen_i128::maybe_codegen_checked(fx, bin_op, in_lhs, in_rhs) {
|
||||
return res;
|
||||
}
|
||||
|
||||
let signed = type_sign(in_lhs.layout().ty);
|
||||
|
||||
let (res, has_overflow) = match bin_op {
|
||||
|
|
@ -236,6 +238,10 @@ pub(crate) fn codegen_checked_int_binop<'tcx>(
|
|||
(val, has_overflow)
|
||||
}
|
||||
BinOp::Mul => {
|
||||
if let Some(res) = crate::codegen_i128::maybe_codegen_mul_checked(fx, in_lhs, in_rhs) {
|
||||
return res;
|
||||
}
|
||||
|
||||
let ty = fx.bcx.func.dfg.value_type(lhs);
|
||||
match ty {
|
||||
types::I8 | types::I16 | types::I32 if !signed => {
|
||||
|
|
@ -357,14 +363,12 @@ pub(crate) fn codegen_float_binop<'tcx>(
|
|||
_ => bug!(),
|
||||
};
|
||||
|
||||
let ret_val = fx.lib_call(
|
||||
fx.lib_call(
|
||||
name,
|
||||
vec![AbiParam::new(ty), AbiParam::new(ty)],
|
||||
vec![AbiParam::new(ty)],
|
||||
&[lhs, rhs],
|
||||
)[0];
|
||||
|
||||
return CValue::by_val(ret_val, in_lhs.layout());
|
||||
)[0]
|
||||
}
|
||||
BinOp::Eq | BinOp::Lt | BinOp::Le | BinOp::Ne | BinOp::Ge | BinOp::Gt => {
|
||||
let fltcc = match bin_op {
|
||||
|
|
@ -431,13 +435,9 @@ pub(crate) fn codegen_ptr_binop<'tcx>(
|
|||
BinOp::Lt | BinOp::Le | BinOp::Ge | BinOp::Gt => {
|
||||
let ptr_eq = fx.bcx.ins().icmp(IntCC::Equal, lhs_ptr, rhs_ptr);
|
||||
|
||||
let ptr_cmp =
|
||||
fx.bcx.ins().icmp(bin_op_to_intcc(bin_op, false).unwrap(), lhs_ptr, rhs_ptr);
|
||||
let extra_cmp = fx.bcx.ins().icmp(
|
||||
bin_op_to_intcc(bin_op, false).unwrap(),
|
||||
lhs_extra,
|
||||
rhs_extra,
|
||||
);
|
||||
let ptr_cmp = fx.bcx.ins().icmp(bin_op_to_intcc(bin_op, false), lhs_ptr, rhs_ptr);
|
||||
let extra_cmp =
|
||||
fx.bcx.ins().icmp(bin_op_to_intcc(bin_op, false), lhs_extra, rhs_extra);
|
||||
|
||||
fx.bcx.ins().select(ptr_eq, extra_cmp, ptr_cmp)
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue