mirror of
https://github.com/edg-l/edlang.git
synced 2024-11-22 16:08:24 +00:00
more
This commit is contained in:
parent
ad353f749d
commit
7a784dd73b
|
@ -395,17 +395,173 @@ fn compile_bin_op<'ctx>(
|
||||||
.as_basic_value_enum()
|
.as_basic_value_enum()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ir::BinOp::BitXor => todo!(),
|
ir::BinOp::BitXor => ctx
|
||||||
ir::BinOp::BitAnd => todo!(),
|
.builder
|
||||||
ir::BinOp::BitOr => todo!(),
|
.build_xor(lhs_value.into_int_value(), rhs_value.into_int_value(), "")?
|
||||||
ir::BinOp::Shl => todo!(),
|
.as_basic_value_enum(),
|
||||||
ir::BinOp::Shr => todo!(),
|
ir::BinOp::BitAnd => ctx
|
||||||
ir::BinOp::Eq => todo!(),
|
.builder
|
||||||
ir::BinOp::Lt => todo!(),
|
.build_and(lhs_value.into_int_value(), rhs_value.into_int_value(), "")?
|
||||||
ir::BinOp::Le => todo!(),
|
.as_basic_value_enum(),
|
||||||
ir::BinOp::Ne => todo!(),
|
ir::BinOp::BitOr => ctx
|
||||||
ir::BinOp::Ge => todo!(),
|
.builder
|
||||||
ir::BinOp::Gt => todo!(),
|
.build_or(lhs_value.into_int_value(), rhs_value.into_int_value(), "")?
|
||||||
|
.as_basic_value_enum(),
|
||||||
|
ir::BinOp::Shl => ctx
|
||||||
|
.builder
|
||||||
|
.build_left_shift(lhs_value.into_int_value(), rhs_value.into_int_value(), "")?
|
||||||
|
.as_basic_value_enum(),
|
||||||
|
ir::BinOp::Shr => ctx
|
||||||
|
.builder
|
||||||
|
.build_right_shift(
|
||||||
|
lhs_value.into_int_value(),
|
||||||
|
rhs_value.into_int_value(),
|
||||||
|
is_signed,
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum(),
|
||||||
|
ir::BinOp::Eq => {
|
||||||
|
if is_float {
|
||||||
|
ctx.builder
|
||||||
|
.build_float_compare(
|
||||||
|
inkwell::FloatPredicate::OEQ,
|
||||||
|
lhs_value.into_float_value(),
|
||||||
|
rhs_value.into_float_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
} else {
|
||||||
|
ctx.builder
|
||||||
|
.build_int_compare(
|
||||||
|
inkwell::IntPredicate::EQ,
|
||||||
|
lhs_value.into_int_value(),
|
||||||
|
rhs_value.into_int_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ir::BinOp::Lt => {
|
||||||
|
if is_float {
|
||||||
|
ctx.builder
|
||||||
|
.build_float_compare(
|
||||||
|
inkwell::FloatPredicate::OLT,
|
||||||
|
lhs_value.into_float_value(),
|
||||||
|
rhs_value.into_float_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
} else {
|
||||||
|
ctx.builder
|
||||||
|
.build_int_compare(
|
||||||
|
if is_signed {
|
||||||
|
inkwell::IntPredicate::SLT
|
||||||
|
} else {
|
||||||
|
inkwell::IntPredicate::ULT
|
||||||
|
},
|
||||||
|
lhs_value.into_int_value(),
|
||||||
|
rhs_value.into_int_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ir::BinOp::Le => {
|
||||||
|
if is_float {
|
||||||
|
ctx.builder
|
||||||
|
.build_float_compare(
|
||||||
|
inkwell::FloatPredicate::OLE,
|
||||||
|
lhs_value.into_float_value(),
|
||||||
|
rhs_value.into_float_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
} else {
|
||||||
|
ctx.builder
|
||||||
|
.build_int_compare(
|
||||||
|
if is_signed {
|
||||||
|
inkwell::IntPredicate::SLE
|
||||||
|
} else {
|
||||||
|
inkwell::IntPredicate::ULE
|
||||||
|
},
|
||||||
|
lhs_value.into_int_value(),
|
||||||
|
rhs_value.into_int_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ir::BinOp::Ne => {
|
||||||
|
if is_float {
|
||||||
|
ctx.builder
|
||||||
|
.build_float_compare(
|
||||||
|
inkwell::FloatPredicate::ONE,
|
||||||
|
lhs_value.into_float_value(),
|
||||||
|
rhs_value.into_float_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
} else {
|
||||||
|
ctx.builder
|
||||||
|
.build_int_compare(
|
||||||
|
inkwell::IntPredicate::NE,
|
||||||
|
lhs_value.into_int_value(),
|
||||||
|
rhs_value.into_int_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ir::BinOp::Ge => {
|
||||||
|
if is_float {
|
||||||
|
ctx.builder
|
||||||
|
.build_float_compare(
|
||||||
|
inkwell::FloatPredicate::OGE,
|
||||||
|
lhs_value.into_float_value(),
|
||||||
|
rhs_value.into_float_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
} else {
|
||||||
|
ctx.builder
|
||||||
|
.build_int_compare(
|
||||||
|
if is_signed {
|
||||||
|
inkwell::IntPredicate::SGE
|
||||||
|
} else {
|
||||||
|
inkwell::IntPredicate::UGE
|
||||||
|
},
|
||||||
|
lhs_value.into_int_value(),
|
||||||
|
rhs_value.into_int_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ir::BinOp::Gt => {
|
||||||
|
if is_float {
|
||||||
|
ctx.builder
|
||||||
|
.build_float_compare(
|
||||||
|
inkwell::FloatPredicate::OGT,
|
||||||
|
lhs_value.into_float_value(),
|
||||||
|
rhs_value.into_float_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
} else {
|
||||||
|
ctx.builder
|
||||||
|
.build_int_compare(
|
||||||
|
if is_signed {
|
||||||
|
inkwell::IntPredicate::SGT
|
||||||
|
} else {
|
||||||
|
inkwell::IntPredicate::UGT
|
||||||
|
},
|
||||||
|
lhs_value.into_int_value(),
|
||||||
|
rhs_value.into_int_value(),
|
||||||
|
"",
|
||||||
|
)?
|
||||||
|
.as_basic_value_enum()
|
||||||
|
}
|
||||||
|
}
|
||||||
ir::BinOp::Offset => todo!(),
|
ir::BinOp::Offset => todo!(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue