@@ -438,7 +438,6 @@ unsigned short compileExpr(KaosIR* program, Expr* expr)
438
438
load_dict (program , symbol );
439
439
break ;
440
440
case V_REF :
441
- load_ref (program , symbol );
442
441
break ;
443
442
default :
444
443
load_any (program , symbol );
@@ -1054,6 +1053,20 @@ void compileDecl(KaosIR* program, Decl* decl)
1054
1053
1055
1054
compileSpec (program , decl -> v .func_decl -> type -> v .func_type -> params );
1056
1055
1056
+ for (int i = 0 ; i < function -> parameter_count ; i ++ ) {
1057
+ Symbol * parameter = function -> parameters [i ];
1058
+ push_inst_r_i (program , GETARG , R0 , (i * 2 ));
1059
+ push_inst_r_i (program , GETARG , R1 , (i * 2 ) + 1 );
1060
+
1061
+ parameter -> addr = stack_counter ++ ;
1062
+ push_inst_i_i (program , ALLOCAI , parameter -> addr , 2 * sizeof (long long ));
1063
+ push_inst_r_i (program , REF_ALLOCAI , R2 , parameter -> addr );
1064
+ push_inst_r_r_i (program , STR , R2 , R0 , sizeof (long long ));
1065
+ push_inst_r_i (program , MOVI , R3 , sizeof (long long ));
1066
+ push_inst_r_r_r_i (program , STXR , R2 , R3 , R1 , sizeof (long long ));
1067
+ parameter -> value_type = V_INT ; // TODO: temp, set it according to parameter type
1068
+ }
1069
+
1057
1070
compileStmt (program , decl -> v .func_decl -> body );
1058
1071
if (decl -> v .func_decl -> decision != NULL )
1059
1072
compileSpec (program , decl -> v .func_decl -> decision );
@@ -1988,13 +2001,6 @@ void load_any(KaosIR* program, Symbol* symbol)
1988
2001
// i64 addr = symbol->addr;
1989
2002
}
1990
2003
1991
- void load_ref (KaosIR * program , Symbol * symbol )
1992
- {
1993
- i64 addr = symbol -> addr ;
1994
- push_inst_r_i (program , GETARG , R0 , addr );
1995
- push_inst_r_i (program , GETARG , R1 , addr + 1 );
1996
- }
1997
-
1998
2004
char * compile_module_selector (Expr * module_selector )
1999
2005
{
2000
2006
char * name = NULL ;
0 commit comments