From: Bernhard Urban Date: Wed, 5 May 2010 16:59:55 +0000 (+0200) Subject: codea: less X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=commitdiff_plain;h=0fdf1644c2700ab9358179ec676ecc2225b4b93c codea: less --- diff --git a/codea/chelper.c b/codea/chelper.c index 1014a71..bbbb361 100644 --- a/codea/chelper.c +++ b/codea/chelper.c @@ -45,7 +45,7 @@ char *next_reg(char *s, short skip, int params) int i=0; if (s != (char*) NULL) { - while(i < 9) { + while(i < REGLEN) { if(!strcmp(s, regs[i++])) { break; } diff --git a/codea/code.bfe b/codea/code.bfe index d014d39..12b2fa5 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -45,6 +45,49 @@ void gen_imm_eno(struct treenode *bnode, char *instr) } } +void gen_less0(struct treenode *bnode) +{ + printf("\t//gen_less0\n"); + KIDREG2PARM(0); +#if 0 + /* TODO */ + KIDREG2PARM(1) +#endif + printf("\tcmp %%%s, %%%s\n", KID_REG(1), KID_REG(0)); + moveimm(1, BN_REG); + printf("\tcmovl %%%1$s, %%%1$s\n", BN_REG); + moveimm(0, KID_REG(1)); + printf("\tcmovnl %%%s, %%%s\n", KID_REG(1), BN_REG); +} + +void gen_less1(struct treenode *bnode) +{ + printf("\t//gen_less1\n"); + KIDREG2PARM(0); +#if 0 + /* TODO */ + KIDREG2PARM(1) +#endif + printf("\tcmp $%li, %%%s\n", KID_VAL(1), KID_REG(0)); + moveimm(1, BN_REG); + printf("\tcmovl %%%1$s, %%%1$s\n", BN_REG); + moveimm(0, KID_REG(1)); + printf("\tcmovnl %%%s, %%%s\n", KID_REG(1), BN_REG); +} + +void gen_less2(struct treenode *bnode) +{ + printf("\t//gen_less2\n"); + + moveimm(KID_VAL(0), BN_REG); + printf("\tcmp %%%s, %%%s\n", KID_REG(1), BN_REG); + + moveimm(1, BN_REG); + printf("\tcmovl %%%1$s, %%%1$s\n", BN_REG); + moveimm(0, KID_REG(1)); + printf("\tcmovnl %%%s, %%%s\n", KID_REG(1), BN_REG); +} + %} %start begin @@ -72,13 +115,19 @@ expr: O_MUL(imm,exprno) # 1 # gen_imm_eno(bnode, "imulq"); expr: O_OR(expr,exprno) # 1 # gen_e_eno(bnode, "orq"); expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "orq"); +expr: O_LESS(expr,expr) # 5 # gen_less0(bnode); +expr: O_LESS(expr,imm) # 5 # gen_less1(bnode); +expr: O_LESS(imm,expr) # 6 # gen_less2(bnode); + + exprno: O_ID # 0 # /* brauchen wir nicht 'zwischenlagern', weil nur gelesen wird */ exprno: expr -imm: O_ADD(imm,imm) # 0 # BN_VAL = KID_VAL(0)+KID_VAL(1); -imm: O_SUB(imm,imm) # 0 # BN_VAL = KID_VAL(0)-KID_VAL(1); -imm: O_MUL(imm,imm) # 0 # BN_VAL = KID_VAL(0)*KID_VAL(1); +imm: O_ADD(imm,imm) # 0 # BN_VAL = KID_VAL(0) + KID_VAL(1); +imm: O_SUB(imm,imm) # 0 # BN_VAL = KID_VAL(0) - KID_VAL(1); +imm: O_MUL(imm,imm) # 0 # BN_VAL = KID_VAL(0) * KID_VAL(1); +imm: O_LESS(imm,imm) # 0 # BN_VAL = KID_VAL(0) < KID_VAL(1) ? 1 : 0; imm: O_NUM # 0 # %% diff --git a/codea/parser.y b/codea/parser.y index c64007e..df66936 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -259,8 +259,13 @@ Expr: | Term '<' Term @{ - @i @Expr.node@ = TREENULL; @i @Expr.exprcount@ = @Term.0.exprcount@ + @Term.1.exprcount@; fprintf(stderr, "(Expr)- Term < Term\n"); + @i @Expr.node@ = new_node(O_LESS, @Term.0.node@, @Term.1.node@, @Expr.exprcount@); + + @reg { + @Term.0.node@->reg = @Expr.node@->reg; + @Term.1.node@->reg = next_reg(@Term.0.node@->reg, @Expr.node@->skip, @Expr.gparamges@); + } @} | Term '=' Term