[project @ 1998-01-08 18:03:08 by simonm]
[ghc-hetmet.git] / ghc / compiler / prelude / PrimOp.lhs
index fd1a666..84af9e0 100644 (file)
@@ -4,8 +4,6 @@
 \section[PrimOp]{Primitive operations (machine-level)}
 
 \begin{code}
-#include "HsVersions.h"
-
 module PrimOp (
        PrimOp(..), allThePrimOps,
        tagOf_PrimOp, -- ToDo: rm
@@ -29,7 +27,7 @@ module PrimOp (
        pprPrimOp, showPrimOp
     ) where
 
-IMP_Ubiq(){-uitous-}
+#include "HsVersions.h"
 
 import PrimRep         -- most of it
 import TysPrim
@@ -38,17 +36,18 @@ import TysWiredIn
 import CStrings                ( identToC )
 import Constants       ( mIN_MP_INT_SIZE, mP_STRUCT_SIZE )
 import HeapOffs                ( addOff, intOff, totHdrSize, HeapOffset )
-import Outputable      ( PprStyle, Outputable(..), codeStyle, ifaceStyle )
+import Outputable
 import PprType         ( pprParendGenType, GenTyVar{-instance Outputable-} )
-import Pretty
 import SMRep           ( SMRep(..), SMSpecRepKind(..), SMUpdateKind(..) )
 import TyCon           ( TyCon{-instances-} )
-import Type            ( mkForAllTys, mkFunTy, mkFunTys, applyTyCon, typePrimRep,
-                         getAppDataTyConExpandingDicts, SYN_IE(Type)
+import Type            ( mkForAllTys, mkFunTy, mkFunTys, mkTyConApp, typePrimRep,
+                         splitAlgTyConApp, Type
                        )
 import TyVar           --( alphaTyVar, betaTyVar, gammaTyVar, GenTyVar{-instance Eq-} )
 import Unique          ( Unique{-instance Eq-} )
 import Util            ( panic#, assoc, panic{-ToDo:rm-} )
+
+import GlaExts         ( Int(..), Int#, (==#) )
 \end{code}
 
 %************************************************************************
@@ -79,11 +78,12 @@ data PrimOp
     -- IntAbsOp unused?? ADR
     | IntAddOp | IntSubOp | IntMulOp | IntQuotOp
     | IntRemOp | IntNegOp | IntAbsOp
+    | ISllOp | ISraOp | ISrlOp -- shift {left,right} {arithmetic,logical}
 
     -- Word#-related ops:
+    | WordQuotOp | WordRemOp
     | AndOp  | OrOp   | NotOp | XorOp
     | SllOp  | SraOp  | SrlOp  -- shift {left,right} {arithmetic,logical}
-    | ISllOp | ISraOp | ISrlOp -- equivs on Int#s
     | Int2WordOp | Word2IntOp -- casts
 
     -- Addr#-related ops:
@@ -305,143 +305,144 @@ 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 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 Int2IntegerOp                   = ILIT(114)
+tagOf_PrimOp Word2IntegerOp                  = ILIT(115)
+tagOf_PrimOp Addr2IntegerOp                  = ILIT(116)
+tagOf_PrimOp FloatEncodeOp                   = ILIT(117)
+tagOf_PrimOp FloatDecodeOp                   = ILIT(118)
+tagOf_PrimOp DoubleEncodeOp                  = ILIT(119)
+tagOf_PrimOp DoubleDecodeOp                  = ILIT(120)
+tagOf_PrimOp NewArrayOp                              = ILIT(121)
+tagOf_PrimOp (NewByteArrayOp CharRep)        = ILIT(122)
+tagOf_PrimOp (NewByteArrayOp IntRep)         = ILIT(123)
+tagOf_PrimOp (NewByteArrayOp AddrRep)        = ILIT(124)
+tagOf_PrimOp (NewByteArrayOp FloatRep)       = ILIT(125)
+tagOf_PrimOp (NewByteArrayOp DoubleRep)       = ILIT(126)
+tagOf_PrimOp SameMutableArrayOp                      = ILIT(127)
+tagOf_PrimOp SameMutableByteArrayOp          = ILIT(128)
+tagOf_PrimOp ReadArrayOp                     = ILIT(129)
+tagOf_PrimOp WriteArrayOp                    = ILIT(130)
+tagOf_PrimOp IndexArrayOp                    = ILIT(131)
+tagOf_PrimOp (ReadByteArrayOp CharRep)       = ILIT(132)
+tagOf_PrimOp (ReadByteArrayOp IntRep)        = ILIT(133)
+tagOf_PrimOp (ReadByteArrayOp AddrRep)       = ILIT(134)
+tagOf_PrimOp (ReadByteArrayOp FloatRep)       = ILIT(135)
+tagOf_PrimOp (ReadByteArrayOp DoubleRep)      = ILIT(136)
+tagOf_PrimOp (WriteByteArrayOp CharRep)       = ILIT(137)
+tagOf_PrimOp (WriteByteArrayOp IntRep)       = ILIT(138)
+tagOf_PrimOp (WriteByteArrayOp AddrRep)       = ILIT(139)
+tagOf_PrimOp (WriteByteArrayOp FloatRep)      = ILIT(140)
+tagOf_PrimOp (WriteByteArrayOp DoubleRep)     = ILIT(141)
+tagOf_PrimOp (IndexByteArrayOp CharRep)       = ILIT(142)
+tagOf_PrimOp (IndexByteArrayOp IntRep)       = ILIT(143)
+tagOf_PrimOp (IndexByteArrayOp AddrRep)       = ILIT(144)
+tagOf_PrimOp (IndexByteArrayOp FloatRep)      = ILIT(145)
+tagOf_PrimOp (IndexByteArrayOp DoubleRep)     = ILIT(146)
+tagOf_PrimOp (IndexOffAddrOp CharRep)        = ILIT(147)
+tagOf_PrimOp (IndexOffAddrOp IntRep)         = ILIT(148)
+tagOf_PrimOp (IndexOffAddrOp AddrRep)        = ILIT(149)
+tagOf_PrimOp (IndexOffAddrOp FloatRep)       = ILIT(150)
+tagOf_PrimOp (IndexOffAddrOp DoubleRep)       = ILIT(151)
+tagOf_PrimOp (IndexOffForeignObjOp CharRep)   = ILIT(152)
+tagOf_PrimOp (IndexOffForeignObjOp IntRep)    = ILIT(153)
+tagOf_PrimOp (IndexOffForeignObjOp AddrRep)   = ILIT(154)
+tagOf_PrimOp (IndexOffForeignObjOp FloatRep)  = ILIT(155)
+tagOf_PrimOp (IndexOffForeignObjOp DoubleRep) = ILIT(156)
+tagOf_PrimOp UnsafeFreezeArrayOp             = ILIT(157)
+tagOf_PrimOp UnsafeFreezeByteArrayOp         = ILIT(158)
+tagOf_PrimOp NewSynchVarOp                   = ILIT(159)
+tagOf_PrimOp TakeMVarOp                              = ILIT(160)
+tagOf_PrimOp PutMVarOp                       = ILIT(161)
+tagOf_PrimOp ReadIVarOp                              = ILIT(162)
+tagOf_PrimOp WriteIVarOp                     = ILIT(163)
+tagOf_PrimOp MakeForeignObjOp                = ILIT(164)
+tagOf_PrimOp WriteForeignObjOp               = ILIT(165)
+tagOf_PrimOp MakeStablePtrOp                 = ILIT(166)
+tagOf_PrimOp DeRefStablePtrOp                = ILIT(167)
+tagOf_PrimOp (CCallOp _ _ _ _ _)             = ILIT(168)
+tagOf_PrimOp ErrorIOPrimOp                   = ILIT(169)
+tagOf_PrimOp ReallyUnsafePtrEqualityOp       = ILIT(170)
+tagOf_PrimOp SeqOp                           = ILIT(171)
+tagOf_PrimOp ParOp                           = ILIT(172)
+tagOf_PrimOp ForkOp                          = ILIT(173)
+tagOf_PrimOp DelayOp                         = ILIT(174)
+tagOf_PrimOp WaitReadOp                              = ILIT(175)
+tagOf_PrimOp WaitWriteOp                     = ILIT(176)
+tagOf_PrimOp ParGlobalOp                     = ILIT(177)
+tagOf_PrimOp ParLocalOp                              = ILIT(178)
+tagOf_PrimOp ParAtOp                         = ILIT(179)
+tagOf_PrimOp ParAtAbsOp                              = ILIT(180)
+tagOf_PrimOp ParAtRelOp                              = ILIT(181)
+tagOf_PrimOp ParAtForNowOp                   = ILIT(182)
+tagOf_PrimOp CopyableOp                              = ILIT(183)
+tagOf_PrimOp NoFollowOp                              = ILIT(184)
 
 tagOf_PrimOp _ = panic# "tagOf_PrimOp: pattern-match"
 
@@ -496,6 +497,8 @@ allThePrimOps
        IntQuotOp,
        IntRemOp,
        IntNegOp,
+       WordQuotOp,
+       WordRemOp,
        AndOp,
        OrOp,
        NotOp,
@@ -791,6 +794,9 @@ primOpInfo IntAbsOp  = Monadic SLIT("absInt#") intPrimTy
 A @Word#@ is an unsigned @Int#@.
 
 \begin{code}
+primOpInfo WordQuotOp = Dyadic SLIT("quotWord#") wordPrimTy
+primOpInfo WordRemOp  = Dyadic SLIT("remWord#")         wordPrimTy
+
 primOpInfo AndOp    = Dyadic  SLIT("and#")     wordPrimTy
 primOpInfo OrOp            = Dyadic  SLIT("or#")       wordPrimTy
 primOpInfo XorOp    = Dyadic  SLIT("xor#")     wordPrimTy
@@ -1397,7 +1403,7 @@ primOpInfo ErrorIOPrimOp
 primOpInfo (CCallOp _ _ _ arg_tys result_ty)
   = AlgResult SLIT("ccall#") [] arg_tys result_tycon tys_applied
   where
-    (result_tycon, tys_applied, _) = getAppDataTyConExpandingDicts result_ty
+    (result_tycon, tys_applied, _) = splitAlgTyConApp result_ty
 
 #ifdef DEBUG
 primOpInfo op = panic ("primOpInfo:"++ show (I# (tagOf_PrimOp op)))
@@ -1721,10 +1727,10 @@ primOpType op
       Coercing str ty1 ty2 -> mkFunTy ty1 ty2
 
       PrimResult str tyvars arg_tys prim_tycon kind res_tys ->
-       mkForAllTys tyvars (mkFunTys arg_tys (applyTyCon prim_tycon res_tys))
+       mkForAllTys tyvars (mkFunTys arg_tys (mkTyConApp prim_tycon res_tys))
 
       AlgResult str tyvars arg_tys tycon res_tys ->
-       mkForAllTys tyvars (mkFunTys arg_tys (applyTyCon tycon res_tys))
+       mkForAllTys tyvars (mkFunTys arg_tys (mkTyConApp tycon res_tys))
 \end{code}
 
 \begin{code}
@@ -1791,12 +1797,12 @@ compare_fun_ty ty = mkFunTys [ty, ty] boolTy
 
 Output stuff:
 \begin{code}
-pprPrimOp  :: PprStyle -> PrimOp -> Doc
-showPrimOp :: PprStyle -> PrimOp -> String
+pprPrimOp  :: PrimOp -> SDoc
+showPrimOp :: PrimOp -> String
 
-showPrimOp sty op = render (pprPrimOp sty op)
+showPrimOp op = showSDoc (pprPrimOp op)
 
-pprPrimOp sty (CCallOp fun is_casm may_gc arg_tys res_ty)
+pprPrimOp (CCallOp fun is_casm may_gc arg_tys res_ty)
   = let
        before
          = if is_casm then
@@ -1808,24 +1814,22 @@ pprPrimOp sty (CCallOp fun is_casm may_gc arg_tys res_ty)
          = if is_casm then text "''" else empty
 
        pp_tys
-         = hsep (map (pprParendGenType sty) (res_ty:arg_tys))
+         = hsep (map pprParendGenType (res_ty:arg_tys))
     in
     hcat [text before, ptext fun, after, space, brackets pp_tys]
 
-pprPrimOp sty other_op
-  | codeStyle sty      -- For C just print the primop itself
-  = identToC str
-
-  | ifaceStyle sty     -- For interfaces Print it qualified with GHC.
-  = ptext SLIT("GHC.") <> ptext str
-
-  | otherwise          -- Unqualified is good enough
-  = ptext str
+pprPrimOp other_op
+  = getPprStyle $ \ sty ->
+    if codeStyle sty then      -- For C just print the primop itself
+       identToC str
+    else if ifaceStyle sty then        -- For interfaces Print it qualified with GHC.
+       ptext SLIT("GHC.") <> ptext str
+    else                       -- Unqualified is good enough
+       ptext str
   where
     str = primOp_str other_op
 
 
-
 instance Outputable PrimOp where
-    ppr sty op = pprPrimOp sty op
+    ppr op = pprPrimOp op
 \end{code}