Please update the repository with the patches attached to this message.
This makes 1.0.5 can be used on MIPS/NetBSD1.x. I've not yet reviewed
bugs reported by the regression tests of 1.0.5.

JIT port for this platform is another issue :-)

Kiyo

diff -ur kaffe-1.0.5.orig/config/mips/netbsd1/md.c 
kaffe-1.0.5.work/config/mips/netbsd1/md.c
--- kaffe-1.0.5.orig/config/mips/netbsd1/md.c   Mon Oct 18 14:23:52 1999
+++ kaffe-1.0.5.work/config/mips/netbsd1/md.c   Thu Dec  2 20:06:22 1999
@@ -8,3 +8,115 @@
  * See the file "license.terms" for information on usage and redistribution 
  * of this file. 
  */
+
+#include "config.h"
+#include "config-std.h"
+#include "config-mem.h"
+#include "jtypes.h"
+#include "object.h"
+#include "support.h"
+
+void
+mips32CallMethod (callMethodInfo *CALL)
+{
+    register int       iret    __asm__("$2");
+    register int64     jret    __asm__("$2");
+    register float     fret    __asm__("$f0");
+    register double    dret    __asm__("$f0");
+
+    register int       i0      __asm__("$4");
+    register int       i1      __asm__("$5");
+    register int       i2      __asm__("$6");
+    register int       i3      __asm__("$7");
+
+    register int*      sp      __asm__("sp");
+    register int*      gp      __asm__("gp");
+    register int*      ra      __asm__("ra");
+    register int64     (*t9)(void) __asm__("$25");
+    int* curr_sp = sp;
+    int* curr_gp = gp;
+    int* curr_ra = ra;
+
+    {
+      int nrargs = CALL->nrargs;
+      uintp *argframe = __builtin_alloca((nrargs > 4 ? nrargs : 4) * sizeof(int64));
+      int argidx;
+      int idx = 0;
+
+      for (argidx = 0; argidx < nrargs; ++argidx) {
+       switch (CALL->callsize[argidx]) {
+       case 2:
+         if ((idx & 1) != 0) { /* Align */
+           idx += 1;
+         }
+         *(jlong*)&argframe[idx] = CALL->args[argidx].j;
+         idx += 2;
+         break;
+       case 1:
+         *(jint*)&argframe[idx] = CALL->args[argidx].i;
+         idx += 1;
+         break;
+       default:
+         break;
+       }
+      }
+
+      /* Load the register up - alot of this is done speculatively
+       * since sometime we need values in float registers, sometimes
+       * in integers.
+       */
+      if (CALL->callsize[0] == 1) {
+       asm volatile ("l.s $f12,%0" : : "m" (*(jfloat*)&argframe[0]));
+       if (CALL->callsize[1] == 1) {
+         asm volatile ("l.s $f14,%0" : : "m" (*(jfloat*)&argframe[1]));
+       }
+       else if (CALL->callsize[1] == 2) {
+         asm volatile ("l.d $f14,%0" : : "m" (*(jdouble*)&argframe[2]));
+       }
+      }
+      else if (CALL->callsize[0] == 2) {
+       asm volatile ("l.d $f12,%0" : : "m" (*(jdouble*)&argframe[0]));
+       if (CALL->callsize[2] == 1) {
+         asm volatile ("l.s $f14,%0" : : "m" (*(jfloat*)&argframe[2]));
+       }
+       else if (CALL->callsize[2] == 2) {
+         asm volatile ("l.d $f14,%0" : : "m" (*(jdouble*)&argframe[2]));
+       }
+      }
+      i0 = argframe[0];
+      i1 = argframe[1];
+      i2 = argframe[2];
+      i3 = argframe[3];
+
+      sp = argframe;
+
+      asm ("" : : "r" (i0), "r" (i1), "r" (i2), "r" (i3));
+
+      (*(t9 = CALL->function))();
+
+      asm ("lw $31,%0" : : "m" (curr_ra));
+      asm ("lw $gp,%0" : : "m" (curr_gp));
+      asm ("lw $sp,%0" : : "m" (curr_sp));
+
+      if (CALL->retsize != 0) {
+       switch(CALL->retsize) {
+       case 2:
+         if (CALL->rettype == 'D')
+           CALL->ret->d = dret;
+         else {
+           CALL->ret->j = jret;
+         }
+         break;
+       case 1:
+         if (CALL->rettype == 'F')
+           CALL->ret->f = fret;
+         else
+           CALL->ret->i = iret;
+         break;
+       default:
+         ABORT();
+         break;
+       }
+      }
+    }
+}
diff -ur kaffe-1.0.5.orig/config/mips/netbsd1/md.h 
kaffe-1.0.5.work/config/mips/netbsd1/md.h
--- kaffe-1.0.5.orig/config/mips/netbsd1/md.h   Mon Oct 18 14:23:52 1999
+++ kaffe-1.0.5.work/config/mips/netbsd1/md.h   Fri Nov 19 14:44:08 1999
@@ -12,6 +12,26 @@
 #ifndef __mips_netbsd1_md_h
 #define __mips_netbsd1_md_h
 
-#include "mips/threads.h"
+/**/
+/* Thread handling */
+/**/
+#define USE_INTERNAL_THREADS
+
+#define THREADSTACKSIZE         (32 * 1024)
+
+/*
+ * Stack offset.
+ * This is the offset into the setjmp buffer where the stack pointer is
+ * stored.  This may be different with different OSes.
+ * NetBSD/mips needs not to define FP_OFFSET.
+ */
+#define SP_OFFSET      32
+
+
+/*
+ * System dependent call method routine definition.
+ * We use 'mips32CallMethod' (defined in mips.c) for NetBSD/mips.
+ */
+#define sysdepCallMethod(CALL) mips32CallMethod(CALL)
 
 #endif

Reply via email to