[project @ 2001-10-27 21:44:54 by sof]
[ghc-hetmet.git] / ghc / includes / PrimOps.h
index e6d1d40..0100f49 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: PrimOps.h,v 1.75 2001/02/28 00:01:03 qrczak Exp $
+ * $Id: PrimOps.h,v 1.83 2001/09/24 00:22:59 ken 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.             
    -------------------------------------------------------------------------- */
    Comparison PrimOps.
    -------------------------------------------------------------------------- */
 
-#define gtCharzh(r,a,b)        r=(a)> (b)
-#define geCharzh(r,a,b)        r=(a)>=(b)
-#define eqCharzh(r,a,b)        r=(a)==(b)
-#define neCharzh(r,a,b)        r=(a)!=(b)
-#define ltCharzh(r,a,b)        r=(a)< (b)
-#define leCharzh(r,a,b)        r=(a)<=(b)
+#define gtCharzh(r,a,b)        r=((C_)(a))> ((C_)(b))
+#define geCharzh(r,a,b)        r=((C_)(a))>=((C_)(b))
+#define eqCharzh(r,a,b)        r=((C_)(a))==((C_)(b))
+#define neCharzh(r,a,b)        r=((C_)(a))!=((C_)(b))
+#define ltCharzh(r,a,b)        r=((C_)(a))< ((C_)(b))
+#define leCharzh(r,a,b)        r=((C_)(a))<=((C_)(b))
 
 /* Int comparisons: >#, >=# etc */
-#define zgzh(r,a,b)    r=(a)> (b)
-#define zgzezh(r,a,b)  r=(a)>=(b)
-#define zezezh(r,a,b)  r=(a)==(b)
-#define zszezh(r,a,b)  r=(a)!=(b)
-#define zlzh(r,a,b)    r=(a)< (b)
-#define zlzezh(r,a,b)  r=(a)<=(b)
-
-#define gtWordzh(r,a,b)        r=(a)> (b)
-#define geWordzh(r,a,b)        r=(a)>=(b)
-#define eqWordzh(r,a,b)        r=(a)==(b)
-#define neWordzh(r,a,b)        r=(a)!=(b)
-#define ltWordzh(r,a,b)        r=(a)< (b)
-#define leWordzh(r,a,b)        r=(a)<=(b)
-
-#define gtAddrzh(r,a,b)        r=(a)> (b)
-#define geAddrzh(r,a,b)        r=(a)>=(b)
-#define eqAddrzh(r,a,b)        r=(a)==(b)
-#define neAddrzh(r,a,b)        r=(a)!=(b)
-#define ltAddrzh(r,a,b)        r=(a)< (b)
-#define leAddrzh(r,a,b)        r=(a)<=(b)
-
-#define gtFloatzh(r,a,b)  r=(a)> (b)
-#define geFloatzh(r,a,b)  r=(a)>=(b)
-#define eqFloatzh(r,a,b)  r=(a)==(b)
-#define neFloatzh(r,a,b)  r=(a)!=(b)
-#define ltFloatzh(r,a,b)  r=(a)< (b)
-#define leFloatzh(r,a,b)  r=(a)<=(b)
+#define zgzh(r,a,b)    r=((I_)(a))> ((I_)(b))
+#define zgzezh(r,a,b)  r=((I_)(a))>=((I_)(b))
+#define zezezh(r,a,b)  r=((I_)(a))==((I_)(b))
+#define zszezh(r,a,b)  r=((I_)(a))!=((I_)(b))
+#define zlzh(r,a,b)    r=((I_)(a))< ((I_)(b))
+#define zlzezh(r,a,b)  r=((I_)(a))<=((I_)(b))
+
+#define gtWordzh(r,a,b)        r=((W_)(a))> ((W_)(b))
+#define geWordzh(r,a,b)        r=((W_)(a))>=((W_)(b))
+#define eqWordzh(r,a,b)        r=((W_)(a))==((W_)(b))
+#define neWordzh(r,a,b)        r=((W_)(a))!=((W_)(b))
+#define ltWordzh(r,a,b)        r=((W_)(a))< ((W_)(b))
+#define leWordzh(r,a,b)        r=((W_)(a))<=((W_)(b))
+
+#define gtAddrzh(r,a,b)        r=((A_)(a))> ((A_)(b))
+#define geAddrzh(r,a,b)        r=((A_)(a))>=((A_)(b))
+#define eqAddrzh(r,a,b)        r=((A_)(a))==((A_)(b))
+#define neAddrzh(r,a,b)        r=((A_)(a))!=((A_)(b))
+#define ltAddrzh(r,a,b)        r=((A_)(a))< ((A_)(b))
+#define leAddrzh(r,a,b)        r=((A_)(a))<=((A_)(b))
+
+#define gtFloatzh(r,a,b)  r=((StgFloat)(a))> ((StgFloat)(b))
+#define geFloatzh(r,a,b)  r=((StgFloat)(a))>=((StgFloat)(b))
+#define eqFloatzh(r,a,b)  r=((StgFloat)(a))==((StgFloat)(b))
+#define neFloatzh(r,a,b)  r=((StgFloat)(a))!=((StgFloat)(b))
+#define ltFloatzh(r,a,b)  r=((StgFloat)(a))< ((StgFloat)(b))
+#define leFloatzh(r,a,b)  r=((StgFloat)(a))<=((StgFloat)(b))
 
 /* Double comparisons: >##, >=## etc */
