From aad834b8be2cad179749bd61e09b4b5c1af74f0d Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Thu, 6 May 2010 00:04:19 +0200 Subject: [PATCH] codea: bessere combo fuer less und equal --- codea/chelper.c | 34 +++++++++++++++++++++++++--------- codea/chelper.h | 1 + codea/code.bfe | 6 ++---- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/codea/chelper.c b/codea/chelper.c index bbbb361..2392092 100644 --- a/codea/chelper.c +++ b/codea/chelper.c @@ -8,6 +8,10 @@ #define DDCHELP #endif +#define REGLEN 9 +static char *regs64[] = {"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"}; +static char *regs8l[] = {"al", "r10b", "r11b", "r9b", "r8b", "cl", "dl", "sil", "dil"}; + void func_header(char *s) { printf("\t.globl %1$s\n\t.type %1$s, @function\n%1$s:\n", s); @@ -39,14 +43,10 @@ void ret(void) char *next_reg(char *s, short skip, int params) { - /* TODO: bessere registerwahl. das is gerade a wengal suboptimal... */ -#define REGLEN 9 - char *regs[] = {"rax", "r10", "r11", "r9", "r8", "rcx", "rdx", "rsi", "rdi"}; - - int i=0; + int i = 0; if (s != (char*) NULL) { while(i < REGLEN) { - if(!strcmp(s, regs[i++])) { + if(!strcmp(s, regs64[i++])) { break; } } @@ -55,20 +55,36 @@ char *next_reg(char *s, short skip, int params) i++; } #ifdef DDCHELP - fprintf(stderr, "next_reg(): %s (bei %i parameter)\n", regs[i], params); + fprintf(stderr, "next_reg(): %s (bei %i parameter)\n", regs64[i], params); #endif /* TODO: <= passt? */ if(REGLEN - params <= i) { - fprintf(stderr, "next_reg(): register \"%s\" in dem sich ein parameter befindet wird als temporaeres register verwendet(params: %i, i: %i)\n", regs[i], params, i); + fprintf(stderr, "next_reg(): register \"%s\" in dem sich ein parameter befindet wird als temporaeres register verwendet(params: %i, i: %i)\n", regs64[i], params, i); /* TODO: exit hier? */ #if 0 exit(4); #endif } + return regs64[i]; +} - return regs[i]; +char *reg_64to8l(char *s) +{ + int i = 0; + if (s != (char*) NULL) { + while(i < REGLEN) { + if(!strcmp(s, regs64[i])) { + return regs8l[i]; + } else { + i++; + } + } + } + fprintf(stderr, "reg_64to8l(): sollte nicht passieren\n"); + exit(4); } + char *param_reg(int num) { char *regs[] = {"rdi", "rsi", "rdx", "rcx", "r8", "r9"}; diff --git a/codea/chelper.h b/codea/chelper.h index 396859c..de14489 100644 --- a/codea/chelper.h +++ b/codea/chelper.h @@ -3,6 +3,7 @@ void func_header(char *s); void func_footer(void); char *next_reg(char *s, short skip, int params); +char *reg_64to8l(char *s); char *param_reg(int num); void ret(void); void move(char *src, char *dest); diff --git a/codea/code.bfe b/codea/code.bfe index c366fbf..2928538 100644 --- a/codea/code.bfe +++ b/codea/code.bfe @@ -47,10 +47,8 @@ void gen_imm_eno(struct treenode *bnode, char *instr) void gen_eqless_footer(struct treenode *bnode, char *op) { - moveimm(1, BN_REG); - printf("\tcmov%s %%%2$s, %%%2$s\n", op, BN_REG); - moveimm(0, KID_REG(1)); - printf("\tcmovn%s %%%s, %%%s\n", op, KID_REG(1), BN_REG); + printf("\tset%s %%%s\n", op, reg_64to8l(BN_REG)); + printf("\tand $1, %%%s\n", BN_REG); } void gen_eqless_ee(struct treenode *bnode, char *op) -- 2.25.1