From a156da2f88f50e4dd4c92d7f66799afd02651b97 Mon Sep 17 00:00:00 2001
From: sof <unknown>
Date: Fri, 14 Aug 1998 11:40:55 +0000
Subject: [PATCH] [project @ 1998-08-14 11:40:55 by sof] PrimOp.CCallOp
 extended to possibly use first arg as function pointer; 64-bit <--> Integer
 primops added, write*OffAddr primop family added; removed SraOp

---
 ghc/compiler/prelude/PrimOp.lhs | 481 +++++++++++++++++++-------------
 1 file changed, 292 insertions(+), 189 deletions(-)

diff --git a/ghc/compiler/prelude/PrimOp.lhs b/ghc/compiler/prelude/PrimOp.lhs
index 420e172d6f7c..aa416737b637 100644
--- a/ghc/compiler/prelude/PrimOp.lhs
+++ b/ghc/compiler/prelude/PrimOp.lhs
@@ -34,6 +34,7 @@ import TysPrim
 import TysWiredIn
 
 import CStrings		( identToC )
+import CallConv		( CallConv, pprCallConv )
 import Constants   	( mIN_MP_INT_SIZE, mP_STRUCT_SIZE )
 import HeapOffs		( addOff, intOff, totHdrSize, HeapOffset )
 import Outputable
@@ -83,7 +84,7 @@ data PrimOp
     -- Word#-related ops:
     | WordQuotOp | WordRemOp
     | AndOp  | OrOp   | NotOp | XorOp
-    | SllOp  | SraOp  | SrlOp  -- shift {left,right} {arithmetic,logical}
+    | SllOp  | SrlOp  -- shift {left,right} {logical}
     | Int2WordOp | Word2IntOp -- casts
 
     -- Addr#-related ops:
@@ -124,6 +125,9 @@ data PrimOp
     | Integer2IntOp  | Integer2WordOp  
     | Int2IntegerOp  | Word2IntegerOp
     | Addr2IntegerOp -- "Addr" is *always* a literal string
+     -- casting to/from Integer and 64-bit (un)signed quantities.
+    | IntegerToInt64Op | Int64ToIntegerOp
+    | IntegerToWord64Op | Word64ToIntegerOp
     -- ?? gcd, etc?
 
     | FloatEncodeOp  | FloatDecodeOp
@@ -148,6 +152,7 @@ data PrimOp
 	-- Note that ForeignObjRep is not included -- the only way of
 	-- creating a ForeignObj is with a ccall or casm.
     | IndexOffForeignObjOp PrimRep
+    | WriteOffAddrOp PrimRep
 
     | UnsafeFreezeArrayOp | UnsafeFreezeByteArrayOp
     | SizeofByteArrayOp   | SizeofMutableByteArrayOp
@@ -164,12 +169,15 @@ data PrimOp
 
 A special ``trap-door'' to use in making calls direct to C functions:
 \begin{code}
-    | CCallOp	FAST_STRING	-- An "unboxed" ccall# to this named function
-		Bool		-- True <=> really a "casm"
-		Bool		-- True <=> might invoke Haskell GC
-		[Type]	-- Unboxed argument; the state-token
-				-- argument will have been put *first*
-		Type		-- Return type; one of the "StateAnd<blah>#" types
+    | CCallOp	(Maybe FAST_STRING) -- Nothing => first argument (an Addr#) is the function pointer
+				    -- Just fn => An "unboxed" ccall# to `fn'.
+
+		Bool		    -- True <=> really a "casm"
+		Bool		    -- True <=> might invoke Haskell GC
+		CallConv	    -- calling convention to use.
+		[Type]		    -- Unboxed arguments; the state-token
+				    -- argument will have been put *first*
+		Type		    -- Return type; one of the "StateAnd<blah>#" types
 
     -- (... to be continued ... )
 \end{code}
@@ -258,6 +266,7 @@ about using it this way?? ADR)
     | ParAtForNowOp	-- specifies initial destination of global par
     | CopyableOp	-- marks copyable code
     | NoFollowOp	-- marks non-followup expression
+
 \end{code}
 
 Deriving Ix is what we really want! ToDo
@@ -305,156 +314,178 @@ tagOf_PrimOp IntAddOp			      = ILIT( 39)
 tagOf_PrimOp IntSubOp			      = ILIT( 40)
 tagOf_PrimOp IntMulOp			      = ILIT( 41)
 tagOf_PrimOp IntQuotOp			      = ILIT( 42)
