diff mc-code-mips.c @ 196:5f70abd9453d

*** empty log message ***
author kono
date Wed, 07 Apr 2004 21:14:19 +0900
parents c193120ee2a6
children 28baf6cd9ad1
line wrap: on
line diff
--- a/mc-code-mips.c	Sun Apr 04 21:17:10 2004 +0900
+++ b/mc-code-mips.c	Wed Apr 07 21:14:19 2004 +0900
@@ -1513,29 +1513,53 @@
 }
 
 int
-rindirect(int e1)   /* *(p +5 ) */
+code_rindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    printf("\tlw %s,%d(%s)\n",crn,offset,crn);
+    return INT;
+}
+
+int
+code_crindirect(int e1, int offset, int us)
 {
     char *crn;
-    int e2,e3,e4,offset;
-
-    offset=0;
-    e3 = cadr(e2 = cadr(e1));
-    if (car(e2)==ADD) {
-        e4=caddr(e2);
-	if (car(e4)==CONST) {
-	    offset=cadr(e4);
-	    e2=e3;
-	}
+    g_expr(e1);
+    crn=register_name(creg);
+    if (us) {
+        printf("\tlbu %s,%d(%s)\n",crn,offset,crn);
+        return UCHAR;
+    } else {
+        printf("\tlb %s,%d(%s)\n",crn,offset,crn);
+        return CHAR;
     }
-    g_expr(e2);
+}
+
+int
+code_srindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
     crn=register_name(creg);
-    switch (car(e1)) {
-    case FRINDIRECT: 
-        printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn);
-        regv[creg]=0; regv[freg]=1;
-	creg = freg;
-        return FLOAT;
-    case DRINDIRECT: 
+    if (us) {
+        printf("\tlhu %s,%d(%s)\n",crn,offset,crn);
+        return USHORT;
+    } else {
+        printf("\tlh %s,%d(%s)\n",crn,offset,crn);
+        return SHORT;
+    }
+}
+
+#if FLOAT_CODE
+int
+code_drindirect(int e1, int offset, int d)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+    if (d) {
         printf("\tlw %s,%d(%s)\n",
             dregister_name0(dreg),offset,crn);
         printf("\tlw %s,%d(%s)\n",
@@ -1543,24 +1567,24 @@
         regv[creg]=0; regv[dreg]=1;
 	creg = dreg;
         return DOUBLE;
-    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 SRINDIRECT: 
-        printf("\tlh %s,%d(%s)\n",crn,offset,crn);
-        return SHORT;
-    case SURINDIRECT: 
-        printf("\tlhu %s,%d(%s)\n",crn,offset,crn);
-        return USHORT;
-    case RINDIRECT:
-        printf("\tlw %s,%d(%s)\n",crn,offset,crn);
-        return INT;
+    } else {
+        printf("\tl.s %s,%d(%s)\n", fregister_name(freg),offset,crn);
+        regv[creg]=0; regv[freg]=1;
+	creg = freg;
+        return FLOAT;
     }
-    error(-1); return INT;
 }
+#endif
+
+#if LONGLONG_CODE
+int
+code_lrindirect(int e1, int offset, int us)
+{
+    char *crn;
+    g_expr(e1);
+    crn=register_name(creg);
+}
+#endif
 
 void
 code_assign_gvar(int e2,int creg,int byte) {