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));
 }