-tagOf_PrimOp IntRemOp			      = ILIT( 44)
-tagOf_PrimOp IntNegOp			      = ILIT( 45)
-tagOf_PrimOp IntAbsOp			      = ILIT( 47)
-tagOf_PrimOp WordQuotOp			      = ILIT( 48)
-tagOf_PrimOp WordRemOp			      = ILIT( 49)
-tagOf_PrimOp AndOp			      = ILIT( 50)
-tagOf_PrimOp OrOp			      = ILIT( 51)
-tagOf_PrimOp NotOp			      = ILIT( 52)
-tagOf_PrimOp XorOp			      = ILIT( 53)
-tagOf_PrimOp SllOp			      = ILIT( 54)
-tagOf_PrimOp SraOp			      = ILIT( 55)
-tagOf_PrimOp SrlOp			      = ILIT( 56)
-tagOf_PrimOp ISllOp			      = ILIT( 57)
-tagOf_PrimOp ISraOp			      = ILIT( 58)
-tagOf_PrimOp ISrlOp			      = ILIT( 59)
-tagOf_PrimOp Int2WordOp			      = ILIT( 60)
-tagOf_PrimOp Word2IntOp			      = ILIT( 61)
-tagOf_PrimOp Int2AddrOp			      = ILIT( 62)
-tagOf_PrimOp Addr2IntOp			      = ILIT( 63)
-tagOf_PrimOp FloatAddOp			      = ILIT( 64)
-tagOf_PrimOp FloatSubOp			      = ILIT( 65)
-tagOf_PrimOp FloatMulOp			      = ILIT( 66)
-tagOf_PrimOp FloatDivOp			      = ILIT( 67)
-tagOf_PrimOp FloatNegOp			      = ILIT( 68)
-tagOf_PrimOp Float2IntOp		      = ILIT( 69)
-tagOf_PrimOp Int2FloatOp		      = ILIT( 70)
-tagOf_PrimOp FloatExpOp			      = ILIT( 71)
-tagOf_PrimOp FloatLogOp			      = ILIT( 72)
-tagOf_PrimOp FloatSqrtOp		      = ILIT( 73)
-tagOf_PrimOp FloatSinOp			      = ILIT( 74)
-tagOf_PrimOp FloatCosOp			      = ILIT( 75)
-tagOf_PrimOp FloatTanOp			      = ILIT( 76)
-tagOf_PrimOp FloatAsinOp		      = ILIT( 77)
-tagOf_PrimOp FloatAcosOp		      = ILIT( 78)
-tagOf_PrimOp FloatAtanOp		      = ILIT( 79)
-tagOf_PrimOp FloatSinhOp		      = ILIT( 80)
-tagOf_PrimOp FloatCoshOp		      = ILIT( 81)
-tagOf_PrimOp FloatTanhOp		      = ILIT( 82)
-tagOf_PrimOp FloatPowerOp		      = ILIT( 83)
-tagOf_PrimOp DoubleAddOp		      = ILIT( 84)
-tagOf_PrimOp DoubleSubOp		      = ILIT( 85)
-tagOf_PrimOp DoubleMulOp		      = ILIT( 86)
-tagOf_PrimOp DoubleDivOp		      = ILIT( 87)
-tagOf_PrimOp DoubleNegOp		      = ILIT( 88)
-tagOf_PrimOp Double2IntOp		      = ILIT( 89)
-tagOf_PrimOp Int2DoubleOp		      = ILIT( 90)
-tagOf_PrimOp Double2FloatOp		      = ILIT( 91)
-tagOf_PrimOp Float2DoubleOp		      = ILIT( 92)
-tagOf_PrimOp DoubleExpOp		      = ILIT( 93)
-tagOf_PrimOp DoubleLogOp		      = ILIT( 94)
-tagOf_PrimOp DoubleSqrtOp		      = ILIT( 95)
-tagOf_PrimOp DoubleSinOp		      = ILIT( 96)
-tagOf_PrimOp DoubleCosOp		      = ILIT( 97)
-tagOf_PrimOp DoubleTanOp		      = ILIT( 98)
-tagOf_PrimOp DoubleAsinOp		      = ILIT( 99)
-tagOf_PrimOp DoubleAcosOp		      = ILIT(100)
-tagOf_PrimOp DoubleAtanOp		      = ILIT(101)
-tagOf_PrimOp DoubleSinhOp		      = ILIT(102)
-tagOf_PrimOp DoubleCoshOp		      = ILIT(103)
-tagOf_PrimOp DoubleTanhOp		      = ILIT(104)
-tagOf_PrimOp DoublePowerOp		      = ILIT(105)
-tagOf_PrimOp IntegerAddOp		      = ILIT(106)
-tagOf_PrimOp IntegerSubOp		      = ILIT(107)
-tagOf_PrimOp IntegerMulOp		      = ILIT(108)
-tagOf_PrimOp IntegerQuotRemOp		      = ILIT(109)
-tagOf_PrimOp IntegerDivModOp		      = ILIT(110)
-tagOf_PrimOp IntegerNegOp		      = ILIT(111)
-tagOf_PrimOp IntegerCmpOp		      = ILIT(112)
-tagOf_PrimOp Integer2IntOp		      = ILIT(113)
-tagOf_PrimOp Integer2WordOp		      = ILIT(114)
-tagOf_PrimOp Int2IntegerOp		      = ILIT(115)
-tagOf_PrimOp Word2IntegerOp		      = ILIT(116)
-tagOf_PrimOp Addr2IntegerOp		      = ILIT(117)
-tagOf_PrimOp FloatEncodeOp		      = ILIT(118)
-tagOf_PrimOp FloatDecodeOp		      = ILIT(119)
-tagOf_PrimOp DoubleEncodeOp		      = ILIT(120)
-tagOf_PrimOp DoubleDecodeOp		      = ILIT(121)
-tagOf_PrimOp NewArrayOp			      = ILIT(122)
-tagOf_PrimOp (NewByteArrayOp CharRep)	      = ILIT(123)
-tagOf_PrimOp (NewByteArrayOp IntRep)	      = ILIT(124)
-tagOf_PrimOp (NewByteArrayOp WordRep)	      = ILIT(125)
-tagOf_PrimOp (NewByteArrayOp AddrRep)	      = ILIT(126)
-tagOf_PrimOp (NewByteArrayOp FloatRep)	      = ILIT(127)
-tagOf_PrimOp (NewByteArrayOp DoubleRep)       = ILIT(128)
-tagOf_PrimOp SameMutableArrayOp		      = ILIT(129)
-tagOf_PrimOp SameMutableByteArrayOp	      = ILIT(130)
-tagOf_PrimOp ReadArrayOp		      = ILIT(131)
-tagOf_PrimOp WriteArrayOp		      = ILIT(132)
-tagOf_PrimOp IndexArrayOp		      = ILIT(133)
-tagOf_PrimOp (ReadByteArrayOp CharRep)	      = ILIT(134)
-tagOf_PrimOp (ReadByteArrayOp IntRep)	      = ILIT(135)
-tagOf_PrimOp (ReadByteArrayOp WordRep)	      = ILIT(136)
-tagOf_PrimOp (ReadByteArrayOp AddrRep)	      = ILIT(137)
-tagOf_PrimOp (ReadByteArrayOp FloatRep)       = ILIT(138)
-tagOf_PrimOp (ReadByteArrayOp DoubleRep)      = ILIT(139)
-tagOf_PrimOp (WriteByteArrayOp CharRep)       = ILIT(140)
-tagOf_PrimOp (WriteByteArrayOp IntRep)	      = ILIT(141)
-tagOf_PrimOp (WriteByteArrayOp WordRep)	      = ILIT(142)
-tagOf_PrimOp (WriteByteArrayOp AddrRep)       = ILIT(143)
-tagOf_PrimOp (WriteByteArrayOp FloatRep)      = ILIT(144)
-tagOf_PrimOp (WriteByteArrayOp DoubleRep)     = ILIT(145)
-tagOf_PrimOp (IndexByteArrayOp CharRep)       = ILIT(146)
-tagOf_PrimOp (IndexByteArrayOp IntRep)	      = ILIT(147)
-tagOf_PrimOp (IndexByteArrayOp WordRep)	      = ILIT(148)
-tagOf_PrimOp (IndexByteArrayOp AddrRep)       = ILIT(149)
-tagOf_PrimOp (IndexByteArrayOp FloatRep)      = ILIT(150)
-tagOf_PrimOp (IndexByteArrayOp DoubleRep)     = ILIT(151)
-tagOf_PrimOp (IndexOffAddrOp CharRep)	      = ILIT(152)
-tagOf_PrimOp (IndexOffAddrOp IntRep)	      = ILIT(153)
-tagOf_PrimOp (IndexOffAddrOp WordRep)	      = ILIT(154)
-tagOf_PrimOp (IndexOffAddrOp AddrRep)	      = ILIT(155)
-tagOf_PrimOp (IndexOffAddrOp FloatRep)	      = ILIT(156)
-tagOf_PrimOp (IndexOffAddrOp DoubleRep)       = ILIT(157)
-tagOf_PrimOp (IndexOffForeignObjOp CharRep)   = ILIT(158)
-tagOf_PrimOp (IndexOffForeignObjOp IntRep)    = ILIT(159)
-tagOf_PrimOp (IndexOffForeignObjOp WordRep)   = ILIT(160)
-tagOf_PrimOp (IndexOffForeignObjOp AddrRep)   = ILIT(161)
-tagOf_PrimOp (IndexOffForeignObjOp FloatRep)  = ILIT(162)
-tagOf_PrimOp (IndexOffForeignObjOp DoubleRep) = ILIT(163)
-tagOf_PrimOp UnsafeFreezeArrayOp	      = ILIT(164)
-tagOf_PrimOp UnsafeFreezeByteArrayOp	      = ILIT(165)
-tagOf_PrimOp SizeofByteArrayOp		      = ILIT(166)
-tagOf_PrimOp SizeofMutableByteArrayOp	      = ILIT(167)
-tagOf_PrimOp NewSynchVarOp		      = ILIT(168)
-tagOf_PrimOp TakeMVarOp		    	      = ILIT(169)
-tagOf_PrimOp PutMVarOp		    	      = ILIT(170)
-tagOf_PrimOp ReadIVarOp		    	      = ILIT(171)
-tagOf_PrimOp WriteIVarOp		      = ILIT(172)
-tagOf_PrimOp MakeForeignObjOp		      = ILIT(173)
-tagOf_PrimOp WriteForeignObjOp		      = ILIT(174)
-tagOf_PrimOp MakeStablePtrOp		      = ILIT(175)
-tagOf_PrimOp DeRefStablePtrOp		      = ILIT(176)
-tagOf_PrimOp (CCallOp _ _ _ _ _)	      = ILIT(177)
-tagOf_PrimOp ErrorIOPrimOp		      = ILIT(178)
-tagOf_PrimOp ReallyUnsafePtrEqualityOp	      = ILIT(179)
-tagOf_PrimOp SeqOp			      = ILIT(180)
-tagOf_PrimOp ParOp			      = ILIT(181)
-tagOf_PrimOp ForkOp			      = ILIT(182)
-tagOf_PrimOp DelayOp			      = ILIT(183)
-tagOf_PrimOp WaitReadOp			      = ILIT(184)
-tagOf_PrimOp WaitWriteOp		      = ILIT(185)
-tagOf_PrimOp ParGlobalOp		      = ILIT(186)
-tagOf_PrimOp ParLocalOp			      = ILIT(187)
-tagOf_PrimOp ParAtOp			      = ILIT(188)
-tagOf_PrimOp ParAtAbsOp			      = ILIT(189)
-tagOf_PrimOp ParAtRelOp			      = ILIT(190)
-tagOf_PrimOp ParAtForNowOp		      = ILIT(191)
-tagOf_PrimOp CopyableOp			      = ILIT(192)
-tagOf_PrimOp NoFollowOp			      = ILIT(193)
-tagOf_PrimOp SameMVarOp			      = ILIT(194)
+tagOf_PrimOp IntRemOp			      = ILIT( 43)
+tagOf_PrimOp IntNegOp			      = ILIT( 44)
+tagOf_PrimOp IntAbsOp			      = ILIT( 45)
+tagOf_PrimOp WordQuotOp			      = ILIT( 46)
+tagOf_PrimOp WordRemOp			      = ILIT( 47)
+tagOf_PrimOp AndOp			      = ILIT( 48)
+tagOf_PrimOp OrOp			      = ILIT( 49)
+tagOf_PrimOp NotOp			      = ILIT( 50)
+tagOf_PrimOp XorOp			      = ILIT( 51)
+tagOf_PrimOp SllOp			      = ILIT( 52)
+tagOf_PrimOp SrlOp			      = ILIT( 53)
+tagOf_PrimOp ISllOp			      = ILIT( 54)
+tagOf_PrimOp ISraOp			      = ILIT( 55)
+tagOf_PrimOp ISrlOp			      = ILIT( 56)
+tagOf_PrimOp Int2WordOp			      = ILIT( 57)
+tagOf_PrimOp Word2IntOp			      = ILIT( 58)
+tagOf_PrimOp Int2AddrOp			      = ILIT( 59)
+tagOf_PrimOp Addr2IntOp			      = ILIT( 60)
+
+tagOf_PrimOp FloatAddOp			      = ILIT( 61)
+tagOf_PrimOp FloatSubOp			      = ILIT( 62)
+tagOf_PrimOp FloatMulOp			      = ILIT( 63)
+tagOf_PrimOp FloatDivOp			      = ILIT( 64)
+tagOf_PrimOp FloatNegOp			      = ILIT( 65)
+tagOf_PrimOp Float2IntOp		      = ILIT( 66)
+tagOf_PrimOp Int2FloatOp		      = ILIT( 67)
+tagOf_PrimOp FloatExpOp			      = ILIT( 68)
+tagOf_PrimOp FloatLogOp			      = ILIT( 69)
+tagOf_PrimOp FloatSqrtOp		      = ILIT( 70)
+tagOf_PrimOp FloatSinOp			      = ILIT( 71)
+tagOf_PrimOp FloatCosOp			      = ILIT( 72)
+tagOf_PrimOp FloatTanOp			      = ILIT( 73)
+tagOf_PrimOp FloatAsinOp		      = ILIT( 74)
+tagOf_PrimOp FloatAcosOp		      = ILIT( 75)
+tagOf_PrimOp FloatAtanOp		      = ILIT( 76)
+tagOf_PrimOp FloatSinhOp		      = ILIT( 77)
+tagOf_PrimOp FloatCoshOp		      = ILIT( 78)
+tagOf_PrimOp FloatTanhOp		      = ILIT( 79)
+tagOf_PrimOp FloatPowerOp		      = ILIT( 80)
+tagOf_PrimOp DoubleAddOp		      = ILIT( 81)
+tagOf_PrimOp DoubleSubOp		      = ILIT( 82)
+tagOf_PrimOp DoubleMulOp		      = ILIT( 83)
+tagOf_PrimOp DoubleDivOp		      = ILIT( 84)
+tagOf_PrimOp DoubleNegOp		      = ILIT( 85)
+tagOf_PrimOp Double2IntOp		      = ILIT( 86)
+tagOf_PrimOp Int2DoubleOp		      = ILIT( 87)
+tagOf_PrimOp Double2FloatOp		      = ILIT( 88)
+tagOf_PrimOp Float2DoubleOp		      = ILIT( 89)
+tagOf_PrimOp DoubleExpOp		      = ILIT( 90)
+tagOf_PrimOp DoubleLogOp		      = ILIT( 91)
+tagOf_PrimOp DoubleSqrtOp		      = ILIT( 92)
+tagOf_PrimOp DoubleSinOp		      = ILIT( 93)
+tagOf_PrimOp DoubleCosOp		      = ILIT( 94)
+tagOf_PrimOp DoubleTanOp		      = ILIT( 95)
+tagOf_PrimOp DoubleAsinOp		      = ILIT( 96)
+tagOf_PrimOp DoubleAcosOp		      = ILIT( 97)
+tagOf_PrimOp DoubleAtanOp		      = ILIT( 98)
+tagOf_PrimOp DoubleSinhOp		      = ILIT( 99)
+tagOf_PrimOp DoubleCoshOp		      = ILIT(100)
+tagOf_PrimOp DoubleTanhOp		      = ILIT(101)
+tagOf_PrimOp DoublePowerOp		      = ILIT(102)
+tagOf_PrimOp IntegerAddOp		      = ILIT(103)
+tagOf_PrimOp IntegerSubOp		      = ILIT(104)
+tagOf_PrimOp IntegerMulOp		      = ILIT(105)
+tagOf_PrimOp IntegerQuotRemOp		      = ILIT(106)
+tagOf_PrimOp IntegerDivModOp		      = ILIT(107)
+tagOf_PrimOp IntegerNegOp		      = ILIT(108)
+tagOf_PrimOp IntegerCmpOp		      = ILIT(109)
+tagOf_PrimOp Integer2IntOp		      = ILIT(110)
+tagOf_PrimOp Integer2WordOp		      = ILIT(111)
+tagOf_PrimOp Int2IntegerOp		      = ILIT(112)
+tagOf_PrimOp Word2IntegerOp		      = ILIT(113)
+tagOf_PrimOp Addr2IntegerOp		      = ILIT(114)
+tagOf_PrimOp IntegerToInt64Op		      = ILIT(115)
+tagOf_PrimOp Int64ToIntegerOp		      = ILIT(116)
+tagOf_PrimOp IntegerToWord64Op		      = ILIT(117)
+tagOf_PrimOp Word64ToIntegerOp		      = ILIT(118)
+tagOf_PrimOp FloatEncodeOp		      = ILIT(119)
+tagOf_PrimOp FloatDecodeOp		      = ILIT(120)
+tagOf_PrimOp DoubleEncodeOp		      = ILIT(121)
+tagOf_PrimOp DoubleDecodeOp		      = ILIT(122)
+tagOf_PrimOp NewArrayOp			      = ILIT(123)
+tagOf_PrimOp (NewByteArrayOp CharRep)	      = ILIT(124)
+tagOf_PrimOp (NewByteArrayOp IntRep)	      = ILIT(125)
+tagOf_PrimOp (NewByteArrayOp WordRep)	      = ILIT(126)
+tagOf_PrimOp (NewByteArrayOp AddrRep)	      = ILIT(127)
+tagOf_PrimOp (NewByteArrayOp FloatRep)	      = ILIT(128)
+tagOf_PrimOp (NewByteArrayOp DoubleRep)       = ILIT(129)
+tagOf_PrimOp SameMutableArrayOp		      = ILIT(130)
+tagOf_PrimOp SameMutableByteArrayOp	      = ILIT(131)
+tagOf_PrimOp ReadArrayOp		      = ILIT(132)
+tagOf_PrimOp WriteArrayOp		      = ILIT(133)
+tagOf_PrimOp IndexArrayOp		      = ILIT(134)
+tagOf_PrimOp (ReadByteArrayOp CharRep)	      = ILIT(135)
+tagOf_PrimOp (ReadByteArrayOp IntRep)	      = ILIT(136)
+tagOf_PrimOp (ReadByteArrayOp WordRep)	      = ILIT(137)
+tagOf_PrimOp (ReadByteArrayOp AddrRep)	      = ILIT(138)
+tagOf_PrimOp (ReadByteArrayOp FloatRep)       = ILIT(139)
+tagOf_PrimOp (ReadByteArrayOp DoubleRep)      = ILIT(140)
+tagOf_PrimOp (ReadByteArrayOp Int64Rep)	      = ILIT(141)
+tagOf_PrimOp (ReadByteArrayOp Word64Rep)      = ILIT(142)
+tagOf_PrimOp (WriteByteArrayOp CharRep)       = ILIT(143)
+tagOf_PrimOp (WriteByteArrayOp AddrRep)       = ILIT(144)
+tagOf_PrimOp (WriteByteArrayOp IntRep)        = ILIT(145)
+tagOf_PrimOp (WriteByteArrayOp WordRep)       = ILIT(146)
+tagOf_PrimOp (WriteByteArrayOp FloatRep)      = ILIT(147)
+tagOf_PrimOp (WriteByteArrayOp DoubleRep)     = ILIT(148)
+tagOf_PrimOp (WriteByteArrayOp Int64Rep)      = ILIT(149)
+tagOf_PrimOp (WriteByteArrayOp Word64Rep)     = ILIT(150)
+tagOf_PrimOp (IndexByteArrayOp CharRep)       = ILIT(151)
+tagOf_PrimOp (IndexByteArrayOp IntRep)	      = ILIT(152)
+tagOf_PrimOp (IndexByteArrayOp WordRep)	      = ILIT(153)
+tagOf_PrimOp (IndexByteArrayOp AddrRep)       = ILIT(154)
+tagOf_PrimOp (IndexByteArrayOp FloatRep)      = ILIT(155)
+tagOf_PrimOp (IndexByteArrayOp DoubleRep)     = ILIT(156)
+tagOf_PrimOp (IndexByteArrayOp Int64Rep)      = ILIT(157)
+tagOf_PrimOp (IndexByteArrayOp Word64Rep)     = ILIT(158)
+tagOf_PrimOp (IndexOffAddrOp CharRep)	      = ILIT(159)
+tagOf_PrimOp (IndexOffAddrOp IntRep)	      = ILIT(160)
+tagOf_PrimOp (IndexOffAddrOp WordRep)	      = ILIT(161)
+tagOf_PrimOp (IndexOffAddrOp AddrRep)	      = ILIT(162)
+tagOf_PrimOp (IndexOffAddrOp FloatRep)	      = ILIT(163)
+tagOf_PrimOp (IndexOffAddrOp DoubleRep)       = ILIT(164)
+tagOf_PrimOp (IndexOffAddrOp Int64Rep)	      = ILIT(165)
+tagOf_PrimOp (IndexOffAddrOp Word64Rep)	      = ILIT(166)
+tagOf_PrimOp (IndexOffForeignObjOp CharRep)   = ILIT(167)
+tagOf_PrimOp (IndexOffForeignObjOp IntRep)    = ILIT(168)
+tagOf_PrimOp (IndexOffForeignObjOp WordRep)   = ILIT(169)
+tagOf_PrimOp (IndexOffForeignObjOp AddrRep)   = ILIT(170)
+tagOf_PrimOp (IndexOffForeignObjOp FloatRep)  = ILIT(171)
+tagOf_PrimOp (IndexOffForeignObjOp DoubleRep) = ILIT(172)
+tagOf_PrimOp (IndexOffForeignObjOp Int64Rep)  = ILIT(173)
+tagOf_PrimOp (IndexOffForeignObjOp Word64Rep) = ILIT(174)
+tagOf_PrimOp (WriteOffAddrOp CharRep)         = ILIT(175)
+tagOf_PrimOp (WriteOffAddrOp IntRep)          = ILIT(176)
+tagOf_PrimOp (WriteOffAddrOp WordRep)         = ILIT(177)
+tagOf_PrimOp (WriteOffAddrOp AddrRep)         = ILIT(178)
+tagOf_PrimOp (WriteOffAddrOp FloatRep)        = ILIT(179)
+tagOf_PrimOp (WriteOffAddrOp DoubleRep)       = ILIT(180)
+tagOf_PrimOp (WriteOffAddrOp Int64Rep)        = ILIT(181)
+tagOf_PrimOp (WriteOffAddrOp Word64Rep)       = ILIT(182)
+tagOf_PrimOp UnsafeFreezeArrayOp	      = ILIT(183)
+tagOf_PrimOp UnsafeFreezeByteArrayOp	      = ILIT(184)
+tagOf_PrimOp SizeofByteArrayOp		      = ILIT(185)
+tagOf_PrimOp SizeofMutableByteArrayOp	      = ILIT(186)
+tagOf_PrimOp NewSynchVarOp		      = ILIT(187)
+tagOf_PrimOp TakeMVarOp		    	      = ILIT(188)
+tagOf_PrimOp PutMVarOp		    	      = ILIT(189)
+tagOf_PrimOp ReadIVarOp		    	      = ILIT(190)
+tagOf_PrimOp WriteIVarOp		      = ILIT(191)
+tagOf_PrimOp MakeForeignObjOp		      = ILIT(192)
+tagOf_PrimOp WriteForeignObjOp		      = ILIT(193)
+tagOf_PrimOp MakeStablePtrOp		      = ILIT(194)
+tagOf_PrimOp DeRefStablePtrOp		      = ILIT(195)
+tagOf_PrimOp (CCallOp _ _ _ _ _ _)	      = ILIT(196)
+tagOf_PrimOp ErrorIOPrimOp		      = ILIT(197)
+tagOf_PrimOp ReallyUnsafePtrEqualityOp	      = ILIT(198)
+tagOf_PrimOp SeqOp			      = ILIT(199)
+tagOf_PrimOp ParOp			      = ILIT(200)
+tagOf_PrimOp ForkOp			      = ILIT(201)
+tagOf_PrimOp DelayOp			      = ILIT(202)
+tagOf_PrimOp WaitReadOp			      = ILIT(203)
+tagOf_PrimOp WaitWriteOp		      = ILIT(204)
+tagOf_PrimOp ParGlobalOp		      = ILIT(205)
+tagOf_PrimOp ParLocalOp			      = ILIT(206)
+tagOf_PrimOp ParAtOp			      = ILIT(207)
+tagOf_PrimOp ParAtAbsOp			      = ILIT(208)
+tagOf_PrimOp ParAtRelOp			      = ILIT(209)
+tagOf_PrimOp ParAtForNowOp		      = ILIT(210)
+tagOf_PrimOp CopyableOp			      = ILIT(211)
+tagOf_PrimOp NoFollowOp			      = ILIT(212)
+tagOf_PrimOp SameMVarOp			      = ILIT(213)
 
 tagOf_PrimOp _ = panic# "tagOf_PrimOp: pattern-match"
 
