Fix floating-point modulo
This commit is contained in:
parent
0203213b28
commit
685520a6cf
@ -572,10 +572,15 @@ pub fn form_intrinsic_binops() -> Vec<BinopDefinition> {
|
|||||||
intrinsics.push(simple_binop_def(Div, &ty, |scope, lhs, rhs| {
|
intrinsics.push(simple_binop_def(Div, &ty, |scope, lhs, rhs| {
|
||||||
scope.block.build(Instr::FDiv(lhs, rhs)).unwrap()
|
scope.block.build(Instr::FDiv(lhs, rhs)).unwrap()
|
||||||
}));
|
}));
|
||||||
intrinsics.push(simple_binop_def(Mod, &ty, |scope, lhs, rhs| {
|
intrinsics.push(simple_binop_def(Mod, &ty, {
|
||||||
let div = scope.block.build(Instr::FDiv(lhs, rhs)).unwrap();
|
let ty = ty.clone();
|
||||||
let mul = scope.block.build(Instr::Mul(rhs, div)).unwrap();
|
|scope, lhs, rhs| {
|
||||||
scope.block.build(Instr::Sub(lhs, mul)).unwrap()
|
let div = scope.block.build(Instr::FDiv(lhs, rhs)).unwrap();
|
||||||
|
let fun = scope.get_intrinsic(LLVMIntrinsicKind::Trunc(ty));
|
||||||
|
let div_truncated = scope.block.build(Instr::FunctionCall(fun, vec![div])).unwrap();
|
||||||
|
let mul = scope.block.build(Instr::FMul(rhs, div_truncated)).unwrap();
|
||||||
|
scope.block.build(Instr::FSub(lhs, mul)).unwrap()
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
intrinsics.push(boolean_binop_def(Cmp(CmpOperator::EQ), &ty, |scope, lhs, rhs| {
|
intrinsics.push(boolean_binop_def(Cmp(CmpOperator::EQ), &ty, |scope, lhs, rhs| {
|
||||||
scope.block.build(Instr::FCmp(CmpPredicate::EQ, lhs, rhs)).unwrap()
|
scope.block.build(Instr::FCmp(CmpPredicate::EQ, lhs, rhs)).unwrap()
|
||||||
|
Loading…
Reference in New Issue
Block a user