From 436ab319b8dd69ca88032d03443ae8ecbcdcfac0 Mon Sep 17 00:00:00 2001 From: sofia Date: Thu, 24 Jul 2025 16:01:23 +0300 Subject: [PATCH] Add intrinsic binops --- examples/arithmetic.reid | 2 +- reid/src/intrinsics.rs | 34 +++++++++++++++++++++++++++++----- reid/src/lib.rs | 8 +++++++- 3 files changed, 37 insertions(+), 7 deletions(-) diff --git a/examples/arithmetic.reid b/examples/arithmetic.reid index 95223af..6a6bd80 100644 --- a/examples/arithmetic.reid +++ b/examples/arithmetic.reid @@ -5,5 +5,5 @@ fn main() -> u32 { let value = 6; let other = 15; - return value * other + 7 * -value; + return value + other; } diff --git a/reid/src/intrinsics.rs b/reid/src/intrinsics.rs index 40fc221..a743aee 100644 --- a/reid/src/intrinsics.rs +++ b/reid/src/intrinsics.rs @@ -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 { 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 { + let mut intrinsics = Vec::new(); + + intrinsics.push(intrinsic_binop( + BinaryOperator::Add, + TypeKind::U32, + TypeKind::U32, + TypeKind::U32, InstrinsicKind::IAdd, )); diff --git a/reid/src/lib.rs b/reid/src/lib.rs index 1fa5844..2b317dd 100644 --- a/reid/src/lib.rs +++ b/reid/src/lib.rs @@ -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);