Add intrinsic binops
This commit is contained in:
		
							parent
							
								
									d448c8b9f1
								
							
						
					
					
						commit
						436ab319b8
					
				| @ -5,5 +5,5 @@ fn main() -> u32 { | ||||
|   let value = 6; | ||||
|   let other = 15; | ||||
| 
 | ||||
|   return value * other + 7 * -value; | ||||
|   return value + other; | ||||
| } | ||||
|  | ||||
| @ -2,7 +2,7 @@ use reid_lib::Instr; | ||||
| 
 | ||||
| use crate::{ | ||||
|     codegen::{ErrorKind, Scope}, | ||||
|     mir::{FunctionDefinition, FunctionDefinitionKind, TypeKind}, | ||||
|     mir::{BinaryOperator, BinopDefinition, FunctionDefinition, FunctionDefinitionKind, TypeKind}, | ||||
| }; | ||||
| 
 | ||||
| #[derive(Debug, Clone, Copy)] | ||||
| @ -26,13 +26,37 @@ fn intrinsic( | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| fn intrinsic_binop( | ||||
|     op: BinaryOperator, | ||||
|     lhs: TypeKind, | ||||
|     rhs: TypeKind, | ||||
|     ret_ty: TypeKind, | ||||
|     kind: InstrinsicKind, | ||||
| ) -> BinopDefinition { | ||||
|     BinopDefinition { | ||||
|         lhs: ("lhs".to_string(), lhs), | ||||
|         op, | ||||
|         rhs: ("rhs".to_owned(), rhs), | ||||
|         return_type: ret_ty, | ||||
|         fn_kind: FunctionDefinitionKind::Intrinsic(kind), | ||||
|         meta: Default::default(), | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| pub fn form_intrinsics() -> Vec<FunctionDefinition> { | ||||
|     let mut intrinsics = Vec::new(); | ||||
| 
 | ||||
|     intrinsics.push(intrinsic( | ||||
|         "addition", | ||||
|         TypeKind::U8, | ||||
|         vec![("lhs".into(), TypeKind::U8), ("rhs".into(), TypeKind::U8)], | ||||
|     intrinsics | ||||
| } | ||||
| 
 | ||||
| pub fn form_intrinsic_binops() -> Vec<BinopDefinition> { | ||||
|     let mut intrinsics = Vec::new(); | ||||
| 
 | ||||
|     intrinsics.push(intrinsic_binop( | ||||
|         BinaryOperator::Add, | ||||
|         TypeKind::U32, | ||||
|         TypeKind::U32, | ||||
|         TypeKind::U32, | ||||
|         InstrinsicKind::IAdd, | ||||
|     )); | ||||
| 
 | ||||
|  | ||||
| @ -44,7 +44,7 @@ | ||||
| use std::path::PathBuf; | ||||
| 
 | ||||
| use error_raporting::{ErrorKind as ErrorRapKind, ErrorModules, ReidError}; | ||||
| use intrinsics::form_intrinsics; | ||||
| use intrinsics::{form_intrinsic_binops, form_intrinsics}; | ||||
| use lexer::FullToken; | ||||
| use mir::{ | ||||
|     linker::LinkerPass, typecheck::TypeCheck, typeinference::TypeInference, typerefs::TypeRefs, | ||||
| @ -128,6 +128,12 @@ pub fn perform_all_passes<'map>( | ||||
|     #[cfg(debug_assertions)] | ||||
|     dbg!(&context); | ||||
| 
 | ||||
|     for module in &mut context.modules { | ||||
|         for intrinsic in form_intrinsic_binops() { | ||||
|             module.1.binop_defs.insert(0, intrinsic); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     for module in &mut context.modules { | ||||
|         for intrinsic in form_intrinsics() { | ||||
|             module.1.functions.insert(0, intrinsic); | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user