X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2FException.cmm;h=8ed83b37d0c5e27b1cf6a091f41de95b4343a68d;hb=7f6c03992744898286d41529200508f775a77e04;hp=a3f3dd0d8290aad57c8ad12b72bbbec46d0661c5;hpb=709599a8485aad112c996ed8eb7cf3462525755d;p=ghc-hetmet.git diff --git a/rts/Exception.cmm b/rts/Exception.cmm index a3f3dd0..8ed83b3 100644 --- a/rts/Exception.cmm +++ b/rts/Exception.cmm @@ -84,8 +84,7 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, if (r != 0::CInt) { if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) { - R1 = ThreadFinished; - jump StgReturn; + jump stg_threadFinished; } else { LOAD_THREAD_STATE(); ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16); @@ -180,8 +179,7 @@ unblockAsyncExceptionszh_fast if (r != 0::CInt) { if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) { - R1 = ThreadFinished; - jump StgReturn; + jump stg_threadFinished; } else { LOAD_THREAD_STATE(); ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16); @@ -229,8 +227,7 @@ killThreadzh_fast foreign "C" throwToSingleThreaded(MyCapability() "ptr", target "ptr", exception "ptr")[R1,R2]; if (StgTSO_what_next(CurrentTSO) == ThreadKilled::I16) { - R1 = ThreadFinished; - jump StgReturn; + jump stg_threadFinished; } else { LOAD_THREAD_STATE(); ASSERT(StgTSO_what_next(CurrentTSO) == ThreadRunGHC::I16); @@ -267,43 +264,11 @@ killThreadzh_fast -------------------------------------------------------------------------- */ #ifdef REG_R1 -#define CATCH_FRAME_ENTRY_TEMPLATE(label,ret) \ - label \ - { \ - Sp = Sp + SIZEOF_StgCatchFrame; \ - jump ret; \ - } -#else -#define CATCH_FRAME_ENTRY_TEMPLATE(label,ret) \ - label \ - { \ - W_ rval; \ - rval = Sp(0); \ - Sp = Sp + SIZEOF_StgCatchFrame; \ - Sp(0) = rval; \ - jump ret; \ - } -#endif - -#ifdef REG_R1 #define SP_OFF 0 #else #define SP_OFF 1 #endif -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_0_ret,%RET_VEC(Sp(SP_OFF),0)) -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_1_ret,%RET_VEC(Sp(SP_OFF),1)) -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_2_ret,%RET_VEC(Sp(SP_OFF),2)) -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_3_ret,%RET_VEC(Sp(SP_OFF),3)) -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_4_ret,%RET_VEC(Sp(SP_OFF),4)) -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_5_ret,%RET_VEC(Sp(SP_OFF),5)) -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_6_ret,%RET_VEC(Sp(SP_OFF),6)) -CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_7_ret,%RET_VEC(Sp(SP_OFF),7)) - -#if MAX_VECTORED_RTN > 8 -#error MAX_VECTORED_RTN has changed: please modify stg_catch_frame too. -#endif - #if defined(PROFILING) #define CATCH_FRAME_BITMAP 7 #define CATCH_FRAME_WORDS 4 @@ -319,16 +284,21 @@ CATCH_FRAME_ENTRY_TEMPLATE(stg_catch_frame_7_ret,%RET_VEC(Sp(SP_OFF),7)) INFO_TABLE_RET(stg_catch_frame, CATCH_FRAME_WORDS, CATCH_FRAME_BITMAP, - CATCH_FRAME, - stg_catch_frame_0_ret, - stg_catch_frame_1_ret, - stg_catch_frame_2_ret, - stg_catch_frame_3_ret, - stg_catch_frame_4_ret, - stg_catch_frame_5_ret, - stg_catch_frame_6_ret, - stg_catch_frame_7_ret) -CATCH_FRAME_ENTRY_TEMPLATE(,%ENTRY_CODE(Sp(SP_OFF))) + CATCH_FRAME) +#ifdef REG_R1 + { + Sp = Sp + SIZEOF_StgCatchFrame; + jump %ENTRY_CODE(Sp(SP_OFF)); + } +#else + { + W_ rval; + rval = Sp(0); + Sp = Sp + SIZEOF_StgCatchFrame; + Sp(0) = rval; + jump %ENTRY_CODE(Sp(SP_OFF)); + } +#endif /* ----------------------------------------------------------------------------- * The catch infotable @@ -458,11 +428,7 @@ retry_pop_stack: StgTSO_what_next(CurrentTSO) = ThreadKilled::I16; SAVE_THREAD_STATE(); /* inline! */ - /* The return code goes in BaseReg->rRet, and BaseReg is returned in R1 */ - StgRegTable_rRet(BaseReg) = ThreadFinished; - R1 = BaseReg; - - jump StgReturn; + jump stg_threadFinished; } /* Ok, Sp points to the enclosing CATCH_FRAME or CATCH_STM_FRAME. Pop everything