-#define ARGTAG_MAX 16 /* probably arbitrary */
-#define ARG_TAG(n) (n)
-#define ARG_SIZE(n) (StgWord)n
-
-typedef enum {
- REALWORLD_TAG = 0,
- INT_TAG = sizeofW(StgInt),
- INT64_TAG = sizeofW(StgInt64),
- WORD_TAG = sizeofW(StgWord),
- ADDR_TAG = sizeofW(StgAddr),
- CHAR_TAG = sizeofW(StgChar),
- FLOAT_TAG = sizeofW(StgFloat),
- DOUBLE_TAG = sizeofW(StgDouble),
- STABLE_TAG = sizeofW(StgWord),
-} StackTag;
-
-static inline int IS_ARG_TAG( StgWord p );
-static inline int IS_ARG_TAG( StgWord p ) { return p <= ARGTAG_MAX; }
-
-/* -----------------------------------------------------------------------------
- Argument checks.
-
- If (Sp + <n_args>) > Su { JMP_(stg_update_PAP); }
-
- Sp points to the topmost used word on the stack, and Su points to
- the most recently pushed update frame.
-
- Remember that <n_args> must include any tagging of unboxed values.
-
- ARGS_CHK_LOAD_NODE is for top-level functions, whose entry
- convention doesn't require that Node is loaded with a pointer to
- the closure. Thus we must load node before calling stg_updatePAP if
- the argument check fails.
- -------------------------------------------------------------------------- */
-
-#define ARGS_CHK(n) \
- if ((P_)(Sp + (n)) > (P_)Su) { \
- JMP_(stg_update_PAP); \
- }
-
-#define ARGS_CHK_LOAD_NODE(n,closure) \
- if ((P_)(Sp + (n)) > (P_)Su) { \
- R1.p = (P_)closure; \
- JMP_(stg_update_PAP); \
- }
+#define ENTER() \
+ { \
+ again: \
+ switch (get_itbl(R1.cl)->type) { \
+ case IND: \
+ case IND_OLDGEN: \
+ case IND_PERM: \
+ case IND_OLDGEN_PERM: \
+ case IND_STATIC: \
+ R1.cl = ((StgInd *)R1.cl)->indirectee; \
+ goto again; \
+ case BCO: \
+ case FUN: \
+ case FUN_1_0: \
+ case FUN_0_1: \
+ case FUN_2_0: \
+ case FUN_1_1: \
+ case FUN_0_2: \
+ case FUN_STATIC: \
+ case PAP: \
+ JMP_(ENTRY_CODE(Sp[0])); \
+ default: \
+ JMP_(GET_ENTRY(R1.cl)); \
+ } \
+ }