codea: konstante bei mul und add wegoptimieren
authorBernhard Urban <lewurm@gmail.com>
Mon, 17 May 2010 22:25:26 +0000 (00:25 +0200)
committerBernhard Urban <lewurm@gmail.com>
Mon, 17 May 2010 22:25:26 +0000 (00:25 +0200)
codea/code.bfe

index b00bdfebde1f1858501e6ed72345d9d4a1540bb7..377082dfc93676bad846a6dd75190e1268433540 100644 (file)
@@ -47,10 +47,19 @@ void gen_e_imm(struct treenode *bnode, char *instr)
        KIDREG2ID(1);
        /* man kann sich ein move der konstante bei der multiplikation ersparen */
        if(strcmp(instr, "imulq") == 0) {
-               printf("\timulq $%d, %%%s, %%%s\n", KID_VAL(1), KID_REG(0), BN_REG);
+               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);
+               }
        } else {
-               printf("\t%s $%d, %%%s\n", instr, KID_VAL(1), KID_REG(0));
-               move(KID_REG(0), BN_REG);
+               if(strcmp(instr, "subq") == 0 && KID_VAL(1) == 0) {
+                       printf("\t//subtraktion mit 0 wegoptimiert\n");
+                       move(KID_REG(0), BN_REG);
+               } else {
+                       printf("\t%s $%d, %%%s\n", instr, KID_VAL(1), KID_REG(0));
+                       move(KID_REG(0), BN_REG);
+               }
        }
 }
 
@@ -61,7 +70,11 @@ void gen_imm_eno(struct treenode *bnode, char *instr)
        KIDREG2PARM(1);
        /* man kann sich ein move der konstante bei der multiplikation ersparen */
        if(strcmp(instr, "imulq") == 0) {
-               printf("\timulq $%d, %%%s, %%%s\n", KID_VAL(0), KID_REG(1), BN_REG);
+               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);
+               }
        } else if(strcmp(instr, "addq") == 0) {
                printf("\taddq $%d, %%%s\n", KID_VAL(0), BN_REG);
        } else { /* subq */