Promote unchecked_add/sub/mul/shl/shr to mir::BinOp
This commit is contained in:
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user