-#define zgzhzh(r,a,b)  r=(a)> (b)
-#define zgzezhzh(r,a,b)        r=(a)>=(b)
-#define zezezhzh(r,a,b)        r=(a)==(b)
-#define zszezhzh(r,a,b)        r=(a)!=(b)
-#define zlzhzh(r,a,b)  r=(a)< (b)
-#define zlzezhzh(r,a,b)        r=(a)<=(b)
+#define zgzhzh(r,a,b)  r=((StgDouble)(a))> ((StgDouble)(b))
+#define zgzezhzh(r,a,b)        r=((StgDouble)(a))>=((StgDouble)(b))
+#define zezezhzh(r,a,b)        r=((StgDouble)(a))==((StgDouble)(b))
+#define zszezhzh(r,a,b)        r=((StgDouble)(a))!=((StgDouble)(b))
+#define zlzhzh(r,a,b)  r=((StgDouble)(a))< ((StgDouble)(b))
+#define zlzezhzh(r,a,b)        r=((StgDouble)(a))<=((StgDouble)(b))
 
 /* -----------------------------------------------------------------------------
    Char# PrimOps.
    Int# PrimOps.
    -------------------------------------------------------------------------- */
 
-#define zpzh(r,a,b)            r=(a)+(b)
-#define zmzh(r,a,b)            r=(a)-(b)
-#define ztzh(r,a,b)            r=(a)*(b)
-#define quotIntzh(r,a,b)       r=(a)/(b)
-#define remIntzh(r,a,b)                r=(a)%(b)
-#define negateIntzh(r,a)       r=-(a)
+#define zpzh(r,a,b)            r=((I_)(a))+((I_)(b))
+#define zmzh(r,a,b)            r=((I_)(a))-((I_)(b))
+#define ztzh(r,a,b)            r=((I_)(a))*((I_)(b))
+#define quotIntzh(r,a,b)       r=((I_)(a))/((I_)(b))
+#define remIntzh(r,a,b)                r=((I_)(a))%((I_)(b))
+#define negateIntzh(r,a)       r=-((I_)(a))
 
 /* -----------------------------------------------------------------------------
  * Int operations with carry.
  * could be improved by making r and c the correct values for
  * plugging into a new J#.  
  */
