arm: codea testcases
authorBernhard Urban <lewurm@gmail.com>
Wed, 30 Mar 2011 01:39:44 +0000 (01:39 +0000)
committerBernhard Urban <lewurm@gmail.com>
Wed, 30 Mar 2011 01:39:44 +0000 (01:39 +0000)
.gitignore
gesamt_arm/Makefile
gesamt_arm/chelper.c
gesamt_arm/code.bfe
gesamt_arm/parser.y

index 650b505f7fbd1c1399f9f800500207fc0a320eb0..4194454957f85c7265e7ae7c8afcbdd88e7161b0 100644 (file)
@@ -65,6 +65,7 @@ gesamt_arm/parser.c
 gesamt_arm/parser.h
 gesamt_arm/scanner.c
 gesamt_arm/code.c
 gesamt_arm/parser.h
 gesamt_arm/scanner.c
 gesamt_arm/code.c
+gesamt_arm/wtf.out
 
 #weitere eintragen...
 torero/torero.log
 
 #weitere eintragen...
 torero/torero.log
index 3421379fe8b0881b748902c05e3bc3cf08d63565..db261f8b883f69f89d856e3a5cbed9f4191769f7 100644 (file)
@@ -1,4 +1,5 @@
 SHELL := bash
 SHELL := bash
+CC := /usr/lib/ccache/gcc
 NAME := gesamt_arm
 CFLAGS := -ansi -pedantic -D_GNU_SOURCE -g
 OBJS := scanner.o parser.o symtable.o code.o chelper.o tree.o
 NAME := gesamt_arm
 CFLAGS := -ansi -pedantic -D_GNU_SOURCE -g
 OBJS := scanner.o parser.o symtable.o code.o chelper.o tree.o
@@ -7,7 +8,7 @@ all: $(NAME)
 
 $(NAME): $(OBJS)
        @echo "  LINK    $@"
 
 $(NAME): $(OBJS)
        @echo "  LINK    $@"
-       @gcc -o $@ $(OBJS) -lfl
+       @$(CC) -o $@ $(OBJS) -lfl
 
 scanner.c: oxout.l
        @echo "  FLEX    $<"
 
 scanner.c: oxout.l
        @echo "  FLEX    $<"
@@ -17,7 +18,7 @@ scanner.c: oxout.l
 %.o: %.c parser.h symtable.h chelper.h tree.h
        @echo "  CC      $<"
        @cp $< tmp.c
 %.o: %.c parser.h symtable.h chelper.h tree.h
        @echo "  CC      $<"
        @cp $< tmp.c
-       @gcc -c $(CFLAGS) $< #-Wall
+       @$(CC) -c $(CFLAGS) $< #-Wall
        @rm tmp.c
 
 parser.c: oxout.y chelper.h tree.h
        @rm tmp.c
 
 parser.c: oxout.y chelper.h tree.h
index ee419220f21d8918c7b4aab2ff93cf049473020d..20e81bffd435e389df1e2487f43d2c33b5d75bf5 100644 (file)
@@ -8,6 +8,7 @@
 #define DDCHELP
 #endif
 
 #define DDCHELP
 #endif
 
+/* TODO */
 #define REGLEN 5
 static char *regsppc[] = {"r10", "r11", "r12", "r13", "r14"};
 
 #define REGLEN 5
 static char *regsppc[] = {"r10", "r11", "r12", "r13", "r14"};
 
