Mercurial > hg > CbC > old > device
diff mc-code-mips.c @ 163:fc8514c9d685
*** empty log message ***
author | kono |
---|---|
date | Mon, 24 Nov 2003 00:52:18 +0900 |
parents | da529eab5618 |
children | 1c2a9232ea93 |
line wrap: on
line diff
--- a/mc-code-mips.c Mon Nov 24 00:21:59 2003 +0900 +++ b/mc-code-mips.c Mon Nov 24 00:52:18 2003 +0900 @@ -11,7 +11,7 @@ #define RODATA_EMIT_MODE 2 static void data_mode(char *name); -static void ld_indexx(int byte, int n, int xreg); +static void ld_indexx(int byte, int n, int xreg,int sign); static void local_table(void); static void shift(char *op, int reg); static int struct_push(int e4,int t,int arg); @@ -819,8 +819,8 @@ } void -code_crgvar(int e1,int creg){ - printf("\tlb %s,%s\n",register_name(creg),((NMTBL*)cadr(e1))->nm); +code_crgvar(int e1,int creg,int sign){ + printf("\t%s %s,%s\n",sign?"lbu":"lb",register_name(creg),((NMTBL*)cadr(e1))->nm); regv[creg]=1; } @@ -842,8 +842,8 @@ void -code_crlvar(int e2,int reg) { - printf("\tlb %s,",register_name(reg)); +code_crlvar(int e2,int reg,int sign) { + printf("\t%s %s,",sign?"lbu":"lb",register_name(reg)); lvar(e2); regv[reg]=1; } @@ -940,11 +940,11 @@ void -code_cpostinc(int e1,int e2,int reg) { +code_cpostinc(int e1,int e2,int reg,int sign) { char *xrn,*crn,*nrn; int i,nreg,dreg; if (car(e2)==REGISTER) { - printf("\tlb %s,0(%s)\n",register_name(reg),register_name(cadr(e2))); + printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",register_name(reg),register_name(cadr(e2))); printf("\taddu %s,%s,%d\n", register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1)); regv[reg]=1; @@ -957,7 +957,7 @@ nreg=get_register(); if (!nreg) error(-1); nrn = register_name(nreg); printf("\tlw %s,0(%s)\n",xrn,crn); - printf("\tlb %s,0(%s)\n",nrn,xrn); + printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",nrn,xrn); printf("\taddu %s,%s,%d\n", xrn,xrn,caddr(e1)); printf("\tsw %s,0(%s)\n",xrn,crn); i=creg;creg=nreg;nreg=i; @@ -968,13 +968,13 @@ void -code_cpreinc(int e1,int e2,int reg) { +code_cpreinc(int e1,int e2,int reg,int sign) { char *xrn,*crn,*nrn; int i,nreg,dreg; if (car(e2)==REGISTER) { printf("\taddu %s,%s,%d\n", register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1)); - printf("\tlb %s,0(%s)\n",register_name(reg),register_name(cadr(e2))); + printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",register_name(reg),register_name(cadr(e2))); regv[reg]=1; return; } @@ -986,7 +986,7 @@ nrn = register_name(nreg); printf("\tlw %s,0(%s)\n",xrn,crn); printf("\taddu %s,%s,%d\n", nrn,xrn,caddr(e1)); - printf("\tlb %s,0(%s)\n",nrn,xrn); + printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",nrn,xrn); printf("\tsw %s,0(%s)\n",xrn,crn); i=creg;creg=nreg;nreg=i; free_register(nreg); @@ -996,13 +996,13 @@ void -code_cpostdec(int e1,int e2,int reg) { +code_cpostdec(int e1,int e2,int reg,int sign) { char *xrn,*crn,*nrn; int i,nreg,dreg; if (car(e2)==REGISTER) { crn=register_name(reg); xrn=register_name(cadr(e2)); - printf("\tlb %s,0(%s)\n",crn,xrn); + printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",crn,xrn); printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); regv[reg]=1; return; @@ -1014,7 +1014,7 @@ nreg=get_register(); if (!nreg) error(-1); nrn = register_name(nreg); printf("\tlw %s,0(%s)\n",xrn,crn); - printf("\tlb %s,0(%s)\n",nrn,xrn); + printf("\t%s %s,0(%s)\n",sign?"lbu":"lb",nrn,xrn); printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); printf("\tsw %s,0(%s)\n",xrn,crn); i=creg;creg=nreg;nreg=i; @@ -1025,14 +1025,14 @@ void -code_cpredec(int e1,int e2,int reg) { +code_cpredec(int e1,int e2,int reg,int sign) { char *xrn,*crn,*nrn; int i,nreg,dreg; if (car(e2)==REGISTER) { crn=register_name(reg); xrn=register_name(cadr(e2)); printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); - printf("\tlb %s,%d(%s)\n",crn,caddr(e1),xrn); + printf("\t%s %s,%d(%s)\n",sign?"lbu":"lb",crn,caddr(e1),xrn); regv[reg]=1; return; } @@ -1044,7 +1044,7 @@ nrn = register_name(nreg); printf("\tlw %s,0(%s)\n",xrn,crn); printf("\taddu %s,%s,%d\n",xrn,xrn,caddr(e1)); - printf("\tlb %s,%d(%s)\n",nrn,caddr(e1),xrn); + printf("\t%s %s,%d(%s)\n",sign?"lbu":"lb",nrn,caddr(e1),xrn); printf("\tsw %s,0(%s)\n",xrn,crn); i=creg;creg=nreg;nreg=i; free_register(nreg); @@ -1119,7 +1119,7 @@ void code_cmp_crgvar(int e1) { if (cmpreg==-1) cmpreg = get_register(); - code_crgvar(cadr(e1),cmpreg); + code_crgvar(cadr(e1),cmpreg,0); regv[cmpreg]=1; } @@ -1127,7 +1127,7 @@ void code_cmp_crlvar(int e2) { if (cmpreg==-1) cmpreg = get_register(); - code_crlvar(e2,cmpreg); + code_crlvar(e2,cmpreg,0); regv[cmpreg]=1; } @@ -1631,6 +1631,9 @@ case CRINDIRECT: printf("\tlb %s,%d(%s)\n",crn,offset,crn); return CHAR; + case CURINDIRECT: + printf("\tlbu %s,%d(%s)\n",crn,offset,crn); + return UCHAR; case RINDIRECT: printf("\tlw %s,%d(%s)\n",crn,offset,crn); return INT; @@ -1696,7 +1699,7 @@ void -code_assop(int op,int byte) { +code_assop(int op,int byte,int sign) { char *xrn,*crn,*drn; int xreg; int edx = get_register(); if(!edx) error(-1); @@ -1704,7 +1707,7 @@ regv[xreg]=regs[xreg]=1; printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg)); regv[edx]=1; - ld_indexx(byte,0,edx); + ld_indexx(byte,0,edx,sign); tosop(op,xreg); crn = register_name(creg); drn = register_name(edx); @@ -1805,15 +1808,14 @@ } void -ld_indexx(int byte, int n, int xreg) +ld_indexx(int byte, int n, int xreg,int sign) { char *crn = register_name(creg); if (byte) { - printf("\tlb %s,%d(%s)\n",register_name(creg),n, + printf("\t%s %s,%d(%s)\n",sign?"lbu":"lb",crn,n, register_name(xreg)); - printf("\textsb %s,%s\n",crn,crn); } else - printf("\tlw %s,%d(%s)\n",register_name(creg),n, + printf("\tlw %s,%d(%s)\n",crn,n, register_name(xreg)); }