@@ -516,7 +547,6 @@ allThePrimOps
 	NotOp,
 	XorOp,
     	SllOp,
-    	SraOp,
     	SrlOp,
     	ISllOp,
     	ISraOp,
@@ -525,6 +555,7 @@ allThePrimOps
 	Word2IntOp,
 	Int2AddrOp,
 	Addr2IntOp,
+
 	FloatAddOp,
 	FloatSubOp,
 	FloatMulOp,
@@ -579,6 +610,10 @@ allThePrimOps
 	Int2IntegerOp,
 	Word2IntegerOp,
 	Addr2IntegerOp,
+	IntegerToInt64Op,
+	Int64ToIntegerOp,
+	IntegerToWord64Op,
+	Word64ToIntegerOp,
 	FloatEncodeOp,
 	FloatDecodeOp,
 	DoubleEncodeOp,
@@ -601,30 +636,48 @@ allThePrimOps
 	ReadByteArrayOp AddrRep,
 	ReadByteArrayOp FloatRep,
 	ReadByteArrayOp DoubleRep,
+	ReadByteArrayOp Int64Rep,
+	ReadByteArrayOp Word64Rep,
 	WriteByteArrayOp CharRep,
 	WriteByteArrayOp IntRep,
 	WriteByteArrayOp WordRep,
 	WriteByteArrayOp AddrRep,
 	WriteByteArrayOp FloatRep,
 	WriteByteArrayOp DoubleRep,
