feat: add support for booleans and comparision operators
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user