+#define LOAD_STACK_POINTERS \
+ iSp = cap->rCurrentTSO->sp; \
+ iSu = cap->rCurrentTSO->su; \
+ /* We don't change this ... */ \
+ iSpLim = cap->rCurrentTSO->stack + RESERVED_STACK_WORDS;
+
+
+#define SAVE_STACK_POINTERS \
+ cap->rCurrentTSO->sp = iSp; \
+ cap->rCurrentTSO->su = iSu;
+
+#define RETURN(retcode) \
+ SAVE_STACK_POINTERS; return retcode;
+
+
+static __inline__ StgPtr allocate_UPD ( int n_words )
+{
+ if (n_words - sizeofW(StgHeader) < MIN_UPD_SIZE)
+ n_words = MIN_UPD_SIZE + sizeofW(StgHeader);
+ return allocate(n_words);
+}
+
+static __inline__ StgPtr allocate_NONUPD ( int n_words )
+{
+ if (n_words - sizeofW(StgHeader) < MIN_NONUPD_SIZE)
+ n_words = MIN_NONUPD_SIZE + sizeofW(StgHeader);
+ return allocate(n_words);
+}
+
+
+#ifdef INTERP_STATS
+/* Hacky stats, for tuning the interpreter ... */
+int it_unknown_entries[N_CLOSURE_TYPES];
+int it_total_unknown_entries;
+int it_total_entries;
+
+int it_retto_BCO;
+int it_retto_UPDATE;
+int it_retto_other;
+
+int it_slides;
+int it_insns;
+int it_BCO_entries;
+
+int it_ofreq[27];
+int it_oofreq[27][27];
+int it_lastopc;
+
+void interp_startup ( void )
+{
+ int i, j;
+ it_retto_BCO = it_retto_UPDATE = it_retto_other = 0;
+ it_total_entries = it_total_unknown_entries = 0;
+ for (i = 0; i < N_CLOSURE_TYPES; i++)
+ it_unknown_entries[i] = 0;
+ it_slides = it_insns = it_BCO_entries = 0;
+ for (i = 0; i < 27; i++) it_ofreq[i] = 0;
+ for (i = 0; i < 27; i++)
+ for (j = 0; j < 27; j++)
+ it_oofreq[i][j] = 0;
+ it_lastopc = 0;
+}
+
+void interp_shutdown ( void )
+{
+ int i, j, k, o_max, i_max, j_max;
+ fprintf(stderr, "%d constrs entered -> (%d BCO, %d UPD, %d ??? )\n",
+ it_retto_BCO + it_retto_UPDATE + it_retto_other,
+ it_retto_BCO, it_retto_UPDATE, it_retto_other );
+ fprintf(stderr, "%d total entries, %d unknown entries \n",
+ it_total_entries, it_total_unknown_entries);
+ for (i = 0; i < N_CLOSURE_TYPES; i++) {
+ if (it_unknown_entries[i] == 0) continue;
+ fprintf(stderr, " type %2d: unknown entries (%4.1f%%) == %d\n",
+ i, 100.0 * ((double)it_unknown_entries[i]) /
+ ((double)it_total_unknown_entries),
+ it_unknown_entries[i]);
+ }
+ fprintf(stderr, "%d insns, %d slides, %d BCO_entries\n",
+ it_insns, it_slides, it_BCO_entries);
+ for (i = 0; i < 27; i++)
+ fprintf(stderr, "opcode %2d got %d\n", i, it_ofreq[i] );
+
+ for (k = 1; k < 20; k++) {
+ o_max = 0;
+ i_max = j_max = 0;
+ for (i = 0; i < 27; i++) {
+ for (j = 0; j < 27; j++) {
+ if (it_oofreq[i][j] > o_max) {
+ o_max = it_oofreq[i][j];
+ i_max = i; j_max = j;
+ }
+ }
+ }
+
+ fprintf ( stderr, "%d: count (%4.1f%%) %6d is %d then %d\n",
+ k, ((double)o_max) * 100.0 / ((double)it_insns), o_max,
+ i_max, j_max );
+ it_oofreq[i_max][j_max] = 0;
+
+ }
+}
+#endif
+
+