diff options
author | pacien | 2018-06-06 15:25:08 +0200 |
---|---|---|
committer | pacien | 2018-06-06 15:25:08 +0200 |
commit | 771a1470cf4630670c8bb4ba8436bfc7cd2e38ca (patch) | |
tree | 218444b47c4a68c6b33230a8ca346f97559647db /src | |
parent | c0feca77799b859a5331417595ac0190bb999e0d (diff) | |
download | tpc-compiler-771a1470cf4630670c8bb4ba8436bfc7cd2e38ca.tar.gz |
extract func param passing
Diffstat (limited to 'src')
-rw-r--r-- | src/generator.c | 7 | ||||
-rw-r--r-- | src/generator.h | 4 | ||||
-rw-r--r-- | src/tpc.y | 5 |
3 files changed, 10 insertions, 6 deletions
diff --git a/src/generator.c b/src/generator.c index 9948966..e7a33c8 100644 --- a/src/generator.c +++ b/src/generator.c | |||
@@ -137,6 +137,13 @@ Type gen_function_call(const char name[], int nb_param) { | |||
137 | return return_type; | 137 | return return_type; |
138 | } | 138 | } |
139 | 139 | ||
140 | void gen_function_param_passing(int nb_params) { | ||
141 | for(int i = 1; i <= nb_params; i++) { | ||
142 | fprintf(output, "mov r8, [rbp + %d]\n", (nb_params - i + 2) * 8); | ||
143 | fprintf(output, "mov [rbp - %d], r8\n", i * 8); | ||
144 | } | ||
145 | } | ||
146 | |||
140 | void gen_declaration(const char name[], Type type, Scope scope) { | 147 | void gen_declaration(const char name[], Type type, Scope scope) { |
141 | switch (scope) { | 148 | switch (scope) { |
142 | case GLOBAL: | 149 | case GLOBAL: |
diff --git a/src/generator.h b/src/generator.h index 94b03c8..bf48644 100644 --- a/src/generator.h +++ b/src/generator.h | |||
@@ -20,17 +20,17 @@ void gen_epilogue(); | |||
20 | void gen_const(const char name[], int value, Scope scope); | 20 | void gen_const(const char name[], int value, Scope scope); |
21 | 21 | ||
22 | Type gen_function_declaration(const char name[], int return_type); | 22 | Type gen_function_declaration(const char name[], int return_type); |
23 | void gen_tab_declaration(const char name[], Scope scope, int size); | ||
24 | void gen_function_end_declaration(const char name[], Type return_type, int nb_param); | 23 | void gen_function_end_declaration(const char name[], Type return_type, int nb_param); |
25 | void gen_function_return(Type expect, Type actual); | 24 | void gen_function_return(Type expect, Type actual); |
26 | Type gen_function_call(const char name[], int nb_param); | 25 | Type gen_function_call(const char name[], int nb_param); |
26 | void gen_function_param_passing(int nb_params); | ||
27 | 27 | ||
28 | void gen_tab_declaration(const char name[], Scope scope, int size); | ||
28 | void gen_declaration(const char name[], Type type, Scope scope); | 29 | void gen_declaration(const char name[], Type type, Scope scope); |
29 | void gen_check(const char name[], Scope scope); | 30 | void gen_check(const char name[], Scope scope); |
30 | 31 | ||
31 | void gen_reade(const char name[], Scope scope); | 32 | void gen_reade(const char name[], Scope scope); |
32 | void gen_readc(const char name[], Scope scope); | 33 | void gen_readc(const char name[], Scope scope); |
33 | |||
34 | void gen_print(Type type); | 34 | void gen_print(Type type); |
35 | 35 | ||
36 | void gen_if_label(int idx); | 36 | void gen_if_label(int idx); |
@@ -114,10 +114,7 @@ ListTypVar: | |||
114 | | TYPE IDENT { gen_declaration($<ident>2, $<type>1, scope); $<num>$ = 1; } | 114 | | TYPE IDENT { gen_declaration($<ident>2, $<type>1, scope); $<num>$ = 1; } |
115 | ; | 115 | ; |
116 | Corps: | 116 | Corps: |
117 | '{' { int i; | 117 | '{' { gen_function_param_passing(nb_param[num_scope]); } |
118 | for(i=1;i<=nb_param[num_scope];i++){ | ||
119 | fprintf(output, "mov r8, [rbp + %d]\nmov [rbp - %d], r8\n", (nb_param[num_scope]-i+2)*8, i*8); | ||
120 | } } | ||
121 | DeclConsts DeclVars SuiteInstr '}' | 118 | DeclConsts DeclVars SuiteInstr '}' |
122 | ; | 119 | ; |
123 | SuiteInstr: | 120 | SuiteInstr: |