arm: first working example
authorBernhard Urban <lewurm@gmail.com>
Sun, 6 Mar 2011 14:45:59 +0000 (14:45 +0000)
committerBernhard Urban <lewurm@gmail.com>
Sun, 6 Mar 2011 14:45:59 +0000 (14:45 +0000)
.gitignore
gesamt_arm/Makefile
gesamt_arm/chelper.c
gesamt_arm/code.bfe

index 090c5c585714a7b30f3231780ad3dae86dba8a16..650b505f7fbd1c1399f9f800500207fc0a320eb0 100644 (file)
@@ -59,5 +59,12 @@ gesamt_ppc/parser.h
 gesamt_ppc/scanner.c
 gesamt_ppc/code.c
 
+#gesamt_arm
+gesamt_arm/gesamt_arm
+gesamt_arm/parser.c
+gesamt_arm/parser.h
+gesamt_arm/scanner.c
+gesamt_arm/code.c
+
 #weitere eintragen...
 torero/torero.log
index f00f2718d0ed07fa428181b23e0190be0dc692cf..3421379fe8b0881b748902c05e3bc3cf08d63565 100644 (file)
@@ -1,5 +1,5 @@
 SHELL := bash
-NAME := gesamt_ppc
+NAME := gesamt_arm
 CFLAGS := -ansi -pedantic -D_GNU_SOURCE -g
 OBJS := scanner.o parser.o symtable.o code.o chelper.o tree.o
 
index 2e736ea421618c08867b07b598b27cfdbbf2d615..ee419220f21d8918c7b4aab2ff93cf049473020d 100644 (file)
@@ -9,7 +9,7 @@
 #endif
 
 #define REGLEN 5
-static char *regsppc[] = {"14", "15", "16", "17", "18"};
+static char *regsppc[] = {"r10", "r11", "r12", "r13", "r14"};
 
 /* ja, dirty.. */
 static char *akt_func_name = (char*) NULL;
@@ -17,8 +17,8 @@ static char need_stack = 0;
 
 void func_header(char *s, int vars, int parms, int call)
 {
-       printf("\t.globl %1$s\n\t.type %1$s, @function\n%1$s:\n", s);
-       printf("\t#vars: %i, parms: %i, call(bool): %i\n", vars, parms, call);
+       printf("\t.globl %1$s\n\t.type %1$s, %%function\n%1$s:\n", s);
+       printf("\tvars: %i, parms: %i, call(bool): %i\n", vars, parms, call);
        akt_func_name = s;
 
        need_stack = (vars || parms) && call;
@@ -43,14 +43,14 @@ void func_footer(void)
                /* restore link register */
                printf("\tlwz 0,-8(1); mtlr 0\n");
        }
-       printf("\tblr\n\n\n");
+       printf("\tblr\n\n\n");
 }
 
 void move(char *src, char *dst)
 {
        if(src == (char*) NULL) return;
        if(strcmp(src,dst) != 0) {
-               printf("\tmr %s,%s\n", dst, src);
+               printf("\tmov %s,%s\n", dst, src);
        }
 }
 
@@ -91,7 +91,7 @@ char *reg_64to8l(char *s)
 
 char *param_reg(int num)
 {
-       char *regs[] = {"3", "4", "5", "6", "7", "8", "9", "10"};
+       char *regs[] = {"r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9"};
        return regs[num];
 }
 
index f97b517b3ef6ccd0997d7977a44437d328226340..331a3780fdb24191caaa66f7fbc14fec4f417415 100644 (file)
@@ -37,7 +37,7 @@
 
 void gen_e_eno(struct treenode *bnode, char *instr)
 {
-       printf("\t#gen_e_eno(%s)\n", instr);
+       printf("\tgen_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));
@@ -232,7 +232,7 @@ void make_call(struct treenode *bnode)
        }
 
        printf("\tbl %s\n", bnode->name);
-       move("3", BN_REG);
+       move("r0", BN_REG);
 
        if(strcmp(BN_REG, "14")!=0) {
                printf("\t#tmp register poppen\n");
@@ -316,7 +316,7 @@ ifstat: O_IF(expr) # 2 # /* iburg beschummeln :/ */ printf("\tcmpwi %s,0\n", BN_
 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, "3");
+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);