From 62dfd96cf8239ceb7cb65e955c29c57f6c798517 Mon Sep 17 00:00:00 2001
From: simonm <unknown>
Date: Wed, 5 Nov 1997 16:11:34 +0000
Subject: [PATCH] [project @ 1997-11-05 16:11:17 by simonm] add xor# word
 operation

---
 ghc/compiler/absCSyn/Costs.lhs        |   2 +-
 ghc/compiler/nativeGen/AsmCodeGen.lhs |   1 +
 ghc/compiler/nativeGen/MachCode.lhs   |   5 +-
 ghc/compiler/prelude/PrimOp.lhs       | 366 +++++++++++++-------------
 ghc/includes/StgMacros.lh             |   1 +
 5 files changed, 192 insertions(+), 183 deletions(-)

diff --git a/ghc/compiler/absCSyn/Costs.lhs b/ghc/compiler/absCSyn/Costs.lhs
index 4c0a636ff9db..eb641bc88f75 100644
--- a/ghc/compiler/absCSyn/Costs.lhs
+++ b/ghc/compiler/absCSyn/Costs.lhs
@@ -518,7 +518,7 @@ data PrimOp
     -- Rest is unchecked so far -- HWL
 
     -- Word#-related ops:
-    | AndOp   | OrOp  | NotOp | ShiftLOp | ShiftROp
+    | AndOp   | OrOp  | NotOp | XorOp | ShiftLOp | ShiftROp
     | Int2WordOp | Word2IntOp -- casts
 
     -- Addr#-related ops:
diff --git a/ghc/compiler/nativeGen/AsmCodeGen.lhs b/ghc/compiler/nativeGen/AsmCodeGen.lhs
index d5926765b43a..b94efa4cf466 100644
--- a/ghc/compiler/nativeGen/AsmCodeGen.lhs
+++ b/ghc/compiler/nativeGen/AsmCodeGen.lhs
@@ -248,6 +248,7 @@ primOpt op args@[x, y@(StInt 0)]
     	IntMulOp -> y
     	AndOp  	 -> y
     	OrOp   	 -> x
+    	XorOp  	 -> x
     	SllOp  	 -> x
     	SraOp  	 -> x
     	SrlOp  	 -> x
diff --git a/ghc/compiler/nativeGen/MachCode.lhs b/ghc/compiler/nativeGen/MachCode.lhs
index c649d875de8e..8c2b59445db9 100644
--- a/ghc/compiler/nativeGen/MachCode.lhs
+++ b/ghc/compiler/nativeGen/MachCode.lhs
@@ -404,6 +404,7 @@ getRegister (StPrim primop [x, y]) -- dyadic PrimOps
 
       AndOp  -> trivialCode AND x y
       OrOp   -> trivialCode OR  x y
+      XorOp  -> trivialCode XOR x y
       SllOp  -> trivialCode SLL x y
       SraOp  -> trivialCode SRA x y
       SrlOp  -> trivialCode SRL x y
@@ -662,6 +663,7 @@ getRegister (StPrim primop [x, y]) -- dyadic PrimOps
 
       AndOp -> trivialCode (AND L) x y {-True-}
       OrOp  -> trivialCode (OR L)  x y {-True-}
+      XorOp -> trivialCode (XOR L) x y {-True-}
 
 	{- Shift ops on x86s have constraints on their source, it
 	   either has to be Imm, CL or 1
@@ -1071,7 +1073,8 @@ getRegister (StPrim primop [x, y]) -- dyadic PrimOps
       DoubleDivOp -> trivialFCode DoubleRep FDIV x y
 
       AndOp -> trivialCode (AND False) x y
-      OrOp  -> trivialCode (OR False) x y
+      OrOp  -> trivialCode (OR  False) x y
+      XorOp -> trivialCode (XOR False) x y
       SllOp -> trivialCode SLL x y
       SraOp -> trivialCode SRA x y
       SrlOp -> trivialCode SRL x y
diff --git a/ghc/compiler/prelude/PrimOp.lhs b/ghc/compiler/prelude/PrimOp.lhs
index ab2428c4e3d2..f9818b072704 100644
--- a/ghc/compiler/prelude/PrimOp.lhs
+++ b/ghc/compiler/prelude/PrimOp.lhs
@@ -81,7 +81,7 @@ data PrimOp
     | IntRemOp | IntNegOp | IntAbsOp
 
     -- Word#-related ops:
-    | AndOp  | OrOp   | NotOp
+    | AndOp  | OrOp   | NotOp | XorOp
     | SllOp  | SraOp  | SrlOp  -- shift {left,right} {arithmetic,logical}
     | ISllOp | ISraOp | ISrlOp -- equivs on Int#s
     | Int2WordOp | Word2IntOp -- casts
@@ -261,186 +261,187 @@ about using it this way?? ADR)
 Deriving Ix is what we really want! ToDo
 (Chk around before deleting...)
 \begin{code}
