\section[PrimOp]{Primitive operations (machine-level)}
\begin{code}
-#include "HsVersions.h"
-
module PrimOp (
PrimOp(..), allThePrimOps,
tagOf_PrimOp, -- ToDo: rm
pprPrimOp, showPrimOp
) where
-IMP_Ubiq(){-uitous-}
+#include "HsVersions.h"
import PrimRep -- most of it
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 ( PprStyle, Outputable(..), codeStyle, ifaceStyle )
-import PprType ( pprParendGenType, GenTyVar{-instance Outputable-} )
-import Pretty
+import Outputable
+import PprType ( pprParendType )
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 TyVar --( alphaTyVar, betaTyVar, gammaTyVar )
import Unique ( Unique{-instance Eq-} )
import Util ( panic#, assoc, panic{-ToDo:rm-} )
+
+import GlaExts ( Int(..), Int#, (==#) )
\end{code}
%************************************************************************
-- 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
+ | SllOp | SrlOp -- shift {left,right} {logical}
| Int2WordOp | Word2IntOp -- casts
-- Addr#-related ops:
| IntegerCmpOp
- | Integer2IntOp | Int2IntegerOp
- | Word2IntegerOp
+ | 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
-- 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
| NewSynchVarOp -- for MVars and IVars
+ | SameMVarOp
| TakeMVarOp | PutMVarOp
| ReadIVarOp | WriteIVarOp
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}
| 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
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 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 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 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 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"
IntQuotOp,
IntRemOp,
IntNegOp,
+ WordQuotOp,
+ WordRemOp,
AndOp,
OrOp,
NotOp,
XorOp,
SllOp,
- SraOp,
SrlOp,
ISllOp,
ISraOp,
Word2IntOp,
Int2AddrOp,
Addr2IntOp,
+
FloatAddOp,
FloatSubOp,
FloatMulOp,
IntegerNegOp,
IntegerCmpOp,
Integer2IntOp,
+ Integer2WordOp,
Int2IntegerOp,
Word2IntegerOp,
Addr2IntegerOp,
+ IntegerToInt64Op,
+ Int64ToIntegerOp,
+ IntegerToWord64Op,
+ Word64ToIntegerOp,
FloatEncodeOp,
FloatDecodeOp,
DoubleEncodeOp,
NewArrayOp,
NewByteArrayOp CharRep,
NewByteArrayOp IntRep,
+ NewByteArrayOp WordRep,
NewByteArrayOp AddrRep,
NewByteArrayOp FloatRep,
NewByteArrayOp DoubleRep,
IndexArrayOp,
ReadByteArrayOp CharRep,
ReadByteArrayOp IntRep,
+ ReadByteArrayOp WordRep,
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 IntRep,
IndexOffForeignObjOp AddrRep,
+ IndexOffForeignObjOp IntRep,
+ IndexOffForeignObjOp WordRep,
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,
+ SizeofMutableByteArrayOp,
NewSynchVarOp,
+ SameMVarOp,
ReadArrayOp,
TakeMVarOp,
PutMVarOp,
primOpInfo DoubleNeOp = Compare SLIT("/=##") doublePrimTy
primOpInfo DoubleLtOp = Compare SLIT("<##") doublePrimTy
primOpInfo DoubleLeOp = Compare SLIT("<=##") doublePrimTy
+
\end{code}
%************************************************************************
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
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 []
primOpInfo Addr2IntOp = Coercing SLIT("addr2Int#") addrPrimTy intPrimTy
\end{code}
+
%************************************************************************
%* *
\subsubsection[PrimOp-Float]{PrimOpInfo for @Float#@s}
primOpInfo Integer2IntOp
= PrimResult SLIT("integer2Int#") [] one_Integer_ty intPrimTyCon IntRep []
+primOpInfo Integer2WordOp
+ = PrimResult SLIT("integer2Word#") [] one_Integer_ty wordPrimTyCon IntRep []
+
primOpInfo Int2IntegerOp
= AlgResult SLIT("int2Integer#") [] [intPrimTy] integerTyCon []
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
where
tbl = [ (CharRep, stateAndCharPrimTyCon),
(IntRep, stateAndIntPrimTyCon),
+ (WordRep, stateAndWordPrimTyCon),
(AddrRep, stateAndAddrPrimTyCon),
(FloatRep, stateAndFloatPrimTyCon),
(DoubleRep, stateAndDoublePrimTyCon) ]
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 {
AlgResult SLIT("unsafeFreezeByteArray#") [s_tv]
[mkMutableByteArrayPrimTy s, mkStatePrimTy s]
stateAndByteArrayPrimTyCon [s]
+---------------------------------------------------------------------------
+primOpInfo SizeofByteArrayOp
+ = PrimResult
+ SLIT("sizeofByteArray#") []
+ [byteArrayPrimTy]
+ intPrimTyCon IntRep []
+
+primOpInfo SizeofMutableByteArrayOp
+ = let { s = alphaTy; s_tv = alphaTyVar } in
+ PrimResult
+ SLIT("sizeofMutableByteArray#") [s_tv]
+ [mkMutableByteArrayPrimTy s]
+ intPrimTyCon IntRep []
+
\end{code}
%************************************************************************
AlgResult SLIT("newSynchVar#") [s_tv, elt_tv] [mkStatePrimTy s]
stateAndSynchVarPrimTyCon [s, elt]
+primOpInfo SameMVarOp
+ = let {
+ elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
+ mvar_ty = mkSynchVarPrimTy s elt
+ } in
+ AlgResult SLIT("sameMVar#") [s_tv, elt_tv] [mvar_ty, mvar_ty]
+ boolTyCon []
+
primOpInfo TakeMVarOp
= let {
elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
%************************************************************************
\begin{code}
-primOpInfo ErrorIOPrimOp -- errorIO# :: PrimIO () -> State# RealWorld#
- = PrimResult SLIT("errorIO#") []
- [primio_ish_ty unitTy]
+-- errorIO# :: (State# RealWorld# -> a) -> State# RealWorld#
+primOpInfo ErrorIOPrimOp
+ = PrimResult SLIT("errorIO#") [alphaTyVar]
+ [mkFunTy realWorldStatePrimTy alphaTy]
statePrimTyCon VoidRep [realWorldTy]
- where
- primio_ish_ty result
- = mkFunTy (mkStatePrimTy realWorldTy) (mkSTretTy realWorldTy result)
\end{code}
%************************************************************************
%************************************************************************
\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, _) = getAppDataTyConExpandingDicts result_ty
+ (result_tycon, tys_applied, _) = splitAlgTyConApp result_ty
#ifdef DEBUG
primOpInfo op = panic ("primOpInfo:"++ show (I# (tagOf_PrimOp op)))
(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))
or if it returns a ForeignObj.
Hmm..the allocation for makeForeignObj# is known (and fixed), so
- why dod we need to be so indeterminate about it? --SOF
+ 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
primOpHeapReq IntegerCmpOp = FixedHeapRequired (intOff (2 * mP_STRUCT_SIZE))
primOpHeapReq Integer2IntOp = FixedHeapRequired (intOff mP_STRUCT_SIZE)
+primOpHeapReq Integer2WordOp = FixedHeapRequired (intOff mP_STRUCT_SIZE)
primOpHeapReq FloatEncodeOp = FixedHeapRequired (intOff mP_STRUCT_SIZE)
primOpHeapReq DoubleEncodeOp = FixedHeapRequired (intOff mP_STRUCT_SIZE)
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!
\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 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
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}
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 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 (pprParendGenType sty) (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
+ = hsep (map pprParendType (res_ty:arg_tys))
- | ifaceStyle sty -- For interfaces Print it qualified with GHC.
- = ptext SLIT("GHC.") <> ptext str
-
- | otherwise -- Unqualified is good enough
- = ptext str
+ ppr_fun =
+ case fun of
+ Nothing -> ptext SLIT("<dynamic>")
+ Just fn -> ptext fn
+
+ in
+ hcat [ ifPprDebug callconv
+ , text before , ppr_fun , after, space, brackets pp_tys]
+
+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 PrelGHC.
+ ptext SLIT("PrelGHC.") <> 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}