From ea73a166fb0973b8fd44c320769b9844de11e78e Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Tue, 18 May 2010 01:11:47 +0200 Subject: [PATCH] codea: optimierungen fuer fieldzugriffe bei mul, sub und add --- codea/code.bfe | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/codea/code.bfe b/codea/code.bfe index 377082d..14cde11 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -40,6 +40,19 @@ void gen_e_field(struct treenode *bnode, char *instr) printf("\t%s %d(%%%s), %%%s\n", instr, bnode->kids[1]->soffset * 8, KIDKID_REG(1,0), KID_REG(0)); } +void gen_field_imm(struct treenode *bnode) +{ + printf("\t//gen_field_imm\n"); + KIDKIDREG2PARM(0,0); + KIDREG2ID(1); + + if(KID_VAL(1) == 1 && strcmp(KID_REG(0), BN_REG) == 0) { + printf("\t//multiplikation mit 1 wegoptimiert\n"); + } else { + printf("\timulq $%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) { printf("\t//gen_e_imm(%s)\n", instr); @@ -63,6 +76,16 @@ void gen_e_imm(struct treenode *bnode, char *instr) } } +void gen_imm_field(struct treenode *bnode) +{ + printf("\t//gen_imm_field\n"); + KIDREG2ID(0); + KIDKIDREG2PARM(1, 0); + + moveimm(KID_VAL(0), BN_REG); + printf("\tsubq %d(%%%s), %%%s\n", bnode->kids[1]->soffset * 8, KIDKID_REG(1, 0), BN_REG); +} + void gen_imm_eno(struct treenode *bnode, char *instr) { printf("\t//gen_imm_eno(%s)\n", instr); @@ -143,9 +166,10 @@ 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,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(expr,O_FIELD(expr)) # 2 # gen_e_field(bnode, "subq"); +expr: O_SUB(imm,O_FIELD(expr)) # 2 # gen_imm_field(bnode); 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); @@ -158,11 +182,14 @@ 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,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_MUL(expr,imm) # 1 # gen_e_imm(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"); -- 2.25.1