Add intrinsic binops

This commit is contained in:
Sofia 2025-07-24 16:01:23 +03:00
parent d448c8b9f1
commit 436ab319b8
3 changed files with 37 additions and 7 deletions

View File

@ -5,5 +5,5 @@ fn main() -> u32 {
let value = 6;
let other = 15;
return value * other + 7 * -value;
return value + other;
}

View File

@ -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,
));

View File

@ -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);