-tagOf_PrimOp CharGtOp			= (ILIT(1) :: FAST_INT)
-tagOf_PrimOp CharGeOp			= ILIT(  2)
-tagOf_PrimOp CharEqOp			= ILIT(  3)
-tagOf_PrimOp CharNeOp			= ILIT(  4)
-tagOf_PrimOp CharLtOp			= ILIT(  5)
-tagOf_PrimOp CharLeOp			= ILIT(  6)
-tagOf_PrimOp IntGtOp			= ILIT(  7)
-tagOf_PrimOp IntGeOp			= ILIT(  8)
-tagOf_PrimOp IntEqOp			= ILIT(  9)
-tagOf_PrimOp IntNeOp			= ILIT( 10)
-tagOf_PrimOp IntLtOp			= ILIT( 11)
-tagOf_PrimOp IntLeOp			= ILIT( 12)
-tagOf_PrimOp WordGtOp			= ILIT( 13)
-tagOf_PrimOp WordGeOp			= ILIT( 14)
-tagOf_PrimOp WordEqOp			= ILIT( 15)
-tagOf_PrimOp WordNeOp			= ILIT( 16)
-tagOf_PrimOp WordLtOp			= ILIT( 17)
-tagOf_PrimOp WordLeOp			= ILIT( 18)
-tagOf_PrimOp AddrGtOp			= ILIT( 19)
-tagOf_PrimOp AddrGeOp			= ILIT( 20)
-tagOf_PrimOp AddrEqOp			= ILIT( 21)
-tagOf_PrimOp AddrNeOp			= ILIT( 22)
-tagOf_PrimOp AddrLtOp			= ILIT( 23)
-tagOf_PrimOp AddrLeOp			= ILIT( 24)
-tagOf_PrimOp FloatGtOp			= ILIT( 25)
-tagOf_PrimOp FloatGeOp			= ILIT( 26)
-tagOf_PrimOp FloatEqOp			= ILIT( 27)
-tagOf_PrimOp FloatNeOp			= ILIT( 28)
-tagOf_PrimOp FloatLtOp			= ILIT( 29)
-tagOf_PrimOp FloatLeOp			= ILIT( 30)
-tagOf_PrimOp DoubleGtOp			= ILIT( 31)
-tagOf_PrimOp DoubleGeOp			= ILIT( 32)
-tagOf_PrimOp DoubleEqOp			= ILIT( 33)
-tagOf_PrimOp DoubleNeOp			= ILIT( 34)
-tagOf_PrimOp DoubleLtOp			= ILIT( 35)
-tagOf_PrimOp DoubleLeOp			= ILIT( 36)
-tagOf_PrimOp OrdOp			= ILIT( 37)
-tagOf_PrimOp ChrOp			= ILIT( 38)
-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( 46)
-tagOf_PrimOp AndOp			= ILIT( 47)
-tagOf_PrimOp OrOp			= ILIT( 48)
-tagOf_PrimOp NotOp			= ILIT( 49)
-tagOf_PrimOp SllOp			= ILIT( 50)
-tagOf_PrimOp SraOp			= ILIT( 51)
-tagOf_PrimOp SrlOp			= ILIT( 52)
-tagOf_PrimOp ISllOp			= ILIT( 53)
-tagOf_PrimOp ISraOp			= ILIT( 54)
-tagOf_PrimOp ISrlOp			= ILIT( 55)
-tagOf_PrimOp Int2WordOp			= ILIT( 56)
-tagOf_PrimOp Word2IntOp			= ILIT( 57)
-tagOf_PrimOp Int2AddrOp			= ILIT( 58)
-tagOf_PrimOp Addr2IntOp			= ILIT( 59)
-tagOf_PrimOp FloatAddOp			= ILIT( 60)
-tagOf_PrimOp FloatSubOp			= ILIT( 61)
-tagOf_PrimOp FloatMulOp			= ILIT( 62)
-tagOf_PrimOp FloatDivOp			= ILIT( 63)
-tagOf_PrimOp FloatNegOp			= ILIT( 64)
-tagOf_PrimOp Float2IntOp		= ILIT( 65)
-tagOf_PrimOp Int2FloatOp		= ILIT( 66)
-tagOf_PrimOp FloatExpOp			= ILIT( 67)
-tagOf_PrimOp FloatLogOp			= ILIT( 68)
-tagOf_PrimOp FloatSqrtOp		= ILIT( 69)
-tagOf_PrimOp FloatSinOp			= ILIT( 70)
-tagOf_PrimOp FloatCosOp			= ILIT( 71)
-tagOf_PrimOp FloatTanOp			= ILIT( 72)
-tagOf_PrimOp FloatAsinOp		= ILIT( 73)
-tagOf_PrimOp FloatAcosOp		= ILIT( 74)
-tagOf_PrimOp FloatAtanOp		= ILIT( 75)
-tagOf_PrimOp FloatSinhOp		= ILIT( 76)
-tagOf_PrimOp FloatCoshOp		= ILIT( 77)
-tagOf_PrimOp FloatTanhOp		= ILIT( 78)
-tagOf_PrimOp FloatPowerOp		= ILIT( 79)
-tagOf_PrimOp DoubleAddOp		= ILIT( 80)
-tagOf_PrimOp DoubleSubOp		= ILIT( 81)
-tagOf_PrimOp DoubleMulOp		= ILIT( 82)
-tagOf_PrimOp DoubleDivOp		= ILIT( 83)
-tagOf_PrimOp DoubleNegOp		= ILIT( 84)
-tagOf_PrimOp Double2IntOp		= ILIT( 85)
-tagOf_PrimOp Int2DoubleOp		= ILIT( 86)
-tagOf_PrimOp Double2FloatOp		= ILIT( 87)
-tagOf_PrimOp Float2DoubleOp		= ILIT( 88)
-tagOf_PrimOp DoubleExpOp		= ILIT( 89)
-tagOf_PrimOp DoubleLogOp		= ILIT( 90)
-tagOf_PrimOp DoubleSqrtOp		= ILIT( 91)
-tagOf_PrimOp DoubleSinOp		= ILIT( 92)
-tagOf_PrimOp DoubleCosOp		= ILIT( 93)
-tagOf_PrimOp DoubleTanOp		= ILIT( 94)
-tagOf_PrimOp DoubleAsinOp		= ILIT( 95)
-tagOf_PrimOp DoubleAcosOp		= ILIT( 96)
-tagOf_PrimOp DoubleAtanOp		= ILIT( 97)
-tagOf_PrimOp DoubleSinhOp		= ILIT( 98)
-tagOf_PrimOp DoubleCoshOp		= ILIT( 99)
-tagOf_PrimOp DoubleTanhOp		= ILIT(100)
-tagOf_PrimOp DoublePowerOp		= ILIT(101)
-tagOf_PrimOp IntegerAddOp		= ILIT(102)
-tagOf_PrimOp IntegerSubOp		= ILIT(103)
-tagOf_PrimOp IntegerMulOp		= ILIT(104)
-tagOf_PrimOp IntegerQuotRemOp		= ILIT(105)
-tagOf_PrimOp IntegerDivModOp		= ILIT(106)
-tagOf_PrimOp IntegerNegOp		= ILIT(107)
-tagOf_PrimOp IntegerCmpOp		= ILIT(108)
-tagOf_PrimOp Integer2IntOp		= ILIT(109)
-tagOf_PrimOp Int2IntegerOp		= ILIT(110)
-tagOf_PrimOp Word2IntegerOp		= ILIT(111)
-tagOf_PrimOp Addr2IntegerOp		= ILIT(112)
-tagOf_PrimOp FloatEncodeOp		= ILIT(113)
-tagOf_PrimOp FloatDecodeOp		= ILIT(114)
-tagOf_PrimOp DoubleEncodeOp		= ILIT(115)
-tagOf_PrimOp DoubleDecodeOp		= ILIT(116)
-tagOf_PrimOp NewArrayOp			= ILIT(117)
-tagOf_PrimOp (NewByteArrayOp CharRep)	= ILIT(118)
-tagOf_PrimOp (NewByteArrayOp IntRep)	= ILIT(119)
-tagOf_PrimOp (NewByteArrayOp AddrRep)	= ILIT(120)
-tagOf_PrimOp (NewByteArrayOp FloatRep)	= ILIT(121)
-tagOf_PrimOp (NewByteArrayOp DoubleRep)= ILIT(122)
-tagOf_PrimOp SameMutableArrayOp		= ILIT(123)
-tagOf_PrimOp SameMutableByteArrayOp	= ILIT(124)
-tagOf_PrimOp ReadArrayOp		= ILIT(125)
-tagOf_PrimOp WriteArrayOp		= ILIT(126)
-tagOf_PrimOp IndexArrayOp		= ILIT(127)
-tagOf_PrimOp (ReadByteArrayOp CharRep)	    = ILIT(128)
-tagOf_PrimOp (ReadByteArrayOp IntRep)	    = ILIT(129)
-tagOf_PrimOp (ReadByteArrayOp AddrRep)	    = ILIT(130)
-tagOf_PrimOp (ReadByteArrayOp FloatRep)    = ILIT(131)
-tagOf_PrimOp (ReadByteArrayOp DoubleRep)   = ILIT(132)
-tagOf_PrimOp (WriteByteArrayOp CharRep)    = ILIT(133)
-tagOf_PrimOp (WriteByteArrayOp IntRep)	    = ILIT(134)
-tagOf_PrimOp (WriteByteArrayOp AddrRep)    = ILIT(135)
-tagOf_PrimOp (WriteByteArrayOp FloatRep)   = ILIT(136)
-tagOf_PrimOp (WriteByteArrayOp DoubleRep)  = ILIT(137)
-tagOf_PrimOp (IndexByteArrayOp CharRep)    = ILIT(138)
-tagOf_PrimOp (IndexByteArrayOp IntRep)	    = ILIT(139)
-tagOf_PrimOp (IndexByteArrayOp AddrRep)    = ILIT(140)
-tagOf_PrimOp (IndexByteArrayOp FloatRep)   = ILIT(141)
-tagOf_PrimOp (IndexByteArrayOp DoubleRep)  = ILIT(142)
-tagOf_PrimOp (IndexOffAddrOp CharRep)	    = ILIT(143)
-tagOf_PrimOp (IndexOffAddrOp IntRep)	    = ILIT(144)
-tagOf_PrimOp (IndexOffAddrOp AddrRep)	    = ILIT(145)
-tagOf_PrimOp (IndexOffAddrOp FloatRep)	    = ILIT(146)
-tagOf_PrimOp (IndexOffAddrOp DoubleRep)    = ILIT(147)
-tagOf_PrimOp (IndexOffForeignObjOp CharRep)   = ILIT(148)
-tagOf_PrimOp (IndexOffForeignObjOp IntRep)    = ILIT(149)
-tagOf_PrimOp (IndexOffForeignObjOp AddrRep)   = ILIT(150)
-tagOf_PrimOp (IndexOffForeignObjOp FloatRep)  = ILIT(151)
-tagOf_PrimOp (IndexOffForeignObjOp DoubleRep) = ILIT(152)
-tagOf_PrimOp UnsafeFreezeArrayOp	    = ILIT(153)
-tagOf_PrimOp UnsafeFreezeByteArrayOp	    = ILIT(154)
-tagOf_PrimOp NewSynchVarOp		    = ILIT(155)
-tagOf_PrimOp TakeMVarOp		    	    = ILIT(156)
-tagOf_PrimOp PutMVarOp		    	    = ILIT(157)
-tagOf_PrimOp ReadIVarOp		    	    = ILIT(158)
-tagOf_PrimOp WriteIVarOp		    = ILIT(159)
-tagOf_PrimOp MakeForeignObjOp		    = ILIT(160)
-tagOf_PrimOp WriteForeignObjOp		    = ILIT(161)
-tagOf_PrimOp MakeStablePtrOp		    = ILIT(162)
-tagOf_PrimOp DeRefStablePtrOp		    = ILIT(163)
-tagOf_PrimOp (CCallOp _ _ _ _ _)	    = ILIT(164)
-tagOf_PrimOp ErrorIOPrimOp		    = ILIT(165)
-tagOf_PrimOp ReallyUnsafePtrEqualityOp	    = ILIT(166)
-tagOf_PrimOp SeqOp			    = ILIT(167)
-tagOf_PrimOp ParOp			    = ILIT(168)
-tagOf_PrimOp ForkOp			    = ILIT(169)
-tagOf_PrimOp DelayOp			    = ILIT(170)
-tagOf_PrimOp WaitReadOp			    = ILIT(171)
-tagOf_PrimOp WaitWriteOp		    = ILIT(172)
-
-tagOf_PrimOp ParGlobalOp		    = ILIT(173)
-tagOf_PrimOp ParLocalOp			    = ILIT(174)
-tagOf_PrimOp ParAtOp			    = ILIT(175)
-tagOf_PrimOp ParAtAbsOp			    = ILIT(176)
-tagOf_PrimOp ParAtRelOp			    = ILIT(177)
-tagOf_PrimOp ParAtForNowOp		    = ILIT(178)
-tagOf_PrimOp CopyableOp			    = ILIT(179)
-tagOf_PrimOp NoFollowOp			    = ILIT(180)
+tagOf_PrimOp CharGtOp			      = (ILIT(1) :: FAST_INT)
+tagOf_PrimOp CharGeOp			      = ILIT(  2)
+tagOf_PrimOp CharEqOp			      = ILIT(  3)
+tagOf_PrimOp CharNeOp			      = ILIT(  4)
+tagOf_PrimOp CharLtOp			      = ILIT(  5)
+tagOf_PrimOp CharLeOp			      = ILIT(  6)
+tagOf_PrimOp IntGtOp			      = ILIT(  7)
+tagOf_PrimOp IntGeOp			      = ILIT(  8)
+tagOf_PrimOp IntEqOp			      = ILIT(  9)
+tagOf_PrimOp IntNeOp			      = ILIT( 10)
+tagOf_PrimOp IntLtOp			      = ILIT( 11)
+tagOf_PrimOp IntLeOp			      = ILIT( 12)
+tagOf_PrimOp WordGtOp			      = ILIT( 13)
+tagOf_PrimOp WordGeOp			      = ILIT( 14)
+tagOf_PrimOp WordEqOp			      = ILIT( 15)
+tagOf_PrimOp WordNeOp			      = ILIT( 16)
+tagOf_PrimOp WordLtOp			      = ILIT( 17)
+tagOf_PrimOp WordLeOp			      = ILIT( 18)
+tagOf_PrimOp AddrGtOp			      = ILIT( 19)
+tagOf_PrimOp AddrGeOp			      = ILIT( 20)
+tagOf_PrimOp AddrEqOp			      = ILIT( 21)
+tagOf_PrimOp AddrNeOp			      = ILIT( 22)
+tagOf_PrimOp AddrLtOp			      = ILIT( 23)
+tagOf_PrimOp AddrLeOp			      = ILIT( 24)
+tagOf_PrimOp FloatGtOp			      = ILIT( 25)
+tagOf_PrimOp FloatGeOp			      = ILIT( 26)
+tagOf_PrimOp FloatEqOp			      = ILIT( 27)
+tagOf_PrimOp FloatNeOp			      = ILIT( 28)
+tagOf_PrimOp FloatLtOp			      = ILIT( 29)
+tagOf_PrimOp FloatLeOp			      = ILIT( 30)
+tagOf_PrimOp DoubleGtOp			      = ILIT( 31)
+tagOf_PrimOp DoubleGeOp			      = ILIT( 32)
+tagOf_PrimOp DoubleEqOp			      = ILIT( 33)
+tagOf_PrimOp DoubleNeOp			      = ILIT( 34)
+tagOf_PrimOp DoubleLtOp			      = ILIT( 35)
+tagOf_PrimOp DoubleLeOp			      = ILIT( 36)
+tagOf_PrimOp OrdOp			      = ILIT( 37)
+tagOf_PrimOp ChrOp			      = ILIT( 38)
+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( 46)
+tagOf_PrimOp AndOp			      = ILIT( 47)
+tagOf_PrimOp OrOp			      = ILIT( 48)
+tagOf_PrimOp NotOp			      = ILIT( 49)
+tagOf_PrimOp XorOp			      = ILIT( 50)
+tagOf_PrimOp SllOp			      = ILIT( 51)
+tagOf_PrimOp SraOp			      = 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 Int2IntegerOp		      = ILIT(111)
+tagOf_PrimOp Word2IntegerOp		      = ILIT(112)
+tagOf_PrimOp Addr2IntegerOp		      = ILIT(113)
+tagOf_PrimOp FloatEncodeOp		      = ILIT(114)
+tagOf_PrimOp FloatDecodeOp		      = ILIT(115)
+tagOf_PrimOp DoubleEncodeOp		      = ILIT(116)
+tagOf_PrimOp DoubleDecodeOp		      = ILIT(117)
+tagOf_PrimOp NewArrayOp			      = ILIT(118)
+tagOf_PrimOp (NewByteArrayOp CharRep)	      = ILIT(119)
+tagOf_PrimOp (NewByteArrayOp IntRep)	      = ILIT(120)
+tagOf_PrimOp (NewByteArrayOp AddrRep)	      = ILIT(121)
+tagOf_PrimOp (NewByteArrayOp FloatRep)	      = ILIT(122)
+tagOf_PrimOp (NewByteArrayOp DoubleRep)       = ILIT(123)
+tagOf_PrimOp SameMutableArrayOp		      = ILIT(124)
+tagOf_PrimOp SameMutableByteArrayOp	      = ILIT(125)
+tagOf_PrimOp ReadArrayOp		      = ILIT(126)
+tagOf_PrimOp WriteArrayOp		      = ILIT(127)
+tagOf_PrimOp IndexArrayOp		      = ILIT(128)
+tagOf_PrimOp (ReadByteArrayOp CharRep)	      = ILIT(129)
+tagOf_PrimOp (ReadByteArrayOp IntRep)	      = ILIT(130)
+tagOf_PrimOp (ReadByteArrayOp AddrRep)	      = ILIT(131)
+tagOf_PrimOp (ReadByteArrayOp FloatRep)       = ILIT(132)
+tagOf_PrimOp (ReadByteArrayOp DoubleRep)      = ILIT(133)
+tagOf_PrimOp (WriteByteArrayOp CharRep)       = ILIT(134)
+tagOf_PrimOp (WriteByteArrayOp IntRep)	      = ILIT(135)
+tagOf_PrimOp (WriteByteArrayOp AddrRep)       = ILIT(136)
+tagOf_PrimOp (WriteByteArrayOp FloatRep)      = ILIT(137)
+tagOf_PrimOp (WriteByteArrayOp DoubleRep)     = ILIT(138)
+tagOf_PrimOp (IndexByteArrayOp CharRep)       = ILIT(139)
+tagOf_PrimOp (IndexByteArrayOp IntRep)	      = ILIT(140)
+tagOf_PrimOp (IndexByteArrayOp AddrRep)       = ILIT(141)
+tagOf_PrimOp (IndexByteArrayOp FloatRep)      = ILIT(142)
+tagOf_PrimOp (IndexByteArrayOp DoubleRep)     = ILIT(143)
+tagOf_PrimOp (IndexOffAddrOp CharRep)	      = ILIT(144)
+tagOf_PrimOp (IndexOffAddrOp IntRep)	      = ILIT(145)
+tagOf_PrimOp (IndexOffAddrOp AddrRep)	      = ILIT(146)
+tagOf_PrimOp (IndexOffAddrOp FloatRep)	      = ILIT(147)
+tagOf_PrimOp (IndexOffAddrOp DoubleRep)       = ILIT(148)
+tagOf_PrimOp (IndexOffForeignObjOp CharRep)   = ILIT(149)
+tagOf_PrimOp (IndexOffForeignObjOp IntRep)    = ILIT(150)
+tagOf_PrimOp (IndexOffForeignObjOp AddrRep)   = ILIT(151)
+tagOf_PrimOp (IndexOffForeignObjOp FloatRep)  = ILIT(152)
+tagOf_PrimOp (IndexOffForeignObjOp DoubleRep) = ILIT(153)
+tagOf_PrimOp UnsafeFreezeArrayOp	      = ILIT(154)
+tagOf_PrimOp UnsafeFreezeByteArrayOp	      = ILIT(155)
+tagOf_PrimOp NewSynchVarOp		      = ILIT(156)
+tagOf_PrimOp TakeMVarOp		    	      = ILIT(157)
+tagOf_PrimOp PutMVarOp		    	      = ILIT(158)
+tagOf_PrimOp ReadIVarOp		    	      = ILIT(159)
+tagOf_PrimOp WriteIVarOp		      = ILIT(160)
+tagOf_PrimOp MakeForeignObjOp		      = ILIT(161)
+tagOf_PrimOp WriteForeignObjOp		      = ILIT(162)
+tagOf_PrimOp MakeStablePtrOp		      = ILIT(163)
+tagOf_PrimOp DeRefStablePtrOp		      = ILIT(164)
+tagOf_PrimOp (CCallOp _ _ _ _ _)	      = ILIT(165)
+tagOf_PrimOp ErrorIOPrimOp		      = ILIT(166)
+tagOf_PrimOp ReallyUnsafePtrEqualityOp	      = ILIT(167)
+tagOf_PrimOp SeqOp			      = ILIT(168)
+tagOf_PrimOp ParOp			      = ILIT(169)
+tagOf_PrimOp ForkOp			      = ILIT(170)
+tagOf_PrimOp DelayOp			      = ILIT(171)
+tagOf_PrimOp WaitReadOp			      = ILIT(172)
+tagOf_PrimOp WaitWriteOp		      = ILIT(173)
+
+tagOf_PrimOp ParGlobalOp		      = ILIT(174)
+tagOf_PrimOp ParLocalOp			      = ILIT(175)
+tagOf_PrimOp ParAtOp			      = ILIT(176)
+tagOf_PrimOp ParAtAbsOp			      = ILIT(177)
+tagOf_PrimOp ParAtRelOp			      = ILIT(178)
+tagOf_PrimOp ParAtForNowOp		      = ILIT(179)
+tagOf_PrimOp CopyableOp			      = ILIT(180)
+tagOf_PrimOp NoFollowOp			      = ILIT(181)
 
 tagOf_PrimOp _ = panic# "tagOf_PrimOp: pattern-match"
 
