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