@@ -50,20 +51,19 @@ void move(char *src, char *dst)
 {
        if(src == (char*) NULL) return;
        if(strcmp(src,dst) != 0) {
 {
        if(src == (char*) NULL) return;
        if(strcmp(src,dst) != 0) {
-               printf("\tmov %s,%s\n", dst, src);
+               printf("\tmov %s, %s\n", dst, src);
        }
 }
 
 void moveimm(long imm, char *dst)
 {
        }
 }
 
 void moveimm(long imm, char *dst)
 {
+       static int constlbl = 1;
        if((imm > 65536-1) || (imm < -65536)) {
        if((imm > 65536-1) || (imm < -65536)) {
-               /* high word */
-               printf("\tlis %s,%d@ha\n", dst, imm);
-               /* low word */
-               printf("\taddi %s,%s,%d@l\n", dst, dst, imm);
+               printf("\t.align 2\n\t.CONSTLBL%i\n\t.word %i\n", constlbl++);
+               printf("\tldr %s, .CONSTLBL%i\n", dst, constlbl);
        } else {
                /* just low word */
        } else {
                /* just low word */
-               printf("\tli %s,%d@l\n", dst, imm);
+               printf("\t%s %s, #%d\n", imm >= 0 ? "mov" : "mvn", dst, imm >= 0 ? imm : (-1 * imm) - 1);
        }
 }
 
        }
 }
 
@@ -90,7 +90,7 @@ char *reg_64to8l(char *s)
 }
 
 char *param_reg(int num)
 }
 
 char *param_reg(int num)
-{
+{      /* TODO */
        char *regs[] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"};
        return regs[num];
 }
        char *regs[] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"};
        return regs[num];
 }
index 331a3780fdb24191caaa66f7fbc14fec4f417415..05bd2157837995e32c5581d112d2bd3998eb35a8 100644 (file)
@@ -40,12 +40,12 @@ void gen_e_eno(struct treenode *bnode, char *instr)
        printf("\t@ gen_e_eno(%s)\n", instr);
        KIDREG2PARM(0);
        KIDREG2PARM(1);
        printf("\t@ gen_e_eno(%s)\n", instr);
        KIDREG2PARM(0);
        KIDREG2PARM(1);