@@ -498,6 +499,7 @@ allThePrimOps
 	AndOp,
 	OrOp,
 	NotOp,
+	XorOp,
     	SllOp,
     	SraOp,
     	SrlOp,
@@ -792,6 +794,7 @@ A @Word#@ is an unsigned @Int#@.
 primOpInfo AndOp    = Dyadic  SLIT("and#")	wordPrimTy
 primOpInfo OrOp	    = Dyadic  SLIT("or#")	wordPrimTy
 primOpInfo NotOp    = Monadic SLIT("not#")	wordPrimTy
+primOpInfo XorOp    = Monadic SLIT("xor#")	wordPrimTy
 
 primOpInfo SllOp
   = PrimResult SLIT("shiftL#")  [] [wordPrimTy, intPrimTy] wordPrimTyCon WordRep []
@@ -1765,6 +1768,7 @@ commutableOp IntAddOp 	  = True
 commutableOp IntMulOp 	  = True
 commutableOp AndOp	  = True
 commutableOp OrOp	  = True
+commutableOp XorOp	  = True
 commutableOp IntEqOp	  = True
 commutableOp IntNeOp	  = True
 commutableOp IntegerAddOp = True
diff --git a/ghc/includes/StgMacros.lh b/ghc/includes/StgMacros.lh
index 5484c77135cb..a1bf60be601a 100644
--- a/ghc/includes/StgMacros.lh
+++ b/ghc/includes/StgMacros.lh
@@ -470,6 +470,7 @@ I_ stg_div PROTO((I_ a, I_ b));
 \begin{code}
 #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 shiftLZh(r,a,b)	  r=(a)<<(b)
-- 
GitLab