[project @ 1998-11-26 09:17:22 by sof]
[ghc-hetmet.git] / ghc / runtime / c-as-asm / CallWrap_C.lc
index 259c485..96892ba 100644 (file)
@@ -44,6 +44,8 @@ callWrapper(STG_NO_ARGS)
     CALLER_SAVE_FltReg4
     CALLER_SAVE_DblReg1
     CALLER_SAVE_DblReg2
+    CALLER_SAVE_LngReg1
+    CALLER_SAVE_LngReg2
     CALLER_SAVE_Tag
     CALLER_SAVE_SpA
     CALLER_SAVE_SuA
@@ -52,7 +54,6 @@ callWrapper(STG_NO_ARGS)
     CALLER_SAVE_Hp
     CALLER_SAVE_HpLim
     CALLER_SAVE_Liveness
-    CALLER_SAVE_Activity
     CALLER_SAVE_Ret
 
     MAGIC_CALL
@@ -74,6 +75,8 @@ callWrapper(STG_NO_ARGS)
     CALLER_RESTORE_FltReg4
     CALLER_RESTORE_DblReg1
     CALLER_RESTORE_DblReg2
+    CALLER_RESTORE_LngReg1
+    CALLER_RESTORE_LngReg2
     CALLER_RESTORE_Tag
     CALLER_RESTORE_SpA
     CALLER_RESTORE_SuA
@@ -82,7 +85,6 @@ callWrapper(STG_NO_ARGS)
     CALLER_RESTORE_Hp
     CALLER_RESTORE_HpLim
     CALLER_RESTORE_Liveness
-    CALLER_RESTORE_Activity
     CALLER_RESTORE_Ret
     
     /* These next two are restore-only */
@@ -108,7 +110,6 @@ callWrapper_safe(STG_NO_ARGS)
     CALLER_SAVE_Hp
     CALLER_SAVE_HpLim
     CALLER_SAVE_Liveness
-    CALLER_SAVE_Activity
     CALLER_SAVE_Ret
 
     MAGIC_CALL
@@ -123,7 +124,6 @@ callWrapper_safe(STG_NO_ARGS)
     CALLER_RESTORE_Hp
     CALLER_RESTORE_HpLim
     CALLER_RESTORE_Liveness
-    CALLER_RESTORE_Activity
     CALLER_RESTORE_Ret
     
     /* These next two are restore-only */
@@ -160,22 +160,37 @@ ADR */
 
 EXTFUN(EnterNodeCode);
 
+void *__temp_esp, *__temp_eax;
+
 void PerformGC_wrapper PROTO((W_))         WRAPPER_NAME(PerformGC);
 void PerformGC_wrapper(args)
 W_ args;
 {
-    WRAPPER_SETUP(PerformGC)
+#if i386_TARGET_ARCH
+    void *ret_addr;
+
+    WRAPPER_SETUP(PerformGC,ret_addr,args)
+#else
+    WRAPPER_SETUP(PerformGC, ignore_me, ignore_me)
+#endif
     PerformGC(args);
     WRAPPER_RETURN(0)
 }
 
 # ifdef CONCURRENT
 
