From c2a8a36f40f5dd2bdb26b07c4f9fc61801abbe3d Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 18 May 2010 15:15:40 +0200 Subject: [PATCH] codea: refactor, teil1 --- codea/chelper.c | 27 ++---------------- codea/chelper.h | 3 +- codea/code.bfe | 73 +++++++++++++++++++++++++++++------------------- codea/parser.y | 22 ++++++--------- codea/symtable.c | 8 ++---- codea/tree.c | 2 +- codea/tree.h | 38 +++++-------------------- 7 files changed, 66 insertions(+), 107 deletions(-) diff --git a/codea/chelper.c b/codea/chelper.c index 25893f9..015e7a3 100644 --- a/codea/chelper.c +++ b/codea/chelper.c @@ -4,7 +4,7 @@ #include "chelper.h" #include "tree.h" -#if 1 +#if 0 #define DDCHELP #endif @@ -24,12 +24,6 @@ void func_footer(void) void move(char *src, char *dst) { - if(src == NULL) { - printf("//wtf, src ist null\n"); - } - if(dst == NULL) { - printf("//wtf, dst ist null\n"); - } if(strcmp(src,dst) != 0) { printf("\tmovq %%%s, %%%s\n", src, dst); } @@ -42,12 +36,7 @@ void moveimm(long imm, char *dst) printf("\tmovq %s, %%%s\n", buf, dst); } -void ret(void) -{ - printf("\tret\n"); -} - -char *next_reg(char *s, short skip, int params) +char *next_reg(char *s, int params) { int i = 0; if (s != (char*) NULL) { @@ -56,20 +45,9 @@ char *next_reg(char *s, short skip, int params) } i = (i+1) % REGLEN; } - if(skip) { - i = (i+1) % REGLEN; - } #ifdef DDCHELP fprintf(stderr, "next_reg(): %s (bei %i parameter)\n", regs64[i], params); #endif - /* TODO: <= passt? */ - if(REGLEN - params <= i) { - fprintf(stderr, "next_reg(): register \"%s\" in dem sich ein parameter befindet wird als temporaeres register verwendet(params: %i, i: %i)\n", regs64[i], params, i); - /* TODO: exit hier? */ -#if 0 - exit(4); -#endif - } return regs64[i]; } @@ -86,7 +64,6 @@ char *reg_64to8l(char *s) exit(4); } - char *param_reg(int num) { char *regs[] = {"rdi", "rsi", "rdx", "rcx", "r8", "r9"}; diff --git a/codea/chelper.h b/codea/chelper.h index de14489..d857db0 100644 --- a/codea/chelper.h +++ b/codea/chelper.h @@ -2,9 +2,8 @@ #define __CHELPER_H void func_header(char *s); void func_footer(void); -char *next_reg(char *s, short skip, int params); +char *next_reg(char *s, int params); char *reg_64to8l(char *s); char *param_reg(int num); -void ret(void); void move(char *src, char *dest); #endif diff --git a/codea/code.bfe b/codea/code.bfe index e5677b2..4d024af 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -1,21 +1,28 @@ %{ #define BFEHAX +/* macros zum registerzugriff bei kinder */ #define KID_REG(A) bnode->kids[A]->reg #define KIDKID_REG(A,B) bnode->kids[A]->kids[B]->reg #define KIDKIDKID_REG(A,B,C) bnode->kids[A]->kids[B]->kids[C]->reg + +/* macros zum wertezugriff bei kindern */ #define KID_VAL(A) bnode->kids[A]->val #define KIDKID_VAL(A,B) bnode->kids[A]->kids[B]->val #define KIDKIDKID_VAL(A,B,C) bnode->kids[A]->kids[B]->kids[C]->val + +/* macros zum zugriff des aktuellen knotens */ #define BN_REG bnode->reg #define BN_VAL bnode->val -/* falls ein parameter auf der "leseseite" ist, soll das statt ein weiteres - * register verwendet werden */ +/* wenn sich ein parameter auf der "leseseite" (also links bei at&t syntax) + * befindet, dann soll dieses register verwendet werden */ #define KIDREG2PARM(A) if(bnode->kids[A]->param_index > -1) { bnode->kids[A]->reg = param_reg(bnode->kids[A]->param_index); } #define KIDKIDREG2PARM(A,B) if(bnode->kids[A]->kids[B]->param_index > -1) { bnode->kids[A]->kids[B]->reg = param_reg(bnode->kids[A]->kids[B]->param_index); } #define KIDKIDKIDREG2PARM(A,B,C) if(bnode->kids[A]->kids[B]->kids[C]->param_index > -1) { bnode->kids[A]->kids[B]->kids[C]->reg = param_reg(bnode->kids[A]->kids[B]->kids[C]->param_index); } +/* wenn sich ein parameter auf der "schreibeseite" befindet (also rechts bei + * at&t syntax), dann muss es vorher in ein temporaeres register gemovt werden */ #define KIDREG2ID(A) if(bnode->kids[A]->op == O_ID && bnode->kids[A]->param_index > -1) move(param_reg(bnode->kids[A]->param_index), bnode->kids[A]->reg); #include @@ -181,56 +188,64 @@ retexpr: expr expr: O_ID # 0 # expr: imm # 1 # moveimm(BN_VAL, BN_REG); -expr: O_SUB(expr,expr) # 1 # gen_e_eno(bnode, "subq"); + +expr: O_SUB(expr,expr) # 1 # gen_e_eno(bnode, "subq"); expr: O_SUB(expr,O_FIELD(expr)) # 2 # gen_e_field(bnode, "subq"); -expr: O_SUB(expr,imm) # 2 # gen_e_imm(bnode, "subq"); -expr: O_SUB(imm,expr) # 2 # gen_imm_eno(bnode, "subq"); -expr: O_SUB(imm,O_FIELD(expr)) # 2 # gen_imm_field(bnode); +expr: O_SUB(expr,imm) # 2 # gen_e_imm(bnode, "subq"); +expr: O_SUB(imm,expr) # 2 # gen_imm_eno(bnode, "subq"); +expr: O_SUB(imm,O_FIELD(expr)) # 2 # gen_imm_field(bnode); expr: O_SUB(expr,O_SUB(O_ID,expr)) # 2 # gen_subspecial(bnode, 0); -expr: O_SUB(expr,O_SUB(imm,expr)) # 2 # gen_subspecial(bnode, 1); +expr: O_SUB(expr,O_SUB(imm,expr)) # 2 # gen_subspecial(bnode, 1); -expr: O_SUB(expr,O_MUL(O_MONE,expr)) # 1 # gen_lea(bnode,0); -expr: O_SUB(expr,O_MUL(O_MTWO,expr)) # 1 # gen_lea(bnode,0); -expr: O_SUB(expr,O_MUL(O_MFOUR,expr)) # 1 # gen_lea(bnode,0); +expr: O_SUB(expr,O_MUL(O_MONE,expr)) # 1 # gen_lea(bnode,0); +expr: O_SUB(expr,O_MUL(O_MTWO,expr)) # 1 # gen_lea(bnode,0); +expr: O_SUB(expr,O_MUL(O_MFOUR,expr)) # 1 # gen_lea(bnode,0); expr: O_SUB(expr,O_MUL(O_MEIGHT,expr)) # 1 # gen_lea(bnode,0); -expr: O_SUB(expr,O_MUL(expr,O_MONE)) # 1 # gen_lea(bnode,1); -expr: O_SUB(expr,O_MUL(expr,O_MTWO)) # 1 # gen_lea(bnode,1); -expr: O_SUB(expr,O_MUL(expr,O_MFOUR)) # 1 # gen_lea(bnode,1); +expr: O_SUB(expr,O_MUL(expr,O_MONE)) # 1 # gen_lea(bnode,1); +expr: O_SUB(expr,O_MUL(expr,O_MTWO)) # 1 # gen_lea(bnode,1); +expr: O_SUB(expr,O_MUL(expr,O_MFOUR)) # 1 # gen_lea(bnode,1); expr: O_SUB(expr,O_MUL(expr,O_MEIGHT)) # 1 # gen_lea(bnode,1); -expr: O_ADD(expr,expr) # 1 # gen_e_eno(bnode, "addq"); -expr: O_ADD(expr,O_FIELD(expr)) # 2 # gen_e_field(bnode, "addq"); + +expr: O_ADD(expr,expr) # 1 # gen_e_eno(bnode, "addq"); expr: O_ADD(expr,imm) # 2 # gen_e_imm(bnode, "addq"); expr: O_ADD(imm,expr) # 2 # gen_imm_eno(bnode, "addq"); -expr: O_MUL(expr,expr) # 1 # gen_e_eno(bnode, "imulq"); -expr: O_MUL(expr,O_FIELD(expr)) # 2 # gen_e_field(bnode, "imulq"); +expr: O_ADD(expr,O_FIELD(expr)) # 2 # gen_e_field(bnode, "addq"); + + +expr: O_MUL(expr,expr) # 1 # gen_e_eno(bnode, "imulq"); expr: O_MUL(expr,imm) # 1 # gen_e_imm(bnode, "imulq"); +expr: O_MUL(imm,expr) # 1 # gen_imm_eno(bnode, "imulq"); + +expr: O_MUL(expr,O_FIELD(expr)) # 1 # gen_e_field(bnode, "imulq"); expr: O_MUL(O_FIELD(expr),imm) # 1 # gen_field_imm(bnode); -expr: O_MUL(imm,expr) # 1 # gen_imm_eno(bnode, "imulq"); -expr: O_OR(expr,expr) # 1 # gen_e_eno(bnode, "orq"); -expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "orq"); +expr: O_OR(expr,expr) # 1 # gen_e_eno(bnode, "orq"); +expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "orq"); expr: O_OR(expr,O_FIELD(expr)) # 2 # gen_e_field(bnode, "orq"); -expr: O_LESS(expr,expr) # 3 # gen_eqless(bnode, "l", 1, 1, 0); + +expr: O_LESS(expr,expr) # 3 # gen_eqless(bnode, "l", 1, 1, 0); expr: O_LESS(expr,O_FIELD(expr)) # 3 # gen_eqless(bnode, "l", 1, 1, 1); -expr: O_LESS(expr,imm) # 3 # gen_eqless(bnode, "l", 1, 0, 0); -expr: O_LESS(imm,expr) # 3 # gen_eqless(bnode, "g", 0, 1, 0); +expr: O_LESS(expr,imm) # 3 # gen_eqless(bnode, "l", 1, 0, 0); +expr: O_LESS(imm,expr) # 3 # gen_eqless(bnode, "g", 0, 1, 0); + -expr: O_EQ(expr,expr) # 3 # gen_eqless(bnode, "e", 1, 1, 0); +expr: O_EQ(expr,expr) # 3 # gen_eqless(bnode, "e", 1, 1, 0); expr: O_EQ(expr,O_FIELD(expr)) # 3 # gen_eqless(bnode, "e", 1, 1, 1); -expr: O_EQ(expr,imm) # 3 # gen_eqless(bnode, "e", 1, 0, 0); -expr: O_EQ(imm,expr) # 3 # gen_eqless(bnode, "e", 0, 1, 0); -expr: O_EQ(expr,O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0, 0); +expr: O_EQ(expr,imm) # 3 # gen_eqless(bnode, "e", 1, 0, 0); +expr: O_EQ(imm,expr) # 3 # gen_eqless(bnode, "e", 0, 1, 0); +expr: O_EQ(expr,O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0, 0); + expr: O_EQ(O_EQ(expr,O_NULL),O_NULL) # 3 # gen_eqless(bnode, "ne", 1, 0, 1); expr: O_EQ(O_EQ(O_EQ(expr,O_NULL),O_NULL),O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0, 2); -expr: O_FIELD(expr) # 1 # printf("\t//field(expr)\n"); KIDREG2PARM(0); printf("\tmovq %d(%%%s), %%%s\n", bnode->soffset * 8, KID_REG(0), BN_REG); -expr: O_FIELD(imm) # 1 # printf("\t//field(imm)\n"); printf("\tmovq %d, %%%s\n", KID_VAL(0) + (bnode->soffset * 8), BN_REG); +expr: O_FIELD(expr) # 1 # printf("\t//field(expr)\n"); KIDREG2PARM(0); printf("\tmovq %d(%%%s), %%%s\n", bnode->soffset * 8, KID_REG(0), BN_REG); +expr: O_FIELD(imm) # 1 # printf("\t//field(imm)\n"); printf("\tmovq %d, %%%s\n", KID_VAL(0) + (bnode->soffset * 8), BN_REG); imm: O_ADD(imm,imm) # 0 # BN_VAL = KID_VAL(0) + KID_VAL(1); diff --git a/codea/parser.y b/codea/parser.y index c01bee7..bab08bc 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -187,7 +187,7 @@ Statement: statinout() xxputsin(@Expr.s@,) @i @Statement.node@ = new_node(O_RET, @Expr.node@, TREENULL, @Expr.exprcount@+1); fprintf(stderr, "RETURN: %s (gparamges: %i, exprcount: %i, gesamt %i [maximal: 7])\n", @Expr.gparamges@ + @Expr.exprcount@ + 1 > 7 ? "zu hohe tiefe" : "tiefe passt", @Expr.gparamges@, @Expr.exprcount@+1, @Expr.gparamges@+@Expr.exprcount@+1); - @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, 0, @Expr.gparamges@); + @reg @Statement.node@->reg = @Expr.node@->reg = next_reg((char *)NULL, @Expr.gparamges@); @} ; @@ -237,11 +237,10 @@ Expr: @reg { if(!(@Expr.node@->kids[0] == TREENULL && @Expr.node@->kids[1] == TREENULL)) { @Term.node@->reg = @Expr.node@->reg; - @Term.node@->skip = 0; if(@Minusterm.imm@) { @Minusterm.node@->reg = @Expr.node@->reg; } else { - @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip, @Expr.gparamges@); + @Minusterm.node@->reg = next_reg(@Term.node@->reg, @Expr.gparamges@); } } } @@ -255,11 +254,10 @@ Expr: @reg { @Term.node@->reg = @Expr.node@->reg; - @Term.node@->skip = 0; if(@Term.imm@) { @Multerm.node@->reg = @Expr.node@->reg; } else { - @Multerm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip, @Expr.gparamges@); + @Multerm.node@->reg = next_reg(@Term.node@->reg, @Expr.gparamges@); } } @} @@ -271,10 +269,8 @@ Expr: @i @Expr.imm@ = @Term.imm@ && @Orterm.imm@; @reg { - /* TODO */ @Term.node@->reg = @Expr.node@->reg; - @Term.node@->skip = 0; - @Orterm.node@->reg = next_reg(@Term.node@->reg, @Expr.node@->skip, @Expr.gparamges@); + @Orterm.node@->reg = next_reg(@Term.node@->reg, @Expr.gparamges@); } @} @@ -286,7 +282,7 @@ Expr: @reg { @Term.0.node@->reg = @Expr.node@->reg; - @Term.1.node@->reg = next_reg(@Term.0.node@->reg, @Expr.node@->skip, @Expr.gparamges@); + @Term.1.node@->reg = next_reg(@Term.0.node@->reg, @Expr.gparamges@); } @} @@ -298,7 +294,7 @@ Expr: @reg { @Term.0.node@->reg = @Expr.node@->reg; - @Term.1.node@->reg = next_reg(@Term.0.node@->reg, @Expr.node@->skip, @Expr.gparamges@); + @Term.1.node@->reg = next_reg(@Term.0.node@->reg, @Expr.gparamges@); } @} ; @@ -315,7 +311,7 @@ Minusterm: if(@Minusterm.1.imm@) { @Term.node@->reg = @Minusterm.node@->reg; } else { - @Term.node@->reg = next_reg(@Minusterm.1.node@->reg, @Minusterm.node@->skip, @Minusterm.gparamges@); + @Term.node@->reg = next_reg(@Minusterm.1.node@->reg, @Minusterm.gparamges@); } } @} @@ -339,7 +335,7 @@ Multerm: if(@Multerm.1.imm@) { @Term.node@->reg = @Multerm.node@->reg; } else { - @Term.node@->reg = next_reg(@Multerm.1.node@->reg, @Multerm.node@->skip, @Multerm.gparamges@); + @Term.node@->reg = next_reg(@Multerm.1.node@->reg, @Multerm.gparamges@); } } @} @@ -363,7 +359,7 @@ Orterm: if(@Orterm.1.imm@) { @Term.node@->reg = @Orterm.node@->reg; } else { - @Term.node@->reg = next_reg(@Orterm.1.node@->reg, @Orterm.node@->skip, @Orterm.gparamges@); + @Term.node@->reg = next_reg(@Orterm.1.node@->reg, @Orterm.gparamges@); } } @} diff --git a/codea/symtable.c b/codea/symtable.c index f8e4f21..4776240 100755 --- a/codea/symtable.c +++ b/codea/symtable.c @@ -56,9 +56,7 @@ struct symbol *tab_add_symbol(struct symbol *tab, char *ident, short type, short new_elm->param_index = param_index; new_elm->soffset = soffset; - if(tab == SYMNULL) { - return new_elm; - } + if(tab == SYMNULL) return new_elm; while(elm->next != SYMNULL) { elm = elm->next; @@ -72,9 +70,7 @@ struct symbol *tab_lookup(struct symbol *tab, char *ident, short type) { struct symbol *elm = tab; - if(tab == SYMNULL) { - return SYMNULL; - } + if(tab == SYMNULL) return SYMNULL; do { if((elm->type & type) && (strcmp(elm->ident, ident) == 0)) { diff --git a/codea/tree.c b/codea/tree.c index 82d986a..2e430f2 100644 --- a/codea/tree.c +++ b/codea/tree.c @@ -15,7 +15,7 @@ static struct treenode *_new_plain(int op) new->parent = TREENULL; new->label = NULL; new->name = new->reg = (char *)NULL; - new->val = new->skip = new->exprcount = 0; + new->val = new->exprcount = 0; new->param_index = -1; return new; } diff --git a/codea/tree.h b/codea/tree.h index f88851f..2e38ed4 100644 --- a/codea/tree.h +++ b/codea/tree.h @@ -10,39 +10,16 @@ typedef struct burm_state *STATEPTR_TYPE; #endif enum { - O_RET=1, - O_NULL, - O_SUB, - O_MUL, - O_OR, - O_LESS, - O_EQ, - O_ID, - O_ADD, - O_NUM, - O_FIELD, - O_MTWO, - O_MFOUR, - O_MEIGHT, - O_MONE + O_RET=1, O_NULL, O_SUB, O_MUL, + O_OR=5, O_LESS, O_EQ, O_ID, O_ADD, + O_NUM=10, O_FIELD, O_MTWO, O_MFOUR, O_MEIGHT, + O_MONE=15 }; static char *o_names[] = { - "", - "O_RET", - "O_NULL", - "O_SUB", - "O_MUL", - "O_OR", - "O_LESS", - "O_EQ", - "O_ID", - "O_ADD", - "O_NUM", - "O_FIELD", - "O_MTWO", - "O_MFOUR", - "O_MEIGHT", + "", "O_RET", "O_NULL", "O_SUB", "O_MUL", + "O_OR", "O_LESS", "O_EQ", "O_ID", "O_ADD", + "O_NUM", "O_FIELD", "O_MTWO", "O_MFOUR", "O_MEIGHT", "O_MONE" }; @@ -54,7 +31,6 @@ struct treenode { long val; char *reg; struct treenode *parent; - int skip; int param_index; int exprcount; int soffset; -- 2.25.1