[project @ 2000-01-14 16:15:08 by simonmar]
[ghc-hetmet.git] / ghc / rts / StgCRun.c
index 09127d8..3ce7803 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgCRun.c,v 1.3 1999/02/05 16:02:57 simonm Exp $
+ * $Id: StgCRun.c,v 1.9 1999/12/01 14:20:11 simonmar Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
 
 static jmp_buf jmp_environment;
 
-extern StgThreadReturnCode StgRun(StgFunPtr f)
+#if 0
+
+extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg)
 {
     jmp_buf save_buf;
     /* Save jmp_environment for previous call to miniInterpret  */
     memcpy((void *) jmp_environment, (void *) save_buf, sizeof(jmp_buf));
     if (setjmp(jmp_environment) == 0) {
        while ( 1 ) {
-           IF_DEBUG(evaluator,
+            IF_DEBUG(evaluator,
                     fprintf(stderr,"Jumping to ");
                     printPtr((P_)f);
                     fprintf(stderr,"\n");
@@ -64,6 +66,46 @@ EXTFUN(StgReturn)
     longjmp(jmp_environment, 1);
 }
 
+#else
+
+extern StgThreadReturnCode StgRun(StgFunPtr f, StgRegTable *basereg)
+{
+    char* nm;
+    while ( f ) {
+
+#if 0
+      //IF_DEBUG(evaluator,
+                fprintf(stderr,"Jumping to ");
+                nm = nameOfObjSym ( f );
+                if (nm)
+                   fprintf(stderr, "%s (%p)", nm, f); else
+                   printPtr((P_)f);
+                fprintf(stderr,"\n");
+               //         );
+if (0&& MainRegTable.rSp) {
+   int i;
+   StgWord* p = MainRegTable.rSp;
+fprintf(stderr, "SP = %p\n", p);
+   p += (8-1);
+   for (i = 0; i < 8; i++, p--)
+      fprintf (stderr, "-- %p: %p\n", p, *p );
+}    
+#endif    
+
+       f = (StgFunPtr) (f)();
+    }
+
+    return (StgThreadReturnCode)R1.i;
+}
+
+EXTFUN(StgReturn)
+{
+   return 0;
+}
+#endif
+
+
+
 #else /* !USE_MINIINTERPRETER */
 
 #ifdef LEADING_UNDERSCORE
@@ -79,7 +121,7 @@ EXTFUN(StgReturn)
 #ifdef sparc_TARGET_ARCH
 
 StgThreadReturnCode
-StgRun(StgFunPtr f) {
+StgRun(StgFunPtr f, StgRegTable *basereg) {
 
     StgChar space[RESERVED_C_STACK_BYTES+sizeof(void *)];
     register void *i7 __asm__("%i7");
@@ -101,8 +143,10 @@ StgRun(StgFunPtr f) {
 #ifdef alpha_TARGET_ARCH
 
 StgThreadReturnCode
-StgRun(StgFunPtr f) 
+StgRun(StgFunPtr f, StgRegTable *basereg) 
 {
+    StgThreadReturnCode ret;
+
     __asm__ volatile ("stq $9,-8($30)\n\t"
                       "stq $10,-16($30)\n\t"
                       "stq $11,-24($30)\n\t"
@@ -127,6 +171,7 @@ StgRun(StgFunPtr f)
     __asm__ volatile (".align 3\n"
                              ".globl " STG_RETURN "\n"
                       STG_RETURN ":\n\t"
+                     "lda %0,($14)\n\t"  /* save R1 */
                              "lda $30,%0($30)\n\t"
                              "ldq $9,-8($30)\n\t"
                              "ldq $10,-16($30)\n\t"
@@ -142,13 +187,107 @@ StgRun(StgFunPtr f)
                              "ldt $f6,-96($30)\n\t"
                      "ldt $f7,-104($30)\n\t"
                      "ldt $f8,-112($30)\n\t" 
-                     "ldt $f9,-120($30)" : :
-                      "K" (RESERVED_C_STACK_BYTES+
+                     "ldt $f9,-120($30)" 
+                     : "=r" (ret)
+                     : "K" (RESERVED_C_STACK_BYTES+
                           8*sizeof(double)+8*sizeof(long)));
 
-    return (StgThreadReturnCode)R1.i;
+    return ret;
+}
+
+#endif /* alpha_TARGET_ARCH */
+
+/* -----------------------------------------------------------------------------
+   HP-PA architecture
+   -------------------------------------------------------------------------- */
+
+#ifdef hppa1_1_TARGET_ARCH
+
+StgThreadReturnCode
+StgRun(StgFunPtr f, StgRegTable *basereg) 
+{
+    StgChar space[RESERVED_C_STACK_BYTES+16*sizeof(long)+10*sizeof(double)];
+    StgThreadReturnCode ret;
+
+    __asm__ volatile ("ldo %0(%%r30),%%r19\n"
+                     "\tstw %%r3, 0(0,%%r19)\n"
+                      "\tstw %%r4, 4(0,%%r19)\n"
+                      "\tstw %%r5, 8(0,%%r19)\n"
+                      "\tstw %%r6,12(0,%%r19)\n"
+                      "\tstw %%r7,16(0,%%r19)\n"
+                      "\tstw %%r8,20(0,%%r19)\n"
+                      "\tstw %%r9,24(0,%%r19)\n"
+                     "\tstw %%r10,28(0,%%r19)\n"
+                      "\tstw %%r11,32(0,%%r19)\n"
+                      "\tstw %%r12,36(0,%%r19)\n"
+                      "\tstw %%r13,40(0,%%r19)\n"
+                      "\tstw %%r14,44(0,%%r19)\n"
+                      "\tstw %%r15,48(0,%%r19)\n"
+                      "\tstw %%r16,52(0,%%r19)\n"
+                      "\tstw %%r17,56(0,%%r19)\n"
+                      "\tstw %%r18,60(0,%%r19)\n"
+                     "\tldo 80(%%r19),%%r19\n"
+                     "\tfstds %%fr12,-16(0,%%r19)\n"
+                     "\tfstds %%fr13, -8(0,%%r19)\n"
+                     "\tfstds %%fr14,  0(0,%%r19)\n"
+                     "\tfstds %%fr15,  8(0,%%r19)\n"
+                     "\tldo 32(%%r19),%%r19\n"
+                     "\tfstds %%fr16,-16(0,%%r19)\n"
+                     "\tfstds %%fr17, -8(0,%%r19)\n"
+                     "\tfstds %%fr18,  0(0,%%r19)\n"
+                     "\tfstds %%fr19,  8(0,%%r19)\n"
+                     "\tldo 32(%%r19),%%r19\n"
+                     "\tfstds %%fr20,-16(0,%%r19)\n"
+                     "\tfstds %%fr21, -8(0,%%r19)\n" : :
+                      "n" (-(116 * sizeof(long) + 10 * sizeof(double))) : "%r19"
+                     );
+
+    f();
+
+    __asm__ volatile (".align 4\n"
+                             "\t.EXPORT " STG_RETURN ",CODE\n"
+                     "\t.EXPORT " STG_RETURN ",ENTRY,PRIV_LEV=3\n"
+                      STG_RETURN "\n"
+                      /* "\tldo %0(%%r3),%%r19\n" */
+                      "\tldo %1(%%r30),%%r19\n"
+                      "\tcopy %%r11, %0\n"  /* save R1 */
+                     "\tldw  0(0,%%r19),%%r3\n"
+                      "\tldw  4(0,%%r19),%%r4\n"
+                      "\tldw  8(0,%%r19),%%r5\n"
+                      "\tldw 12(0,%%r19),%%r6\n"
+                      "\tldw 16(0,%%r19),%%r7\n"
+                      "\tldw 20(0,%%r19),%%r8\n"
+                      "\tldw 24(0,%%r19),%%r9\n"
+                     "\tldw 28(0,%%r19),%%r10\n"
+                      "\tldw 32(0,%%r19),%%r11\n"
+                      "\tldw 36(0,%%r19),%%r12\n"
+                      "\tldw 40(0,%%r19),%%r13\n"
+                      "\tldw 44(0,%%r19),%%r14\n"
+                      "\tldw 48(0,%%r19),%%r15\n"
+                      "\tldw 52(0,%%r19),%%r16\n"
+                      "\tldw 56(0,%%r19),%%r17\n"
+                      "\tldw 60(0,%%r19),%%r18\n"
+                     "\tldo 80(%%r19),%%r19\n"
+                     "\tfldds -16(0,%%r19),%%fr12\n"
+                     "\tfldds  -8(0,%%r19),%%fr13\n"
+                     "\tfldds   0(0,%%r19),%%fr14\n"
+                     "\tfldds   8(0,%%r19),%%fr15\n"
+                     "\tldo 32(%%r19),%%r19\n"
+                     "\tfldds -16(0,%%r19),%%fr16\n"
+                     "\tfldds  -8(0,%%r19),%%fr17\n"
+                     "\tfldds   0(0,%%r19),%%fr18\n"
+                     "\tfldds   8(0,%%r19),%%fr19\n"
+                     "\tldo 32(%%r19),%%r19\n"
+                     "\tfldds -16(0,%%r19),%%fr20\n"
+                     "\tfldds  -8(0,%%r19),%%fr21\n" 
+                        : "=r" (ret)
+                        : "n" (-(116 * sizeof(long) + 10 * sizeof(double)))
+                        : "%r19"
+                     );
+
+    return ret;
 }
 
-#endif /* sparc_TARGET_ARCH */
+#endif /* hppa1_1_TARGET_ARCH */
 
 #endif /* !USE_MINIINTERPRETER */