diff options
author | Simon Marlow <marlowsd@gmail.com> | 2008-07-28 15:56:21 +0000 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2008-07-28 15:56:21 +0000 |
commit | 02620e7c705ac946db43e61988ca3781af3f2447 (patch) | |
tree | 4a65b034fdda5ed683d951a786b56383b1300e77 /rts/Exception.cmm | |
parent | 4ddcff11bae7e4c66c3c895b277eb8b2230aea67 (diff) | |
download | haskell-02620e7c705ac946db43e61988ca3781af3f2447.tar.gz |
Change the calling conventions for unboxed tuples slightly
When returning an unboxed tuple with a single non-void component, we
now use the same calling convention as for returning a value of the
same type as that component. This means that the return convention
for IO now doesn't vary depending on the platform, which make some
parts of the RTS simpler, and fixes a problem I was having with making
the FFI work in unregisterised GHCi (the byte-code compiler makes
some assumptions about calling conventions to keep things simple).
Diffstat (limited to 'rts/Exception.cmm')
-rw-r--r-- | rts/Exception.cmm | 48 |
1 files changed, 0 insertions, 48 deletions
diff --git a/rts/Exception.cmm b/rts/Exception.cmm index 793c9ab149..479c9c9427 100644 --- a/rts/Exception.cmm +++ b/rts/Exception.cmm @@ -64,23 +64,10 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, RET_SMALL ) * thread, which might result in the thread being killed. */ -#ifndef REG_R1 - /* - * raiseAsync assumes that the stack is in ThreadRunGHC state, - * i.e. with a return address on the top. In unreg mode, the - * return value for IO is on top of the return address, so we - * need to make a small adjustment here. - */ - Sp_adj(1); -#endif STK_CHK_GEN( WDS(2), R1_PTR, stg_unblockAsyncExceptionszh_ret_info); Sp_adj(-2); Sp(1) = R1; -#ifdef REG_R1 Sp(0) = stg_gc_unpt_r1_info; -#else - Sp(0) = stg_ut_1_0_unreg_info; -#endif SAVE_THREAD_STATE(); (r) = foreign "C" maybePerformBlockedException (MyCapability() "ptr", CurrentTSO "ptr") [R1]; @@ -94,25 +81,10 @@ INFO_TABLE_RET( stg_unblockAsyncExceptionszh_ret, RET_SMALL ) jump %ENTRY_CODE(Sp(0)); } } -#ifndef REG_R1 - /* - * Readjust stack in unregisterised mode if we didn't raise an - * exception, see above - */ - else { - Sp_adj(-1); - } -#endif } -#ifdef REG_R1 Sp_adj(1); jump %ENTRY_CODE(Sp(0)); -#else - Sp(1) = Sp(0); - Sp_adj(1); - jump %ENTRY_CODE(Sp(1)); -#endif } INFO_TABLE_RET( stg_blockAsyncExceptionszh_ret, RET_SMALL ) @@ -120,14 +92,8 @@ INFO_TABLE_RET( stg_blockAsyncExceptionszh_ret, RET_SMALL ) StgTSO_flags(CurrentTSO) = StgTSO_flags(CurrentTSO) | TSO_BLOCKEX::I32 | TSO_INTERRUPTIBLE::I32; -#ifdef REG_R1 Sp_adj(1); jump %ENTRY_CODE(Sp(0)); -#else - Sp(1) = Sp(0); - Sp_adj(1); - jump %ENTRY_CODE(Sp(1)); -#endif } blockAsyncExceptionszh_fast @@ -276,11 +242,7 @@ killThreadzh_fast Catch frames -------------------------------------------------------------------------- */ -#ifdef REG_R1 #define SP_OFF 0 -#else -#define SP_OFF 1 -#endif /* Catch frames are very similar to update frames, but when entering * one we just pop the frame off the stack and perform the correct @@ -292,20 +254,10 @@ INFO_TABLE_RET(stg_catch_frame, CATCH_FRAME, W_ unused1, W_ unused2, #endif W_ unused3, "ptr" W_ unused4) -#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 |