+	WriteByteArrayOp Int64Rep,
+	WriteByteArrayOp Word64Rep,
 	IndexByteArrayOp CharRep,
 	IndexByteArrayOp IntRep,
 	IndexByteArrayOp WordRep,
 	IndexByteArrayOp AddrRep,
 	IndexByteArrayOp FloatRep,
 	IndexByteArrayOp DoubleRep,
+	IndexByteArrayOp Int64Rep,
+	IndexByteArrayOp Word64Rep,
 	IndexOffAddrOp CharRep,
 	IndexOffAddrOp IntRep,
 	IndexOffAddrOp WordRep,
 	IndexOffAddrOp AddrRep,
 	IndexOffAddrOp FloatRep,
 	IndexOffAddrOp DoubleRep,
+	IndexOffAddrOp Int64Rep,
+	IndexOffAddrOp Word64Rep,
 	IndexOffForeignObjOp CharRep,
+	IndexOffForeignObjOp AddrRep,
 	IndexOffForeignObjOp IntRep,
 	IndexOffForeignObjOp WordRep,
-	IndexOffForeignObjOp AddrRep,
 	IndexOffForeignObjOp FloatRep,
 	IndexOffForeignObjOp DoubleRep,
+	IndexOffForeignObjOp Int64Rep,
+	IndexOffForeignObjOp Word64Rep,
+	WriteOffAddrOp CharRep,
+	WriteOffAddrOp IntRep,
+	WriteOffAddrOp WordRep,
+	WriteOffAddrOp AddrRep,
+	WriteOffAddrOp FloatRep,
+	WriteOffAddrOp DoubleRep,
+	WriteOffAddrOp Int64Rep,
+	WriteOffAddrOp Word64Rep,
 	UnsafeFreezeArrayOp,
 	UnsafeFreezeByteArrayOp,
 	SizeofByteArrayOp,
