X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=gesamt_ppc%2Fchelper.c;h=94d3f9179b607f7d6b3823172b24573faad18f3e;hb=be9027fc4d97ced5cd5c2286da4fd99d387ee657;hp=dd345b0934bf7e8db0b2810ba0a899d51c550326;hpb=3a713827de71d9eaedc12d4f8d7d185532f70c4d;p=uebersetzerbau-ss10.git diff --git a/gesamt_ppc/chelper.c b/gesamt_ppc/chelper.c index dd345b0..94d3f91 100644 --- a/gesamt_ppc/chelper.c +++ b/gesamt_ppc/chelper.c @@ -8,9 +8,8 @@ #define DDCHELP #endif -#define REGLEN 4 -static char *regs64[] = {"rax", "r10", "r11", "r9"}; -static char *regs8l[] = {"al", "r10b", "r11b", "r9b"}; +#define REGLEN 5 +static char *regsppc[] = {"14", "15", "16", "17", "18"}; /* ja, dirty.. */ static char *akt_func_name = (char*) NULL; @@ -19,7 +18,7 @@ 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#vars: %i, parms: %i, call(bool): %i\n", vars, parms, call); akt_func_name = s; need_stack = (vars || parms) && call; @@ -37,55 +36,48 @@ void func_footer(void) { if(need_stack) printf("\tleave\n"); - printf("\tret\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("\tmovq %%%s, %%%s\n", src, dst); + printf("\tmr %s,%s\n", dst, src); } } void moveimm(long imm, char *dst) { - char buf[100]; - sprintf(buf, "$%d", imm); - printf("\tmovq %s, %%%s\n", buf, dst); + /* TODO: 32 bits... */ + printf("\tli %s,%d\n", dst, imm); } char *next_reg(char *s, int params) { int i = 0; if (s != (char*) NULL) { - while(strcmp(s, regs64[i]) != 0) { + while(strcmp(s, regsppc[i]) != 0) { i = (i+1) % REGLEN; } i = (i+1) % REGLEN; } #ifdef DDCHELP - fprintf(stderr, "next_reg(): %s (bei %i parameter)\n", regs64[i], params); + fprintf(stderr, "next_reg(): %s (bei %i parameter)\n", regsppc[i], params); #endif - return regs64[i]; + return regsppc[i]; } char *reg_64to8l(char *s) { - int i = 0; - if (s != (char*) NULL) { - while(strcmp(s, regs64[i]) != 0) { - i = (i+1) % REGLEN; - } - return regs8l[i]; - } fprintf(stderr, "reg_64to8l(): sollte nicht passieren\n"); exit(4); + return ""; } char *param_reg(int num) { - char *regs[] = {"rdi", "rsi", "rdx", "rcx", "r8", "r9", "r11"}; + char *regs[] = {"3", "4", "5", "6", "7", "8", "9"}; return regs[num]; }