X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=ghc%2Frts%2FStgStdThunks.cmm;h=342a6eb1648a608065fed24371f102c385386767;hp=f1e4f088e1892fc34828cdd21fb7e5162e2c7973;hb=04db0e9fa47ce4dfbcb73ec1752d94195f3b394e;hpb=423d477bfecd490de1449c59325c8776f91d7aac diff --git a/ghc/rts/StgStdThunks.cmm b/ghc/rts/StgStdThunks.cmm index f1e4f08..342a6eb 100644 --- a/ghc/rts/StgStdThunks.cmm +++ b/ghc/rts/StgStdThunks.cmm @@ -44,7 +44,7 @@ #define SELECTOR_CODE_UPD(offset) \ INFO_TABLE_RET(stg_sel_ret_##offset##_upd, RET_FRAMESIZE, RET_BITMAP, RET_SMALL) \ { \ - R1 = StgClosure_payload(R1,offset); \ + R1 = StgClosure_payload(R1,offset); \ GET_SAVED_CCCS; \ Sp = Sp + SIZEOF_StgHeader; \ ENTER(); \ @@ -57,13 +57,15 @@ UPD_BH_UPDATABLE(); \ LDV_ENTER(R1); \ PUSH_UPD_FRAME(Sp - SIZEOF_StgUpdateFrame, R1); \ - ENTER_CCS_THUNK(R1); \ + ENTER_CCS_THUNK(R1); \ SAVE_CCCS(WITHUPD_FRAME_SIZE); \ W_[Sp-WITHUPD_FRAME_SIZE] = stg_sel_ret_##offset##_upd_info; \ - R1 = StgClosure_payload(R1,0); \ + R1 = StgThunk_payload(R1,0); \ Sp = Sp - WITHUPD_FRAME_SIZE; \ - ENTER(); \ + jump %GET_ENTRY(R1); \ } + /* NOTE: no need to ENTER() here, we know the closure cannot evaluate to a function, + because we're going to do a field selection on the result. */ SELECTOR_CODE_UPD(0) SELECTOR_CODE_UPD(1) @@ -85,7 +87,7 @@ SELECTOR_CODE_UPD(15) #define SELECTOR_CODE_NOUPD(offset) \ INFO_TABLE_RET(stg_sel_ret_##offset##_noupd, RET_FRAMESIZE, RET_BITMAP, RET_SMALL) \ { \ - R1 = StgClosure_payload(R1,offset); \ + R1 = StgClosure_payload(R1,offset); \ GET_SAVED_CCCS; \ Sp = Sp + SIZEOF_StgHeader; \ jump %GET_ENTRY(R1); \ @@ -98,10 +100,10 @@ SELECTOR_CODE_UPD(15) UPD_BH_SINGLE_ENTRY(); \ LDV_ENTER(R1); \ TICK_UPDF_OMITTED(); \ - ENTER_CCS_THUNK(R1); \ + ENTER_CCS_THUNK(R1); \ SAVE_CCCS(NOUPD_FRAME_SIZE); \ W_[Sp-NOUPD_FRAME_SIZE] = stg_sel_ret_##offset##_noupd_info; \ - R1 = StgClosure_payload(R1,0); \ + R1 = StgThunk_payload(R1,0); \ Sp = Sp - NOUPD_FRAME_SIZE; \ jump %GET_ENTRY(R1); \ } @@ -149,10 +151,9 @@ INFO_TABLE(stg_ap_1_upd,1,1,THUNK_1_0,"stg_ap_1_upd_info","stg_ap_1_upd_info") LDV_ENTER(R1); ENTER_CCS_THUNK(R1); PUSH_UPD_FRAME(Sp-SIZEOF_StgUpdateFrame,R1); - R1 = StgClosure_payload(R1,0); + R1 = StgThunk_payload(R1,0); Sp = Sp - SIZEOF_StgUpdateFrame; - Sp_adj(-1); // for stg_ap_0_ret - jump RET_LBL(stg_ap_0); + jump stg_ap_0_fast; } INFO_TABLE(stg_ap_2_upd,2,0,THUNK_2_0,"stg_ap_2_upd_info","stg_ap_2_upd_info") @@ -163,10 +164,10 @@ INFO_TABLE(stg_ap_2_upd,2,0,THUNK_2_0,"stg_ap_2_upd_info","stg_ap_2_upd_info") LDV_ENTER(R1); ENTER_CCS_THUNK(R1); PUSH_UPD_FRAME(Sp-SIZEOF_StgUpdateFrame,R1); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgClosure_payload(R1,1); - R1 = StgClosure_payload(R1,0); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgThunk_payload(R1,1); + R1 = StgThunk_payload(R1,0); Sp = Sp - SIZEOF_StgUpdateFrame - WDS(1); - Sp_adj(-1); // for stg_ap_0_ret + Sp_adj(-1); // for stg_ap_*_ret TICK_UNKNOWN_CALL(); TICK_SLOW_CALL_p(); jump RET_LBL(stg_ap_p); @@ -180,11 +181,11 @@ INFO_TABLE(stg_ap_3_upd,3,0,THUNK,"stg_ap_3_upd_info","stg_ap_3_upd_info") LDV_ENTER(R1); ENTER_CCS_THUNK(R1); PUSH_UPD_FRAME(Sp-SIZEOF_StgUpdateFrame,R1); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgClosure_payload(R1,2); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgClosure_payload(R1,1); - R1 = StgClosure_payload(R1,0); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgThunk_payload(R1,2); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgThunk_payload(R1,1); + R1 = StgThunk_payload(R1,0); Sp = Sp - SIZEOF_StgUpdateFrame - WDS(2); - Sp_adj(-1); // for stg_ap_0_ret + Sp_adj(-1); // for stg_ap_*_ret TICK_UNKNOWN_CALL(); TICK_SLOW_CALL_pp(); jump RET_LBL(stg_ap_pp); @@ -198,12 +199,12 @@ INFO_TABLE(stg_ap_4_upd,4,0,THUNK,"stg_ap_4_upd_info","stg_ap_4_upd_info") LDV_ENTER(R1); ENTER_CCS_THUNK(R1); PUSH_UPD_FRAME(Sp-SIZEOF_StgUpdateFrame,R1); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgClosure_payload(R1,3); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgClosure_payload(R1,2); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgClosure_payload(R1,1); - R1 = StgClosure_payload(R1,0); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgThunk_payload(R1,3); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgThunk_payload(R1,2); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgThunk_payload(R1,1); + R1 = StgThunk_payload(R1,0); Sp = Sp - SIZEOF_StgUpdateFrame - WDS(3); - Sp_adj(-1); // for stg_ap_0_ret + Sp_adj(-1); // for stg_ap_*_ret TICK_UNKNOWN_CALL(); TICK_SLOW_CALL_ppp(); jump RET_LBL(stg_ap_ppp); @@ -217,13 +218,13 @@ INFO_TABLE(stg_ap_5_upd,5,0,THUNK,"stg_ap_5_upd_info","stg_ap_5_upd_info") LDV_ENTER(R1); ENTER_CCS_THUNK(R1); PUSH_UPD_FRAME(Sp-SIZEOF_StgUpdateFrame,R1); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgClosure_payload(R1,4); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgClosure_payload(R1,3); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgClosure_payload(R1,2); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(4)] = StgClosure_payload(R1,1); - R1 = StgClosure_payload(R1,0); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgThunk_payload(R1,4); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgThunk_payload(R1,3); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgThunk_payload(R1,2); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(4)] = StgThunk_payload(R1,1); + R1 = StgThunk_payload(R1,0); Sp = Sp - SIZEOF_StgUpdateFrame - WDS(4); - Sp_adj(-1); // for stg_ap_0_ret + Sp_adj(-1); // for stg_ap_*_ret TICK_UNKNOWN_CALL(); TICK_SLOW_CALL_pppp(); jump RET_LBL(stg_ap_pppp); @@ -237,14 +238,14 @@ INFO_TABLE(stg_ap_6_upd,6,0,THUNK,"stg_ap_6_upd_info","stg_ap_6_upd_info") LDV_ENTER(R1); ENTER_CCS_THUNK(R1); PUSH_UPD_FRAME(Sp-SIZEOF_StgUpdateFrame,R1); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgClosure_payload(R1,5); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgClosure_payload(R1,4); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgClosure_payload(R1,3); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(4)] = StgClosure_payload(R1,2); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(5)] = StgClosure_payload(R1,1); - R1 = StgClosure_payload(R1,0); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgThunk_payload(R1,5); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgThunk_payload(R1,4); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgThunk_payload(R1,3); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(4)] = StgThunk_payload(R1,2); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(5)] = StgThunk_payload(R1,1); + R1 = StgThunk_payload(R1,0); Sp = Sp - SIZEOF_StgUpdateFrame - WDS(5); - Sp_adj(-1); // for stg_ap_0_ret + Sp_adj(-1); // for stg_ap_*_ret TICK_UNKNOWN_CALL(); TICK_SLOW_CALL_ppppp(); jump RET_LBL(stg_ap_ppppp); @@ -258,15 +259,15 @@ INFO_TABLE(stg_ap_7_upd,7,0,THUNK,"stg_ap_7_upd_info","stg_ap_7_upd_info") LDV_ENTER(R1); ENTER_CCS_THUNK(R1); PUSH_UPD_FRAME(Sp-SIZEOF_StgUpdateFrame,R1); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgClosure_payload(R1,6); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgClosure_payload(R1,5); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgClosure_payload(R1,4); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(4)] = StgClosure_payload(R1,3); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(5)] = StgClosure_payload(R1,2); - W_[Sp-SIZEOF_StgUpdateFrame-WDS(6)] = StgClosure_payload(R1,1); - R1 = StgClosure_payload(R1,0); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(1)] = StgThunk_payload(R1,6); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(2)] = StgThunk_payload(R1,5); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(3)] = StgThunk_payload(R1,4); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(4)] = StgThunk_payload(R1,3); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(5)] = StgThunk_payload(R1,2); + W_[Sp-SIZEOF_StgUpdateFrame-WDS(6)] = StgThunk_payload(R1,1); + R1 = StgThunk_payload(R1,0); Sp = Sp - SIZEOF_StgUpdateFrame - WDS(6); - Sp_adj(-1); // for stg_ap_0_ret + Sp_adj(-1); // for stg_ap_*_ret TICK_UNKNOWN_CALL(); TICK_SLOW_CALL_pppppp(); jump RET_LBL(stg_ap_pppppp);