@@ -777,6 +830,7 @@ primOpInfo DoubleEqOp = Compare SLIT("==##") doublePrimTy
 primOpInfo DoubleNeOp = Compare SLIT("/=##") doublePrimTy
 primOpInfo DoubleLtOp = Compare SLIT("<##") doublePrimTy
 primOpInfo DoubleLeOp = Compare SLIT("<=##") doublePrimTy
+
 \end{code}
 
 %************************************************************************
@@ -826,8 +880,6 @@ primOpInfo NotOp    = Monadic SLIT("not#")	wordPrimTy
 
 primOpInfo SllOp
   = PrimResult SLIT("shiftL#")  [] [wordPrimTy, intPrimTy] wordPrimTyCon WordRep []
-primOpInfo SraOp
-  = PrimResult SLIT("shiftRA#") [] [wordPrimTy, intPrimTy] wordPrimTyCon WordRep []
 primOpInfo SrlOp
   = PrimResult SLIT("shiftRL#") [] [wordPrimTy, intPrimTy] wordPrimTyCon WordRep []
 
@@ -853,6 +905,7 @@ primOpInfo Int2AddrOp = Coercing SLIT("int2Addr#") intPrimTy addrPrimTy
 primOpInfo Addr2IntOp = Coercing SLIT("addr2Int#") addrPrimTy intPrimTy
 \end{code}
 