+void __DISCARD__ (STG_NO_ARGS) { /*nothing*/ }
+
 void StackOverflow_wrapper PROTO((W_,W_))   WRAPPER_NAME(StackOverflow);
 void StackOverflow_wrapper(args1,args2)
 W_ args1, args2;
 {
-    WRAPPER_SETUP(StackOverflow)
+#if i386_TARGET_ARCH
+    void *ret_addr, *ignore_me;
+    WRAPPER_SETUP(StackOverflow,ret_addr,ignore_me)
+#else
+    WRAPPER_SETUP(StackOverflow, ignore_me, ignore_me)
+#endif
     if(StackOverflow(args1,args2)) {
        WRAPPER_RETURN(1)
     }
@@ -186,27 +201,100 @@ void Yield_wrapper PROTO((W_))               WRAPPER_NAME(Yield);
 void Yield_wrapper(args)
 W_ args;
 {
-    WRAPPER_SETUP(Yield)
+#if i386_TARGET_ARCH
+    void *ret_addr, *ignore_me;
+    WRAPPER_SETUP(Yield, ret_addr, ignore_me)
+#else
+    WRAPPER_SETUP(Yield, ignore_me, ignore_me)
+#endif
     Yield(args);
     WRAPPER_RETURN(0)
 }
 
-# endif
-
-# ifdef GRAN
-
+#if defined(GRAN)
 void PerformReschedule_wrapper PROTO((W_, W_))     WRAPPER_NAME(PerformReschedule);
 void PerformReschedule_wrapper(liveness, always_reenter_node)
   W_ liveness;
   W_  always_reenter_node;
 {
-    WRAPPER_SETUP(PerformReschedule)
+#if i386_TARGET_ARCH
+    void *ret_addr, *ignore_me;
+    WRAPPER_SETUP(PerformReschedule, ret_addr, ignore_me)
+#else
+    WRAPPER_SETUP(PerformReschedule, ignore_me, ignore_me)
+#endif
     PerformReschedule(liveness, always_reenter_node);
     WRAPPER_RETURN(0)
 }
 
+/* Similar wrappers for all GrAnSim functions. */
+/* NB: These are normal functions, which don't call ReSchedule. So we just */
+/* have to safe/restore the registers. */
+
+void GranSimAllocate_wrapper PROTO((I_, P_, W_))  WRAPPER_NAME(GranSimAllocate);
+void GranSimAllocate_wrapper(n, node, liveness)
+I_ n;
+P_ node;
+W_ liveness;
+{
+#if i386_TARGET_ARCH
+    void *ret_addr, *ignore_me;
+    WRAPPER_SETUP(GranSimAllocate, ret_addr, ignore_me)
+#else
+    WRAPPER_SETUP(GranSimAllocate, ignore_me, ignore_me)
+#endif
+    GranSimAllocate(n, node, liveness);
+    WRAPPER_RETURN(0);
+}
+
+void GranSimUnallocate_wrapper PROTO((I_, P_, W_))  WRAPPER_NAME(GranSimUnallocate);
+void GranSimUnallocate_wrapper(n, node, liveness)
+I_ n;
+P_ node;
+W_ liveness;
+{
+#if i386_TARGET_ARCH
+    void *ret_addr, *ignore_me;
+    WRAPPER_SETUP(GranSimUnallocate, ret_addr, ignore_me)
+#else
+    WRAPPER_SETUP(GranSimUnallocate, ignore_me, ignore_me)
+#endif
+  GranSimUnallocate(n, node, liveness);
+  WRAPPER_RETURN(0);
+}
+
+void GranSimFetch_wrapper PROTO((P_))  WRAPPER_NAME(GranSimFetch);
+void GranSimFetch_wrapper(node)
+P_ node;
+{
+#if i386_TARGET_ARCH
+    void *ret_addr, *ignore_me;
+    WRAPPER_SETUP(GranSimFetch, ret_addr, ignore_me)
+#else
+    WRAPPER_SETUP(GranSimFetch, ignore_me, ignore_me)
+#endif
+    GranSimFetch(node);
+    WRAPPER_RETURN(0);
+}
+
+void GranSimExec_wrapper PROTO((W_, W_, W_, W_, W_))  WRAPPER_NAME(GranSimExec);
+void GranSimExec_wrapper(arith,branch,load,store,floats)
+W_ arith,branch,load,store,floats;
+{
+#if i386_TARGET_ARCH
+    void *ret_addr, *ignore_me;
+    WRAPPER_SETUP(GranSimExec, ret_addr, ignore_me)
+#else
+    WRAPPER_SETUP(GranSimExec, ignore_me, ignore_me)
+#endif
+    GranSimExec(arith,branch,load,store,floats);       
+    WRAPPER_RETURN(0);
+}
+
 # endif /* GRAN */
 
+# endif /* CONCURRENT */
+
 /* 
  * In the threaded world, context switches may occur during one of these
  * wrapped calls, and when we come back, our stack will have been trashed.
@@ -233,14 +321,3 @@ checkInCCallGC()
 }
 \end{code}
 
-Hack for -UGRAN setup. % HWL
-
-\begin{code}
-#ifndef GRAN
-void PerformReschedule_wrapper PROTO((W_, W_));
-void PerformReschedule_wrapper(liveness, always_reenter_node)
-  W_ liveness;
-  W_  always_reenter_node;
-{ }
-#endif
-\end{code}