Sync from rust 065a1f5df9
This commit is contained in:
commit
ee1793432d
@ -442,7 +442,7 @@ fn codegen_fn_body(fx: &mut FunctionCx<'_, '_, '_>, start_block: Block) {
|
||||
target,
|
||||
fn_span,
|
||||
unwind: _,
|
||||
from_hir_call: _,
|
||||
call_source: _,
|
||||
} => {
|
||||
fx.tcx.prof.generic_activity("codegen call").run(|| {
|
||||
crate::abi::codegen_terminator_call(
|
||||
|
@ -22,8 +22,8 @@ pub(crate) fn maybe_codegen<'tcx>(
|
||||
|
||||
match bin_op {
|
||||
BinOp::BitAnd | BinOp::BitOr | BinOp::BitXor => None,
|
||||
BinOp::Add | BinOp::Sub => None,
|
||||
BinOp::Mul => {
|
||||
BinOp::Add | BinOp::AddUnchecked | BinOp::Sub | BinOp::SubUnchecked => None,
|
||||
BinOp::Mul | BinOp::MulUnchecked => {
|
||||
let args = [lhs.load_scalar(fx), rhs.load_scalar(fx)];
|
||||
let ret_val = fx.lib_call(
|
||||
"__multi3",
|
||||
@ -69,7 +69,7 @@ pub(crate) fn maybe_codegen<'tcx>(
|
||||
}
|
||||
}
|
||||
BinOp::Lt | BinOp::Le | BinOp::Eq | BinOp::Ge | BinOp::Gt | BinOp::Ne => None,
|
||||
BinOp::Shl | BinOp::Shr => None,
|
||||
BinOp::Shl | BinOp::ShlUnchecked | BinOp::Shr | BinOp::ShrUnchecked => None,
|
||||
}
|
||||
}
|
||||
|
||||
@ -131,9 +131,10 @@ pub(crate) fn maybe_codegen_checked<'tcx>(
|
||||
fx.lib_call(name, param_types, vec![], &args);
|
||||
Some(out_place.to_cvalue(fx))
|
||||
}
|
||||
BinOp::AddUnchecked | BinOp::SubUnchecked | BinOp::MulUnchecked => unreachable!(),
|
||||
BinOp::Offset => unreachable!("offset should only be used on pointers, not 128bit ints"),
|
||||
BinOp::Div | BinOp::Rem => unreachable!(),
|
||||
BinOp::Lt | BinOp::Le | BinOp::Eq | BinOp::Ge | BinOp::Gt | BinOp::Ne => unreachable!(),
|
||||
BinOp::Shl | BinOp::Shr => unreachable!(),
|
||||
BinOp::Shl | BinOp::ShlUnchecked | BinOp::Shr | BinOp::ShrUnchecked => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
@ -472,25 +472,11 @@ fn codegen_regular_intrinsic_call<'tcx>(
|
||||
ret.write_cvalue(fx, CValue::by_val(align, usize_layout));
|
||||
}
|
||||
|
||||
sym::unchecked_add
|
||||
| sym::unchecked_sub
|
||||
| sym::unchecked_mul
|
||||
| sym::exact_div
|
||||
| sym::unchecked_shl
|
||||
| sym::unchecked_shr => {
|
||||
sym::exact_div => {
|
||||
intrinsic_args!(fx, args => (x, y); intrinsic);
|
||||
|
||||
// FIXME trap on overflow
|
||||
let bin_op = match intrinsic {
|
||||
sym::unchecked_add => BinOp::Add,
|
||||
sym::unchecked_sub => BinOp::Sub,
|
||||
sym::unchecked_mul => BinOp::Mul,
|
||||
sym::exact_div => BinOp::Div,
|
||||
sym::unchecked_shl => BinOp::Shl,
|
||||
sym::unchecked_shr => BinOp::Shr,
|
||||
_ => unreachable!(),
|
||||
};
|
||||
let res = crate::num::codegen_int_binop(fx, bin_op, x, y);
|
||||
// FIXME trap on inexact
|
||||
let res = crate::num::codegen_int_binop(fx, BinOp::Div, x, y);
|
||||
ret.write_cvalue(fx, res);
|
||||
}
|
||||
sym::saturating_add | sym::saturating_sub => {
|
||||
|
16
src/num.rs
16
src/num.rs
@ -128,10 +128,11 @@ pub(crate) fn codegen_int_binop<'tcx>(
|
||||
let rhs = in_rhs.load_scalar(fx);
|
||||
|
||||
let b = fx.bcx.ins();
|
||||
// FIXME trap on overflow for the Unchecked versions
|
||||
let val = match bin_op {
|
||||
BinOp::Add => b.iadd(lhs, rhs),
|
||||
BinOp::Sub => b.isub(lhs, rhs),
|
||||
BinOp::Mul => b.imul(lhs, rhs),
|
||||
BinOp::Add | BinOp::AddUnchecked => b.iadd(lhs, rhs),
|
||||
BinOp::Sub | BinOp::SubUnchecked => b.isub(lhs, rhs),
|
||||
BinOp::Mul | BinOp::MulUnchecked => b.imul(lhs, rhs),
|
||||
BinOp::Div => {
|
||||
if signed {
|
||||
b.sdiv(lhs, rhs)
|
||||
@ -149,16 +150,19 @@ pub(crate) fn codegen_int_binop<'tcx>(
|
||||
BinOp::BitXor => b.bxor(lhs, rhs),
|
||||
BinOp::BitAnd => b.band(lhs, rhs),
|
||||
BinOp::BitOr => b.bor(lhs, rhs),
|
||||
BinOp::Shl => b.ishl(lhs, rhs),
|
||||
BinOp::Shr => {
|
||||
BinOp::Shl | BinOp::ShlUnchecked => b.ishl(lhs, rhs),
|
||||
BinOp::Shr | BinOp::ShrUnchecked => {
|
||||
if signed {
|
||||
b.sshr(lhs, rhs)
|
||||
} else {
|
||||
b.ushr(lhs, rhs)
|
||||
}
|
||||
}
|
||||
BinOp::Offset => unreachable!("Offset is not an integer operation"),
|
||||
// Compare binops handles by `codegen_binop`.
|
||||
_ => unreachable!("{:?}({:?}, {:?})", bin_op, in_lhs.layout().ty, in_rhs.layout().ty),
|
||||
BinOp::Eq | BinOp::Ne | BinOp::Lt | BinOp::Le | BinOp::Gt | BinOp::Ge => {
|
||||
unreachable!("{:?}({:?}, {:?})", bin_op, in_lhs.layout().ty, in_rhs.layout().ty);
|
||||
}
|
||||
};
|
||||
|
||||
CValue::by_val(val, in_lhs.layout())
|
||||
|
Loading…
Reference in New Issue
Block a user