From 777a3cb3a801b3ab86e9a77fe045676ed498e350 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 4 May 2010 01:23:21 +0200 Subject: [PATCH] codea: bissl refactor, TODO(vorerst): stack fuer snafu_03.0 oder mehr refactor? --- codea/chelper.c | 5 +++++ codea/chelper.h | 1 + codea/code.bfe | 6 +++--- codea/parser.y | 28 +++++----------------------- codea/tree.c | 13 ++++++++++++- codea/tree.h | 1 + 6 files changed, 27 insertions(+), 27 deletions(-) diff --git a/codea/chelper.c b/codea/chelper.c index 4926b8a..be39f3f 100644 --- a/codea/chelper.c +++ b/codea/chelper.c @@ -12,6 +12,11 @@ void func_header(char *s) printf("\t.globl %1$s\n\t.type %1$s, @function\n%1$s:\n", s); } +void func_footer(void) +{ + printf("\tret\n"); +} + void move(char *src, char *dst) { if(strcmp(src,dst) != 0) { diff --git a/codea/chelper.h b/codea/chelper.h index 9336fd6..9933b34 100644 --- a/codea/chelper.h +++ b/codea/chelper.h @@ -1,6 +1,7 @@ #ifndef __CHELPER_H #define __CHELPER_H void func_header(char *s); +void func_footer(void); char *next_reg(char *s, short skip); char *param_reg(int num); void ret(void); diff --git a/codea/code.bfe b/codea/code.bfe index 0b14110..23a3123 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -19,8 +19,8 @@ %% -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); @@ -31,7 +31,7 @@ expr: O_SUB(expr,imm) # 3 # fprintf(stderr, "osub2\n"); moveimm(KIDV(1), BNR); p 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); diff --git a/codea/parser.y b/codea/parser.y index 4bd07bb..34dadf1 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -208,14 +208,16 @@ Expr: @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); - } } @} @@ -292,69 +294,49 @@ Term: '(' 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"); @} ; diff --git a/codea/tree.c b/codea/tree.c index 1490ae6..b85fe6a 100644 --- a/codea/tree.c +++ b/codea/tree.c @@ -2,7 +2,7 @@ #include #include "tree.h" -#if 1 +#if 0 #define DDTREE #endif @@ -33,6 +33,17 @@ struct treenode *new_node(int op, struct treenode *l, struct treenode *r) 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); diff --git a/codea/tree.h b/codea/tree.h index b4e6fca..38347ce 100644 --- a/codea/tree.h +++ b/codea/tree.h @@ -59,5 +59,6 @@ typedef struct treenode *treenodep; struct treenode *new_node(int op, struct treenode *l, struct treenode *r); struct treenode *new_number(long val); +struct treenode *new_param(int op, struct treenode *l, struct treenode *r, int param_index); #endif -- 2.25.1