/* -----------------------------------------------------------------------------
- * $Id: PrimOps.h,v 1.89 2001/12/14 15:26:16 sewardj Exp $
+ * $Id: PrimOps.h,v 1.95 2002/06/04 16:13:53 sof Exp $
*
* (c) The GHC Team, 1998-2000
*
* we use a crude approximation, testing whether either operand is
* larger than 32-bits; if neither is, then we go ahead with the
* multiplication.
+ *
+ * Return non-zero if there is any possibility that the signed multiply
+ * of a and b might overflow. Return zero only if you are absolutely sure
+ * that it won't overflow. If in doubt, return non-zero.
*/
#if SIZEOF_VOID_P == 4
#ifdef WORDS_BIGENDIAN
-#define C 0
-#define R 1
+#define RTS_CARRY_IDX__ 0
+#define RTS_REM_IDX__ 1
#else
-#define C 1
-#define R 0
+#define RTS_CARRY_IDX__ 1
+#define RTS_REM_IDX__ 0
#endif
typedef union {
StgInt32 r, c; \
long_long_u z; \
z.l = (StgInt64)a * (StgInt64)b; \
- r = z.i[R]; \
- c = z.i[C]; \
+ r = z.i[RTS_REM_IDX__]; \
+ c = z.i[RTS_CARRY_IDX__]; \
if (c == 0 || c == -1) { \
c = ((StgWord)((a^b) ^ r)) \
>> (BITS_IN (I_) - 1); \
EXTFUN_RTS(int64ToIntegerzh_fast);
EXTFUN_RTS(word64ToIntegerzh_fast);
-/* The rest are (way!) out of line, implemented in vanilla C. */
-I_ stg_gtWord64 (StgWord64, StgWord64);
-I_ stg_geWord64 (StgWord64, StgWord64);
-I_ stg_eqWord64 (StgWord64, StgWord64);
-I_ stg_neWord64 (StgWord64, StgWord64);
-I_ stg_ltWord64 (StgWord64, StgWord64);
-I_ stg_leWord64 (StgWord64, StgWord64);
-
-I_ stg_gtInt64 (StgInt64, StgInt64);
-I_ stg_geInt64 (StgInt64, StgInt64);
-I_ stg_eqInt64 (StgInt64, StgInt64);
-I_ stg_neInt64 (StgInt64, StgInt64);
-I_ stg_ltInt64 (StgInt64, StgInt64);
-I_ stg_leInt64 (StgInt64, StgInt64);
-
-LW_ stg_remWord64 (StgWord64, StgWord64);
-LW_ stg_quotWord64 (StgWord64, StgWord64);
-
-LI_ stg_remInt64 (StgInt64, StgInt64);
-LI_ stg_quotInt64 (StgInt64, StgInt64);
-LI_ stg_negateInt64 (StgInt64);
-LI_ stg_plusInt64 (StgInt64, StgInt64);
-LI_ stg_minusInt64 (StgInt64, StgInt64);
-LI_ stg_timesInt64 (StgInt64, StgInt64);
-
-LW_ stg_and64 (StgWord64, StgWord64);
-LW_ stg_or64 (StgWord64, StgWord64);
-LW_ stg_xor64 (StgWord64, StgWord64);
-LW_ stg_not64 (StgWord64);
-
-LW_ stg_uncheckedShiftL64 (StgWord64, StgInt);
-LW_ stg_uncheckedShiftRL64 (StgWord64, StgInt);
-LI_ stg_uncheckedIShiftL64 (StgInt64, StgInt);
-LI_ stg_uncheckedIShiftRL64 (StgInt64, StgInt);
-LI_ stg_uncheckedIShiftRA64 (StgInt64, StgInt);
-
-LI_ stg_intToInt64 (StgInt);
-I_ stg_int64ToInt (StgInt64);
-LW_ stg_int64ToWord64 (StgInt64);
-
-LW_ stg_wordToWord64 (StgWord);
-W_ stg_word64ToWord (StgWord64);
-LI_ stg_word64ToInt64 (StgWord64);
-
-LI_ stg_integerToInt64 (I_ sa, StgByteArray /* Really: mp_limb_t* */ da);
-LW_ stg_integerToWord64 (I_ sa, StgByteArray /* Really: mp_limb_t* */ da);
-
#endif
/* -----------------------------------------------------------------------------
-------------------------------------------------------------------------- */
EXTFUN_RTS(forkzh_fast);
+EXTFUN_RTS(forkProcesszh_fast);
EXTFUN_RTS(yieldzh_fast);
EXTFUN_RTS(killThreadzh_fast);
EXTFUN_RTS(seqzh_fast);
EXTFUN_RTS(blockAsyncExceptionszh_fast);
EXTFUN_RTS(unblockAsyncExceptionszh_fast);
EXTFUN_RTS(myThreadIdzh_fast);
+EXTFUN_RTS(labelThreadzh_fast);
extern int cmp_thread(const StgTSO *tso1, const StgTSO *tso2);
extern int rts_getThreadId(const StgTSO *tso);
+extern void labelThread(StgTSO *tso, char *label);
/* -----------------------------------------------------------------------------
/* -----------------------------------------------------------------------------
+ Constructor tags
+ -------------------------------------------------------------------------- */
+
+/*
+ * This macro is only used when compiling unregisterised code (see
+ * AbsCUtils.dsCOpStmt for motivation & the Story).
+ */
+#ifndef TABLES_NEXT_TO_CODE
+# define dataToTagzh(r,a) r=(GET_TAG(((StgClosure *)a)->header.info))
+#endif
+
+/* -----------------------------------------------------------------------------
BCOs and BCO linkery
-------------------------------------------------------------------------- */