-#define addIntCzh(r,c,a,b)                     \
-{ r = a + b;                                   \
-  c = ((StgWord)(~(a^b) & (a^r)))              \
-    >> (BITS_IN (I_) - 1);                     \
+#define addIntCzh(r,c,a,b)                                     \
+{ r = ((I_)(a)) + ((I_)(b));                                   \
+  c = ((StgWord)(~(((I_)(a))^((I_)(b))) & (((I_)(a))^r)))      \
+    >> (BITS_IN (I_) - 1);                                     \
 }
 
 
-#define subIntCzh(r,c,a,b)                     \
-{ r = a - b;                                   \
-  c = ((StgWord)((a^b) & (a^r)))               \
-    >> (BITS_IN (I_) - 1);                     \
+#define subIntCzh(r,c,a,b)                                     \
+{ r = ((I_)(a)) - ((I_)(b));                                   \
+  c = ((StgWord)((((I_)(a))^((I_)(b))) & (((I_)(a))^r)))       \
+    >> (BITS_IN (I_) - 1);                                     \
 }
 
 /* Multiply with overflow checking.
@@ -171,17 +177,17 @@ typedef union {
 
 #else
 
-#define HALF_INT  (1 << (BITS_IN (I_) / 2))
+#define HALF_INT  (((I_)1) << (BITS_IN (I_) / 2))
 
-#define stg_abs(a) ((a) < 0 ? -(a) : (a))
+#define stg_abs(a) (((I_)(a)) < 0 ? -((I_)(a)) : ((I_)(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 {                                     \
-    r = a * b;                                 \
+    r = ((I_)(a)) * ((I_)(b));                 \
     c = 0;                                     \
   }                                            \
 }
@@ -191,16 +197,16 @@ typedef union {
    Word# PrimOps.
    -------------------------------------------------------------------------- */
 
-#define plusWordzh(r,a,b)      r=(a)+(b)
-#define minusWordzh(r,a,b)     r=(a)-(b)
-#define timesWordzh(r,a,b)     r=(a)*(b)
-#define quotWordzh(r,a,b)      r=(a)/(b)
-#define remWordzh(r,a,b)       r=(a)%(b)
+#define plusWordzh(r,a,b)      r=((W_)(a))+((W_)(b))
+#define minusWordzh(r,a,b)     r=((W_)(a))-((W_)(b))
+#define timesWordzh(r,a,b)     r=((W_)(a))*((W_)(b))
+#define quotWordzh(r,a,b)      r=((W_)(a))/((W_)(b))
+#define remWordzh(r,a,b)       r=((W_)(a))%((W_)(b))
 
-#define andzh(r,a,b)           r=(a)&(b)
-#define orzh(r,a,b)            r=(a)|(b)
-#define xorzh(r,a,b)            r=(a)^(b)
-#define notzh(r,a)             r=~(a)
+#define andzh(r,a,b)           r=((W_)(a))&((W_)(b))
+#define orzh(r,a,b)            r=((W_)(a))|((W_)(b))
+#define xorzh(r,a,b)            r=((W_)(a))^((W_)(b))
+#define notzh(r,a)             r=~((W_)(a))
 
 /* The extra tests below properly define the behaviour when shifting
  * by offsets larger than the width of the value being shifted.  Doing
@@ -208,34 +214,38 @@ typedef union {
  * on whether the operation is constant folded or not with gcc on x86!)
  */
 
-#define shiftLzh(r,a,b)                r=((b) >= BITS_IN(W_)) ? 0 : (a)<<(b)
-#define shiftRLzh(r,a,b)       r=((b) >= BITS_IN(W_)) ? 0 : (a)>>(b)
-#define iShiftLzh(r,a,b)       r=((b) >= BITS_IN(W_)) ? 0 : (a)<<(b)
+#define shiftLzh(r,a,b)                r=(((I_)(b)) >= BITS_IN(W_)) ? 0 : ((W_)(a))<<((I_)(b))
+#define shiftRLzh(r,a,b)       r=(((I_)(b)) >= BITS_IN(W_)) ? 0 : ((W_)(a))>>((I_)(b))
+#define iShiftLzh(r,a,b)       r=(((I_)(b)) >= BITS_IN(W_)) ? 0 : ((W_)(a))<<((I_)(b))
 /* Right shifting of signed quantities is not portable in C, so
    the behaviour you'll get from using these primops depends
    on the whatever your C compiler is doing. ToDo: fix/document. -- sof 8/98
 */
-#define iShiftRAzh(r,a,b)      r=((b) >= BITS_IN(I_)) ? (((a) < 0) ? -1 : 0) : (a)>>(b)
-#define iShiftRLzh(r,a,b)      r=((b) >= BITS_IN(I_)) ? 0 : (I_)((W_)(a)>>(b))
+#define iShiftRAzh(r,a,b)      r=(((I_)(b)) >= BITS_IN(I_)) ? ((((I_)(a)) < 0) ? -1 : 0) : ((I_)(a))>>((I_)(b))
+#define iShiftRLzh(r,a,b)      r=(((I_)(b)) >= BITS_IN(I_)) ? 0 : (I_)((W_)((I_)(a))>>((I_)(b)))
 
-#define int2Wordzh(r,a)        r=(W_)(a)
-#define word2Intzh(r,a)        r=(I_)(a)
+#define int2Wordzh(r,a)        r=(W_)((I_)(a))
+#define word2Intzh(r,a)        r=(I_)((W_)(a))
 
 /* -----------------------------------------------------------------------------
    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)((I_)(a))
+#define narrow16Intzh(r,a)     r=(StgInt16)((I_)(a))
+#define narrow32Intzh(r,a)     r=(StgInt32)((I_)(a))
+#define narrow8Wordzh(r,a)     r=(StgWord8)((W_)(a))
+#define narrow16Wordzh(r,a)    r=(StgWord16)((W_)(a))
+#define narrow32Wordzh(r,a)    r=(StgWord32)((W_)(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)
 
@@ -249,13 +259,16 @@ typedef union {
 #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)
@@ -276,6 +289,9 @@ typedef union {
 #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]
@@ -295,65 +311,68 @@ typedef union {
 #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
 
 /* -----------------------------------------------------------------------------
    Float PrimOps.
    -------------------------------------------------------------------------- */
 
-#define plusFloatzh(r,a,b)   r=(a)+(b)
-#define minusFloatzh(r,a,b)  r=(a)-(b)
-#define timesFloatzh(r,a,b)  r=(a)*(b)
-#define divideFloatzh(r,a,b) r=(a)/(b)
-#define negateFloatzh(r,a)   r=-(a)
+#define plusFloatzh(r,a,b)   r=((StgFloat)(a))+((StgFloat)(b))
+#define minusFloatzh(r,a,b)  r=((StgFloat)(a))-((StgFloat)(b))
+#define timesFloatzh(r,a,b)  r=((StgFloat)(a))*((StgFloat)(b))
+#define divideFloatzh(r,a,b) r=((StgFloat)(a))/((StgFloat)(b))
+#define negateFloatzh(r,a)   r=-((StgFloat)(a))
                             
-#define int2Floatzh(r,a)     r=(StgFloat)(a)
-#define float2Intzh(r,a)     r=(I_)(a)
+#define int2Floatzh(r,a)     r=(StgFloat)((I_)(a))
+#define float2Intzh(r,a)     r=(I_)((StgFloat)(a))
                             
-#define expFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,exp,a)
-#define logFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,log,a)
-#define sqrtFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,sqrt,a)
-#define sinFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,sin,a)
-#define cosFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,cos,a)
-#define tanFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,tan,a)
-#define asinFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,asin,a)
-#define acosFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,acos,a)
-#define atanFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,atan,a)
-#define sinhFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,sinh,a)
-#define coshFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,cosh,a)
-#define tanhFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,tanh,a)
-#define powerFloatzh(r,a,b)  r=(StgFloat) RET_PRIM_STGCALL2(StgDouble,pow,a,b)
+#define expFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,exp,((StgFloat)(a)))
+#define logFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,log,((StgFloat)(a)))
+#define sqrtFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,sqrt,((StgFloat)(a)))
+#define sinFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,sin,((StgFloat)(a)))
+#define cosFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,cos,((StgFloat)(a)))
+#define tanFloatzh(r,a)             r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,tan,((StgFloat)(a)))
+#define asinFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,asin,((StgFloat)(a)))
+#define acosFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,acos,((StgFloat)(a)))
+#define atanFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,atan,((StgFloat)(a)))
+#define sinhFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,sinh,((StgFloat)(a)))
+#define coshFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,cosh,((StgFloat)(a)))
+#define tanhFloatzh(r,a)     r=(StgFloat) RET_PRIM_STGCALL1(StgDouble,tanh,((StgFloat)(a)))
+#define powerFloatzh(r,a,b)  r=(StgFloat) RET_PRIM_STGCALL2(StgDouble,pow,((StgFloat)(a)),((StgFloat)(b)))
 
 /* -----------------------------------------------------------------------------
    Double PrimOps.
    -------------------------------------------------------------------------- */
 
-#define zpzhzh(r,a,b)       r=(a)+(b)
-#define zmzhzh(r,a,b)       r=(a)-(b)
-#define ztzhzh(r,a,b)       r=(a)*(b)
-#define zszhzh(r,a,b)       r=(a)/(b)
-#define negateDoublezh(r,a)  r=-(a)
+#define zpzhzh(r,a,b)       r=((StgDouble)(a))+((StgDouble)(b))
+#define zmzhzh(r,a,b)       r=((StgDouble)(a))-((StgDouble)(b))
+#define ztzhzh(r,a,b)       r=((StgDouble)(a))*((StgDouble)(b))
+#define zszhzh(r,a,b)       r=((StgDouble)(a))/((StgDouble)(b))
+#define negateDoublezh(r,a)  r=-((StgDouble)(a))
                             
-#define int2Doublezh(r,a)    r=(StgDouble)(a)
-#define double2Intzh(r,a)    r=(I_)(a)
+#define int2Doublezh(r,a)    r=(StgDouble)((I_)(a))
+#define double2Intzh(r,a)    r=(I_)((StgDouble)(a))
                             
-#define float2Doublezh(r,a)  r=(StgDouble)(a)
-#define double2Floatzh(r,a)  r=(StgFloat)(a)
+#define float2Doublezh(r,a)  r=(StgDouble)((StgFloat)(a))
+#define double2Floatzh(r,a)  r=(StgFloat)((StgDouble)(a))
                             
-#define expDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,exp,a)
-#define logDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,log,a)
-#define sqrtDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,sqrt,a)
-#define sinDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,sin,a)
-#define cosDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,cos,a)
-#define tanDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,tan,a)
-#define asinDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,asin,a)
-#define acosDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,acos,a)
-#define atanDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,atan,a)
-#define sinhDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,sinh,a)
-#define coshDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,cosh,a)
-#define tanhDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,tanh,a)
+#define expDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,exp,((StgDouble)(a)))
+#define logDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,log,((StgDouble)(a)))
+#define sqrtDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,sqrt,((StgDouble)(a)))
+#define sinDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,sin,((StgDouble)(a)))
+#define cosDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,cos,((StgDouble)(a)))
+#define tanDoublezh(r,a)     r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,tan,((StgDouble)(a)))
+#define asinDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,asin,((StgDouble)(a)))
+#define acosDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,acos,((StgDouble)(a)))
+#define atanDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,atan,((StgDouble)(a)))
+#define sinhDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,sinh,((StgDouble)(a)))
+#define coshDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,cosh,((StgDouble)(a)))
+#define tanhDoublezh(r,a)    r=(StgDouble) RET_PRIM_STGCALL1(StgDouble,tanh,((StgDouble)(a)))
 /* Power: **## */
-#define ztztzhzh(r,a,b)        r=(StgDouble) RET_PRIM_STGCALL2(StgDouble,pow,a,b)
+#define ztztzhzh(r,a,b)        r=(StgDouble) RET_PRIM_STGCALL2(StgDouble,pow,((StgDouble)(a)),((StgDouble)(b)))
 
 /* -----------------------------------------------------------------------------
    Integer PrimOps.
@@ -538,7 +557,7 @@ LI_ stg_iShiftRL64 (StgInt64, StgInt);
 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);
@@ -593,10 +612,8 @@ extern I_ resetGenSymZh(void);
 #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)
@@ -615,10 +632,8 @@ extern I_ resetGenSymZh(void);
 #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)]
 
@@ -636,10 +651,8 @@ extern I_ resetGenSymZh(void);
 #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
@@ -664,8 +677,13 @@ EXTFUN_RTS(unsafeThawArrayzh_fast);
 /* 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 */
@@ -742,8 +760,6 @@ extern void stg_exit(I_ n)  __attribute__ ((noreturn));
    Stable Name / Stable Pointer  PrimOps
    -------------------------------------------------------------------------- */
 
-#ifndef PAR
-
 EXTFUN_RTS(makeStableNamezh_fast);
 
 #define stableNameToIntzh(r,s)   (r = ((StgStableName *)s)->sn)
@@ -762,8 +778,6 @@ EXTFUN_RTS(makeStableNamezh_fast);
 #define eqStablePtrzh(r,sp1,sp2) \
     (r = ((stgCast(StgWord,sp1) & ~STABLEPTR_WEIGHT_MASK) == (stgCast(StgWord,sp2) & ~STABLEPTR_WEIGHT_MASK)))
 
-#endif
-
 /* -----------------------------------------------------------------------------
    Concurrency/Exception PrimOps.
    -------------------------------------------------------------------------- */
@@ -793,7 +807,7 @@ extern int cmp_thread(const StgTSO *tso1, const StgTSO *tso2);
 
 #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) \
@@ -833,13 +847,13 @@ extern int cmp_thread(const StgTSO *tso1, const StgTSO *tso2);
 
 //@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;                                                   \
@@ -887,8 +901,6 @@ extern int cmp_thread(const StgTSO *tso1, const StgTSO *tso2);
    Weak Pointer PrimOps.
    -------------------------------------------------------------------------- */
 
-#ifndef PAR
-
 EXTFUN_RTS(mkWeakzh_fast);
 EXTFUN_RTS(finalizzeWeakzh_fast);
 
@@ -903,14 +915,11 @@ 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)
@@ -921,8 +930,7 @@ EXTFUN_RTS(mkForeignObjzh_fast);
 #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)
@@ -937,13 +945,8 @@ EXTFUN_RTS(mkForeignObjzh_fast);
 #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