Add Mult and And -operators to the whole chain
This commit is contained in:
		
							parent
							
								
									8afb2c2572
								
							
						
					
					
						commit
						b84672ef8c
					
				| @ -200,6 +200,8 @@ impl Builder { | ||||
|                 Constant(_) => Ok(()), | ||||
|                 Add(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), | ||||
|                 Sub(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), | ||||
|                 Mult(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), | ||||
|                 And(lhs, rhs) => match_types(&lhs, &rhs, &self).map(|_| ()), | ||||
|                 ICmp(_, lhs, rhs) => { | ||||
|                     let t = match_types(&lhs, &rhs, self)?; | ||||
|                     if t.comparable() { | ||||
| @ -248,6 +250,8 @@ impl InstructionValue { | ||||
|                 Constant(c) => Ok(c.get_type()), | ||||
|                 Add(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||
|                 Sub(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||
|                 Mult(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||
|                 And(lhs, rhs) => match_types(lhs, rhs, &builder), | ||||
|                 ICmp(_, _, _) => Ok(Type::Bool), | ||||
|                 FunctionCall(function_value, _) => Ok(builder.function_data(function_value).ret), | ||||
|                 Phi(values) => values.first().ok_or(()).and_then(|v| v.get_type(&builder)), | ||||
|  | ||||
| @ -263,6 +263,16 @@ impl InstructionHolder { | ||||
|                     let rhs_val = module.values.get(&rhs).unwrap().value_ref; | ||||
|                     LLVMBuildSub(module.builder_ref, lhs_val, rhs_val, c"sub".as_ptr()) | ||||
|                 } | ||||
|                 Mult(lhs, rhs) => { | ||||
|                     let lhs_val = module.values.get(&lhs).unwrap().value_ref; | ||||
|                     let rhs_val = module.values.get(&rhs).unwrap().value_ref; | ||||
|                     LLVMBuildMul(module.builder_ref, lhs_val, rhs_val, c"mul".as_ptr()) | ||||
|                 } | ||||
|                 And(lhs, rhs) => { | ||||
|                     let lhs_val = module.values.get(&lhs).unwrap().value_ref; | ||||
|                     let rhs_val = module.values.get(&rhs).unwrap().value_ref; | ||||
|                     LLVMBuildAnd(module.builder_ref, lhs_val, rhs_val, c"and".as_ptr()) | ||||
|                 } | ||||
|                 ICmp(pred, lhs, rhs) => { | ||||
|                     let lhs = module.values.get(&lhs).unwrap(); | ||||
|                     let rhs_val = module.values.get(&rhs).unwrap().value_ref; | ||||
|  | ||||
| @ -86,6 +86,8 @@ impl Debug for InstructionKind { | ||||
|             Self::Constant(c) => c.fmt(f), | ||||
|             Self::Add(lhs, rhs) => fmt_binop(f, lhs, &"+", rhs), | ||||
|             Self::Sub(lhs, rhs) => fmt_binop(f, lhs, &"-", rhs), | ||||
|             Self::Mult(lhs, rhs) => fmt_binop(f, lhs, &"*", rhs), | ||||
|             Self::And(lhs, rhs) => fmt_binop(f, lhs, &"&&", rhs), | ||||
|             Self::Phi(val) => fmt_call(f, &"Phi", &val), | ||||
|             Self::ICmp(cmp, lhs, rhs) => fmt_binop(f, lhs, cmp, rhs), | ||||
|             Self::FunctionCall(fun, params) => fmt_call(f, fun, params), | ||||
|  | ||||
| @ -152,6 +152,8 @@ pub enum InstructionKind { | ||||
|     Constant(ConstValue), | ||||
|     Add(InstructionValue, InstructionValue), | ||||
|     Sub(InstructionValue, InstructionValue), | ||||
|     Mult(InstructionValue, InstructionValue), | ||||
|     And(InstructionValue, InstructionValue), | ||||
|     Phi(Vec<InstructionValue>), | ||||
| 
 | ||||
|     /// Integer Comparison
 | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| // Main | ||||
| fn main() -> bool { | ||||
|     return 2 == fibonacci(3); | ||||
|     return (5 == fibonacci(5)) && (2 == fibonacci(3)); | ||||
| } | ||||
| 
 | ||||
| // Fibonacci | ||||
|  | ||||
| @ -240,8 +240,12 @@ impl mir::Expression { | ||||
|                     mir::BinaryOperator::Minus => { | ||||
|                         scope.block.build(InstructionKind::Sub(lhs, rhs)).unwrap() | ||||
|                     } | ||||
|                     mir::BinaryOperator::Mult => todo!(), | ||||
|                     mir::BinaryOperator::And => todo!(), | ||||
|                     mir::BinaryOperator::Mult => { | ||||
|                         scope.block.build(InstructionKind::Mult(lhs, rhs)).unwrap() | ||||
|                     } | ||||
|                     mir::BinaryOperator::And => { | ||||
|                         scope.block.build(InstructionKind::And(lhs, rhs)).unwrap() | ||||
|                     } | ||||
|                     mir::BinaryOperator::Logic(l) => scope | ||||
|                         .block | ||||
|                         .build(InstructionKind::ICmp(l.int_predicate(), lhs, rhs)) | ||||
|  | ||||
| @ -103,7 +103,10 @@ impl Display for StmtKind { | ||||
| 
 | ||||
| impl Display for Expression { | ||||
|     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { | ||||
|         Display::fmt(&self.0, f) | ||||
|         f.write_char('(')?; | ||||
|         Display::fmt(&self.0, f)?; | ||||
|         f.write_char(')')?; | ||||
|         Ok(()) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user