/* -----------------------------------------------------------------------------
- * $Id: PrimOps.h,v 1.75 2001/02/28 00:01:03 qrczak Exp $
+ * $Id: PrimOps.h,v 1.82 2001/08/18 11:55:48 qrczak Exp $
*
* (c) The GHC Team, 1998-2000
*
#ifndef PRIMOPS_H
#define PRIMOPS_H
+#include "MachDeps.h"
+
+#if WORD_SIZE_IN_BITS < 32
+#error GHC C backend requires 32+-bit words
+#endif
+
/* -----------------------------------------------------------------------------
Helpers for the bytecode linker.
-------------------------------------------------------------------------- */
* plugging into a new J#.
*/
#define addIntCzh(r,c,a,b) \
-{ r = a + b; \
- c = ((StgWord)(~(a^b) & (a^r))) \
+{ r = (I_)a + (I_)b; \
+ c = ((StgWord)(~((I_)a^(I_)b) & ((I_)a^r))) \
>> (BITS_IN (I_) - 1); \
}
#else
-#define HALF_INT (1 << (BITS_IN (I_) / 2))
+#define HALF_INT (1LL << (BITS_IN (I_) / 2))
#define stg_abs(a) ((a) < 0 ? -(a) : (a))
#define mulIntCzh(r,c,a,b) \
{ \
- if (stg_abs(a) >= HALF_INT \
+ if (stg_abs(a) >= HALF_INT || \
stg_abs(b) >= HALF_INT) { \
c = 1; \
} else { \
Explicitly sized Int# and Word# PrimOps.
-------------------------------------------------------------------------- */
-#define intToInt8zh(r,a) r=(StgInt8)(a)
-#define intToInt16zh(r,a) r=(StgInt16)(a)
-#define intToInt32zh(r,a) r=(StgInt32)(a)
-#define wordToWord8zh(r,a) r=(StgWord8)(a)
-#define wordToWord16zh(r,a) r=(StgWord16)(a)
-#define wordToWord32zh(r,a) r=(StgWord32)(a)
+#define narrow8Intzh(r,a) r=(StgInt8)(a)
+#define narrow16Intzh(r,a) r=(StgInt16)(a)
+#define narrow32Intzh(r,a) r=(StgInt32)(a)
+#define narrow8Wordzh(r,a) r=(StgWord8)(a)
+#define narrow16Wordzh(r,a) r=(StgWord16)(a)
+#define narrow32Wordzh(r,a) r=(StgWord32)(a)
/* -----------------------------------------------------------------------------
Addr# PrimOps.
-------------------------------------------------------------------------- */
+#define nullAddrzh(r,i) r=(A_)(0)
+#define plusAddrzh(r,a,i) r=((char *)(a)) + (i)
+#define minusAddrzh(r,a,b) r=((char *)(a)) - ((char *)(b))
+#define remAddrzh(r,a,i) r=((W_)(a))%(i)
#define int2Addrzh(r,a) r=(A_)(a)
#define addr2Intzh(r,a) r=(I_)(a)
#define readStablePtrOffAddrzh(r,a,i) r=((StgStablePtr *)(a))[i]
#define readInt8OffAddrzh(r,a,i) r=((StgInt8 *)(a))[i]
#define readInt16OffAddrzh(r,a,i) r=((StgInt16 *)(a))[i]
-#define readInt32OffAddrzh(r,a,i) r=((StgInt32 *)(a))[i]
#define readWord8OffAddrzh(r,a,i) r=((StgWord8 *)(a))[i]
#define readWord16OffAddrzh(r,a,i) r=((StgWord16 *)(a))[i]
+#define readInt32OffAddrzh(r,a,i) r=((StgInt32 *)(a))[i]
#define readWord32OffAddrzh(r,a,i) r=((StgWord32 *)(a))[i]
#ifdef SUPPORT_LONG_LONGS
#define readInt64OffAddrzh(r,a,i) r=((LI_ *)(a))[i]
#define readWord64OffAddrzh(r,a,i) r=((LW_ *)(a))[i]
+#else
+#define readInt64OffAddrzh(r,a,i) r=((I_ *)(a))[i]
+#define readWord64OffAddrzh(r,a,i) r=((W_ *)(a))[i]
#endif
#define writeCharOffAddrzh(a,i,v) ((StgWord8 *)(a))[i] = (v)
#ifdef SUPPORT_LONG_LONGS
#define writeInt64OffAddrzh(a,i,v) ((LI_ *)(a))[i] = (v)
#define writeWord64OffAddrzh(a,i,v) ((LW_ *)(a))[i] = (v)
+#else
+#define writeInt64OffAddrzh(a,i,v) ((I_ *)(a))[i] = (v)
+#define writeWord64OffAddrzh(a,i,v) ((W_ *)(a))[i] = (v)
#endif
#define indexCharOffAddrzh(r,a,i) r=((StgWord8 *)(a))[i]
#ifdef SUPPORT_LONG_LONGS
#define indexInt64OffAddrzh(r,a,i) r=((LI_ *)(a))[i]
#define indexWord64OffAddrzh(r,a,i) r=((LW_ *)(a))[i]
+#else
+#define indexInt64OffAddrzh(r,a,i) r=((I_ *)(a))[i]
+#define indexWord64OffAddrzh(r,a,i) r=((W_ *)(a))[i]
#endif
/* -----------------------------------------------------------------------------
LI_ stg_iShiftRA64 (StgInt64, StgInt);
LI_ stg_intToInt64 (StgInt);
-I_ stg_int64ToInt (StgInt64);
+I_ stg_int64ToInt (StgInt64);
LW_ stg_int64ToWord64 (StgInt64);
LW_ stg_wordToWord64 (StgWord);
#define readWord8Arrayzh(r,a,i) indexWord8OffAddrzh(r,BYTE_ARR_CTS(a),i)
#define readWord16Arrayzh(r,a,i) indexWord16OffAddrzh(r,BYTE_ARR_CTS(a),i)
#define readWord32Arrayzh(r,a,i) indexWord32OffAddrzh(r,BYTE_ARR_CTS(a),i)
-#ifdef SUPPORT_LONG_LONGS
#define readInt64Arrayzh(r,a,i) indexInt64OffAddrzh(r,BYTE_ARR_CTS(a),i)
#define readWord64Arrayzh(r,a,i) indexWord64OffAddrzh(r,BYTE_ARR_CTS(a),i)
-#endif
/* result ("r") arg ignored in write macros! */
#define writeArrayzh(a,i,v) ((PP_) PTRS_ARR_CTS(a))[(i)]=(v)
#define writeWord8Arrayzh(a,i,v) writeWord8OffAddrzh(BYTE_ARR_CTS(a),i,v)
#define writeWord16Arrayzh(a,i,v) writeWord16OffAddrzh(BYTE_ARR_CTS(a),i,v)
#define writeWord32Arrayzh(a,i,v) writeWord32OffAddrzh(BYTE_ARR_CTS(a),i,v)
-#ifdef SUPPORT_LONG_LONGS
#define writeInt64Arrayzh(a,i,v) writeInt64OffAddrzh(BYTE_ARR_CTS(a),i,v)
#define writeWord64Arrayzh(a,i,v) writeWord64OffAddrzh(BYTE_ARR_CTS(a),i,v)
-#endif
#define indexArrayzh(r,a,i) r=((PP_) PTRS_ARR_CTS(a))[(i)]
#define indexWord8Arrayzh(r,a,i) indexWord8OffAddrzh(r,BYTE_ARR_CTS(a),i)
#define indexWord16Arrayzh(r,a,i) indexWord16OffAddrzh(r,BYTE_ARR_CTS(a),i)
#define indexWord32Arrayzh(r,a,i) indexWord32OffAddrzh(r,BYTE_ARR_CTS(a),i)
-#ifdef SUPPORT_LONG_LONGS
#define indexInt64Arrayzh(r,a,i) indexInt64OffAddrzh(r,BYTE_ARR_CTS(a),i)
#define indexWord64Arrayzh(r,a,i) indexWord64OffAddrzh(r,BYTE_ARR_CTS(a),i)
-#endif
/* Freezing arrays-of-ptrs requires changing an info table, for the
benefit of the generational collector. It needs to scavenge mutable
/* and the out-of-line ones... */
EXTFUN_RTS(newByteArrayzh_fast);
+EXTFUN_RTS(newPinnedByteArrayzh_fast);
EXTFUN_RTS(newArrayzh_fast);
+// Highly unsafe, for use with a pinned ByteArray
+// being kept alive with touch#
+#define byteArrayContentszh(r,a) r = BYTE_ARR_CTS(a)
+
/* encoding and decoding of floats/doubles. */
/* We only support IEEE floating point format */
Stable Name / Stable Pointer PrimOps
-------------------------------------------------------------------------- */
-#ifndef PAR
-
EXTFUN_RTS(makeStableNamezh_fast);
#define stableNameToIntzh(r,s) (r = ((StgStableName *)s)->sn)
#define eqStablePtrzh(r,sp1,sp2) \
(r = ((stgCast(StgWord,sp1) & ~STABLEPTR_WEIGHT_MASK) == (stgCast(StgWord,sp2) & ~STABLEPTR_WEIGHT_MASK)))
-#endif
-
/* -----------------------------------------------------------------------------
Concurrency/Exception PrimOps.
-------------------------------------------------------------------------- */
#if defined(GRAN)
//@cindex _par_
-#define parzh(r,node) PAR(r,node,1,0,0,0,0,0)
+#define parzh(r,node) parAny(r,node,1,0,0,0,0,0)
//@cindex _parAt_
#define parAtzh(r,node,where,identifier,gran_info,size_info,par_info,rest) \
//@cindex _parLocal_
#define parLocalzh(r,node,identifier,gran_info,size_info,par_info,rest) \
- PAR(r,node,rest,identifier,gran_info,size_info,par_info,1)
+ parAny(r,node,rest,identifier,gran_info,size_info,par_info,1)
//@cindex _parGlobal_
#define parGlobalzh(r,node,identifier,gran_info,size_info,par_info,rest) \
- PAR(r,node,rest,identifier,gran_info,size_info,par_info,0)
+ parAny(r,node,rest,identifier,gran_info,size_info,par_info,0)
-#define PAR(r,node,rest,identifier,gran_info,size_info,par_info,local) \
+#define parAny(r,node,rest,identifier,gran_info,size_info,par_info,local) \
{ \
if (closure_SHOULD_SPARK((StgClosure*)node)) { \
rtsSpark *result; \
Weak Pointer PrimOps.
-------------------------------------------------------------------------- */
-#ifndef PAR
-
EXTFUN_RTS(mkWeakzh_fast);
EXTFUN_RTS(finalizzeWeakzh_fast);
#define sameWeakzh(w1,w2) ((w1)==(w2))
-#endif
/* -----------------------------------------------------------------------------
Foreign Object PrimOps.
-------------------------------------------------------------------------- */
-#ifndef PAR
-
#define ForeignObj_CLOSURE_DATA(c) (((StgForeignObj *)c)->data)
#define foreignObjToAddrzh(r,fo) r=ForeignObj_CLOSURE_DATA(fo)
#define writeForeignObjzh(res,datum) \
(ForeignObj_CLOSURE_DATA(res) = (P_)(datum))
-#define eqForeignObj(f1,f2) ((f1)==(f2))
-
+#define eqForeignObjzh(r,f1,f2) r=(f1)==(f2)
#define indexCharOffForeignObjzh(r,fo,i) indexCharOffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
#define indexWideCharOffForeignObjzh(r,fo,i) indexWideCharOffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
#define indexIntOffForeignObjzh(r,fo,i) indexIntOffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
#define indexWord8OffForeignObjzh(r,fo,i) indexWord8OffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
#define indexWord16OffForeignObjzh(r,fo,i) indexWord16OffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
#define indexWord32OffForeignObjzh(r,fo,i) indexWord32OffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
-#ifdef SUPPORT_LONG_LONGS
#define indexInt64OffForeignObjzh(r,fo,i) indexInt64OffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
#define indexWord64OffForeignObjzh(r,fo,i) indexWord64OffAddrzh(r,ForeignObj_CLOSURE_DATA(fo),i)
-#endif
-
-#endif
-
/* -----------------------------------------------------------------------------
Constructor tags