Add AST -> MIR for bitwise-operations and or
This commit is contained in:
parent
516833d26f
commit
49084ea0af
@ -6,5 +6,5 @@ fn main() -> bool {
|
||||
let bwor = (0x0f | 0x00) << 4;
|
||||
let bwxor = (0xf0 | 0x0f);
|
||||
|
||||
return (bwxor == 255) && ((value == 15) || false) && (bwor == 240);
|
||||
return (bwxor == 255) && ((bwand == 15) || false) && (bwor == 240);
|
||||
}
|
@ -446,21 +446,21 @@ impl ast::BinaryOperator {
|
||||
ast::BinaryOperator::Add => mir::BinaryOperator::Add,
|
||||
ast::BinaryOperator::Minus => mir::BinaryOperator::Minus,
|
||||
ast::BinaryOperator::Mult => mir::BinaryOperator::Mult,
|
||||
ast::BinaryOperator::And => mir::BinaryOperator::And,
|
||||
ast::BinaryOperator::Div => mir::BinaryOperator::Div,
|
||||
ast::BinaryOperator::Mod => mir::BinaryOperator::Mod,
|
||||
ast::BinaryOperator::And => mir::BinaryOperator::And,
|
||||
ast::BinaryOperator::Or => mir::BinaryOperator::Or,
|
||||
ast::BinaryOperator::LT => mir::BinaryOperator::Cmp(mir::CmpOperator::LT),
|
||||
ast::BinaryOperator::LE => mir::BinaryOperator::Cmp(mir::CmpOperator::LE),
|
||||
ast::BinaryOperator::GT => mir::BinaryOperator::Cmp(mir::CmpOperator::GT),
|
||||
ast::BinaryOperator::GE => mir::BinaryOperator::Cmp(mir::CmpOperator::GE),
|
||||
ast::BinaryOperator::EQ => mir::BinaryOperator::Cmp(mir::CmpOperator::EQ),
|
||||
ast::BinaryOperator::NE => mir::BinaryOperator::Cmp(mir::CmpOperator::NE),
|
||||
ast::BinaryOperator::BitshiftRight => todo!(),
|
||||
ast::BinaryOperator::BitshiftLeft => todo!(),
|
||||
ast::BinaryOperator::Or => todo!(),
|
||||
ast::BinaryOperator::Xor => todo!(),
|
||||
ast::BinaryOperator::BWAnd => todo!(),
|
||||
ast::BinaryOperator::BWOr => todo!(),
|
||||
ast::BinaryOperator::BitshiftRight => mir::BinaryOperator::BitshiftRight,
|
||||
ast::BinaryOperator::BitshiftLeft => mir::BinaryOperator::BitshiftLeft,
|
||||
ast::BinaryOperator::Xor => mir::BinaryOperator::Xor,
|
||||
ast::BinaryOperator::BWAnd => mir::BinaryOperator::BitwiseAnd,
|
||||
ast::BinaryOperator::BWOr => mir::BinaryOperator::BitwiseOr,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -885,6 +885,30 @@ impl mir::Expression {
|
||||
.maybe_location(&mut scope.block, location);
|
||||
Instr::Sub(lhs, mul)
|
||||
}
|
||||
(mir::BinaryOperator::Or, true, true) => todo!(),
|
||||
(mir::BinaryOperator::Or, true, false) => todo!(),
|
||||
(mir::BinaryOperator::Or, false, true) => todo!(),
|
||||
(mir::BinaryOperator::Or, false, false) => todo!(),
|
||||
(mir::BinaryOperator::Xor, true, true) => todo!(),
|
||||
(mir::BinaryOperator::Xor, true, false) => todo!(),
|
||||
(mir::BinaryOperator::Xor, false, true) => todo!(),
|
||||
(mir::BinaryOperator::Xor, false, false) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseOr, true, true) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseOr, true, false) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseOr, false, true) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseOr, false, false) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseAnd, true, true) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseAnd, true, false) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseAnd, false, true) => todo!(),
|
||||
(mir::BinaryOperator::BitwiseAnd, false, false) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftRight, true, true) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftRight, true, false) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftRight, false, true) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftRight, false, false) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftLeft, true, true) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftLeft, true, false) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftLeft, false, true) => todo!(),
|
||||
(mir::BinaryOperator::BitshiftLeft, false, false) => todo!(),
|
||||
};
|
||||
Some(StackValue(
|
||||
StackValueKind::Immutable(
|
||||
|
@ -352,6 +352,12 @@ impl Display for BinaryOperator {
|
||||
BinaryOperator::Cmp(op) => Display::fmt(op, f),
|
||||
BinaryOperator::Div => write!(f, "/"),
|
||||
BinaryOperator::Mod => write!(f, "%"),
|
||||
BinaryOperator::Or => write!(f, "||"),
|
||||
BinaryOperator::Xor => write!(f, "^"),
|
||||
BinaryOperator::BitwiseOr => write!(f, "|"),
|
||||
BinaryOperator::BitwiseAnd => write!(f, "&"),
|
||||
BinaryOperator::BitshiftRight => write!(f, ">>"),
|
||||
BinaryOperator::BitshiftLeft => write!(f, "<<"),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -26,40 +26,6 @@ enum BlockReturn<'b> {
|
||||
}
|
||||
|
||||
impl TypeKind {
|
||||
/// Return the type that is the result of a binary operator between two
|
||||
/// values of this type
|
||||
pub fn simple_binop_type(&self, op: &BinaryOperator) -> Option<TypeKind> {
|
||||
if !self.category().is_simple_maths() {
|
||||
return None;
|
||||
}
|
||||
Some(match op {
|
||||
BinaryOperator::Add => self.clone(),
|
||||
BinaryOperator::Minus => self.clone(),
|
||||
BinaryOperator::Mult => self.clone(),
|
||||
BinaryOperator::And => TypeKind::Bool,
|
||||
BinaryOperator::Cmp(_) => TypeKind::Bool,
|
||||
BinaryOperator::Div => self.clone(),
|
||||
BinaryOperator::Mod => self.clone(),
|
||||
})
|
||||
}
|
||||
|
||||
/// Reverse of binop_type, where the given hint is the known required output
|
||||
/// type of the binop, and the output is the hint for the lhs/rhs type.
|
||||
pub fn simple_binop_hint(&self, op: &BinaryOperator) -> Option<TypeKind> {
|
||||
if !self.category().is_simple_maths() {
|
||||
return None;
|
||||
}
|
||||
match op {
|
||||
BinaryOperator::Add
|
||||
| BinaryOperator::Minus
|
||||
| BinaryOperator::Mult
|
||||
| BinaryOperator::Div
|
||||
| BinaryOperator::Mod => Some(self.clone()),
|
||||
BinaryOperator::And => None,
|
||||
BinaryOperator::Cmp(_) => None,
|
||||
}
|
||||
}
|
||||
|
||||
pub fn signed(&self) -> bool {
|
||||
match self {
|
||||
TypeKind::Bool => false,
|
||||
@ -240,6 +206,12 @@ impl BinaryOperator {
|
||||
CmpOperator::EQ => true,
|
||||
CmpOperator::NE => true,
|
||||
},
|
||||
BinaryOperator::Or => true,
|
||||
BinaryOperator::Xor => true,
|
||||
BinaryOperator::BitwiseOr => true,
|
||||
BinaryOperator::BitwiseAnd => true,
|
||||
BinaryOperator::BitshiftRight => false,
|
||||
BinaryOperator::BitshiftLeft => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -507,6 +479,12 @@ impl Expression {
|
||||
}
|
||||
maybe(lhs.num_value()?, rhs.num_value()?, |a, b| a % b)
|
||||
}
|
||||
BinaryOperator::Or => None,
|
||||
BinaryOperator::Xor => maybe(lhs.num_value()?, rhs.num_value()?, |a, b| a ^ b),
|
||||
BinaryOperator::BitwiseOr => maybe(lhs.num_value()?, rhs.num_value()?, |a, b| a | b),
|
||||
BinaryOperator::BitwiseAnd => maybe(lhs.num_value()?, rhs.num_value()?, |a, b| a & b),
|
||||
BinaryOperator::BitshiftRight => maybe(lhs.num_value()?, rhs.num_value()?, |a, b| a >> b),
|
||||
BinaryOperator::BitshiftLeft => maybe(lhs.num_value()?, rhs.num_value()?, |a, b| a << b),
|
||||
},
|
||||
ExprKind::FunctionCall(..) => None,
|
||||
ExprKind::If(_) => None,
|
||||
|
@ -222,6 +222,12 @@ pub enum BinaryOperator {
|
||||
Div,
|
||||
Mod,
|
||||
And,
|
||||
Or,
|
||||
Xor,
|
||||
BitwiseOr,
|
||||
BitwiseAnd,
|
||||
BitshiftRight,
|
||||
BitshiftLeft,
|
||||
Cmp(CmpOperator),
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user