Add codegen for div and mod
This commit is contained in:
parent
b9459a19bb
commit
3a68154ae5
@ -659,17 +659,57 @@ impl mir::Expression {
|
||||
(mir::BinaryOperator::And, _, _) => Instr::And(lhs, rhs),
|
||||
(mir::BinaryOperator::Cmp(i), _, false) => Instr::ICmp(i.predicate(), lhs, rhs),
|
||||
(mir::BinaryOperator::Cmp(i), _, true) => Instr::FCmp(i.predicate(), lhs, rhs),
|
||||
(mir::BinaryOperator::Div, true, true) => todo!(),
|
||||
(mir::BinaryOperator::Div, true, false) => todo!(),
|
||||
(mir::BinaryOperator::Div, false, true) => todo!(),
|
||||
(mir::BinaryOperator::Div, false, false) => todo!(),
|
||||
(mir::BinaryOperator::Mod, true, true) => todo!(),
|
||||
(mir::BinaryOperator::Mod, true, false) => todo!(),
|
||||
(mir::BinaryOperator::Mod, false, true) => todo!(),
|
||||
(mir::BinaryOperator::Mod, false, false) => todo!(),
|
||||
(mir::BinaryOperator::Div, false, false) => Instr::UDiv(lhs, rhs),
|
||||
(mir::BinaryOperator::Div, true, false) => Instr::SDiv(lhs, rhs),
|
||||
(mir::BinaryOperator::Div, _, true) => Instr::FDiv(lhs, rhs),
|
||||
(mir::BinaryOperator::Mod, false, false) => {
|
||||
let div = scope
|
||||
.block
|
||||
.build(Instr::UDiv(lhs, rhs))
|
||||
.unwrap()
|
||||
.maybe_location(&mut scope.block, location);
|
||||
let mul = scope
|
||||
.block
|
||||
.build(Instr::Mul(rhs, div))
|
||||
.unwrap()
|
||||
.maybe_location(&mut scope.block, location);
|
||||
Instr::Sub(lhs, mul)
|
||||
}
|
||||
(mir::BinaryOperator::Mod, true, false) => {
|
||||
let div = scope
|
||||
.block
|
||||
.build(Instr::SDiv(lhs, rhs))
|
||||
.unwrap()
|
||||
.maybe_location(&mut scope.block, location);
|
||||
let mul = scope
|
||||
.block
|
||||
.build(Instr::Mul(rhs, div))
|
||||
.unwrap()
|
||||
.maybe_location(&mut scope.block, location);
|
||||
Instr::Sub(lhs, mul)
|
||||
}
|
||||
(mir::BinaryOperator::Mod, _, true) => {
|
||||
let div = scope
|
||||
.block
|
||||
.build(Instr::FDiv(lhs, rhs))
|
||||
.unwrap()
|
||||
.maybe_location(&mut scope.block, location);
|
||||
let mul = scope
|
||||
.block
|
||||
.build(Instr::Mul(rhs, div))
|
||||
.unwrap()
|
||||
.maybe_location(&mut scope.block, location);
|
||||
Instr::Sub(lhs, mul)
|
||||
}
|
||||
};
|
||||
Some(StackValue(
|
||||
StackValueKind::Immutable(scope.block.build(instr).unwrap()),
|
||||
StackValueKind::Immutable(
|
||||
scope
|
||||
.block
|
||||
.build(instr)
|
||||
.unwrap()
|
||||
.maybe_location(&mut scope.block, location),
|
||||
),
|
||||
lhs_type,
|
||||
))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user