ASSERT(Sp != 0); \
ASSERT(SpLim != 0); \
ASSERT(HpLim != 0); \
- ASSERT(SpLim - RESERVED_STACK_WORDS <= Sp); \
+ ASSERT(SpLim - WDS(RESERVED_STACK_WORDS) <= Sp); \
ASSERT(HpLim >= Hp);
/* -----------------------------------------------------------------------------
SAVE_THREAD_STATE();
- /* R1 contains the return value of the thread */
- R1 = ThreadFinished;
+ /* The return code goes in BaseReg->rRet, and BaseReg is returned in R1 */
+ StgRegTable_rRet(BaseReg) = ThreadFinished;
+ R1 = BaseReg;
jump StgReturn;
}
stg_returnToSched
{
SAVE_THREAD_STATE();
- foreign "C" threadPaused(CurrentTSO);
+ foreign "C" threadPaused(MyCapability() "ptr", CurrentTSO);
+ jump StgReturn;
+}
+
+// A variant of stg_returntToSched that doesn't call threadPaused() on the
+// current thread. This is used for switching from compiled execution to the
+// interpreter, where calling threadPaused() on every switch would be too
+// expensive.
+stg_returnToSchedNotPaused
+{
+ SAVE_THREAD_STATE();
jump StgReturn;
}
stg_returnToSchedButFirst
{
SAVE_THREAD_STATE();
- foreign "C" threadPaused(CurrentTSO);
+ foreign "C" threadPaused(MyCapability() "ptr", CurrentTSO);
jump R2;
}