From 828d0aa567098cd32c62ed74ee034da4be4d8297 Mon Sep 17 00:00:00 2001 From: itycodes Date: Mon, 10 Mar 2025 06:38:55 +0100 Subject: [PATCH] Modify the language's store-ptr syntax to make it match the compiler store-ptr now takes a symbol instead of a list containing a symbol to make the compiler easier to write. --- src/compiler/backend/tests.rs | 57 ++++++++++++++++++++++++++++++++++- src/parser/tests.rs | 6 ++-- 2 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/compiler/backend/tests.rs b/src/compiler/backend/tests.rs index 2f0cce5..62ff63e 100644 --- a/src/compiler/backend/tests.rs +++ b/src/compiler/backend/tests.rs @@ -12,7 +12,7 @@ fn test_emit() { (dec out-color:*v4f32o Output) (entry main Fragment OriginUpperLeft (:frag-coord :out-color)) (fun (main) :<> - (store-ptr (out-color) + (store-ptr out-color (v4f32i (/ (.xy (load-ptr frag-coord)) (v2f32 1920.0 1080.0)) 1.0 @@ -49,3 +49,58 @@ fn test_type_parse() { assert_eq!(parse_type(&"f32".to_string()), Float(32)); assert_eq!(parse_type(&"s32".to_string()), Int(32)); } + +#[test] +fn test_block_ssa() { + use crate::compiler::backend::*; + use crate::compiler::*; + use crate::parser::*; + let src = " + (module Shader Logical GLSL450) +(import :std GLSL.std.450) +(bind (out-color:*f32) (Location 0)) +(dec out-color:*f32 Output) +(entry main Fragment OriginUpperLeft (:out-color)) +(fun (main) :<> + (store-ptr out-color 1.0)) +"; + let ast = parse(tokenize(src)); + let mut module = meta_compile(ast.unwrap()).unwrap(); + let fun = module.functions.pop().unwrap(); + let block = fun.ast.unwrap(); + let block = block + .list() + .unwrap() + .get(0) + .unwrap() + .clone(); + println!("{:#?}", block); + let mut vars = vec![]; + let mut constants = vec![]; + let mut counter = Box::new(0); + let mut stack = vec![]; + let mut out = vec![]; + for v in &module.globals { + vars.push((v.name.clone(), v.typ.clone())); + } + compile_ast_ssa( + block, + &mut vars, + &mut constants, + &mut counter, + &mut stack, + &mut out, + ); + println!("\n---constants:---\n{:#?}\n------", constants); + println!("\n---vars:---\n{:#?}\n------", vars); + println!("\n---stack:---\n{:#?}\n------", stack); + println!("\n---counter---\n{}\n------", counter); + println!("\n---out---"); + for (a, b) in &out { + match a { + Some(a) => println!("%{} = {}", a, b), + None => println!("{}", b), + } + } + println!("------"); +} diff --git a/src/parser/tests.rs b/src/parser/tests.rs index 8e94147..4a96b68 100644 --- a/src/parser/tests.rs +++ b/src/parser/tests.rs @@ -44,7 +44,7 @@ fn test_parse() { (dec out-color:*v4f32o Output) (entry main Fragment OriginUpperLeft (:frag-coord :out-color)) (fun (main) :<> - (store-ptr (out-color) + (store-ptr out-color (v4f32i (/ (.xy (load-ptr frag-coord)) (v2f32 1920.0 1080.0)) 1.0 @@ -111,9 +111,7 @@ fn test_parse() { Ast::Symbol(Localised::dummy_location(":<>".to_string())), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("store-ptr".to_string())), - Ast::List(Localised::dummy_location(vec![Ast::Symbol( - Localised::dummy_location("out-color".to_string()), - )])), + Ast::Symbol(Localised::dummy_location("out-color".to_string())), Ast::List(Localised::dummy_location(vec![ Ast::Symbol(Localised::dummy_location("v4f32i".to_string())), Ast::List(Localised::dummy_location(vec![