feat: add support for booleans and comparision operators

This commit is contained in:
2026-04-21 10:56:42 +02:00
parent bad6b9e116
commit eb3663dfbb
11 changed files with 293 additions and 3 deletions
+50
View File
@@ -192,6 +192,14 @@ impl<'a> FunctionTranslator<'a> {
let inner_val = self.translate_expr(inner);
match op {
UnaryOp::Neg => self.builder.ins().ineg(inner_val),
UnaryOp::Not => {
// `!x` is equivalent to `x == 0` for booleans (0 or 1).
let ty = CraneliftBackend::lower_type(&inner.ty);
let zero = self.builder.ins().iconst(ty, 0);
self.builder
.ins()
.icmp(ir::condcodes::IntCC::Equal, inner_val, zero)
}
}
}
TypedExprKind::Binary { op, lhs, rhs } => {
@@ -218,6 +226,48 @@ impl<'a> FunctionTranslator<'a> {
self.builder.ins().urem(lhs_val, rhs_val)
}
}
BinaryOp::Eq => {
self.builder
.ins()
.icmp(ir::condcodes::IntCC::Equal, lhs_val, rhs_val)
}
BinaryOp::Neq => {
self.builder
.ins()
.icmp(ir::condcodes::IntCC::NotEqual, lhs_val, rhs_val)
}
BinaryOp::Lt => {
let cc = if is_signed {
ir::condcodes::IntCC::SignedLessThan
} else {
ir::condcodes::IntCC::UnsignedLessThan
};
self.builder.ins().icmp(cc, lhs_val, rhs_val)
}
BinaryOp::Le => {
let cc = if is_signed {
ir::condcodes::IntCC::SignedLessThanOrEqual
} else {
ir::condcodes::IntCC::UnsignedLessThanOrEqual
};
self.builder.ins().icmp(cc, lhs_val, rhs_val)
}
BinaryOp::Gt => {
let cc = if is_signed {
ir::condcodes::IntCC::SignedGreaterThan
} else {
ir::condcodes::IntCC::UnsignedGreaterThan
};
self.builder.ins().icmp(cc, lhs_val, rhs_val)
}
BinaryOp::Ge => {
let cc = if is_signed {
ir::condcodes::IntCC::SignedGreaterThanOrEqual
} else {
ir::condcodes::IntCC::UnsignedGreaterThanOrEqual
};
self.builder.ins().icmp(cc, lhs_val, rhs_val)
}
}
}
}