%%
-begin: ret # 0 # printf("// end\n");
-ret: O_RET(expr) # 2 # move(BNR, "rax"); ret();
+begin: ret # 0 # printf("\n");
+ret: O_RET(expr) # 2 # move(BNR, "rax"); func_footer();
expr: O_ID # 1 # if(bnode->param_index > -1) move(param_reg(bnode->param_index), BNR);
expr: imm # 1 # moveimm(BNV, BNR);
expr: O_ADD(expr,expr) # 1 # printf("\taddq %%%s, %%%s\n", KIDR(1), KIDR(0));
expr: O_ADD(imm,expr) # 1 # printf("\taddq $%li, %%%s\n", KIDV(1), KIDR(0)); move(KIDR(0), BNR);
-expr: O_ADD(expr,imm) # 1 # printf("\taddq $%li, %%%s\n", KIDV(0), KIDR(1)); move(KIDR(1), BNR);
+expr: O_ADD(expr,imm) # 1 # printf("\taddq $%li, %%%s\n", KIDV(1), KIDR(0)); move(KIDR(0), BNR);
imm: O_ADD(imm,imm) # 0 # BNV = KIDV(0)+KIDV(1);
@reg {
/* TODO */
+ fprintf(stderr, "at_expr: Minusterm.imm \"%i\", Term.imm \"%i\"\n", @Minusterm.imm@, @Term.imm@);
+ #if 0
if(@Minusterm.imm@) {
@Minusterm.node@->reg = @Expr.node@->reg;
@Term.node@->reg = next_reg(@Minusterm.node@->reg, @Expr.node@->skip);
@Minusterm.node@->skip = 1;
} else {
+ #endif
@Term.node@->reg = @Expr.node@->reg;
@Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip);
- }
}
@}
'(' Expr ')'
@{
@i @Term.node@ = @Expr.node@;
- @reg fprintf(stderr, "wtf1\n");
@}
| NUM
@{
@i @Term.node@ = new_number(@NUM.val@);
@i @Term.imm@ = 1;
-
- @reg fprintf(stderr, "wtf2\n");
@}
| '-' NUM
@{
@i @Term.node@ = new_number(-1 * (@NUM.val@));
@i @Term.imm@ = 1;
-
- @reg fprintf(stderr, "wtf3\n");
@}
| THIS
@{
- @i @Term.node@ = new_node(O_ID, TREENULL, TREENULL); @Term.node@->param_index = 0;
+ @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, 0);
@i @Term.imm@ = 0;
-
- @reg fprintf(stderr, "wtf4\n");
@}
| IDENT
@{
@c check(@Term.s@, @IDENT.name@, S_VAR|S_PARM);
- @i @Term.node@ = new_node(O_ID, TREENULL, TREENULL); {
- struct symbol *tmp;
- if((tmp = tab_lookup(@Term.s@, @IDENT.name@, S_PARM)) != TREENULL) {
- @Term.node@->param_index = tmp->param_index;
- }
- }
+ @i @Term.node@ = new_param(O_ID, TREENULL, TREENULL, tab_lookup(@Term.s@, @IDENT.name@, S_PARM) == SYMNULL ? -1 : tab_lookup(@Term.s@, @IDENT.name@, S_PARM)->param_index);
@i @Term.imm@ = 0;
-
- @reg fprintf(stderr, "wtf5\n");
@}
| Feld
@{
@i @Term.node@ = TREENULL;
@i @Term.imm@ = 0;
-
- @reg fprintf(stderr, "wtf6\n");
@}
| IDENT '(' Exprs ')'
@{
@i @Term.node@ = TREENULL;
@i @Term.imm@ = 0;
-
- @reg fprintf(stderr, "wtf7\n");
@}
| Term '.' IDENT '(' Exprs ')'
@{
@i @Term.node@ = TREENULL;
@i @Term.imm@ = 0;
-
- @reg fprintf(stderr, "wtf8\n");
@}
;
#include <stdlib.h>
#include "tree.h"
-#if 1
+#if 0
#define DDTREE
#endif
return new;
}
+struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index)
+{
+ struct treenode *new = new_node(op, l, r);
+
+#ifdef DDTREE
+ fprintf(stderr, "new_param: %i (index)\n", param_index);
+#endif
+ new->param_index = param_index;
+ return new;
+}
+
struct treenode *new_number(long val)
{
struct treenode *new = _new_plain(O_NUM);