From ca235efbf622798be9c5adb965b37f3be0f5d335 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 5 May 2010 19:22:26 +0200 Subject: [PATCH] codea: equal --- codea/code.bfe | 55 +++++++++++++++++++++++++++----------------------- codea/parser.y | 7 ++++++- 2 files changed, 36 insertions(+), 26 deletions(-) diff --git a/codea/code.bfe b/codea/code.bfe index 12b2fa5..362ace5 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -45,47 +45,47 @@ void gen_imm_eno(struct treenode *bnode, char *instr) } } -void gen_less0(struct treenode *bnode) +void gen_eqless_footer(struct treenode *bnode, char *op) { - printf("\t//gen_less0\n"); + moveimm(1, BN_REG); + printf("\tcmov%s %%%2$s, %%%2$s\n", op, BN_REG); + moveimm(0, KID_REG(1)); + printf("\tcmovn%s %%%s, %%%s\n", op, KID_REG(1), BN_REG); +} + +void gen_eqless_ee(struct treenode *bnode, char *op) +{ + printf("\t//gen_eqless_ee\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); + + gen_eqless_footer(bnode, op); } -void gen_less1(struct treenode *bnode) +void gen_eqless_ei(struct treenode *bnode, char *op) { - printf("\t//gen_less1\n"); + printf("\t//gen_eqless_ei\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); + + gen_eqless_footer(bnode, op); } -void gen_less2(struct treenode *bnode) +void gen_eqless_ie(struct treenode *bnode, char *op) { - printf("\t//gen_less2\n"); - + printf("\t//gen_eqless_ie\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); + gen_eqless_footer(bnode, op); } %} @@ -115,19 +115,24 @@ 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); +expr: O_LESS(expr,expr) # 5 # gen_eqless_ee(bnode, "l"); +expr: O_LESS(expr,imm) # 5 # gen_eqless_ei(bnode, "l"); +expr: O_LESS(imm,expr) # 6 # gen_eqless_ie(bnode, "l"); + +expr: O_EQ(expr,expr) # 5 # gen_eqless_ee(bnode, "e"); +expr: O_EQ(expr,imm) # 5 # gen_eqless_ei(bnode, "e"); +expr: O_EQ(imm,expr) # 6 # gen_eqless_ie(bnode, "e"); 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_EQ(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 df66936..736cb23 100644 --- a/codea/parser.y +++ b/codea/parser.y @@ -270,8 +270,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_EQ, @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@); + } @} ; -- 2.25.1