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 bwor = (0x0f | 0x00) << 4;
|
||||||
let bwxor = (0xf0 | 0x0f);
|
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::Add => mir::BinaryOperator::Add,
|
||||||
ast::BinaryOperator::Minus => mir::BinaryOperator::Minus,
|
ast::BinaryOperator::Minus => mir::BinaryOperator::Minus,
|
||||||
ast::BinaryOperator::Mult => mir::BinaryOperator::Mult,
|
ast::BinaryOperator::Mult => mir::BinaryOperator::Mult,
|
||||||
ast::BinaryOperator::And => mir::BinaryOperator::And,
|
|
||||||
ast::BinaryOperator::Div => mir::BinaryOperator::Div,
|
ast::BinaryOperator::Div => mir::BinaryOperator::Div,
|
||||||
ast::BinaryOperator::Mod => mir::BinaryOperator::Mod,
|
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::LT => mir::BinaryOperator::Cmp(mir::CmpOperator::LT),
|
||||||
ast::BinaryOperator::LE => mir::BinaryOperator::Cmp(mir::CmpOperator::LE),
|
ast::BinaryOperator::LE => mir::BinaryOperator::Cmp(mir::CmpOperator::LE),
|
||||||
ast::BinaryOperator::GT => mir::BinaryOperator::Cmp(mir::CmpOperator::GT),
|
ast::BinaryOperator::GT => mir::BinaryOperator::Cmp(mir::CmpOperator::GT),
|
||||||
ast::BinaryOperator::GE => mir::BinaryOperator::Cmp(mir::CmpOperator::GE),
|
ast::BinaryOperator::GE => mir::BinaryOperator::Cmp(mir::CmpOperator::GE),
|
||||||
ast::BinaryOperator::EQ => mir::BinaryOperator::Cmp(mir::CmpOperator::EQ),
|
ast::BinaryOperator::EQ => mir::BinaryOperator::Cmp(mir::CmpOperator::EQ),
|
||||||
ast::BinaryOperator::NE => mir::BinaryOperator::Cmp(mir::CmpOperator::NE),
|
ast::BinaryOperator::NE => mir::BinaryOperator::Cmp(mir::CmpOperator::NE),
|
||||||
ast::BinaryOperator::BitshiftRight => todo!(),
|
ast::BinaryOperator::BitshiftRight => mir::BinaryOperator::BitshiftRight,
|
||||||
ast::BinaryOperator::BitshiftLeft => todo!(),
|
ast::BinaryOperator::BitshiftLeft => mir::BinaryOperator::BitshiftLeft,
|
||||||
ast::BinaryOperator::Or => todo!(),
|
ast::BinaryOperator::Xor => mir::BinaryOperator::Xor,
|
||||||
ast::BinaryOperator::Xor => todo!(),
|
ast::BinaryOperator::BWAnd => mir::BinaryOperator::BitwiseAnd,
|
||||||
ast::BinaryOperator::BWAnd => todo!(),
|
ast::BinaryOperator::BWOr => mir::BinaryOperator::BitwiseOr,
|
||||||
ast::BinaryOperator::BWOr => todo!(),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -885,6 +885,30 @@ impl mir::Expression {
|
|||||||
.maybe_location(&mut scope.block, location);
|
.maybe_location(&mut scope.block, location);
|
||||||
Instr::Sub(lhs, mul)
|
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(
|
Some(StackValue(
|
||||||
StackValueKind::Immutable(
|
StackValueKind::Immutable(
|
||||||
|
@ -352,6 +352,12 @@ impl Display for BinaryOperator {
|
|||||||
BinaryOperator::Cmp(op) => Display::fmt(op, f),
|
BinaryOperator::Cmp(op) => Display::fmt(op, f),
|
||||||
BinaryOperator::Div => write!(f, "/"),
|
BinaryOperator::Div => write!(f, "/"),
|
||||||
BinaryOperator::Mod => 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 {
|
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 {
|
pub fn signed(&self) -> bool {
|
||||||
match self {
|
match self {
|
||||||
TypeKind::Bool => false,
|
TypeKind::Bool => false,
|
||||||
@ -240,6 +206,12 @@ impl BinaryOperator {
|
|||||||
CmpOperator::EQ => true,
|
CmpOperator::EQ => true,
|
||||||
CmpOperator::NE => 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)
|
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::FunctionCall(..) => None,
|
||||||
ExprKind::If(_) => None,
|
ExprKind::If(_) => None,
|
||||||
|
@ -222,6 +222,12 @@ pub enum BinaryOperator {
|
|||||||
Div,
|
Div,
|
||||||
Mod,
|
Mod,
|
||||||
And,
|
And,
|
||||||
|
Or,
|
||||||
|
Xor,
|
||||||
|
BitwiseOr,
|
||||||
|
BitwiseAnd,
|
||||||
|
BitshiftRight,
|
||||||
|
BitshiftLeft,
|
||||||
Cmp(CmpOperator),
|
Cmp(CmpOperator),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user