codea: 'optimierungen' fuer die multiplikation
authorBernhard Urban <lewurm@gmail.com>
Wed, 5 May 2010 15:02:14 +0000 (17:02 +0200)
committerBernhard Urban <lewurm@gmail.com>
Wed, 5 May 2010 15:02:14 +0000 (17:02 +0200)
codea/code.bfe

index 7c0c074ec50049bc936ae75def47947b5821290c..d014d3916329415c89b036981fe7e109b1423fbc 100644 (file)
@@ -5,6 +5,9 @@
 #define KID_VAL(A) bnode->kids[A]->val
 #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 */
 #define KIDREG2PARM(A) if(bnode->kids[A]->param_index > -1) { bnode->kids[A]->reg = param_reg(bnode->kids[A]->param_index); }
 
 #include <stdio.h>
@@ -21,15 +24,25 @@ void gen_e_eno(struct treenode *bnode, char *instr)
 
 void gen_e_imm(struct treenode *bnode, char *instr)
 {
-       printf("\t%s $%li, %%%s\n", instr, KID_VAL(1), KID_REG(0));
-       move(KID_REG(0), BN_REG);
+       /* man kann sich ein move der konstante bei der multiplikation ersparen */
+       if(strcmp(instr, "imulq") == 0) {
+               printf("\timulq $%li, %%%s, %%%s\n", KID_VAL(1), KID_REG(0), BN_REG);
+       } else {
+               printf("\t%s $%li, %%%s\n", instr, KID_VAL(1), KID_REG(0));
+               move(KID_REG(0), BN_REG);
+       }
 }
 
 void gen_imm_eno(struct treenode *bnode, char *instr)
 {
-       moveimm(KID_VAL(0), BN_REG);
        KIDREG2PARM(1);
-       printf("\tsubq %%%s, %%%s\n", KID_REG(1), BN_REG);
+       /* man kann sich ein move der konstante bei der multiplikation ersparen */
+       if(strcmp(instr, "imulq") == 0) {
+               printf("\timulq $%li, %%%s, %%%s\n", KID_VAL(0), KID_REG(1), BN_REG);
+       } else {
+               moveimm(KID_VAL(0), BN_REG);
+               printf("\t%s %%%s, %%%s\n", instr, KID_REG(1), BN_REG);
+       }
 }
 
 %}
@@ -47,13 +60,14 @@ expr: imm # 1 # moveimm(BN_VAL, BN_REG);
 
 expr: O_SUB(expr,exprno) # 1 # gen_e_eno(bnode, "subq");
 expr: O_SUB(expr,imm) # 2 # gen_e_imm(bnode, "subq");
-expr: O_SUB(imm,exprno) # 3 # gen_imm_eno(bnode, "subq");
+expr: O_SUB(imm,exprno) # 2 # gen_imm_eno(bnode, "subq");
 
 expr: O_ADD(expr,exprno) # 1 # gen_e_eno(bnode, "addq");
 expr: O_ADD(imm,expr) # 2 # gen_e_imm(bnode, "addq");
 
 expr: O_MUL(expr,exprno) # 1 # gen_e_eno(bnode, "imulq");
-expr: O_MUL(expr,imm) # 2 # gen_e_imm(bnode, "imulq");
+expr: O_MUL(expr,imm) # 1 # gen_e_imm(bnode, "imulq");
+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");