-       printf("\t%s %s,%s,%s\n", instr, BN_REG, KID_REG(0), KID_REG(1));
+       printf("\t%s %s, %s, %s\n", instr, BN_REG, KID_REG(0), KID_REG(1));
 }
 
 void gen_id_eno(struct treenode *bnode)
 {
 }
 
 void gen_id_eno(struct treenode *bnode)
 {
-       printf("\t#gen_id_eno\n");
+       printf("\t@gen_id_eno\n");
        KIDKIDREG2PARM(1,0);
        KIDKIDREG2PARM(1,1);
        KIDREG2PARM(0);
        KIDKIDREG2PARM(1,0);
        KIDKIDREG2PARM(1,1);
        KIDREG2PARM(0);
@@ -56,31 +56,31 @@ void gen_id_eno(struct treenode *bnode)
 
 void gen_e_imm(struct treenode *bnode, char *instr)
 {
 
 void gen_e_imm(struct treenode *bnode, char *instr)
 {
-       printf("\t#gen_e_imm(%s)\n", instr);
+       printf("\t@gen_e_imm(%s)\n", instr);
        KIDREG2PARM(0);
        KIDREG2ID(1);
        /* man kann sich ein move der konstante bei der multiplikation ersparen */
        if(strcmp(instr, "mullw") == 0) {
                if(KID_VAL(1) == 1 && strcmp(KID_REG(0), BN_REG) == 0) {
        KIDREG2PARM(0);
        KIDREG2ID(1);
        /* man kann sich ein move der konstante bei der multiplikation ersparen */
        if(strcmp(instr, "mullw") == 0) {
                if(KID_VAL(1) == 1 && strcmp(KID_REG(0), BN_REG) == 0) {
-                       printf("\t#multiplikation mit 1 wegoptimiert\n");
+                       printf("\t@multiplikation mit 1 wegoptimiert\n");
                } else {
                        if(KID_VAL(1) > (65536)-1 || KID_VAL(1) < -65536) {
                                moveimm(KID_VAL(1), next_reg(BN_REG,0));
                } else {
                        if(KID_VAL(1) > (65536)-1 || KID_VAL(1) < -65536) {
                                moveimm(KID_VAL(1), next_reg(BN_REG,0));
-                               printf("\tmullw %s,%s,%s\n", BN_REG, KID_REG(0), next_reg(BN_REG,0));
+                               printf("\tmul %s, %s, %s\n", BN_REG, KID_REG(0), next_reg(BN_REG,0));
                        } else {
                        } else {
-                               printf("\tmulli %s,%s,%d\n", BN_REG, KID_REG(0), KID_VAL(1));
+                               printf("\tmul %s, %s, #%d\n", BN_REG, KID_REG(0), KID_VAL(1));
                        }
                }
        } else {
                if(strcmp(instr, "sub") == 0 && KID_VAL(1) == 0) {
                        }
                }
        } else {
                if(strcmp(instr, "sub") == 0 && KID_VAL(1) == 0) {
-                       printf("\t#subtraktion mit 0 wegoptimiert\n");
+                       printf("\t@subtraktion mit 0 wegoptimiert\n");
                        move(KID_REG(0), BN_REG);
                } else {
                        if(KID_VAL(1) > (65536)-1 || KID_VAL(1) < -65536) {
                                moveimm(KID_VAL(1), next_reg(BN_REG,0));
                        move(KID_REG(0), BN_REG);
                } else {
                        if(KID_VAL(1) > (65536)-1 || KID_VAL(1) < -65536) {
                                moveimm(KID_VAL(1), next_reg(BN_REG,0));
-                               printf("\t%s %s,%s,%s\n", instr, BN_REG, KID_REG(0), next_reg(BN_REG,0));
+                               printf("\t%s %s, %s, %s\n", instr, BN_REG, KID_REG(0), next_reg(BN_REG,0));
                        } else {
                        } else {
-                               printf("\t%si %s,%s,%d\n", instr, BN_REG, KID_REG(0), KID_VAL(1));
+                               printf("\t%s %s, %s, #%d\n", instr, BN_REG, KID_REG(0), KID_VAL(1));
                        }
                }
        }
                        }
                }
        }
@@ -88,90 +88,59 @@ void gen_e_imm(struct treenode *bnode, char *instr)
 
 void gen_imm_eno(struct treenode *bnode, char *instr)
 {
 
 void gen_imm_eno(struct treenode *bnode, char *instr)
 {
-       printf("\t#gen_imm_eno(%s)\n", instr);
+       printf("\t@gen_imm_eno(%s)\n", instr);
        KIDREG2ID(0);
        KIDREG2PARM(1);
        /* man kann sich ein move der konstante bei der multiplikation ersparen */
        KIDREG2ID(0);
        KIDREG2PARM(1);
        /* man kann sich ein move der konstante bei der multiplikation ersparen */
-       if(strcmp(instr, "mullw") == 0) {
+       if(strcmp(instr, "mul") == 0) {
                if(KID_VAL(0) == 1 && strcmp(KID_REG(1), BN_REG) == 0) {
                if(KID_VAL(0) == 1 && strcmp(KID_REG(1), BN_REG) == 0) {
-                       printf("\t#multiplikation mit 1 wegoptimiert\n");
+                       printf("\t@multiplikation mit 1 wegoptimiert\n");
                } else {
                        if(KID_VAL(0) > (65536)-1 || KID_VAL(0) < -65536) {
                                moveimm(KID_VAL(0), next_reg(BN_REG,0));
                } else {
                        if(KID_VAL(0) > (65536)-1 || KID_VAL(0) < -65536) {
                                moveimm(KID_VAL(0), next_reg(BN_REG,0));
-                               printf("\tmullw %s,%s,%s\n", BN_REG, KID_REG(1), next_reg(BN_REG,0));
+                               printf("\tmul %s, %s, %s\n", BN_REG, KID_REG(1), next_reg(BN_REG,0));
                        } else {
                        } else {
-                               printf("\tmulli %s,%s,%d\n", BN_REG, KID_REG(1), KID_VAL(0));
+                               printf("\tmul %s, %s, #%d\n", BN_REG, KID_REG(1), KID_VAL(0));
                        }
                }
        } else { /* addq */
                /* TODO: imm check einbauen */
                        }
                }
        } else { /* addq */
                /* TODO: imm check einbauen */
-               printf("\taddi %s,%s,%d\n", BN_REG, KID_REG(1), KID_VAL(0));
+               printf("\tadd %s, %s, #%d\n", BN_REG, KID_REG(1), KID_VAL(0));
        }
 }
 
 void gen_eqless(struct treenode *bnode, char *op, short e0, short e1, short deep)
 {
        }
 }
 
 void gen_eqless(struct treenode *bnode, char *op, short e0, short e1, short deep)
 {
-       printf("\t#gen_eqless_%i%i @ %i (op: %s)\n", e0, e1, deep, op);
-#if 0
-       if(e0) { KIDREG2PARM(0); } else { KIDREG2ID(0); }
-       if(e1) { KIDREG2PARM(1); } else { KIDREG2ID(1); }
-
-       if(e0 && e1) {
-               if(deep) {
-                       KIDKIDREG2PARM(1,0);
-                       printf("\tcmp %d(%%%s), %%%s\n", bnode->kids[1]->soffset *8, KIDKID_REG(1,0), KID_REG(0));
-               } else {
-                       printf("\tcmp %%%s, %%%s\n", KID_REG(1), KID_REG(0));
-               }
-       } else if(e0 && !e1) {
-               if (deep == 0) {
-                       printf("\tcmp $%d, %%%s\n", KID_VAL(1), KID_REG(0));
-               } else if (deep == 1) {
-                       KIDKIDREG2PARM(0,0);
-                       printf("\tcmp $%d, %%%s\n", KID_VAL(1), KIDKID_REG(0,0));
-               } else if (deep == 2) {
-                       KIDKIDKIDREG2PARM(0,0,0);
-                       printf("\tcmp $%d, %%%s\n", KID_VAL(1), KIDKIDKID_REG(0,0,0));
-               }
-       } else if(!e0 && e1) {
-                       printf("\tcmp $%d, %%%s\n", KID_VAL(0), KID_REG(1));
-       }
-       printf("\tset%s %%%s\n", op, reg_64to8l(BN_REG));
-       printf("\tand $1, %%%s\n", BN_REG);
-#else
+       printf("\t@gen_eqless_%i%i @ %i (op: %s)\n", e0, e1, deep, op);
        if(e0) { KIDREG2PARM(0); } else { moveimm(KID_VAL(0), BN_REG); }
        if(e1) { KIDREG2PARM(1); }
        if(strcmp(op,"e")==0 && bnode->kids[1]->op == O_NULL) {
                /* not */
        if(e0) { KIDREG2PARM(0); } else { moveimm(KID_VAL(0), BN_REG); }
        if(e1) { KIDREG2PARM(1); }
        if(strcmp(op,"e")==0 && bnode->kids[1]->op == O_NULL) {
                /* not */
-               printf("\tcntlzw %s,%s\n", KID_REG(0), KID_REG(0));
-               printf("\tsrwi %s,%s,5\n", BN_REG, KID_REG(0));
+               printf("\tcmp %s, #0\n", KID_REG(0));
+               printf("\tmoveq %s, #1\n", BN_REG);
+               printf("\tmovne %s, #0\n", BN_REG);
        } else {
                if(!e1) {
                        moveimm(KID_VAL(1), KID_REG(1));
                }
                if(strcmp(op, "e")==0) {
                        /* eq */
        } else {
                if(!e1) {
                        moveimm(KID_VAL(1), KID_REG(1));
                }
                if(strcmp(op, "e")==0) {
                        /* eq */
-                       printf("\txor %s,%s,%s\n", BN_REG, KID_REG(0), KID_REG(1));
-                       printf("\tcntlzw %s,%s\n", BN_REG, BN_REG);
-                       printf("\tsrwi %s,%s,5\n", BN_REG, BN_REG);
+                       printf("\tcmp %s,%s\n", KID_REG(0), KID_REG(1));
+                       printf("\tmoveq %s, #1\n", BN_REG);
+                       printf("\tmovne %s, #0\n", BN_REG);
                } else if(strcmp(op, "l")==0 || strcmp(op, "g")==0) {
                        /* less */
                } 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);
+                       printf("\tcmp %s, %s\n", KID_REG(1), KID_REG(0));
+                       printf("\tmovle %s, #0\n", BN_REG);
+                       printf("\tmovgt %s, #1\n", BN_REG);
                }
        }
                }
        }
-       /* vergleich mit null und in CR0 speichern */
-       printf("\tcmpwi %s,0\n", BN_REG);
-#endif
 }
 
 void gen_subspecial(struct treenode *bnode, short e)
 {
        /* tritt z.b. bei snafu_05.0 auf */
 }
 
 void gen_subspecial(struct treenode *bnode, short e)
 {
        /* tritt z.b. bei snafu_05.0 auf */
-       printf("\t#gen_subspecial(%i)\n", e);
+       printf("\t@gen_subspecial(%i)\n", e);
        KIDREG2ID(0);
        KIDKIDREG2PARM(1,0);
 
        KIDREG2ID(0);
        KIDKIDREG2PARM(1,0);
 
@@ -190,7 +159,7 @@ void gen_subspecial(struct treenode *bnode, short e)
 
 void assign_var(struct treenode *bnode)
 {
 
 void assign_var(struct treenode *bnode)
 {
-       printf("\t#assign_var\n");
+       printf("\t@assign_var\n");
        KIDREG2PARM(1);
        if (strcmp(bnode->kids[0]->kids[0]->name, bnode->kids[1]->name) != 0) {
                KIDKIDREG2PARM(0,0);
        KIDREG2PARM(1);
        if (strcmp(bnode->kids[0]->kids[0]->name, bnode->kids[1]->name) != 0) {
                KIDKIDREG2PARM(0,0);
@@ -204,7 +173,7 @@ static short sc[8] = {0};
 void make_call(struct treenode *bnode)
 {
        int j;
 void make_call(struct treenode *bnode)
 {
        int j;
-       printf("\t#params pushen\n");
+       printf("\t@params pushen\n");
        for(j = 0; j < bnode->soffset; j++) {
                if(sc[j] == 1) {
                        printf("\tlwz 20,%d(1)\n", j*4);
        for(j = 0; j < bnode->soffset; j++) {
                if(sc[j] == 1) {
                        printf("\tlwz 20,%d(1)\n", j*4);
@@ -214,14 +183,14 @@ void make_call(struct treenode *bnode)
                        printf("\tstw %s,%d(1)\n", param_reg(j), j*4);
                }
        }
                        printf("\tstw %s,%d(1)\n", param_reg(j), j*4);
                }
        }
-       printf("\t#vars pushen\n");
+       printf("\t@vars pushen\n");
        for(j = bnode->soffset; j < bnode->soffset + bnode->vars; j++) {
                printf("\tstw %s,%d(1)\n", param_reg(j), j*4);
        }
 
        /* TODO: schoener machen... */
        if(strcmp(BN_REG, "14")!=0) {
        for(j = bnode->soffset; j < bnode->soffset + bnode->vars; j++) {
                printf("\tstw %s,%d(1)\n", param_reg(j), j*4);
        }
 
        /* TODO: schoener machen... */
        if(strcmp(BN_REG, "14")!=0) {
-               printf("\t#tmp register pushen\n");
+               printf("\t@tmp register pushen\n");
                printf("\tstw 14,52(1)\n");
                if(strcmp(BN_REG, "15")!=0) {
                        printf("\tstw 15,56(1)\n");
                printf("\tstw 14,52(1)\n");
                if(strcmp(BN_REG, "15")!=0) {
                        printf("\tstw 15,56(1)\n");
@@ -235,7 +204,7 @@ void make_call(struct treenode *bnode)
        move("r0", BN_REG);
 
        if(strcmp(BN_REG, "14")!=0) {
        move("r0", BN_REG);
 
        if(strcmp(BN_REG, "14")!=0) {
-               printf("\t#tmp register poppen\n");
+               printf("\t@tmp register poppen\n");
                if(strcmp(BN_REG, "15")!=0) {
                        if(strcmp(BN_REG, "16")!=0) {
                                printf("\tlwz 16,60(1)\n");
                if(strcmp(BN_REG, "15")!=0) {
                        if(strcmp(BN_REG, "16")!=0) {
                                printf("\tlwz 16,60(1)\n");
@@ -245,12 +214,12 @@ void make_call(struct treenode *bnode)
                printf("\tlwz 14,52(1)\n");
        }
 
                printf("\tlwz 14,52(1)\n");
        }
 
-       printf("\t#vars poppen\n");
+       printf("\t@vars poppen\n");
        for(j = bnode->soffset + bnode->vars - 1; j > bnode->soffset - 1; j--) {
                printf("\tlwz %s,%d(1)\n", param_reg(j), j*4);
        }
 
        for(j = bnode->soffset + bnode->vars - 1; j > bnode->soffset - 1; j--) {
                printf("\tlwz %s,%d(1)\n", param_reg(j), j*4);
        }
 
-       printf("\t#params poppen\n");
+       printf("\t@params poppen\n");
        for(j = bnode->soffset - 1; j >= 0; j--) {
                if(sc[j] == 0)
                        printf("\tlwz %s,%d(1)\n", param_reg(j), j*4);
        for(j = bnode->soffset - 1; j >= 0; j--) {
                if(sc[j] == 0)
                        printf("\tlwz %s,%d(1)\n", param_reg(j), j*4);
@@ -267,7 +236,7 @@ void make_call(struct treenode *bnode)
 
 void prep_arg(struct treenode *bnode, int moveit)
 {
 
 void prep_arg(struct treenode *bnode, int moveit)
 {
-       printf("\t#args-nr-> %i (%%%s) [moveit= %i]\n", bnode->soffset, param_reg(bnode->soffset), moveit);
+       printf("\t@args-nr-> %i (%%%s) [moveit= %i]\n", bnode->soffset, param_reg(bnode->soffset), moveit);
        sc[bnode->soffset] = 1;
        if(moveit) { /* expr */
                if((BN_REG == (char *) NULL) || (bnode->kids[1] != TREENULL && bnode->kids[1]->op == O_ID && bnode->kids[1]->kids[0] == TREENULL && bnode->kids[1]->kids[1] == TREENULL)) {
        sc[bnode->soffset] = 1;
        if(moveit) { /* expr */
                if((BN_REG == (char *) NULL) || (bnode->kids[1] != TREENULL && bnode->kids[1]->op == O_ID && bnode->kids[1]->kids[0] == TREENULL && bnode->kids[1]->kids[1] == TREENULL)) {
@@ -287,6 +256,20 @@ void prep_arg(struct treenode *bnode, int moveit)
        }
 }
 
        }
 }
 
+void field_lolbfefail(struct treenode *bnode)
+{
+       printf("\t@ field(expr)\n");
+       KIDREG2PARM(0);
+       printf("\tldr %s, [%s, #%d]\n", BN_REG, KID_REG(0), bnode->soffset * 4);
+}
+
+void field_lolbfefail_imm(struct treenode *bnode)
+{
+       printf("\t@ field(imm)\n");
+       moveimm(KID_VAL(0), BN_REG);
+       printf("\tlwz %s, [%s, #%d]\n", BN_REG, BN_REG, bnode->soffset * 4);
+}
+
 %}
 
 %start begin
 %}
 
 %start begin
@@ -319,7 +302,7 @@ ifstat: O_IF(O_BOOL(expr)) # 1 # /* dann braucht man kein test */
 ret: O_RET(retexpr) # 2 # printf("\t@ o_ret(expr)\n"); move(BN_REG, "r0");
 ret: O_EXPR(expr) # 0 #
 
 ret: O_RET(retexpr) # 2 # printf("\t@ o_ret(expr)\n"); move(BN_REG, "r0");
 ret: O_EXPR(expr) # 0 #
 
-retexpr: O_ID # 1 # printf("\t/*retexpr*/\n"); if(bnode->param_index > -1) move(param_reg(bnode->param_index), BN_REG);
+retexpr: O_ID # 1 # printf("\t@*retexpr*/\n"); if(bnode->param_index > -1) move(param_reg(bnode->param_index), BN_REG);
 retexpr: expr
 
 
 retexpr: expr
 
 
@@ -346,13 +329,13 @@ expr: O_ADD(expr,imm)    # 1 # gen_e_imm(bnode, "add");
 expr: O_ADD(imm,expr)    # 1 # gen_imm_eno(bnode, "add");
 
 
 expr: O_ADD(imm,expr)    # 1 # gen_imm_eno(bnode, "add");
 
 
-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,expr)   # 1 # gen_e_eno(bnode, "mul");
+expr: O_MUL(expr,imm)    # 1 # gen_e_imm(bnode, "mul");
+expr: O_MUL(imm,expr)    # 1 # gen_imm_eno(bnode, "mul");
 
 
 
 
-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,expr)          # 1 # gen_e_eno(bnode, "orr");
+expr: O_OR(expr,imm)           # 2 # gen_e_imm(bnode, "orr");
 
 
 expr: O_LESS(expr,expr)          # 3 # gen_eqless(bnode, "l", 1, 1, 0);
 
 
 expr: O_LESS(expr,expr)          # 3 # gen_eqless(bnode, "l", 1, 1, 0);
@@ -369,8 +352,8 @@ expr: O_EQ(O_EQ(expr,O_NULL),O_NULL)  # 3 # gen_eqless(bnode, "ne", 1, 0, 1);
 expr: O_EQ(O_EQ(O_EQ(expr,O_NULL),O_NULL),O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0, 2);
 
 
 expr: O_EQ(O_EQ(O_EQ(expr,O_NULL),O_NULL),O_NULL) # 3 # gen_eqless(bnode, "e", 1, 0, 2);
 
 
-expr: O_FIELD(expr) # 1 # printf("\t/* field(expr)*/\n"); KIDREG2PARM(0); printf("\tlwz %s, %d(%s)\n", BN_REG, bnode->soffset * 4, KID_REG(0));
-expr: O_FIELD(imm)  # 1 # printf("\t/* field(imm)*/\n"); moveimm(KID_VAL(0), BN_REG); printf("\tlwz %s,%d(%s)\n", BN_REG, bnode->soffset * 4, BN_REG);
+expr: O_FIELD(expr) # 1 # field_lolbfefail(bnode);
+expr: O_FIELD(imm)  # 1 # field_lolbfefail_imm(bnode);
 
 
 imm: O_ADD(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);
index e6fc7a5a2f772a03b17ff70c48cd92a71a50da3a..93165013b30fcc1357c2a9440e9219f9f063cae5 100644 (file)
@@ -383,7 +383,7 @@ Expr:
                @i @Expr.call@ = @Term.call@ || @Multerm.call@;
 
                @reg {
                @i @Expr.call@ = @Term.call@ || @Multerm.call@;
 
                @reg {
-                       @Term.node@->reg = @Expr.node@->reg;
+                       @Term.node@->reg = next_reg(@Expr.node@->reg, @Expr.gparamges@);
                        if(@Term.imm@) {
                                @Multerm.node@->reg = @Expr.node@->reg;
                        } else {
                        if(@Term.imm@) {
                                @Multerm.node@->reg = @Expr.node@->reg;
                        } else {