+
 %************************************************************************
 %*									*
 \subsubsection[PrimOp-Float]{PrimOpInfo for @Float#@s}
@@ -956,6 +1009,18 @@ primOpInfo Word2IntegerOp
 
 primOpInfo Addr2IntegerOp
   = AlgResult SLIT("addr2Integer#") [] [addrPrimTy] integerTyCon []
+
+primOpInfo IntegerToInt64Op
+  = PrimResult SLIT("integerToInt64#") [] one_Integer_ty int64PrimTyCon Int64Rep []
+
+primOpInfo Int64ToIntegerOp
+  = AlgResult SLIT("int64ToInteger#") [] [int64PrimTy] integerTyCon []
+
+primOpInfo Word64ToIntegerOp
+  = AlgResult SLIT("word64ToInteger#") [] [word64PrimTy] integerTyCon []
+
+primOpInfo IntegerToWord64Op
+  = PrimResult SLIT("integerToWord64#") [] one_Integer_ty word64PrimTyCon Word64Rep []
 \end{code}
 
 Encoding and decoding of floating-point numbers is sorta
@@ -1105,6 +1170,18 @@ primOpInfo (IndexOffForeignObjOp kind)
     in
     PrimResult op_str [] [foreignObjPrimTy, intPrimTy] prim_tycon kind []
 
+primOpInfo (WriteOffAddrOp kind)
+  = let
+	s = alphaTy; s_tv = alphaTyVar
+
+	(str, prim_ty, _) = getPrimRepInfo kind
+	op_str = _PK_ ("write" ++ str ++ "OffAddr#")
+    in
+    -- NB: *Prim*Result --
+    PrimResult op_str [s_tv]
+	[addrPrimTy, intPrimTy, prim_ty, mkStatePrimTy s]
+	statePrimTyCon VoidRep [s]
+
 ---------------------------------------------------------------------------
 primOpInfo UnsafeFreezeArrayOp
   = let {
@@ -1448,7 +1525,7 @@ primOpInfo ErrorIOPrimOp
 %************************************************************************
 
 \begin{code}
-primOpInfo (CCallOp _ _ _ arg_tys result_ty)
+primOpInfo (CCallOp _ _ _ _ arg_tys result_ty)
   = AlgResult SLIT("ccall#") [] arg_tys result_tycon tys_applied
   where
     (result_tycon, tys_applied, _) = splitAlgTyConApp result_ty
@@ -1496,6 +1573,18 @@ primOpHeapReq Word2IntegerOp	= FixedHeapRequired
     	    	    	    	  (addOff (totHdrSize (DataRep mIN_MP_INT_SIZE))
     	    	    	    	    	  (intOff mIN_MP_INT_SIZE))
 primOpHeapReq Addr2IntegerOp	= VariableHeapRequired
+primOpHeapReq IntegerToInt64Op	= FixedHeapRequired
+    	    	    	    	  (addOff (totHdrSize (DataRep mIN_MP_INT_SIZE))
+    	    	    	    	    	  (intOff mIN_MP_INT_SIZE))
+primOpHeapReq Word64ToIntegerOp	= FixedHeapRequired
+    	    	    	    	  (addOff (totHdrSize (DataRep mIN_MP_INT_SIZE))
+    	    	    	    	    	  (intOff mIN_MP_INT_SIZE))
+primOpHeapReq Int64ToIntegerOp	= FixedHeapRequired
+    	    	    	    	  (addOff (totHdrSize (DataRep mIN_MP_INT_SIZE))
+    	    	    	    	    	  (intOff mIN_MP_INT_SIZE))
+primOpHeapReq IntegerToWord64Op	= FixedHeapRequired
+    	    	    	    	  (addOff (totHdrSize (DataRep mIN_MP_INT_SIZE))
+    	    	    	    	    	  (intOff mIN_MP_INT_SIZE))
 primOpHeapReq FloatDecodeOp	= FixedHeapRequired
 				  (addOff (intOff (getPrimRepSize IntRep + mP_STRUCT_SIZE))
     	    	    	    	  (addOff (totHdrSize (DataRep mIN_MP_INT_SIZE))
@@ -1512,8 +1601,8 @@ primOpHeapReq DoubleDecodeOp	= FixedHeapRequired
   Hmm..the allocation for makeForeignObj# is known (and fixed), so
   why do we need to be so indeterminate about it? --SOF
 -}
-primOpHeapReq (CCallOp _ _ mayGC@True  _ _) = VariableHeapRequired
-primOpHeapReq (CCallOp _ _ mayGC@False _ _) = NoHeapRequired
+primOpHeapReq (CCallOp _ _ mayGC@True  _ _ _) = VariableHeapRequired
+primOpHeapReq (CCallOp _ _ mayGC@False _ _ _) = NoHeapRequired
 
 primOpHeapReq MakeForeignObjOp	= VariableHeapRequired
 primOpHeapReq WriteForeignObjOp	= NoHeapRequired
@@ -1624,7 +1713,7 @@ primOpOkForSpeculation DoubleAsinOp	= False		-- Arg out of domain
 primOpOkForSpeculation DoubleAcosOp	= False		-- Arg out of domain
 
 -- CCall
-primOpOkForSpeculation (CCallOp	_ _ _ _ _)= False	-- Could be expensive!
+primOpOkForSpeculation (CCallOp	_ _ _ _ _ _) = False	-- Could be expensive!
 
 -- errorIO#
 primOpOkForSpeculation ErrorIOPrimOp	= False		-- Could be disastrous!
@@ -1687,23 +1776,27 @@ that are stored in caller-saves registers
 \begin{code}
 primOpNeedsWrapper :: PrimOp -> Bool
 
-primOpNeedsWrapper (CCallOp _ _ _ _ _) 	= True
-
-primOpNeedsWrapper NewArrayOp     	= True	-- ToDo: for nativeGen only!(JSM)
-primOpNeedsWrapper (NewByteArrayOp _)  	= True
-
-primOpNeedsWrapper IntegerAddOp		= True
-primOpNeedsWrapper IntegerSubOp		= True
-primOpNeedsWrapper IntegerMulOp		= True
-primOpNeedsWrapper IntegerQuotRemOp	= True
-primOpNeedsWrapper IntegerDivModOp	= True
-primOpNeedsWrapper IntegerNegOp		= True
-primOpNeedsWrapper IntegerCmpOp	    	= True
-primOpNeedsWrapper Integer2IntOp    	= True
-primOpNeedsWrapper Integer2WordOp    	= True
-primOpNeedsWrapper Int2IntegerOp	= True
-primOpNeedsWrapper Word2IntegerOp	= True
-primOpNeedsWrapper Addr2IntegerOp	= True
+primOpNeedsWrapper (CCallOp _ _ _ _ _ _) = True
+
+primOpNeedsWrapper NewArrayOp     	 = True	-- ToDo: for nativeGen only!(JSM)
+primOpNeedsWrapper (NewByteArrayOp _)  	 = True
+
+primOpNeedsWrapper IntegerAddOp		 = True
+primOpNeedsWrapper IntegerSubOp		 = True
+primOpNeedsWrapper IntegerMulOp		 = True
+primOpNeedsWrapper IntegerQuotRemOp	 = True
+primOpNeedsWrapper IntegerDivModOp	 = True
+primOpNeedsWrapper IntegerNegOp		 = True
+primOpNeedsWrapper IntegerCmpOp	    	 = True
+primOpNeedsWrapper Integer2IntOp    	 = True
+primOpNeedsWrapper Integer2WordOp    	 = True
+primOpNeedsWrapper Int2IntegerOp	 = True
+primOpNeedsWrapper Word2IntegerOp	 = True
+primOpNeedsWrapper Addr2IntegerOp	 = True
+primOpNeedsWrapper IntegerToInt64Op	 = True
+primOpNeedsWrapper IntegerToWord64Op	 = True
+primOpNeedsWrapper Word64ToIntegerOp	 = True
+primOpNeedsWrapper Int64ToIntegerOp	 = True
 
 primOpNeedsWrapper FloatExpOp	    	= True
 primOpNeedsWrapper FloatLogOp	    	= True
@@ -1852,21 +1945,31 @@ showPrimOp :: PrimOp -> String
 
 showPrimOp op = showSDoc (pprPrimOp op)
 
-pprPrimOp (CCallOp fun is_casm may_gc arg_tys res_ty)
+pprPrimOp (CCallOp fun is_casm may_gc cconv arg_tys res_ty)
   = let
+        callconv = text "{-" <> pprCallConv cconv <> text "-}"
+
 	before
-	  = if is_casm then
-	       if may_gc then "_casm_GC_ ``" else "_casm_ ``"
-	    else
-	       if may_gc then "_ccall_GC_ " else "_ccall_ "
+	  | is_casm && may_gc = "_casm_GC_ ``"
+	  | is_casm	      = "casm_ ``"
+	  | may_gc	      = "_ccall_GC_ "
+	  | otherwise	      = "_ccall_ "
 
 	after
-	  = if is_casm then text "''" else empty
+	  | is_casm   = text "''"
+	  | otherwise = empty
 
 	pp_tys
 	  = hsep (map pprParendType (res_ty:arg_tys))
+
+	ppr_fun =
+	 case fun of
+	   Nothing -> ptext SLIT("<dynamic>")
+	   Just fn -> ptext fn
+	 
     in
-    hcat [text before, ptext fun, after, space, brackets pp_tys]
+    hcat [ ifPprDebug callconv
+         , text before , ppr_fun , after, space, brackets pp_tys]
 
 pprPrimOp other_op
   = getPprStyle $ \ sty ->
-- 
GitLab