From b9ffbf367b39d7786ca493cc0b755e43e084b0e0 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Sun, 6 Mar 2011 14:45:59 +0000 Subject: [PATCH] arm: first working example --- .gitignore | 7 +++++++ gesamt_arm/Makefile | 2 +- gesamt_arm/chelper.c | 12 ++++++------ gesamt_arm/code.bfe | 6 +++--- 4 files changed, 17 insertions(+), 10 deletions(-) diff --git a/.gitignore b/.gitignore index 090c5c5..650b505 100644 --- a/.gitignore +++ b/.gitignore @@ -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 diff --git a/gesamt_arm/Makefile b/gesamt_arm/Makefile index f00f271..3421379 100644 --- a/gesamt_arm/Makefile +++ b/gesamt_arm/Makefile @@ -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 diff --git a/gesamt_arm/chelper.c b/gesamt_arm/chelper.c index 2e736ea..ee41922 100644 --- a/gesamt_arm/chelper.c +++ b/gesamt_arm/chelper.c @@ -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("\t@ vars: %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("\tbx lr\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]; } diff --git a/gesamt_arm/code.bfe b/gesamt_arm/code.bfe index f97b517..331a378 100644 --- a/gesamt_arm/code.bfe +++ b/gesamt_arm/code.bfe @@ -37,7 +37,7 @@ void gen_e_eno(struct treenode *bnode, char *instr) { - printf("\t#gen_e_eno(%s)\n", instr); + 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)); @@ -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); -- 2.25.1