From: Bernhard Urban Date: Tue, 8 Jun 2010 12:20:50 +0000 (+0200) Subject: ppc: codea_abgabe_a{i,h} gehen jetzt auch, bin mir dabei aber ned ganz sicher... X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=uebersetzerbau-ss10.git;a=commitdiff_plain;h=393b53c6f2065d6cd834327447b2a6aacfccf7bd ppc: codea_abgabe_a{i,h} gehen jetzt auch, bin mir dabei aber ned ganz sicher... --- diff --git a/gesamt_ppc/code.bfe b/gesamt_ppc/code.bfe index 7fdc466..8451990 100644 --- a/gesamt_ppc/code.bfe +++ b/gesamt_ppc/code.bfe @@ -73,7 +73,7 @@ void gen_field_imm(struct treenode *bnode) printf("\t#gen_field_imm\n"); KIDKIDREG2PARM(0,0); KIDREG2ID(1); - printf("\timulq $%d, %d(%%%s), %%%s\n", KID_VAL(1), bnode->kids[0]->soffset * 8, KIDKID_REG(0, 0), BN_REG); + printf("\tmullw $%d, %d(%%%s), %%%s\n", KID_VAL(1), bnode->kids[0]->soffset * 8, KIDKID_REG(0, 0), BN_REG); } void gen_e_imm(struct treenode *bnode, char *instr) @@ -82,11 +82,11 @@ void gen_e_imm(struct treenode *bnode, char *instr) KIDREG2PARM(0); KIDREG2ID(1); /* man kann sich ein move der konstante bei der multiplikation ersparen */ - if(strcmp(instr, "imulq") == 0) { + if(strcmp(instr, "mullw") == 0) { if(KID_VAL(1) == 1 && strcmp(KID_REG(0), BN_REG) == 0) { printf("\t#multiplikation mit 1 wegoptimiert\n"); } else { - printf("\timulq $%d, %%%s, %%%s\n", KID_VAL(1), KID_REG(0), BN_REG); + printf("\tmullw $%d, %%%s, %%%s\n", KID_VAL(1), KID_REG(0), BN_REG); } } else { if(strcmp(instr, "sub") == 0 && KID_VAL(1) == 0) { @@ -119,11 +119,11 @@ void gen_imm_eno(struct treenode *bnode, char *instr) KIDREG2ID(0); KIDREG2PARM(1); /* man kann sich ein move der konstante bei der multiplikation ersparen */ - if(strcmp(instr, "imulq") == 0) { + if(strcmp(instr, "mullw") == 0) { if(KID_VAL(0) == 1 && strcmp(KID_REG(1), BN_REG) == 0) { printf("\t#multiplikation mit 1 wegoptimiert\n"); } else { - printf("\timulq $%d, %%%s, %%%s\n", KID_VAL(0), KID_REG(1), BN_REG); + printf("\tmullw $%d, %%%s, %%%s\n", KID_VAL(0), KID_REG(1), BN_REG); } } else { /* addq */ printf("\taddq $%d, %%%s\n", KID_VAL(0), BN_REG); @@ -160,12 +160,19 @@ void gen_eqless(struct treenode *bnode, char *op, short e0, short e1, short deep printf("\tset%s %%%s\n", op, reg_64to8l(BN_REG)); printf("\tand $1, %%%s\n", BN_REG); #else - if(e0) { KIDREG2PARM(0); } else { KIDREG2ID(0); } + if(e0) { KIDREG2PARM(0); } else { moveimm(KID_VAL(0), BN_REG); } if(e1) { KIDREG2PARM(1); } else { KIDREG2ID(1); } if(strcmp(op,"e")==0 && KID_VAL(1) == 0) { /* not */ printf("\tcntlzw %s,%s\n", KID_REG(0), KID_REG(0)); printf("\tsrwi %s,%s,5\n", BN_REG, KID_REG(0)); + } else if(strcmp(op, "l")==0 || strcmp(op, "g")==0) { + /* less */ + printf("\tcmpw 7,%s,%s\n", KID_REG(1), KID_REG(0)); + printf("\tmfcr %s\n", BN_REG); + /* EQ, GT, LT */ + /* um (32-29)=3 nach rechts shiften und das LSB anschauen */ + printf("\trlwinm %s,%s,%i,31,31\n", BN_REG, BN_REG, strcmp(op,"l")==0 ? 30 : 30); } #endif } @@ -357,16 +364,16 @@ expr: O_ADD(imm,expr) # 1 # gen_imm_eno(bnode, "addq"); 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,expr) # 1 # gen_e_eno(bnode, "mullw"); +expr: O_MUL(expr,imm) # 1 # gen_e_imm(bnode, "mullw"); +expr: O_MUL(imm,expr) # 1 # gen_imm_eno(bnode, "mullw"); -expr: O_MUL(expr,O_FIELD(expr)) # 1 # gen_e_field(bnode, "imulq"); +expr: O_MUL(expr,O_FIELD(expr)) # 1 # gen_e_field(bnode, "mullw"); expr: O_MUL(O_FIELD(expr),imm) # 1 # gen_field_imm(bnode); -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_OR(expr,expr) # 1 # gen_e_eno(bnode, "or"); +expr: O_OR(expr,imm) # 2 # gen_e_imm(bnode, "or"); +expr: O_OR(expr,O_FIELD(expr)) # 2 # gen_e_field(bnode, "or"); expr: O_LESS(expr,expr) # 3 # gen_eqless(bnode, "l", 1, 1, 0);