pass arguments to unknown function calls in registers
[ghc-hetmet.git] / ghc / rts / StgStdThunks.cmm
index f1e4f08..342a6eb 100644 (file)
@@ -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();                                                         \
       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);