[project @ 1999-05-18 15:03:54 by simonpj]
[ghc-hetmet.git] / ghc / compiler / prelude / PrimOp.lhs
1 %
2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
3 %
4 \section[PrimOp]{Primitive operations (machine-level)}
5
6 \begin{code}
7 module PrimOp (
8         PrimOp(..), allThePrimOps,
9         primOpType, primOpSig, primOpUsg,
10         mkPrimOpIdName, primOpRdrName,
11
12         commutableOp,
13
14         primOpOutOfLine, primOpNeedsWrapper, primOpStrictness,
15         primOpOkForSpeculation, primOpIsCheap, primOpIsDupable,
16         primOpHasSideEffects,
17
18         getPrimOpResultInfo,  PrimOpResultInfo(..),
19
20         pprPrimOp
21     ) where
22
23 #include "HsVersions.h"
24
25 import PrimRep          -- most of it
26 import TysPrim
27 import TysWiredIn
28
29 import Demand           ( Demand, wwLazy, wwPrim, wwStrict )
30 import Var              ( TyVar, Id )
31 import CallConv         ( CallConv, pprCallConv )
32 import PprType          ( pprParendType )
33 import Name             ( Name, mkWiredInIdName )
34 import RdrName          ( RdrName, mkRdrQual )
35 import OccName          ( OccName, pprOccName, mkSrcVarOcc )
36 import TyCon            ( TyCon, tyConArity )
37 import Type             ( Type, mkForAllTys, mkForAllTy, mkFunTy, mkFunTys, mkTyVarTys,
38                           mkTyConTy, mkTyConApp, typePrimRep,
39                           splitFunTy_maybe, splitAlgTyConApp_maybe, splitTyConApp_maybe,
40                           UsageAnn(..), mkUsgTy
41                         )
42 import Unique           ( Unique, mkPrimOpIdUnique )
43 import PrelMods         ( pREL_GHC, pREL_GHC_Name )
44 import Outputable
45 import Util             ( assoc, zipWithEqual )
46 import GlaExts          ( Int(..), Int#, (==#) )
47 \end{code}
48
49 %************************************************************************
50 %*                                                                      *
51 \subsection[PrimOp-datatype]{Datatype for @PrimOp@ (an enumeration)}
52 %*                                                                      *
53 %************************************************************************
54
55 These are in \tr{state-interface.verb} order.
56
57 \begin{code}
58 data PrimOp
59     -- dig the FORTRAN/C influence on the names...
60
61     -- comparisons:
62
63     = CharGtOp   | CharGeOp   | CharEqOp   | CharNeOp   | CharLtOp   | CharLeOp
64     | IntGtOp    | IntGeOp    | IntEqOp    | IntNeOp    | IntLtOp    | IntLeOp
65     | WordGtOp   | WordGeOp   | WordEqOp   | WordNeOp   | WordLtOp   | WordLeOp
66     | AddrGtOp   | AddrGeOp   | AddrEqOp   | AddrNeOp   | AddrLtOp   | AddrLeOp
67     | FloatGtOp  | FloatGeOp  | FloatEqOp  | FloatNeOp  | FloatLtOp  | FloatLeOp
68     | DoubleGtOp | DoubleGeOp | DoubleEqOp | DoubleNeOp | DoubleLtOp | DoubleLeOp
69
70     -- Char#-related ops:
71     | OrdOp | ChrOp
72
73     -- Int#-related ops:
74    -- IntAbsOp unused?? ADR
75     | IntAddOp | IntSubOp | IntMulOp | IntQuotOp
76     | IntRemOp | IntNegOp | IntAbsOp
77     | ISllOp | ISraOp | ISrlOp -- shift {left,right} {arithmetic,logical}
78     | IntAddCOp
79     | IntSubCOp
80     | IntMulCOp
81
82     -- Word#-related ops:
83     | WordQuotOp | WordRemOp
84     | AndOp  | OrOp   | NotOp | XorOp
85     | SllOp  | SrlOp  -- shift {left,right} {logical}
86     | Int2WordOp | Word2IntOp -- casts
87
88     -- Addr#-related ops:
89     | Int2AddrOp | Addr2IntOp -- casts
90
91     -- Float#-related ops:
92     | FloatAddOp | FloatSubOp | FloatMulOp | FloatDivOp | FloatNegOp
93     | Float2IntOp | Int2FloatOp
94
95     | FloatExpOp   | FloatLogOp   | FloatSqrtOp
96     | FloatSinOp   | FloatCosOp   | FloatTanOp
97     | FloatAsinOp  | FloatAcosOp  | FloatAtanOp
98     | FloatSinhOp  | FloatCoshOp  | FloatTanhOp
99     -- not all machines have these available conveniently:
100     -- | FloatAsinhOp | FloatAcoshOp | FloatAtanhOp
101     | FloatPowerOp -- ** op
102
103     -- Double#-related ops:
104     | DoubleAddOp | DoubleSubOp | DoubleMulOp | DoubleDivOp | DoubleNegOp
105     | Double2IntOp | Int2DoubleOp
106     | Double2FloatOp | Float2DoubleOp
107
108     | DoubleExpOp   | DoubleLogOp   | DoubleSqrtOp
109     | DoubleSinOp   | DoubleCosOp   | DoubleTanOp
110     | DoubleAsinOp  | DoubleAcosOp  | DoubleAtanOp
111     | DoubleSinhOp  | DoubleCoshOp  | DoubleTanhOp
112     -- not all machines have these available conveniently:
113     -- | DoubleAsinhOp | DoubleAcoshOp | DoubleAtanhOp
114     | DoublePowerOp -- ** op
115
116     -- Integer (and related...) ops:
117     -- slightly weird -- to match GMP package.
118     | IntegerAddOp | IntegerSubOp | IntegerMulOp | IntegerGcdOp
119     | IntegerQuotRemOp | IntegerDivModOp | IntegerNegOp
120
121     | IntegerCmpOp
122     | IntegerCmpIntOp
123
124     | Integer2IntOp  | Integer2WordOp  
125     | Int2IntegerOp  | Word2IntegerOp
126     | Addr2IntegerOp
127      -- casting to/from Integer and 64-bit (un)signed quantities.
128     | IntegerToInt64Op | Int64ToIntegerOp
129     | IntegerToWord64Op | Word64ToIntegerOp
130     -- ?? gcd, etc?
131
132     | FloatDecodeOp
133     | DoubleDecodeOp
134
135     -- primitive ops for primitive arrays
136
137     | NewArrayOp
138     | NewByteArrayOp PrimRep
139
140     | SameMutableArrayOp
141     | SameMutableByteArrayOp
142
143     | ReadArrayOp | WriteArrayOp | IndexArrayOp -- for arrays of Haskell ptrs
144
145     | ReadByteArrayOp   PrimRep
146     | WriteByteArrayOp  PrimRep
147     | IndexByteArrayOp  PrimRep
148     | IndexOffAddrOp    PrimRep
149     | WriteOffAddrOp    PrimRep
150         -- PrimRep can be one of {Char,Int,Addr,Float,Double}Kind.
151         -- This is just a cheesy encoding of a bunch of ops.
152         -- Note that ForeignObjRep is not included -- the only way of
153         -- creating a ForeignObj is with a ccall or casm.
154     | IndexOffForeignObjOp PrimRep
155
156     | UnsafeFreezeArrayOp | UnsafeFreezeByteArrayOp
157     | UnsafeThawArrayOp   | UnsafeThawByteArrayOp
158     | SizeofByteArrayOp   | SizeofMutableByteArrayOp
159
160     -- Mutable variables
161     | NewMutVarOp
162     | ReadMutVarOp
163     | WriteMutVarOp
164     | SameMutVarOp
165
166     -- for MVars
167     | NewMVarOp
168     | TakeMVarOp 
169     | PutMVarOp
170     | SameMVarOp
171     | IsEmptyMVarOp
172
173     -- exceptions
174     | CatchOp
175     | RaiseOp
176
177     -- foreign objects
178     | MakeForeignObjOp
179     | WriteForeignObjOp
180
181     -- weak pointers
182     | MkWeakOp
183     | DeRefWeakOp
184     | FinalizeWeakOp
185
186     -- stable names
187     | MakeStableNameOp
188     | EqStableNameOp
189     | StableNameToIntOp
190
191     -- stable pointers
192     | MakeStablePtrOp
193     | DeRefStablePtrOp
194     | EqStablePtrOp
195 \end{code}
196
197 A special ``trap-door'' to use in making calls direct to C functions:
198 \begin{code}
199     | CCallOp   (Either 
200                     FAST_STRING    -- Left fn => An "unboxed" ccall# to `fn'.
201                     Unique)        -- Right u => first argument (an Addr#) is the function pointer
202                                    --   (unique is used to generate a 'typedef' to cast
203                                    --    the function pointer if compiling the ccall# down to
204                                    --    .hc code - can't do this inline for tedious reasons.)
205                                     
206                 Bool                -- True <=> really a "casm"
207                 Bool                -- True <=> might invoke Haskell GC
208                 CallConv            -- calling convention to use.
209
210     -- (... to be continued ... )
211 \end{code}
212
213 The ``type'' of @CCallOp foo [t1, ... tm] r@ is @t1 -> ... tm -> r@.
214 (See @primOpInfo@ for details.)
215
216 Note: that first arg and part of the result should be the system state
217 token (which we carry around to fool over-zealous optimisers) but
218 which isn't actually passed.
219
220 For example, we represent
221 \begin{pseudocode}
222 ((ccall# foo [StablePtr# a, Int] Float) sp# i#) :: (Float, IoWorld)
223 \end{pseudocode}
224 by
225 \begin{pseudocode}
226 Case
227   ( Prim
228       (CCallOp "foo" [Universe#, StablePtr# a, Int#] FloatPrimAndUniverse False)
229        -- :: Universe# -> StablePtr# a -> Int# -> FloatPrimAndUniverse
230       []
231       [w#, sp# i#]
232   )
233   (AlgAlts [ ( FloatPrimAndIoWorld,
234                  [f#, w#],
235                  Con (TupleCon 2) [Float, IoWorld] [F# f#, World w#]
236                ) ]
237              NoDefault
238   )
239 \end{pseudocode}
240
241 Nota Bene: there are some people who find the empty list of types in
242 the @Prim@ somewhat puzzling and would represent the above by
243 \begin{pseudocode}
244 Case
245   ( Prim
246       (CCallOp "foo" [alpha1, alpha2, alpha3] alpha4 False)
247        -- :: /\ alpha1, alpha2 alpha3, alpha4.
248        --       alpha1 -> alpha2 -> alpha3 -> alpha4
249       [Universe#, StablePtr# a, Int#, FloatPrimAndIoWorld]
250       [w#, sp# i#]
251   )
252   (AlgAlts [ ( FloatPrimAndIoWorld,
253                  [f#, w#],
254                  Con (TupleCon 2) [Float, IoWorld] [F# f#, World w#]
255                ) ]
256              NoDefault
257   )
258 \end{pseudocode}
259
260 But, this is a completely different way of using @CCallOp@.  The most
261 major changes required if we switch to this are in @primOpInfo@, and
262 the desugarer. The major difficulty is in moving the HeapRequirement
263 stuff somewhere appropriate.  (The advantage is that we could simplify
264 @CCallOp@ and record just the number of arguments with corresponding
265 simplifications in reading pragma unfoldings, the simplifier,
266 instantiation (etc) of core expressions, ... .  Maybe we should think
267 about using it this way?? ADR)
268
269 \begin{code}
270     -- (... continued from above ... )
271
272     -- Operation to test two closure addresses for equality (yes really!)
273     -- BLAME ALASTAIR REID FOR THIS!  THE REST OF US ARE INNOCENT!
274     | ReallyUnsafePtrEqualityOp
275
276     -- parallel stuff
277     | SeqOp
278     | ParOp
279
280     -- concurrency
281     | ForkOp
282     | KillThreadOp
283     | YieldOp
284     | MyThreadIdOp
285     | DelayOp
286     | WaitReadOp
287     | WaitWriteOp
288
289     -- more parallel stuff
290     | ParGlobalOp       -- named global par
291     | ParLocalOp        -- named local par
292     | ParAtOp           -- specifies destination of local par
293     | ParAtAbsOp        -- specifies destination of local par (abs processor)
294     | ParAtRelOp        -- specifies destination of local par (rel processor)
295     | ParAtForNowOp     -- specifies initial destination of global par
296     | CopyableOp        -- marks copyable code
297     | NoFollowOp        -- marks non-followup expression
298
299     -- tag-related
300     | DataToTagOp
301     | TagToEnumOp
302 \end{code}
303
304 Used for the Ord instance
305
306 \begin{code}
307 tagOf_PrimOp CharGtOp                         = (ILIT( 1) :: FAST_INT)
308 tagOf_PrimOp CharGeOp                         = ILIT(  2)
309 tagOf_PrimOp CharEqOp                         = ILIT(  3)
310 tagOf_PrimOp CharNeOp                         = ILIT(  4)
311 tagOf_PrimOp CharLtOp                         = ILIT(  5)
312 tagOf_PrimOp CharLeOp                         = ILIT(  6)
313 tagOf_PrimOp IntGtOp                          = ILIT(  7)
314 tagOf_PrimOp IntGeOp                          = ILIT(  8)
315 tagOf_PrimOp IntEqOp                          = ILIT(  9)
316 tagOf_PrimOp IntNeOp                          = ILIT( 10)
317 tagOf_PrimOp IntLtOp                          = ILIT( 11)
318 tagOf_PrimOp IntLeOp                          = ILIT( 12)
319 tagOf_PrimOp WordGtOp                         = ILIT( 13)
320 tagOf_PrimOp WordGeOp                         = ILIT( 14)
321 tagOf_PrimOp WordEqOp                         = ILIT( 15)
322 tagOf_PrimOp WordNeOp                         = ILIT( 16)
323 tagOf_PrimOp WordLtOp                         = ILIT( 17)
324 tagOf_PrimOp WordLeOp                         = ILIT( 18)
325 tagOf_PrimOp AddrGtOp                         = ILIT( 19)
326 tagOf_PrimOp AddrGeOp                         = ILIT( 20)
327 tagOf_PrimOp AddrEqOp                         = ILIT( 21)
328 tagOf_PrimOp AddrNeOp                         = ILIT( 22)
329 tagOf_PrimOp AddrLtOp                         = ILIT( 23)
330 tagOf_PrimOp AddrLeOp                         = ILIT( 24)
331 tagOf_PrimOp FloatGtOp                        = ILIT( 25)
332 tagOf_PrimOp FloatGeOp                        = ILIT( 26)
333 tagOf_PrimOp FloatEqOp                        = ILIT( 27)
334 tagOf_PrimOp FloatNeOp                        = ILIT( 28)
335 tagOf_PrimOp FloatLtOp                        = ILIT( 29)
336 tagOf_PrimOp FloatLeOp                        = ILIT( 30)
337 tagOf_PrimOp DoubleGtOp                       = ILIT( 31)
338 tagOf_PrimOp DoubleGeOp                       = ILIT( 32)
339 tagOf_PrimOp DoubleEqOp                       = ILIT( 33)
340 tagOf_PrimOp DoubleNeOp                       = ILIT( 34)
341 tagOf_PrimOp DoubleLtOp                       = ILIT( 35)
342 tagOf_PrimOp DoubleLeOp                       = ILIT( 36)
343 tagOf_PrimOp OrdOp                            = ILIT( 37)
344 tagOf_PrimOp ChrOp                            = ILIT( 38)
345 tagOf_PrimOp IntAddOp                         = ILIT( 39)
346 tagOf_PrimOp IntSubOp                         = ILIT( 40)
347 tagOf_PrimOp IntMulOp                         = ILIT( 41)
348 tagOf_PrimOp IntQuotOp                        = ILIT( 42)
349 tagOf_PrimOp IntRemOp                         = ILIT( 43)
350 tagOf_PrimOp IntNegOp                         = ILIT( 44)
351 tagOf_PrimOp IntAbsOp                         = ILIT( 45)
352 tagOf_PrimOp WordQuotOp                       = ILIT( 46)
353 tagOf_PrimOp WordRemOp                        = ILIT( 47)
354 tagOf_PrimOp AndOp                            = ILIT( 48)
355 tagOf_PrimOp OrOp                             = ILIT( 49)
356 tagOf_PrimOp NotOp                            = ILIT( 50)
357 tagOf_PrimOp XorOp                            = ILIT( 51)
358 tagOf_PrimOp SllOp                            = ILIT( 52)
359 tagOf_PrimOp SrlOp                            = ILIT( 53)
360 tagOf_PrimOp ISllOp                           = ILIT( 54)
361 tagOf_PrimOp ISraOp                           = ILIT( 55)
362 tagOf_PrimOp ISrlOp                           = ILIT( 56)
363 tagOf_PrimOp IntAddCOp                        = ILIT( 57)
364 tagOf_PrimOp IntSubCOp                        = ILIT( 58)
365 tagOf_PrimOp IntMulCOp                        = ILIT( 59)
366 tagOf_PrimOp Int2WordOp                       = ILIT( 60)
367 tagOf_PrimOp Word2IntOp                       = ILIT( 61)
368 tagOf_PrimOp Int2AddrOp                       = ILIT( 62)
369 tagOf_PrimOp Addr2IntOp                       = ILIT( 63)
370
371 tagOf_PrimOp FloatAddOp                       = ILIT( 64)
372 tagOf_PrimOp FloatSubOp                       = ILIT( 65)
373 tagOf_PrimOp FloatMulOp                       = ILIT( 66)
374 tagOf_PrimOp FloatDivOp                       = ILIT( 67)
375 tagOf_PrimOp FloatNegOp                       = ILIT( 68)
376 tagOf_PrimOp Float2IntOp                      = ILIT( 69)
377 tagOf_PrimOp Int2FloatOp                      = ILIT( 70)
378 tagOf_PrimOp FloatExpOp                       = ILIT( 71)
379 tagOf_PrimOp FloatLogOp                       = ILIT( 72)
380 tagOf_PrimOp FloatSqrtOp                      = ILIT( 73)
381 tagOf_PrimOp FloatSinOp                       = ILIT( 74)
382 tagOf_PrimOp FloatCosOp                       = ILIT( 75)
383 tagOf_PrimOp FloatTanOp                       = ILIT( 76)
384 tagOf_PrimOp FloatAsinOp                      = ILIT( 77)
385 tagOf_PrimOp FloatAcosOp                      = ILIT( 78)
386 tagOf_PrimOp FloatAtanOp                      = ILIT( 79)
387 tagOf_PrimOp FloatSinhOp                      = ILIT( 80)
388 tagOf_PrimOp FloatCoshOp                      = ILIT( 81)
389 tagOf_PrimOp FloatTanhOp                      = ILIT( 82)
390 tagOf_PrimOp FloatPowerOp                     = ILIT( 83)
391
392 tagOf_PrimOp DoubleAddOp                      = ILIT( 84)
393 tagOf_PrimOp DoubleSubOp                      = ILIT( 85)
394 tagOf_PrimOp DoubleMulOp                      = ILIT( 86)
395 tagOf_PrimOp DoubleDivOp                      = ILIT( 87)
396 tagOf_PrimOp DoubleNegOp                      = ILIT( 88)
397 tagOf_PrimOp Double2IntOp                     = ILIT( 89)
398 tagOf_PrimOp Int2DoubleOp                     = ILIT( 90)
399 tagOf_PrimOp Double2FloatOp                   = ILIT( 91)
400 tagOf_PrimOp Float2DoubleOp                   = ILIT( 92)
401 tagOf_PrimOp DoubleExpOp                      = ILIT( 93)
402 tagOf_PrimOp DoubleLogOp                      = ILIT( 94)
403 tagOf_PrimOp DoubleSqrtOp                     = ILIT( 95)
404 tagOf_PrimOp DoubleSinOp                      = ILIT( 96)
405 tagOf_PrimOp DoubleCosOp                      = ILIT( 97)
406 tagOf_PrimOp DoubleTanOp                      = ILIT( 98)
407 tagOf_PrimOp DoubleAsinOp                     = ILIT( 99)
408 tagOf_PrimOp DoubleAcosOp                     = ILIT(100)
409 tagOf_PrimOp DoubleAtanOp                     = ILIT(101)
410 tagOf_PrimOp DoubleSinhOp                     = ILIT(102)
411 tagOf_PrimOp DoubleCoshOp                     = ILIT(103)
412 tagOf_PrimOp DoubleTanhOp                     = ILIT(104)
413 tagOf_PrimOp DoublePowerOp                    = ILIT(105)
414
415 tagOf_PrimOp IntegerAddOp                     = ILIT(106)
416 tagOf_PrimOp IntegerSubOp                     = ILIT(107)
417 tagOf_PrimOp IntegerMulOp                     = ILIT(108)
418 tagOf_PrimOp IntegerGcdOp                     = ILIT(109)
419 tagOf_PrimOp IntegerQuotRemOp                 = ILIT(110)
420 tagOf_PrimOp IntegerDivModOp                  = ILIT(111)
421 tagOf_PrimOp IntegerNegOp                     = ILIT(112)
422 tagOf_PrimOp IntegerCmpOp                     = ILIT(113)
423 tagOf_PrimOp IntegerCmpIntOp                  = ILIT(114)
424 tagOf_PrimOp Integer2IntOp                    = ILIT(115)
425 tagOf_PrimOp Integer2WordOp                   = ILIT(116)
426 tagOf_PrimOp Int2IntegerOp                    = ILIT(117)
427 tagOf_PrimOp Word2IntegerOp                   = ILIT(118)
428 tagOf_PrimOp Addr2IntegerOp                   = ILIT(119)
429 tagOf_PrimOp IntegerToInt64Op                 = ILIT(120)
430 tagOf_PrimOp Int64ToIntegerOp                 = ILIT(121)
431 tagOf_PrimOp IntegerToWord64Op                = ILIT(122)
432 tagOf_PrimOp Word64ToIntegerOp                = ILIT(123)
433 tagOf_PrimOp FloatDecodeOp                    = ILIT(125)
434 tagOf_PrimOp DoubleDecodeOp                   = ILIT(127)
435
436 tagOf_PrimOp NewArrayOp                       = ILIT(128)
437 tagOf_PrimOp (NewByteArrayOp CharRep)         = ILIT(129)
438 tagOf_PrimOp (NewByteArrayOp IntRep)          = ILIT(130)
439 tagOf_PrimOp (NewByteArrayOp WordRep)         = ILIT(131)
440 tagOf_PrimOp (NewByteArrayOp AddrRep)         = ILIT(132)
441 tagOf_PrimOp (NewByteArrayOp FloatRep)        = ILIT(133)
442 tagOf_PrimOp (NewByteArrayOp DoubleRep)       = ILIT(134)
443 tagOf_PrimOp (NewByteArrayOp StablePtrRep)    = ILIT(135)
444
445 tagOf_PrimOp SameMutableArrayOp               = ILIT(136)
446 tagOf_PrimOp SameMutableByteArrayOp           = ILIT(137)
447 tagOf_PrimOp ReadArrayOp                      = ILIT(138)
448 tagOf_PrimOp WriteArrayOp                     = ILIT(139)
449 tagOf_PrimOp IndexArrayOp                     = ILIT(140)
450
451 tagOf_PrimOp (ReadByteArrayOp CharRep)        = ILIT(141)
452 tagOf_PrimOp (ReadByteArrayOp IntRep)         = ILIT(142)
453 tagOf_PrimOp (ReadByteArrayOp WordRep)        = ILIT(143)
454 tagOf_PrimOp (ReadByteArrayOp AddrRep)        = ILIT(144)
455 tagOf_PrimOp (ReadByteArrayOp FloatRep)       = ILIT(145)
456 tagOf_PrimOp (ReadByteArrayOp DoubleRep)      = ILIT(146)
457 tagOf_PrimOp (ReadByteArrayOp StablePtrRep)   = ILIT(147)
458 tagOf_PrimOp (ReadByteArrayOp Int64Rep)       = ILIT(148)
459 tagOf_PrimOp (ReadByteArrayOp Word64Rep)      = ILIT(149)
460
461 tagOf_PrimOp (WriteByteArrayOp CharRep)       = ILIT(150)
462 tagOf_PrimOp (WriteByteArrayOp IntRep)        = ILIT(151)
463 tagOf_PrimOp (WriteByteArrayOp WordRep)       = ILIT(152)
464 tagOf_PrimOp (WriteByteArrayOp AddrRep)       = ILIT(153)
465 tagOf_PrimOp (WriteByteArrayOp FloatRep)      = ILIT(154)
466 tagOf_PrimOp (WriteByteArrayOp DoubleRep)     = ILIT(155)
467 tagOf_PrimOp (WriteByteArrayOp StablePtrRep)  = ILIT(156)
468 tagOf_PrimOp (WriteByteArrayOp Int64Rep)      = ILIT(157)
469 tagOf_PrimOp (WriteByteArrayOp Word64Rep)     = ILIT(158)
470
471 tagOf_PrimOp (IndexByteArrayOp CharRep)       = ILIT(159)
472 tagOf_PrimOp (IndexByteArrayOp IntRep)        = ILIT(160)
473 tagOf_PrimOp (IndexByteArrayOp WordRep)       = ILIT(161)
474 tagOf_PrimOp (IndexByteArrayOp AddrRep)       = ILIT(162)
475 tagOf_PrimOp (IndexByteArrayOp FloatRep)      = ILIT(163)
476 tagOf_PrimOp (IndexByteArrayOp DoubleRep)     = ILIT(164)
477 tagOf_PrimOp (IndexByteArrayOp StablePtrRep)  = ILIT(165)
478 tagOf_PrimOp (IndexByteArrayOp Int64Rep)      = ILIT(166)
479 tagOf_PrimOp (IndexByteArrayOp Word64Rep)     = ILIT(167)
480
481 tagOf_PrimOp (IndexOffAddrOp CharRep)         = ILIT(168)
482 tagOf_PrimOp (IndexOffAddrOp IntRep)          = ILIT(169)
483 tagOf_PrimOp (IndexOffAddrOp WordRep)         = ILIT(170)
484 tagOf_PrimOp (IndexOffAddrOp AddrRep)         = ILIT(171)
485 tagOf_PrimOp (IndexOffAddrOp FloatRep)        = ILIT(172)
486 tagOf_PrimOp (IndexOffAddrOp DoubleRep)       = ILIT(173)
487 tagOf_PrimOp (IndexOffAddrOp StablePtrRep)    = ILIT(174)
488 tagOf_PrimOp (IndexOffAddrOp Int64Rep)        = ILIT(175)
489 tagOf_PrimOp (IndexOffAddrOp Word64Rep)       = ILIT(176)
490
491 tagOf_PrimOp (IndexOffForeignObjOp CharRep)   = ILIT(177)
492 tagOf_PrimOp (IndexOffForeignObjOp IntRep)    = ILIT(178)
493 tagOf_PrimOp (IndexOffForeignObjOp WordRep)   = ILIT(179)
494 tagOf_PrimOp (IndexOffForeignObjOp AddrRep)   = ILIT(180)
495 tagOf_PrimOp (IndexOffForeignObjOp FloatRep)  = ILIT(181)
496 tagOf_PrimOp (IndexOffForeignObjOp DoubleRep) = ILIT(182)
497 tagOf_PrimOp (IndexOffForeignObjOp StablePtrRep) = ILIT(183)
498 tagOf_PrimOp (IndexOffForeignObjOp Int64Rep)  = ILIT(184)
499 tagOf_PrimOp (IndexOffForeignObjOp Word64Rep) = ILIT(185)
500
501 tagOf_PrimOp (WriteOffAddrOp CharRep)         = ILIT(186)
502 tagOf_PrimOp (WriteOffAddrOp IntRep)          = ILIT(187)
503 tagOf_PrimOp (WriteOffAddrOp WordRep)         = ILIT(188)
504 tagOf_PrimOp (WriteOffAddrOp AddrRep)         = ILIT(189)
505 tagOf_PrimOp (WriteOffAddrOp FloatRep)        = ILIT(190)
506 tagOf_PrimOp (WriteOffAddrOp DoubleRep)       = ILIT(191)
507 tagOf_PrimOp (WriteOffAddrOp StablePtrRep)    = ILIT(192)
508 tagOf_PrimOp (WriteOffAddrOp ForeignObjRep)   = ILIT(193)
509 tagOf_PrimOp (WriteOffAddrOp Int64Rep)        = ILIT(194)
510 tagOf_PrimOp (WriteOffAddrOp Word64Rep)       = ILIT(195)
511
512 tagOf_PrimOp UnsafeFreezeArrayOp              = ILIT(196)
513 tagOf_PrimOp UnsafeFreezeByteArrayOp          = ILIT(197)
514 tagOf_PrimOp UnsafeThawArrayOp                = ILIT(198)
515 tagOf_PrimOp UnsafeThawByteArrayOp            = ILIT(199)
516 tagOf_PrimOp SizeofByteArrayOp                = ILIT(200)
517 tagOf_PrimOp SizeofMutableByteArrayOp         = ILIT(201)
518
519 tagOf_PrimOp NewMVarOp                        = ILIT(202)
520 tagOf_PrimOp TakeMVarOp                       = ILIT(203)
521 tagOf_PrimOp PutMVarOp                        = ILIT(204)
522 tagOf_PrimOp SameMVarOp                       = ILIT(205)
523 tagOf_PrimOp IsEmptyMVarOp                    = ILIT(206)
524 tagOf_PrimOp MakeForeignObjOp                 = ILIT(207)
525 tagOf_PrimOp WriteForeignObjOp                = ILIT(208)
526 tagOf_PrimOp MkWeakOp                         = ILIT(209)
527 tagOf_PrimOp DeRefWeakOp                      = ILIT(210)
528 tagOf_PrimOp FinalizeWeakOp                   = ILIT(211)
529 tagOf_PrimOp MakeStableNameOp                 = ILIT(212)
530 tagOf_PrimOp EqStableNameOp                   = ILIT(213)
531 tagOf_PrimOp StableNameToIntOp                = ILIT(214)
532 tagOf_PrimOp MakeStablePtrOp                  = ILIT(215)
533 tagOf_PrimOp DeRefStablePtrOp                 = ILIT(216)
534 tagOf_PrimOp EqStablePtrOp                    = ILIT(217)
535 tagOf_PrimOp (CCallOp _ _ _ _)                = ILIT(218)
536 tagOf_PrimOp ReallyUnsafePtrEqualityOp        = ILIT(219)
537 tagOf_PrimOp SeqOp                            = ILIT(220)
538 tagOf_PrimOp ParOp                            = ILIT(221)
539 tagOf_PrimOp ForkOp                           = ILIT(222)
540 tagOf_PrimOp KillThreadOp                     = ILIT(223)
541 tagOf_PrimOp YieldOp                          = ILIT(224)
542 tagOf_PrimOp MyThreadIdOp                     = ILIT(225)
543 tagOf_PrimOp DelayOp                          = ILIT(226)
544 tagOf_PrimOp WaitReadOp                       = ILIT(227)
545 tagOf_PrimOp WaitWriteOp                      = ILIT(228)
546 tagOf_PrimOp ParGlobalOp                      = ILIT(229)
547 tagOf_PrimOp ParLocalOp                       = ILIT(230)
548 tagOf_PrimOp ParAtOp                          = ILIT(231)
549 tagOf_PrimOp ParAtAbsOp                       = ILIT(232)
550 tagOf_PrimOp ParAtRelOp                       = ILIT(233)
551 tagOf_PrimOp ParAtForNowOp                    = ILIT(234)
552 tagOf_PrimOp CopyableOp                       = ILIT(235)
553 tagOf_PrimOp NoFollowOp                       = ILIT(236)
554 tagOf_PrimOp NewMutVarOp                      = ILIT(237)
555 tagOf_PrimOp ReadMutVarOp                     = ILIT(238)
556 tagOf_PrimOp WriteMutVarOp                    = ILIT(239)
557 tagOf_PrimOp SameMutVarOp                     = ILIT(240)
558 tagOf_PrimOp CatchOp                          = ILIT(241)
559 tagOf_PrimOp RaiseOp                          = ILIT(242)
560 tagOf_PrimOp DataToTagOp                      = ILIT(243)
561 tagOf_PrimOp TagToEnumOp                      = ILIT(244)
562
563 tagOf_PrimOp op = pprPanic# "tagOf_PrimOp: pattern-match" (ppr op)
564 --panic# "tagOf_PrimOp: pattern-match"
565
566 instance Eq PrimOp where
567     op1 == op2 = tagOf_PrimOp op1 _EQ_ tagOf_PrimOp op2
568
569 instance Ord PrimOp where
570     op1 <  op2 =  tagOf_PrimOp op1 _LT_ tagOf_PrimOp op2
571     op1 <= op2 =  tagOf_PrimOp op1 _LE_ tagOf_PrimOp op2
572     op1 >= op2 =  tagOf_PrimOp op1 _GE_ tagOf_PrimOp op2
573     op1 >  op2 =  tagOf_PrimOp op1 _GT_ tagOf_PrimOp op2
574     op1 `compare` op2 | op1 < op2  = LT
575                       | op1 == op2 = EQ
576                       | otherwise  = GT
577
578 instance Outputable PrimOp where
579     ppr op = pprPrimOp op
580
581 instance Show PrimOp where
582     showsPrec p op = showsPrecSDoc p (pprPrimOp op)
583 \end{code}
584
585 An @Enum@-derived list would be better; meanwhile... (ToDo)
586 \begin{code}
587 allThePrimOps
588   = [   CharGtOp,
589         CharGeOp,
590         CharEqOp,
591         CharNeOp,
592         CharLtOp,
593         CharLeOp,
594         IntGtOp,
595         IntGeOp,
596         IntEqOp,
597         IntNeOp,
598         IntLtOp,
599         IntLeOp,
600         WordGtOp,
601         WordGeOp,
602         WordEqOp,
603         WordNeOp,
604         WordLtOp,
605         WordLeOp,
606         AddrGtOp,
607         AddrGeOp,
608         AddrEqOp,
609         AddrNeOp,
610         AddrLtOp,
611         AddrLeOp,
612         FloatGtOp,
613         FloatGeOp,
614         FloatEqOp,
615         FloatNeOp,
616         FloatLtOp,
617         FloatLeOp,
618         DoubleGtOp,
619         DoubleGeOp,
620         DoubleEqOp,
621         DoubleNeOp,
622         DoubleLtOp,
623         DoubleLeOp,
624         OrdOp,
625         ChrOp,
626         IntAddOp,
627         IntSubOp,
628         IntMulOp,
629         IntQuotOp,
630         IntRemOp,
631         IntNegOp,
632         WordQuotOp,
633         WordRemOp,
634         AndOp,
635         OrOp,
636         NotOp,
637         XorOp,
638         SllOp,
639         SrlOp,
640         ISllOp,
641         ISraOp,
642         ISrlOp,
643         IntAddCOp,
644         IntSubCOp,
645         IntMulCOp,
646         Int2WordOp,
647         Word2IntOp,
648         Int2AddrOp,
649         Addr2IntOp,
650
651         FloatAddOp,
652         FloatSubOp,
653         FloatMulOp,
654         FloatDivOp,
655         FloatNegOp,
656         Float2IntOp,
657         Int2FloatOp,
658         FloatExpOp,
659         FloatLogOp,
660         FloatSqrtOp,
661         FloatSinOp,
662         FloatCosOp,
663         FloatTanOp,
664         FloatAsinOp,
665         FloatAcosOp,
666         FloatAtanOp,
667         FloatSinhOp,
668         FloatCoshOp,
669         FloatTanhOp,
670         FloatPowerOp,
671         DoubleAddOp,
672         DoubleSubOp,
673         DoubleMulOp,
674         DoubleDivOp,
675         DoubleNegOp,
676         Double2IntOp,
677         Int2DoubleOp,
678         Double2FloatOp,
679         Float2DoubleOp,
680         DoubleExpOp,
681         DoubleLogOp,
682         DoubleSqrtOp,
683         DoubleSinOp,
684         DoubleCosOp,
685         DoubleTanOp,
686         DoubleAsinOp,
687         DoubleAcosOp,
688         DoubleAtanOp,
689         DoubleSinhOp,
690         DoubleCoshOp,
691         DoubleTanhOp,
692         DoublePowerOp,
693         IntegerAddOp,
694         IntegerSubOp,
695         IntegerMulOp,
696         IntegerGcdOp,
697         IntegerQuotRemOp,
698         IntegerDivModOp,
699         IntegerNegOp,
700         IntegerCmpOp,
701         IntegerCmpIntOp,
702         Integer2IntOp,
703         Integer2WordOp,
704         Int2IntegerOp,
705         Word2IntegerOp,
706         Addr2IntegerOp,
707         IntegerToInt64Op,
708         Int64ToIntegerOp,
709         IntegerToWord64Op,
710         Word64ToIntegerOp,
711         FloatDecodeOp,
712         DoubleDecodeOp,
713         NewArrayOp,
714         NewByteArrayOp CharRep,
715         NewByteArrayOp IntRep,
716         NewByteArrayOp WordRep,
717         NewByteArrayOp AddrRep,
718         NewByteArrayOp FloatRep,
719         NewByteArrayOp DoubleRep,
720         NewByteArrayOp StablePtrRep,
721         SameMutableArrayOp,
722         SameMutableByteArrayOp,
723         ReadArrayOp,
724         WriteArrayOp,
725         IndexArrayOp,
726         ReadByteArrayOp CharRep,
727         ReadByteArrayOp IntRep,
728         ReadByteArrayOp WordRep,
729         ReadByteArrayOp AddrRep,
730         ReadByteArrayOp FloatRep,
731         ReadByteArrayOp DoubleRep,
732         ReadByteArrayOp StablePtrRep,
733         ReadByteArrayOp Int64Rep,
734         ReadByteArrayOp Word64Rep,
735         WriteByteArrayOp CharRep,
736         WriteByteArrayOp IntRep,
737         WriteByteArrayOp WordRep,
738         WriteByteArrayOp AddrRep,
739         WriteByteArrayOp FloatRep,
740         WriteByteArrayOp DoubleRep,
741         WriteByteArrayOp StablePtrRep,
742         WriteByteArrayOp Int64Rep,
743         WriteByteArrayOp Word64Rep,
744         IndexByteArrayOp CharRep,
745         IndexByteArrayOp IntRep,
746         IndexByteArrayOp WordRep,
747         IndexByteArrayOp AddrRep,
748         IndexByteArrayOp FloatRep,
749         IndexByteArrayOp DoubleRep,
750         IndexByteArrayOp StablePtrRep,
751         IndexByteArrayOp Int64Rep,
752         IndexByteArrayOp Word64Rep,
753         IndexOffForeignObjOp CharRep,
754         IndexOffForeignObjOp AddrRep,
755         IndexOffForeignObjOp IntRep,
756         IndexOffForeignObjOp WordRep,
757         IndexOffForeignObjOp FloatRep,
758         IndexOffForeignObjOp DoubleRep,
759         IndexOffForeignObjOp StablePtrRep,
760         IndexOffForeignObjOp Int64Rep,
761         IndexOffForeignObjOp Word64Rep,
762         IndexOffAddrOp CharRep,
763         IndexOffAddrOp IntRep,
764         IndexOffAddrOp WordRep,
765         IndexOffAddrOp AddrRep,
766         IndexOffAddrOp FloatRep,
767         IndexOffAddrOp DoubleRep,
768         IndexOffAddrOp StablePtrRep,
769         IndexOffAddrOp Int64Rep,
770         IndexOffAddrOp Word64Rep,
771         WriteOffAddrOp CharRep,
772         WriteOffAddrOp IntRep,
773         WriteOffAddrOp WordRep,
774         WriteOffAddrOp AddrRep,
775         WriteOffAddrOp FloatRep,
776         WriteOffAddrOp DoubleRep,
777         WriteOffAddrOp ForeignObjRep,
778         WriteOffAddrOp StablePtrRep,
779         WriteOffAddrOp Int64Rep,
780         WriteOffAddrOp Word64Rep,
781         UnsafeFreezeArrayOp,
782         UnsafeFreezeByteArrayOp,
783         UnsafeThawArrayOp,
784         UnsafeThawByteArrayOp,
785         SizeofByteArrayOp,
786         SizeofMutableByteArrayOp,
787         NewMutVarOp,
788         ReadMutVarOp,
789         WriteMutVarOp,
790         SameMutVarOp,
791         CatchOp,
792         RaiseOp,
793         NewMVarOp,
794         TakeMVarOp,
795         PutMVarOp,
796         SameMVarOp,
797         IsEmptyMVarOp,
798         MakeForeignObjOp,
799         WriteForeignObjOp,
800         MkWeakOp,
801         DeRefWeakOp,
802         FinalizeWeakOp,
803         MakeStableNameOp,
804         EqStableNameOp,
805         StableNameToIntOp,
806         MakeStablePtrOp,
807         DeRefStablePtrOp,
808         EqStablePtrOp,
809         ReallyUnsafePtrEqualityOp,
810         ParGlobalOp,
811         ParLocalOp,
812         ParAtOp,
813         ParAtAbsOp,
814         ParAtRelOp,
815         ParAtForNowOp,
816         CopyableOp,
817         NoFollowOp,
818         SeqOp,
819         ParOp,
820         ForkOp,
821         KillThreadOp,
822         YieldOp,
823         MyThreadIdOp,
824         DelayOp,
825         WaitReadOp,
826         WaitWriteOp,
827         DataToTagOp,
828         TagToEnumOp
829     ]
830 \end{code}
831
832 %************************************************************************
833 %*                                                                      *
834 \subsection[PrimOp-info]{The essential info about each @PrimOp@}
835 %*                                                                      *
836 %************************************************************************
837
838 The @String@ in the @PrimOpInfos@ is the ``base name'' by which the user may
839 refer to the primitive operation.  The conventional \tr{#}-for-
840 unboxed ops is added on later.
841
842 The reason for the funny characters in the names is so we do not
843 interfere with the programmer's Haskell name spaces.
844
845 We use @PrimKinds@ for the ``type'' information, because they're
846 (slightly) more convenient to use than @TyCons@.
847 \begin{code}
848 data PrimOpInfo
849   = Dyadic      OccName         -- string :: T -> T -> T
850                 Type
851   | Monadic     OccName         -- string :: T -> T
852                 Type
853   | Compare     OccName         -- string :: T -> T -> Bool
854                 Type
855
856   | GenPrimOp   OccName         -- string :: \/a1..an . T1 -> .. -> Tk -> T
857                 [TyVar] 
858                 [Type] 
859                 Type 
860
861 mkDyadic str  ty = Dyadic  (mkSrcVarOcc str) ty
862 mkMonadic str ty = Monadic (mkSrcVarOcc str) ty
863 mkCompare str ty = Compare (mkSrcVarOcc str) ty
864 mkGenPrimOp str tvs tys ty = GenPrimOp (mkSrcVarOcc str) tvs tys ty
865 \end{code}
866
867 Utility bits:
868 \begin{code}
869 one_Integer_ty = [intPrimTy, byteArrayPrimTy]
870 two_Integer_tys
871   = [intPrimTy, byteArrayPrimTy, -- first Integer pieces
872      intPrimTy, byteArrayPrimTy] -- second '' pieces
873 an_Integer_and_Int_tys
874   = [intPrimTy, byteArrayPrimTy, -- Integer
875      intPrimTy]
876
877 unboxedPair      = mkUnboxedTupleTy 2
878 unboxedTriple    = mkUnboxedTupleTy 3
879 unboxedQuadruple = mkUnboxedTupleTy 4
880
881 integerMonadic name = mkGenPrimOp name [] one_Integer_ty 
882                         (unboxedPair one_Integer_ty)
883
884 integerDyadic name = mkGenPrimOp name [] two_Integer_tys 
885                         (unboxedPair one_Integer_ty)
886
887 integerDyadic2Results name = mkGenPrimOp name [] two_Integer_tys 
888     (unboxedQuadruple two_Integer_tys)
889
890 integerCompare name = mkGenPrimOp name [] two_Integer_tys intPrimTy
891 \end{code}
892
893 %************************************************************************
894 %*                                                                      *
895 \subsubsection{Strictness}
896 %*                                                                      *
897 %************************************************************************
898
899 Not all primops are strict!
900
901 \begin{code}
902 primOpStrictness :: PrimOp -> ([Demand], Bool)
903         -- See IdInfo.StrictnessInfo for discussion of what the results
904         -- **NB** as a cheap hack, to avoid having to look up the PrimOp's arity,
905         -- the list of demands may be infinite!
906         -- Use only the ones you ned.
907
908 primOpStrictness SeqOp            = ([wwLazy], False)
909 primOpStrictness ParOp            = ([wwLazy], False)
910 primOpStrictness ForkOp           = ([wwLazy, wwPrim], False)
911
912 primOpStrictness NewArrayOp       = ([wwPrim, wwLazy, wwPrim], False)
913 primOpStrictness WriteArrayOp     = ([wwPrim, wwPrim, wwLazy, wwPrim], False)
914
915 primOpStrictness NewMutVarOp      = ([wwLazy, wwPrim], False)
916 primOpStrictness WriteMutVarOp    = ([wwPrim, wwLazy, wwPrim], False)
917
918 primOpStrictness PutMVarOp        = ([wwPrim, wwLazy, wwPrim], False)
919
920 primOpStrictness CatchOp          = ([wwLazy, wwLazy], False)
921 primOpStrictness RaiseOp          = ([wwLazy], True)    -- NB: True => result is bottom
922
923 primOpStrictness MkWeakOp         = ([wwLazy, wwLazy, wwLazy, wwPrim], False)
924 primOpStrictness MakeStableNameOp = ([wwLazy, wwPrim], False)
925 primOpStrictness MakeStablePtrOp  = ([wwLazy, wwPrim], False)
926
927 primOpStrictness DataToTagOp      = ([wwLazy], False)
928
929         -- The rest all have primitive-typed arguments
930 primOpStrictness other            = (repeat wwPrim, False)
931 \end{code}
932
933 %************************************************************************
934 %*                                                                      *
935 \subsubsection[PrimOp-comparison]{PrimOpInfo basic comparison ops}
936 %*                                                                      *
937 %************************************************************************
938
939 @primOpInfo@ gives all essential information (from which everything
940 else, notably a type, can be constructed) for each @PrimOp@.
941
942 \begin{code}
943 primOpInfo :: PrimOp -> PrimOpInfo
944 \end{code}
945
946 There's plenty of this stuff!
947
948 \begin{code}
949 primOpInfo CharGtOp   = mkCompare SLIT("gtChar#")   charPrimTy
950 primOpInfo CharGeOp   = mkCompare SLIT("geChar#")   charPrimTy
951 primOpInfo CharEqOp   = mkCompare SLIT("eqChar#")   charPrimTy
952 primOpInfo CharNeOp   = mkCompare SLIT("neChar#")   charPrimTy
953 primOpInfo CharLtOp   = mkCompare SLIT("ltChar#")   charPrimTy
954 primOpInfo CharLeOp   = mkCompare SLIT("leChar#")   charPrimTy
955
956 primOpInfo IntGtOp    = mkCompare SLIT(">#")       intPrimTy
957 primOpInfo IntGeOp    = mkCompare SLIT(">=#")      intPrimTy
958 primOpInfo IntEqOp    = mkCompare SLIT("==#")      intPrimTy
959 primOpInfo IntNeOp    = mkCompare SLIT("/=#")      intPrimTy
960 primOpInfo IntLtOp    = mkCompare SLIT("<#")       intPrimTy
961 primOpInfo IntLeOp    = mkCompare SLIT("<=#")      intPrimTy
962
963 primOpInfo WordGtOp   = mkCompare SLIT("gtWord#")   wordPrimTy
964 primOpInfo WordGeOp   = mkCompare SLIT("geWord#")   wordPrimTy
965 primOpInfo WordEqOp   = mkCompare SLIT("eqWord#")   wordPrimTy
966 primOpInfo WordNeOp   = mkCompare SLIT("neWord#")   wordPrimTy
967 primOpInfo WordLtOp   = mkCompare SLIT("ltWord#")   wordPrimTy
968 primOpInfo WordLeOp   = mkCompare SLIT("leWord#")   wordPrimTy
969
970 primOpInfo AddrGtOp   = mkCompare SLIT("gtAddr#")   addrPrimTy
971 primOpInfo AddrGeOp   = mkCompare SLIT("geAddr#")   addrPrimTy
972 primOpInfo AddrEqOp   = mkCompare SLIT("eqAddr#")   addrPrimTy
973 primOpInfo AddrNeOp   = mkCompare SLIT("neAddr#")   addrPrimTy
974 primOpInfo AddrLtOp   = mkCompare SLIT("ltAddr#")   addrPrimTy
975 primOpInfo AddrLeOp   = mkCompare SLIT("leAddr#")   addrPrimTy
976
977 primOpInfo FloatGtOp  = mkCompare SLIT("gtFloat#")  floatPrimTy
978 primOpInfo FloatGeOp  = mkCompare SLIT("geFloat#")  floatPrimTy
979 primOpInfo FloatEqOp  = mkCompare SLIT("eqFloat#")  floatPrimTy
980 primOpInfo FloatNeOp  = mkCompare SLIT("neFloat#")  floatPrimTy
981 primOpInfo FloatLtOp  = mkCompare SLIT("ltFloat#")  floatPrimTy
982 primOpInfo FloatLeOp  = mkCompare SLIT("leFloat#")  floatPrimTy
983
984 primOpInfo DoubleGtOp = mkCompare SLIT(">##") doublePrimTy
985 primOpInfo DoubleGeOp = mkCompare SLIT(">=##") doublePrimTy
986 primOpInfo DoubleEqOp = mkCompare SLIT("==##") doublePrimTy
987 primOpInfo DoubleNeOp = mkCompare SLIT("/=##") doublePrimTy
988 primOpInfo DoubleLtOp = mkCompare SLIT("<##") doublePrimTy
989 primOpInfo DoubleLeOp = mkCompare SLIT("<=##") doublePrimTy
990
991 \end{code}
992
993 %************************************************************************
994 %*                                                                      *
995 \subsubsection[PrimOp-Char]{PrimOpInfo for @Char#@s}
996 %*                                                                      *
997 %************************************************************************
998
999 \begin{code}
1000 primOpInfo OrdOp = mkGenPrimOp SLIT("ord#") [] [charPrimTy] intPrimTy
1001 primOpInfo ChrOp = mkGenPrimOp SLIT("chr#") [] [intPrimTy]  charPrimTy
1002 \end{code}
1003
1004 %************************************************************************
1005 %*                                                                      *
1006 \subsubsection[PrimOp-Int]{PrimOpInfo for @Int#@s}
1007 %*                                                                      *
1008 %************************************************************************
1009
1010 \begin{code}
1011 primOpInfo IntAddOp  = mkDyadic SLIT("+#")       intPrimTy
1012 primOpInfo IntSubOp  = mkDyadic SLIT("-#") intPrimTy
1013 primOpInfo IntMulOp  = mkDyadic SLIT("*#") intPrimTy
1014 primOpInfo IntQuotOp = mkDyadic SLIT("quotInt#")         intPrimTy
1015 primOpInfo IntRemOp  = mkDyadic SLIT("remInt#")  intPrimTy
1016
1017 primOpInfo IntNegOp  = mkMonadic SLIT("negateInt#") intPrimTy
1018 primOpInfo IntAbsOp  = mkMonadic SLIT("absInt#") intPrimTy
1019
1020 primOpInfo IntAddCOp = 
1021         mkGenPrimOp SLIT("addIntC#")  [] [intPrimTy, intPrimTy] 
1022                 (unboxedPair [intPrimTy, intPrimTy])
1023
1024 primOpInfo IntSubCOp = 
1025         mkGenPrimOp SLIT("subIntC#")  [] [intPrimTy, intPrimTy] 
1026                 (unboxedPair [intPrimTy, intPrimTy])
1027
1028 primOpInfo IntMulCOp = 
1029         mkGenPrimOp SLIT("mulIntC#")  [] [intPrimTy, intPrimTy] 
1030                 (unboxedPair [intPrimTy, intPrimTy])
1031 \end{code}
1032
1033 %************************************************************************
1034 %*                                                                      *
1035 \subsubsection[PrimOp-Word]{PrimOpInfo for @Word#@s}
1036 %*                                                                      *
1037 %************************************************************************
1038
1039 A @Word#@ is an unsigned @Int#@.
1040
1041 \begin{code}
1042 primOpInfo WordQuotOp = mkDyadic SLIT("quotWord#") wordPrimTy
1043 primOpInfo WordRemOp  = mkDyadic SLIT("remWord#")        wordPrimTy
1044
1045 primOpInfo AndOp    = mkDyadic  SLIT("and#")    wordPrimTy
1046 primOpInfo OrOp     = mkDyadic  SLIT("or#")     wordPrimTy
1047 primOpInfo XorOp    = mkDyadic  SLIT("xor#")    wordPrimTy
1048 primOpInfo NotOp    = mkMonadic SLIT("not#")    wordPrimTy
1049
1050 primOpInfo SllOp
1051   = mkGenPrimOp SLIT("shiftL#")  [] [wordPrimTy, intPrimTy] wordPrimTy
1052 primOpInfo SrlOp
1053   = mkGenPrimOp SLIT("shiftRL#") [] [wordPrimTy, intPrimTy] wordPrimTy
1054
1055 primOpInfo ISllOp
1056   = mkGenPrimOp SLIT("iShiftL#")  [] [intPrimTy, intPrimTy] intPrimTy
1057 primOpInfo ISraOp
1058   = mkGenPrimOp SLIT("iShiftRA#") [] [intPrimTy, intPrimTy] intPrimTy
1059 primOpInfo ISrlOp
1060   = mkGenPrimOp SLIT("iShiftRL#") [] [intPrimTy, intPrimTy] intPrimTy
1061
1062 primOpInfo Int2WordOp = mkGenPrimOp SLIT("int2Word#") [] [intPrimTy] wordPrimTy
1063 primOpInfo Word2IntOp = mkGenPrimOp SLIT("word2Int#") [] [wordPrimTy] intPrimTy
1064 \end{code}
1065
1066 %************************************************************************
1067 %*                                                                      *
1068 \subsubsection[PrimOp-Addr]{PrimOpInfo for @Addr#@s}
1069 %*                                                                      *
1070 %************************************************************************
1071
1072 \begin{code}
1073 primOpInfo Int2AddrOp = mkGenPrimOp SLIT("int2Addr#") [] [intPrimTy] addrPrimTy
1074 primOpInfo Addr2IntOp = mkGenPrimOp SLIT("addr2Int#") [] [addrPrimTy] intPrimTy
1075 \end{code}
1076
1077
1078 %************************************************************************
1079 %*                                                                      *
1080 \subsubsection[PrimOp-Float]{PrimOpInfo for @Float#@s}
1081 %*                                                                      *
1082 %************************************************************************
1083
1084 @decodeFloat#@ is given w/ Integer-stuff (it's similar).
1085
1086 \begin{code}
1087 primOpInfo FloatAddOp   = mkDyadic    SLIT("plusFloat#")           floatPrimTy
1088 primOpInfo FloatSubOp   = mkDyadic    SLIT("minusFloat#")   floatPrimTy
1089 primOpInfo FloatMulOp   = mkDyadic    SLIT("timesFloat#")   floatPrimTy
1090 primOpInfo FloatDivOp   = mkDyadic    SLIT("divideFloat#")  floatPrimTy
1091 primOpInfo FloatNegOp   = mkMonadic   SLIT("negateFloat#")  floatPrimTy
1092
1093 primOpInfo Float2IntOp  = mkGenPrimOp SLIT("float2Int#") [] [floatPrimTy] intPrimTy
1094 primOpInfo Int2FloatOp  = mkGenPrimOp SLIT("int2Float#") [] [intPrimTy] floatPrimTy
1095
1096 primOpInfo FloatExpOp   = mkMonadic   SLIT("expFloat#")    floatPrimTy
1097 primOpInfo FloatLogOp   = mkMonadic   SLIT("logFloat#")    floatPrimTy
1098 primOpInfo FloatSqrtOp  = mkMonadic   SLIT("sqrtFloat#")           floatPrimTy
1099 primOpInfo FloatSinOp   = mkMonadic   SLIT("sinFloat#")    floatPrimTy
1100 primOpInfo FloatCosOp   = mkMonadic   SLIT("cosFloat#")    floatPrimTy
1101 primOpInfo FloatTanOp   = mkMonadic   SLIT("tanFloat#")    floatPrimTy
1102 primOpInfo FloatAsinOp  = mkMonadic   SLIT("asinFloat#")           floatPrimTy
1103 primOpInfo FloatAcosOp  = mkMonadic   SLIT("acosFloat#")           floatPrimTy
1104 primOpInfo FloatAtanOp  = mkMonadic   SLIT("atanFloat#")           floatPrimTy
1105 primOpInfo FloatSinhOp  = mkMonadic   SLIT("sinhFloat#")           floatPrimTy
1106 primOpInfo FloatCoshOp  = mkMonadic   SLIT("coshFloat#")           floatPrimTy
1107 primOpInfo FloatTanhOp  = mkMonadic   SLIT("tanhFloat#")           floatPrimTy
1108 primOpInfo FloatPowerOp = mkDyadic    SLIT("powerFloat#")   floatPrimTy
1109 \end{code}
1110
1111 %************************************************************************
1112 %*                                                                      *
1113 \subsubsection[PrimOp-Double]{PrimOpInfo for @Double#@s}
1114 %*                                                                      *
1115 %************************************************************************
1116
1117 @decodeDouble#@ is given w/ Integer-stuff (it's similar).
1118
1119 \begin{code}
1120 primOpInfo DoubleAddOp  = mkDyadic    SLIT("+##")   doublePrimTy
1121 primOpInfo DoubleSubOp  = mkDyadic    SLIT("-##")  doublePrimTy
1122 primOpInfo DoubleMulOp  = mkDyadic    SLIT("*##")  doublePrimTy
1123 primOpInfo DoubleDivOp  = mkDyadic    SLIT("/##") doublePrimTy
1124 primOpInfo DoubleNegOp  = mkMonadic   SLIT("negateDouble#") doublePrimTy
1125
1126 primOpInfo Double2IntOp     = mkGenPrimOp SLIT("double2Int#") [] [doublePrimTy] intPrimTy
1127 primOpInfo Int2DoubleOp     = mkGenPrimOp SLIT("int2Double#") [] [intPrimTy] doublePrimTy
1128
1129 primOpInfo Double2FloatOp   = mkGenPrimOp SLIT("double2Float#") [] [doublePrimTy] floatPrimTy
1130 primOpInfo Float2DoubleOp   = mkGenPrimOp SLIT("float2Double#") [] [floatPrimTy] doublePrimTy
1131
1132 primOpInfo DoubleExpOp  = mkMonadic   SLIT("expDouble#")           doublePrimTy
1133 primOpInfo DoubleLogOp  = mkMonadic   SLIT("logDouble#")           doublePrimTy
1134 primOpInfo DoubleSqrtOp = mkMonadic   SLIT("sqrtDouble#")   doublePrimTy
1135 primOpInfo DoubleSinOp  = mkMonadic   SLIT("sinDouble#")           doublePrimTy
1136 primOpInfo DoubleCosOp  = mkMonadic   SLIT("cosDouble#")           doublePrimTy
1137 primOpInfo DoubleTanOp  = mkMonadic   SLIT("tanDouble#")           doublePrimTy
1138 primOpInfo DoubleAsinOp = mkMonadic   SLIT("asinDouble#")   doublePrimTy
1139 primOpInfo DoubleAcosOp = mkMonadic   SLIT("acosDouble#")   doublePrimTy
1140 primOpInfo DoubleAtanOp = mkMonadic   SLIT("atanDouble#")   doublePrimTy
1141 primOpInfo DoubleSinhOp = mkMonadic   SLIT("sinhDouble#")   doublePrimTy
1142 primOpInfo DoubleCoshOp = mkMonadic   SLIT("coshDouble#")   doublePrimTy
1143 primOpInfo DoubleTanhOp = mkMonadic   SLIT("tanhDouble#")   doublePrimTy
1144 primOpInfo DoublePowerOp= mkDyadic    SLIT("**##")  doublePrimTy
1145 \end{code}
1146
1147 %************************************************************************
1148 %*                                                                      *
1149 \subsubsection[PrimOp-Integer]{PrimOpInfo for @Integer@ (and related!)}
1150 %*                                                                      *
1151 %************************************************************************
1152
1153 \begin{code}
1154 primOpInfo IntegerNegOp = integerMonadic SLIT("negateInteger#")
1155
1156 primOpInfo IntegerAddOp = integerDyadic SLIT("plusInteger#")
1157 primOpInfo IntegerSubOp = integerDyadic SLIT("minusInteger#")
1158 primOpInfo IntegerMulOp = integerDyadic SLIT("timesInteger#")
1159 primOpInfo IntegerGcdOp = integerDyadic SLIT("gcdInteger#")
1160
1161 primOpInfo IntegerCmpOp = integerCompare SLIT("cmpInteger#")
1162 primOpInfo IntegerCmpIntOp 
1163   = mkGenPrimOp SLIT("cmpIntegerInt#") [] an_Integer_and_Int_tys intPrimTy
1164
1165 primOpInfo IntegerQuotRemOp = integerDyadic2Results SLIT("quotRemInteger#")
1166 primOpInfo IntegerDivModOp  = integerDyadic2Results SLIT("divModInteger#")
1167
1168 primOpInfo Integer2IntOp
1169   = mkGenPrimOp SLIT("integer2Int#") [] one_Integer_ty intPrimTy
1170
1171 primOpInfo Integer2WordOp
1172   = mkGenPrimOp SLIT("integer2Word#") [] one_Integer_ty wordPrimTy
1173
1174 primOpInfo Int2IntegerOp
1175   = mkGenPrimOp SLIT("int2Integer#") [] [intPrimTy] 
1176         (unboxedPair one_Integer_ty)
1177
1178 primOpInfo Word2IntegerOp
1179   = mkGenPrimOp SLIT("word2Integer#") [] [wordPrimTy] 
1180         (unboxedPair one_Integer_ty)
1181
1182 primOpInfo Addr2IntegerOp
1183   = mkGenPrimOp SLIT("addr2Integer#") [] [addrPrimTy] 
1184         (unboxedPair one_Integer_ty)
1185
1186 primOpInfo IntegerToInt64Op
1187   = mkGenPrimOp SLIT("integerToInt64#") [] one_Integer_ty int64PrimTy
1188
1189 primOpInfo Int64ToIntegerOp
1190   = mkGenPrimOp SLIT("int64ToInteger#") [] [int64PrimTy]
1191         (unboxedPair one_Integer_ty)
1192
1193 primOpInfo Word64ToIntegerOp
1194   = mkGenPrimOp SLIT("word64ToInteger#") [] [word64PrimTy] 
1195         (unboxedPair one_Integer_ty)
1196
1197 primOpInfo IntegerToWord64Op
1198   = mkGenPrimOp SLIT("integerToWord64#") [] one_Integer_ty word64PrimTy
1199 \end{code}
1200
1201 Decoding of floating-point numbers is sorta Integer-related.  Encoding
1202 is done with plain ccalls now (see PrelNumExtra.lhs).
1203
1204 \begin{code}
1205 primOpInfo FloatDecodeOp
1206   = mkGenPrimOp SLIT("decodeFloat#") [] [floatPrimTy] 
1207         (unboxedTriple [intPrimTy, intPrimTy, byteArrayPrimTy])
1208 primOpInfo DoubleDecodeOp
1209   = mkGenPrimOp SLIT("decodeDouble#") [] [doublePrimTy] 
1210         (unboxedTriple [intPrimTy, intPrimTy, byteArrayPrimTy])
1211 \end{code}
1212
1213 %************************************************************************
1214 %*                                                                      *
1215 \subsubsection[PrimOp-Arrays]{PrimOpInfo for primitive arrays}
1216 %*                                                                      *
1217 %************************************************************************
1218
1219 \begin{verbatim}
1220 newArray#    :: Int# -> a -> State# s -> (# State# s, MutArr# s a #)
1221 newFooArray# :: Int# -> State# s -> (# State# s, MutByteArr# s #)
1222 \end{verbatim}
1223
1224 \begin{code}
1225 primOpInfo NewArrayOp
1226   = let {
1227         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1228         state = mkStatePrimTy s
1229     } in
1230     mkGenPrimOp SLIT("newArray#") [s_tv, elt_tv] 
1231         [intPrimTy, elt, state]
1232         (unboxedPair [state, mkMutableArrayPrimTy s elt])
1233
1234 primOpInfo (NewByteArrayOp kind)
1235   = let
1236         s = alphaTy; s_tv = alphaTyVar
1237
1238         op_str         = _PK_ ("new" ++ primRepString kind ++ "Array#")
1239         state = mkStatePrimTy s
1240     in
1241     mkGenPrimOp op_str [s_tv]
1242         [intPrimTy, state]
1243         (unboxedPair [state, mkMutableByteArrayPrimTy s])
1244
1245 ---------------------------------------------------------------------------
1246
1247 {-
1248 sameMutableArray#     :: MutArr# s a -> MutArr# s a -> Bool
1249 sameMutableByteArray# :: MutByteArr# s -> MutByteArr# s -> Bool
1250 -}
1251
1252 primOpInfo SameMutableArrayOp
1253   = let {
1254         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1255         mut_arr_ty = mkMutableArrayPrimTy s elt
1256     } in
1257     mkGenPrimOp SLIT("sameMutableArray#") [s_tv, elt_tv] [mut_arr_ty, mut_arr_ty]
1258                                    boolTy
1259
1260 primOpInfo SameMutableByteArrayOp
1261   = let {
1262         s = alphaTy; s_tv = alphaTyVar;
1263         mut_arr_ty = mkMutableByteArrayPrimTy s
1264     } in
1265     mkGenPrimOp SLIT("sameMutableByteArray#") [s_tv] [mut_arr_ty, mut_arr_ty]
1266                                    boolTy
1267
1268 ---------------------------------------------------------------------------
1269 -- Primitive arrays of Haskell pointers:
1270
1271 {-
1272 readArray#  :: MutArr# s a -> Int# -> State# s -> (# State# s, a #)
1273 writeArray# :: MutArr# s a -> Int# -> a -> State# s -> State# s
1274 indexArray# :: Array# a -> Int# -> (# a #)
1275 -}
1276
1277 primOpInfo ReadArrayOp
1278   = let {
1279         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1280         state = mkStatePrimTy s
1281     } in
1282     mkGenPrimOp SLIT("readArray#") [s_tv, elt_tv]
1283         [mkMutableArrayPrimTy s elt, intPrimTy, state]
1284         (unboxedPair [state, elt])
1285
1286
1287 primOpInfo WriteArrayOp
1288   = let {
1289         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1290     } in
1291     mkGenPrimOp SLIT("writeArray#") [s_tv, elt_tv]
1292         [mkMutableArrayPrimTy s elt, intPrimTy, elt, mkStatePrimTy s]
1293         (mkStatePrimTy s)
1294
1295 primOpInfo IndexArrayOp
1296   = let { elt = alphaTy; elt_tv = alphaTyVar } in
1297     mkGenPrimOp SLIT("indexArray#") [elt_tv] [mkArrayPrimTy elt, intPrimTy]
1298         (mkUnboxedTupleTy 1 [elt])
1299
1300 ---------------------------------------------------------------------------
1301 -- Primitive arrays full of unboxed bytes:
1302
1303 primOpInfo (ReadByteArrayOp kind)
1304   = let
1305         s = alphaTy; s_tv = alphaTyVar
1306
1307         op_str         = _PK_ ("read" ++ primRepString kind ++ "Array#")
1308         (tvs, prim_ty) = mkPrimTyApp betaTyVars kind
1309         state          = mkStatePrimTy s
1310     in
1311     mkGenPrimOp op_str (s_tv:tvs)
1312         [mkMutableByteArrayPrimTy s, intPrimTy, state]
1313         (unboxedPair [state, prim_ty])
1314
1315 primOpInfo (WriteByteArrayOp kind)
1316   = let
1317         s = alphaTy; s_tv = alphaTyVar
1318         op_str = _PK_ ("write" ++ primRepString kind ++ "Array#")
1319         (tvs, prim_ty) = mkPrimTyApp betaTyVars kind
1320     in
1321     mkGenPrimOp op_str (s_tv:tvs)
1322         [mkMutableByteArrayPrimTy s, intPrimTy, prim_ty, mkStatePrimTy s]
1323         (mkStatePrimTy s)
1324
1325 primOpInfo (IndexByteArrayOp kind)
1326   = let
1327         op_str = _PK_ ("index" ++ primRepString kind ++ "Array#")
1328         (tvs, prim_ty) = mkPrimTyApp alphaTyVars kind
1329     in
1330     mkGenPrimOp op_str tvs [byteArrayPrimTy, intPrimTy] prim_ty
1331
1332 primOpInfo (IndexOffForeignObjOp kind)
1333   = let
1334         op_str = _PK_ ("index" ++ primRepString kind ++ "OffForeignObj#")
1335         (tvs, prim_ty) = mkPrimTyApp alphaTyVars kind
1336     in
1337     mkGenPrimOp op_str tvs [foreignObjPrimTy, intPrimTy] prim_ty
1338
1339 primOpInfo (IndexOffAddrOp kind)
1340   = let
1341         op_str = _PK_ ("index" ++ primRepString kind ++ "OffAddr#")
1342         (tvs, prim_ty) = mkPrimTyApp alphaTyVars kind
1343     in
1344     mkGenPrimOp op_str tvs [addrPrimTy, intPrimTy] prim_ty
1345
1346 primOpInfo (WriteOffAddrOp kind)
1347   = let
1348         s = alphaTy; s_tv = alphaTyVar
1349         op_str = _PK_ ("write" ++ primRepString kind ++ "OffAddr#")
1350         (tvs, prim_ty) = mkPrimTyApp betaTyVars kind
1351     in
1352     mkGenPrimOp op_str (s_tv:tvs)
1353         [addrPrimTy, intPrimTy, prim_ty, mkStatePrimTy s]
1354         (mkStatePrimTy s)
1355
1356 ---------------------------------------------------------------------------
1357 {-
1358 unsafeFreezeArray#     :: MutArr# s a -> State# s -> (# State# s, Array# a #)
1359 unsafeFreezeByteArray# :: MutByteArr# s -> State# s -> (# State# s, ByteArray# #)
1360 unsafeThawArray#       :: Array# a -> State# s -> (# State# s, MutArr# s a #)
1361 unsafeThawByteArray#   :: ByteArray# -> State# s -> (# State# s, MutByteArr# s #)
1362 -}
1363
1364 primOpInfo UnsafeFreezeArrayOp
1365   = let {
1366         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1367         state = mkStatePrimTy s
1368     } in
1369     mkGenPrimOp SLIT("unsafeFreezeArray#") [s_tv, elt_tv]
1370         [mkMutableArrayPrimTy s elt, state]
1371         (unboxedPair [state, mkArrayPrimTy elt])
1372
1373 primOpInfo UnsafeFreezeByteArrayOp
1374   = let { 
1375         s = alphaTy; s_tv = alphaTyVar;
1376         state = mkStatePrimTy s
1377     } in
1378     mkGenPrimOp SLIT("unsafeFreezeByteArray#") [s_tv]
1379         [mkMutableByteArrayPrimTy s, state]
1380         (unboxedPair [state, byteArrayPrimTy])
1381
1382 primOpInfo UnsafeThawArrayOp
1383   = let {
1384         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1385         state = mkStatePrimTy s
1386     } in
1387     mkGenPrimOp SLIT("unsafeThawArray#") [s_tv, elt_tv]
1388         [mkArrayPrimTy elt, state]
1389         (unboxedPair [state, mkMutableArrayPrimTy s elt])
1390
1391 primOpInfo UnsafeThawByteArrayOp
1392   = let { 
1393         s = alphaTy; s_tv = alphaTyVar;
1394         state = mkStatePrimTy s
1395     } in
1396     mkGenPrimOp SLIT("unsafeThawByteArray#") [s_tv]
1397         [byteArrayPrimTy, state]
1398         (unboxedPair [state, mkMutableByteArrayPrimTy s])
1399
1400 ---------------------------------------------------------------------------
1401 primOpInfo SizeofByteArrayOp
1402   = mkGenPrimOp
1403         SLIT("sizeofByteArray#") []
1404         [byteArrayPrimTy]
1405         intPrimTy
1406
1407 primOpInfo SizeofMutableByteArrayOp
1408   = let { s = alphaTy; s_tv = alphaTyVar } in
1409     mkGenPrimOp
1410         SLIT("sizeofMutableByteArray#") [s_tv]
1411         [mkMutableByteArrayPrimTy s]
1412         intPrimTy
1413 \end{code}
1414
1415
1416 %************************************************************************
1417 %*                                                                      *
1418 \subsubsection[PrimOp-MutVars]{PrimOpInfo for mutable variable ops}
1419 %*                                                                      *
1420 %************************************************************************
1421
1422 \begin{code}
1423 primOpInfo NewMutVarOp
1424   = let {
1425         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1426         state = mkStatePrimTy s
1427     } in
1428     mkGenPrimOp SLIT("newMutVar#") [s_tv, elt_tv] 
1429         [elt, state]
1430         (unboxedPair [state, mkMutVarPrimTy s elt])
1431
1432 primOpInfo ReadMutVarOp
1433   = let {
1434         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1435         state = mkStatePrimTy s
1436     } in
1437     mkGenPrimOp SLIT("readMutVar#") [s_tv, elt_tv]
1438         [mkMutVarPrimTy s elt, state]
1439         (unboxedPair [state, elt])
1440
1441
1442 primOpInfo WriteMutVarOp
1443   = let {
1444         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1445     } in
1446     mkGenPrimOp SLIT("writeMutVar#") [s_tv, elt_tv]
1447         [mkMutVarPrimTy s elt, elt, mkStatePrimTy s]
1448         (mkStatePrimTy s)
1449
1450 primOpInfo SameMutVarOp
1451   = let {
1452         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1453         mut_var_ty = mkMutVarPrimTy s elt
1454     } in
1455     mkGenPrimOp SLIT("sameMutVar#") [s_tv, elt_tv] [mut_var_ty, mut_var_ty]
1456                                    boolTy
1457 \end{code}
1458
1459 %************************************************************************
1460 %*                                                                      *
1461 \subsubsection[PrimOp-Exceptions]{PrimOpInfo for exceptions}
1462 %*                                                                      *
1463 %************************************************************************
1464
1465 catch  :: IO a -> (IOError -> IO a) -> IO a
1466 catch# :: a  -> (b -> a) -> a
1467
1468 \begin{code}
1469 primOpInfo CatchOp   
1470   = let
1471         a = alphaTy; a_tv = alphaTyVar
1472         b = betaTy;  b_tv = betaTyVar;
1473     in
1474     mkGenPrimOp SLIT("catch#") [a_tv, b_tv] [a, mkFunTy b a] a
1475
1476 primOpInfo RaiseOp
1477   = let
1478         a = alphaTy; a_tv = alphaTyVar
1479         b = betaTy;  b_tv = betaTyVar;
1480     in
1481     mkGenPrimOp SLIT("raise#") [a_tv, b_tv] [a] b
1482 \end{code}
1483
1484 %************************************************************************
1485 %*                                                                      *
1486 \subsubsection[PrimOp-MVars]{PrimOpInfo for synchronizing Variables}
1487 %*                                                                      *
1488 %************************************************************************
1489
1490 \begin{code}
1491 primOpInfo NewMVarOp
1492   = let
1493         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1494         state = mkStatePrimTy s
1495     in
1496     mkGenPrimOp SLIT("newMVar#") [s_tv, elt_tv] [state]
1497         (unboxedPair [state, mkMVarPrimTy s elt])
1498
1499 primOpInfo TakeMVarOp
1500   = let
1501         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1502         state = mkStatePrimTy s
1503     in
1504     mkGenPrimOp SLIT("takeMVar#") [s_tv, elt_tv]
1505         [mkMVarPrimTy s elt, state]
1506         (unboxedPair [state, elt])
1507
1508 primOpInfo PutMVarOp
1509   = let
1510         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1511     in
1512     mkGenPrimOp SLIT("putMVar#") [s_tv, elt_tv]
1513         [mkMVarPrimTy s elt, elt, mkStatePrimTy s]
1514         (mkStatePrimTy s)
1515
1516 primOpInfo SameMVarOp
1517   = let
1518         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1519         mvar_ty = mkMVarPrimTy s elt
1520     in
1521     mkGenPrimOp SLIT("sameMVar#") [s_tv, elt_tv] [mvar_ty, mvar_ty] boolTy
1522
1523 primOpInfo IsEmptyMVarOp
1524   = let
1525         elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1526         state = mkStatePrimTy s
1527     in
1528     mkGenPrimOp SLIT("isEmptyMVar#") [s_tv, elt_tv]
1529         [mkMVarPrimTy s elt, mkStatePrimTy s]
1530         (unboxedPair [state, intPrimTy])
1531
1532 \end{code}
1533
1534 %************************************************************************
1535 %*                                                                      *
1536 \subsubsection[PrimOp-Wait]{PrimOpInfo for delay/wait operations}
1537 %*                                                                      *
1538 %************************************************************************
1539
1540 \begin{code}
1541
1542 primOpInfo DelayOp
1543   = let {
1544         s = alphaTy; s_tv = alphaTyVar
1545     } in
1546     mkGenPrimOp SLIT("delay#") [s_tv]
1547         [intPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1548
1549 primOpInfo WaitReadOp
1550   = let {
1551         s = alphaTy; s_tv = alphaTyVar
1552     } in
1553     mkGenPrimOp SLIT("waitRead#") [s_tv]
1554         [intPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1555
1556 primOpInfo WaitWriteOp
1557   = let {
1558         s = alphaTy; s_tv = alphaTyVar
1559     } in
1560     mkGenPrimOp SLIT("waitWrite#") [s_tv]
1561         [intPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1562 \end{code}
1563
1564 %************************************************************************
1565 %*                                                                      *
1566 \subsubsection[PrimOp-Concurrency]{Concurrency Primitives}
1567 %*                                                                      *
1568 %************************************************************************
1569
1570 \begin{code}
1571 -- fork# :: a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1572 primOpInfo ForkOp       
1573   = mkGenPrimOp SLIT("fork#") [alphaTyVar] 
1574         [alphaTy, realWorldStatePrimTy]
1575         (unboxedPair [realWorldStatePrimTy, threadIdPrimTy])
1576
1577 -- killThread# :: ThreadId# -> exception -> State# RealWorld -> State# RealWorld
1578 primOpInfo KillThreadOp
1579   = mkGenPrimOp SLIT("killThread#") [alphaTyVar] 
1580         [threadIdPrimTy, alphaTy, realWorldStatePrimTy]
1581         realWorldStatePrimTy
1582
1583 -- yield# :: State# RealWorld -> State# RealWorld
1584 primOpInfo YieldOp
1585   = mkGenPrimOp SLIT("yield#") [] 
1586         [realWorldStatePrimTy]
1587         realWorldStatePrimTy
1588
1589 -- myThreadId# :: State# RealWorld -> (# State# RealWorld, ThreadId# #)
1590 primOpInfo MyThreadIdOp
1591   = mkGenPrimOp SLIT("myThreadId#") [] 
1592         [realWorldStatePrimTy]
1593         (unboxedPair [realWorldStatePrimTy, threadIdPrimTy])
1594 \end{code}
1595
1596 ************************************************************************
1597 %*                                                                      *
1598 \subsubsection[PrimOps-Foreign]{PrimOpInfo for Foreign Objects}
1599 %*                                                                      *
1600 %************************************************************************
1601
1602 \begin{code}
1603 primOpInfo MakeForeignObjOp
1604   = mkGenPrimOp SLIT("makeForeignObj#") [] 
1605         [addrPrimTy, realWorldStatePrimTy] 
1606         (unboxedPair [realWorldStatePrimTy, foreignObjPrimTy])
1607
1608 primOpInfo WriteForeignObjOp
1609  = let {
1610         s = alphaTy; s_tv = alphaTyVar
1611     } in
1612    mkGenPrimOp SLIT("writeForeignObj#") [s_tv]
1613         [foreignObjPrimTy, addrPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1614 \end{code}
1615
1616 ************************************************************************
1617 %*                                                                      *
1618 \subsubsection[PrimOps-Weak]{PrimOpInfo for Weak Pointers}
1619 %*                                                                      *
1620 %************************************************************************
1621
1622 A @Weak@ Pointer is created by the @mkWeak#@ primitive:
1623
1624         mkWeak# :: k -> v -> f -> State# RealWorld 
1625                         -> (# State# RealWorld, Weak# v #)
1626
1627 In practice, you'll use the higher-level
1628
1629         data Weak v = Weak# v
1630         mkWeak :: k -> v -> IO () -> IO (Weak v)
1631
1632 \begin{code}
1633 primOpInfo MkWeakOp
1634   = mkGenPrimOp SLIT("mkWeak#") [alphaTyVar, betaTyVar, gammaTyVar] 
1635         [alphaTy, betaTy, gammaTy, realWorldStatePrimTy]
1636         (unboxedPair [realWorldStatePrimTy, mkWeakPrimTy betaTy])
1637 \end{code}
1638
1639 The following operation dereferences a weak pointer.  The weak pointer
1640 may have been finalized, so the operation returns a result code which
1641 must be inspected before looking at the dereferenced value.
1642
1643         deRefWeak# :: Weak# v -> State# RealWorld ->
1644                         (# State# RealWorld, v, Int# #)
1645
1646 Only look at v if the Int# returned is /= 0 !!
1647
1648 The higher-level op is
1649
1650         deRefWeak :: Weak v -> IO (Maybe v)
1651
1652 \begin{code}
1653 primOpInfo DeRefWeakOp
1654  = mkGenPrimOp SLIT("deRefWeak#") [alphaTyVar]
1655         [mkWeakPrimTy alphaTy, realWorldStatePrimTy]
1656         (unboxedTriple [realWorldStatePrimTy, intPrimTy, alphaTy])
1657 \end{code}
1658
1659 Weak pointers can be finalized early by using the finalize# operation:
1660         
1661         finalizeWeak# :: Weak# v -> State# RealWorld -> 
1662                            (# State# RealWorld, Int#, IO () #)
1663
1664 The Int# returned is either
1665
1666         0 if the weak pointer has already been finalized, or it has no
1667           finalizer (the third component is then invalid).
1668
1669         1 if the weak pointer is still alive, with the finalizer returned
1670           as the third component.
1671
1672 \begin{code}
1673 primOpInfo FinalizeWeakOp
1674  = mkGenPrimOp SLIT("finalizeWeak#") [alphaTyVar]
1675         [mkWeakPrimTy alphaTy, realWorldStatePrimTy]
1676         (unboxedTriple [realWorldStatePrimTy, intPrimTy,
1677                         mkFunTy realWorldStatePrimTy 
1678                           (unboxedPair [realWorldStatePrimTy,unitTy])])
1679 \end{code}
1680
1681 %************************************************************************
1682 %*                                                                      *
1683 \subsubsection[PrimOp-stable-pointers]{PrimOpInfo for stable pointers and stable names}
1684 %*                                                                      *
1685 %************************************************************************
1686
1687 A {\em stable name/pointer} is an index into a table of stable name
1688 entries.  Since the garbage collector is told about stable pointers,
1689 it is safe to pass a stable pointer to external systems such as C
1690 routines.
1691
1692 \begin{verbatim}
1693 makeStablePtr#  :: a -> State# RealWorld -> (# State# RealWorld, StablePtr# a #)
1694 freeStablePtr   :: StablePtr# a -> State# RealWorld -> State# RealWorld
1695 deRefStablePtr# :: StablePtr# a -> State# RealWorld -> (# State# RealWorld, a #)
1696 eqStablePtr#    :: StablePtr# a -> StablePtr# a -> Int#
1697 \end{verbatim}
1698
1699 It may seem a bit surprising that @makeStablePtr#@ is a @IO@
1700 operation since it doesn't (directly) involve IO operations.  The
1701 reason is that if some optimisation pass decided to duplicate calls to
1702 @makeStablePtr#@ and we only pass one of the stable pointers over, a
1703 massive space leak can result.  Putting it into the IO monad
1704 prevents this.  (Another reason for putting them in a monad is to
1705 ensure correct sequencing wrt the side-effecting @freeStablePtr@
1706 operation.)
1707
1708 An important property of stable pointers is that if you call
1709 makeStablePtr# twice on the same object you get the same stable
1710 pointer back.
1711
1712 Note that we can implement @freeStablePtr#@ using @_ccall_@ (and,
1713 besides, it's not likely to be used from Haskell) so it's not a
1714 primop.
1715
1716 Question: Why @RealWorld@ - won't any instance of @_ST@ do the job? [ADR]
1717
1718 Stable Names
1719 ~~~~~~~~~~~~
1720
1721 A stable name is like a stable pointer, but with three important differences:
1722
1723         (a) You can't deRef one to get back to the original object.
1724         (b) You can convert one to an Int.
1725         (c) You don't need to 'freeStableName'
1726
1727 The existence of a stable name doesn't guarantee to keep the object it
1728 points to alive (unlike a stable pointer), hence (a).
1729
1730 Invariants:
1731         
1732         (a) makeStableName always returns the same value for a given
1733             object (same as stable pointers).
1734
1735         (b) if two stable names are equal, it implies that the objects
1736             from which they were created were the same.
1737
1738         (c) stableNameToInt always returns the same Int for a given
1739             stable name.
1740
1741 \begin{code}
1742 primOpInfo MakeStablePtrOp
1743   = mkGenPrimOp SLIT("makeStablePtr#") [alphaTyVar]
1744         [alphaTy, realWorldStatePrimTy]
1745         (unboxedPair [realWorldStatePrimTy, 
1746                         mkTyConApp stablePtrPrimTyCon [alphaTy]])
1747
1748 primOpInfo DeRefStablePtrOp
1749   = mkGenPrimOp SLIT("deRefStablePtr#") [alphaTyVar]
1750         [mkStablePtrPrimTy alphaTy, realWorldStatePrimTy]
1751         (unboxedPair [realWorldStatePrimTy, alphaTy])
1752
1753 primOpInfo EqStablePtrOp
1754   = mkGenPrimOp SLIT("eqStablePtr#") [alphaTyVar, betaTyVar]
1755         [mkStablePtrPrimTy alphaTy, mkStablePtrPrimTy betaTy]
1756         intPrimTy
1757
1758 primOpInfo MakeStableNameOp
1759   = mkGenPrimOp SLIT("makeStableName#") [alphaTyVar]
1760         [alphaTy, realWorldStatePrimTy]
1761         (unboxedPair [realWorldStatePrimTy, 
1762                         mkTyConApp stableNamePrimTyCon [alphaTy]])
1763
1764 primOpInfo EqStableNameOp
1765   = mkGenPrimOp SLIT("eqStableName#") [alphaTyVar, betaTyVar]
1766         [mkStableNamePrimTy alphaTy, mkStableNamePrimTy betaTy]
1767         intPrimTy
1768
1769 primOpInfo StableNameToIntOp
1770   = mkGenPrimOp SLIT("stableNameToInt#") [alphaTyVar]
1771         [mkStableNamePrimTy alphaTy]
1772         intPrimTy
1773 \end{code}
1774
1775 %************************************************************************
1776 %*                                                                      *
1777 \subsubsection[PrimOp-unsafePointerEquality]{PrimOpInfo for Pointer Equality}
1778 %*                                                                      *
1779 %************************************************************************
1780
1781 [Alastair Reid is to blame for this!]
1782
1783 These days, (Glasgow) Haskell seems to have a bit of everything from
1784 other languages: strict operations, mutable variables, sequencing,
1785 pointers, etc.  About the only thing left is LISP's ability to test
1786 for pointer equality.  So, let's add it in!
1787
1788 \begin{verbatim}
1789 reallyUnsafePtrEquality :: a -> a -> Int#
1790 \end{verbatim}
1791
1792 which tests any two closures (of the same type) to see if they're the
1793 same.  (Returns $0$ for @False@, $\neq 0$ for @True@ - to avoid
1794 difficulties of trying to box up the result.)
1795
1796 NB This is {\em really unsafe\/} because even something as trivial as
1797 a garbage collection might change the answer by removing indirections.
1798 Still, no-one's forcing you to use it.  If you're worried about little
1799 things like loss of referential transparency, you might like to wrap
1800 it all up in a monad-like thing as John O'Donnell and John Hughes did
1801 for non-determinism (1989 (Fraserburgh) Glasgow FP Workshop
1802 Proceedings?)
1803
1804 I'm thinking of using it to speed up a critical equality test in some
1805 graphics stuff in a context where the possibility of saying that
1806 denotationally equal things aren't isn't a problem (as long as it
1807 doesn't happen too often.)  ADR
1808
1809 To Will: Jim said this was already in, but I can't see it so I'm
1810 adding it.  Up to you whether you add it.  (Note that this could have
1811 been readily implemented using a @veryDangerousCCall@ before they were
1812 removed...)
1813
1814 \begin{code}
1815 primOpInfo ReallyUnsafePtrEqualityOp
1816   = mkGenPrimOp SLIT("reallyUnsafePtrEquality#") [alphaTyVar]
1817         [alphaTy, alphaTy] intPrimTy
1818 \end{code}
1819
1820 %************************************************************************
1821 %*                                                                      *
1822 \subsubsection[PrimOp-parallel]{PrimOpInfo for parallelism op(s)}
1823 %*                                                                      *
1824 %************************************************************************
1825
1826 \begin{code}
1827 primOpInfo SeqOp        -- seq# :: a -> Int#
1828   = mkGenPrimOp SLIT("seq#")    [alphaTyVar] [alphaTy] intPrimTy
1829
1830 primOpInfo ParOp        -- par# :: a -> Int#
1831   = mkGenPrimOp SLIT("par#")    [alphaTyVar] [alphaTy] intPrimTy
1832 \end{code}
1833
1834 \begin{code}
1835 -- HWL: The first 4 Int# in all par... annotations denote:
1836 --   name, granularity info, size of result, degree of parallelism
1837 --      Same  structure as _seq_ i.e. returns Int#
1838 -- KSW: v, the second arg in parAt# and parAtForNow#, is used only to determine
1839 --   `the processor containing the expression v'; it is not evaluated
1840
1841 primOpInfo ParGlobalOp  -- parGlobal# :: a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1842   = mkGenPrimOp SLIT("parGlobal#")      [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1843
1844 primOpInfo ParLocalOp   -- parLocal# :: a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1845   = mkGenPrimOp SLIT("parLocal#")       [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1846
1847 primOpInfo ParAtOp      -- parAt# :: a -> v -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1848   = mkGenPrimOp SLIT("parAt#")  [alphaTyVar,betaTyVar,gammaTyVar] [betaTy,alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,gammaTy] intPrimTy
1849
1850 primOpInfo ParAtAbsOp   -- parAtAbs# :: a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1851   = mkGenPrimOp SLIT("parAtAbs#")       [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1852
1853 primOpInfo ParAtRelOp   -- parAtRel# :: a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1854   = mkGenPrimOp SLIT("parAtRel#")       [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1855
1856 primOpInfo ParAtForNowOp -- parAtForNow# :: a -> v -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1857   = mkGenPrimOp SLIT("parAtForNow#")    [alphaTyVar,betaTyVar,gammaTyVar] [betaTy,alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,gammaTy] intPrimTy
1858
1859 primOpInfo CopyableOp   -- copyable# :: a -> Int#
1860   = mkGenPrimOp SLIT("copyable#")       [alphaTyVar] [alphaTy] intPrimTy
1861
1862 primOpInfo NoFollowOp   -- noFollow# :: a -> Int#
1863   = mkGenPrimOp SLIT("noFollow#")       [alphaTyVar] [alphaTy] intPrimTy
1864 \end{code}
1865
1866 %************************************************************************
1867 %*                                                                      *
1868 \subsubsection[PrimOp-IO-etc]{PrimOpInfo for C calls, and I/O-ish things}
1869 %*                                                                      *
1870 %************************************************************************
1871
1872 \begin{code}
1873 primOpInfo (CCallOp _ _ _ _)
1874      = mkGenPrimOp SLIT("ccall#") [alphaTyVar] [] alphaTy
1875
1876 {-
1877 primOpInfo (CCallOp _ _ _ _ arg_tys result_ty)
1878   = mkGenPrimOp SLIT("ccall#") [] arg_tys result_tycon tys_applied
1879   where
1880     (result_tycon, tys_applied, _) = splitAlgTyConApp result_ty
1881 -}
1882 \end{code}
1883
1884 %************************************************************************
1885 %*                                                                      *
1886 \subsubsection[PrimOp-tag]{PrimOpInfo for @dataToTag#@ and @tagToEnum#@}
1887 %*                                                                      *
1888 %************************************************************************
1889
1890 These primops are pretty wierd.
1891
1892         dataToTag# :: a -> Int    (arg must be an evaluated data type)
1893         tagToEnum# :: Int -> a    (result type must be an enumerated type)
1894
1895 The constraints aren't currently checked by the front end, but the
1896 code generator will fall over if they aren't satisfied.
1897
1898 \begin{code}
1899 primOpInfo DataToTagOp
1900   = mkGenPrimOp SLIT("dataToTag#") [alphaTyVar] [alphaTy] intPrimTy
1901
1902 primOpInfo TagToEnumOp
1903   = mkGenPrimOp SLIT("tagToEnum#") [alphaTyVar] [intPrimTy] alphaTy
1904
1905 #ifdef DEBUG
1906 primOpInfo op = panic ("primOpInfo:"++ show (I# (tagOf_PrimOp op)))
1907 #endif
1908 \end{code}
1909
1910 %************************************************************************
1911 %*                                                                      *
1912 \subsubsection[PrimOp-ool]{Which PrimOps are out-of-line}
1913 %*                                                                      *
1914 %************************************************************************
1915
1916 Some PrimOps need to be called out-of-line because they either need to
1917 perform a heap check or they block.
1918
1919 \begin{code}
1920 primOpOutOfLine op
1921   = case op of
1922         TakeMVarOp              -> True
1923         PutMVarOp               -> True
1924         DelayOp                 -> True
1925         WaitReadOp              -> True
1926         WaitWriteOp             -> True
1927         CatchOp                 -> True
1928         RaiseOp                 -> True
1929         NewArrayOp              -> True
1930         NewByteArrayOp _        -> True
1931         IntegerAddOp            -> True
1932         IntegerSubOp            -> True
1933         IntegerMulOp            -> True
1934         IntegerGcdOp            -> True
1935         IntegerQuotRemOp        -> True
1936         IntegerDivModOp         -> True
1937         Int2IntegerOp           -> True
1938         Word2IntegerOp          -> True
1939         Addr2IntegerOp          -> True
1940         Word64ToIntegerOp       -> True
1941         Int64ToIntegerOp        -> True
1942         FloatDecodeOp           -> True
1943         DoubleDecodeOp          -> True
1944         MkWeakOp                -> True
1945         FinalizeWeakOp          -> True
1946         MakeStableNameOp        -> True
1947         MakeForeignObjOp        -> True
1948         NewMutVarOp             -> True
1949         NewMVarOp               -> True
1950         ForkOp                  -> True
1951         KillThreadOp            -> True
1952         YieldOp                 -> True
1953         CCallOp _ _ may_gc@True _ -> True       -- _ccall_GC_
1954           -- the next one doesn't perform any heap checks,
1955           -- but it is of such an esoteric nature that
1956           -- it is done out-of-line rather than require
1957           -- the NCG to implement it.
1958         UnsafeThawArrayOp       -> True
1959         _                       -> False
1960 \end{code}
1961
1962 Sometimes we may choose to execute a PrimOp even though it isn't
1963 certain that its result will be required; ie execute them
1964 ``speculatively''.  The same thing as ``cheap eagerness.'' Usually
1965 this is OK, because PrimOps are usually cheap, but it isn't OK for
1966 (a)~expensive PrimOps and (b)~PrimOps which can fail.
1967
1968 See also @primOpIsCheap@ (below).
1969
1970 PrimOps that have side effects also should not be executed speculatively
1971 or by data dependencies.
1972
1973 \begin{code}
1974 primOpOkForSpeculation :: PrimOp -> Bool
1975 primOpOkForSpeculation op 
1976   = not (primOpCanFail op || primOpHasSideEffects op || primOpOutOfLine op)
1977 \end{code}
1978
1979 @primOpIsCheap@, as used in \tr{SimplUtils.lhs}.  For now (HACK
1980 WARNING), we just borrow some other predicates for a
1981 what-should-be-good-enough test.  "Cheap" means willing to call it more
1982 than once.  Evaluation order is unaffected.
1983
1984 \begin{code}
1985 primOpIsCheap op = not (primOpHasSideEffects op || primOpOutOfLine op)
1986 \end{code}
1987
1988 primOpIsDupable means that the use of the primop is small enough to
1989 duplicate into different case branches.  See CoreUtils.exprIsDupable.
1990
1991 \begin{code}
1992 primOpIsDupable (CCallOp _ _ _ _) = False
1993 primOpIsDupable op                = not (primOpOutOfLine op)
1994 \end{code}
1995
1996
1997 \begin{code}
1998 primOpCanFail :: PrimOp -> Bool
1999 -- Int.
2000 primOpCanFail IntQuotOp = True          -- Divide by zero
2001 primOpCanFail IntRemOp          = True          -- Divide by zero
2002
2003 -- Integer
2004 primOpCanFail IntegerQuotRemOp = True           -- Divide by zero
2005 primOpCanFail IntegerDivModOp   = True          -- Divide by zero
2006
2007 -- Float.  ToDo: tan? tanh?
2008 primOpCanFail FloatDivOp        = True          -- Divide by zero
2009 primOpCanFail FloatLogOp        = True          -- Log of zero
2010 primOpCanFail FloatAsinOp       = True          -- Arg out of domain
2011 primOpCanFail FloatAcosOp       = True          -- Arg out of domain
2012
2013 -- Double.  ToDo: tan? tanh?
2014 primOpCanFail DoubleDivOp       = True          -- Divide by zero
2015 primOpCanFail DoubleLogOp       = True          -- Log of zero
2016 primOpCanFail DoubleAsinOp      = True          -- Arg out of domain
2017 primOpCanFail DoubleAcosOp      = True          -- Arg out of domain
2018
2019 primOpCanFail other_op          = False
2020 \end{code}
2021
2022 And some primops have side-effects and so, for example, must not be
2023 duplicated.
2024
2025 \begin{code}
2026 primOpHasSideEffects :: PrimOp -> Bool
2027
2028 primOpHasSideEffects TakeMVarOp        = True
2029 primOpHasSideEffects DelayOp           = True
2030 primOpHasSideEffects WaitReadOp        = True
2031 primOpHasSideEffects WaitWriteOp       = True
2032
2033 primOpHasSideEffects ParOp             = True
2034 primOpHasSideEffects ForkOp            = True
2035 primOpHasSideEffects KillThreadOp      = True
2036 primOpHasSideEffects YieldOp           = True
2037 primOpHasSideEffects SeqOp             = True
2038
2039 primOpHasSideEffects MakeForeignObjOp  = True
2040 primOpHasSideEffects WriteForeignObjOp = True
2041 primOpHasSideEffects MkWeakOp          = True
2042 primOpHasSideEffects DeRefWeakOp       = True
2043 primOpHasSideEffects FinalizeWeakOp    = True
2044 primOpHasSideEffects MakeStablePtrOp   = True
2045 primOpHasSideEffects MakeStableNameOp  = True
2046 primOpHasSideEffects EqStablePtrOp     = True  -- SOF
2047 primOpHasSideEffects DeRefStablePtrOp  = True  -- ??? JSM & ADR
2048
2049 primOpHasSideEffects ParGlobalOp        = True
2050 primOpHasSideEffects ParLocalOp         = True
2051 primOpHasSideEffects ParAtOp            = True
2052 primOpHasSideEffects ParAtAbsOp         = True
2053 primOpHasSideEffects ParAtRelOp         = True
2054 primOpHasSideEffects ParAtForNowOp      = True
2055 primOpHasSideEffects CopyableOp         = True  -- Possibly not.  ASP 
2056 primOpHasSideEffects NoFollowOp         = True  -- Possibly not.  ASP
2057
2058 -- CCall
2059 primOpHasSideEffects (CCallOp   _ _ _ _) = True
2060
2061 primOpHasSideEffects other = False
2062 \end{code}
2063
2064 Inline primitive operations that perform calls need wrappers to save
2065 any live variables that are stored in caller-saves registers.
2066
2067 \begin{code}
2068 primOpNeedsWrapper :: PrimOp -> Bool
2069
2070 primOpNeedsWrapper (CCallOp _ _ _ _)    = True
2071
2072 primOpNeedsWrapper Integer2IntOp        = True
2073 primOpNeedsWrapper Integer2WordOp       = True
2074 primOpNeedsWrapper IntegerCmpOp         = True
2075 primOpNeedsWrapper IntegerCmpIntOp      = True
2076
2077 primOpNeedsWrapper FloatExpOp           = True
2078 primOpNeedsWrapper FloatLogOp           = True
2079 primOpNeedsWrapper FloatSqrtOp          = True
2080 primOpNeedsWrapper FloatSinOp           = True
2081 primOpNeedsWrapper FloatCosOp           = True
2082 primOpNeedsWrapper FloatTanOp           = True
2083 primOpNeedsWrapper FloatAsinOp          = True
2084 primOpNeedsWrapper FloatAcosOp          = True
2085 primOpNeedsWrapper FloatAtanOp          = True
2086 primOpNeedsWrapper FloatSinhOp          = True
2087 primOpNeedsWrapper FloatCoshOp          = True
2088 primOpNeedsWrapper FloatTanhOp          = True
2089 primOpNeedsWrapper FloatPowerOp         = True
2090
2091 primOpNeedsWrapper DoubleExpOp          = True
2092 primOpNeedsWrapper DoubleLogOp          = True
2093 primOpNeedsWrapper DoubleSqrtOp         = True
2094 primOpNeedsWrapper DoubleSinOp          = True
2095 primOpNeedsWrapper DoubleCosOp          = True
2096 primOpNeedsWrapper DoubleTanOp          = True
2097 primOpNeedsWrapper DoubleAsinOp         = True
2098 primOpNeedsWrapper DoubleAcosOp         = True
2099 primOpNeedsWrapper DoubleAtanOp         = True
2100 primOpNeedsWrapper DoubleSinhOp         = True
2101 primOpNeedsWrapper DoubleCoshOp         = True
2102 primOpNeedsWrapper DoubleTanhOp         = True
2103 primOpNeedsWrapper DoublePowerOp        = True
2104
2105 primOpNeedsWrapper MakeStableNameOp     = True
2106 primOpNeedsWrapper DeRefStablePtrOp     = True
2107
2108 primOpNeedsWrapper DelayOp              = True
2109 primOpNeedsWrapper WaitReadOp           = True
2110 primOpNeedsWrapper WaitWriteOp          = True
2111
2112 primOpNeedsWrapper other_op             = False
2113 \end{code}
2114
2115 \begin{code}
2116 primOpType :: PrimOp -> Type  -- you may want to use primOpSig instead
2117 primOpType op
2118   = case (primOpInfo op) of
2119       Dyadic occ ty ->      dyadic_fun_ty ty
2120       Monadic occ ty ->     monadic_fun_ty ty
2121       Compare occ ty ->     compare_fun_ty ty
2122
2123       GenPrimOp occ tyvars arg_tys res_ty -> 
2124         mkForAllTys tyvars (mkFunTys arg_tys res_ty)
2125
2126 mkPrimOpIdName :: PrimOp -> Id -> Name
2127         -- Make the name for the PrimOp's Id
2128         -- We have to pass in the Id itself because it's a WiredInId
2129         -- and hence recursive
2130 mkPrimOpIdName op id
2131   = mkWiredInIdName key pREL_GHC occ_name id
2132   where
2133     occ_name = primOpOcc op
2134     key      = mkPrimOpIdUnique (IBOX(tagOf_PrimOp op))
2135
2136
2137 primOpRdrName :: PrimOp -> RdrName 
2138 primOpRdrName op = mkRdrQual pREL_GHC_Name (primOpOcc op)
2139
2140 primOpOcc :: PrimOp -> OccName
2141 primOpOcc op = case (primOpInfo op) of
2142                               Dyadic    occ _     -> occ
2143                               Monadic   occ _     -> occ
2144                               Compare   occ _     -> occ
2145                               GenPrimOp occ _ _ _ -> occ
2146
2147 -- primOpSig is like primOpType but gives the result split apart:
2148 -- (type variables, argument types, result type)
2149
2150 primOpSig :: PrimOp -> ([TyVar],[Type],Type)
2151 primOpSig op
2152   = case (primOpInfo op) of
2153       Monadic   occ ty -> ([],     [ty],    ty    )
2154       Dyadic    occ ty -> ([],     [ty,ty], ty    )
2155       Compare   occ ty -> ([],     [ty,ty], boolTy)
2156       GenPrimOp occ tyvars arg_tys res_ty
2157                        -> (tyvars, arg_tys, res_ty)
2158
2159 -- primOpUsg is like primOpSig but the types it yields are the
2160 -- appropriate sigma (i.e., usage-annotated) types,
2161 -- as required by the UsageSP inference.
2162
2163 primOpUsg :: PrimOp -> ([TyVar],[Type],Type)
2164 primOpUsg op
2165   = case op of
2166
2167       -- Refer to comment by `otherwise' clause; we need consider here
2168       -- *only* primops that have arguments or results containing Haskell
2169       -- pointers (things that are pointed).  Unpointed values are
2170       -- irrelevant to the usage analysis.  The issue is whether pointed
2171       -- values may be entered or duplicated by the primop.
2172
2173       -- Remember that primops are *never* partially applied.
2174
2175       NewArrayOp           -> mangle [mkP, mkM, mkP     ] mkM
2176       SameMutableArrayOp   -> mangle [mkP, mkP          ] mkM
2177       ReadArrayOp          -> mangle [mkM, mkP, mkP     ] mkM
2178       WriteArrayOp         -> mangle [mkM, mkP, mkM, mkP] mkR
2179       IndexArrayOp         -> mangle [mkM, mkP          ] mkM
2180       UnsafeFreezeArrayOp  -> mangle [mkM, mkP          ] mkM
2181       UnsafeThawArrayOp    -> mangle [mkM, mkP          ] mkM
2182
2183       NewMutVarOp          -> mangle [mkM, mkP          ] mkM
2184       ReadMutVarOp         -> mangle [mkM, mkP          ] mkM
2185       WriteMutVarOp        -> mangle [mkM, mkM, mkP     ] mkR
2186       SameMutVarOp         -> mangle [mkP, mkP          ] mkM
2187
2188       CatchOp              -> --     [mkO, mkO . (inFun mkM mkO)] mkO
2189                               mangle [mkM, mkM . (inFun mkM mkM)] mkM
2190                               -- might use caught action multiply
2191       RaiseOp              -> mangle [mkM               ] mkM
2192
2193       NewMVarOp            -> mangle [mkP               ] mkR
2194       TakeMVarOp           -> mangle [mkM, mkP          ] mkM
2195       PutMVarOp            -> mangle [mkM, mkM, mkP     ] mkR
2196       SameMVarOp           -> mangle [mkP, mkP          ] mkM
2197       IsEmptyMVarOp        -> mangle [mkP, mkP          ] mkM
2198
2199       ForkOp               -> mangle [mkO, mkP          ] mkR
2200       KillThreadOp         -> mangle [mkP, mkM, mkP     ] mkR
2201
2202       MkWeakOp             -> mangle [mkZ, mkM, mkM, mkP] mkM
2203       DeRefWeakOp          -> mangle [mkM, mkP          ] mkM
2204       FinalizeWeakOp       -> mangle [mkM, mkP          ] (mkR . (inUB [id,id,inFun mkR mkM]))
2205
2206       MakeStablePtrOp      -> mangle [mkM, mkP          ] mkM
2207       DeRefStablePtrOp     -> mangle [mkM, mkP          ] mkM
2208       EqStablePtrOp        -> mangle [mkP, mkP          ] mkR
2209       MakeStableNameOp     -> mangle [mkZ, mkP          ] mkR
2210       EqStableNameOp       -> mangle [mkP, mkP          ] mkR
2211       StableNameToIntOp    -> mangle [mkP               ] mkR
2212
2213       ReallyUnsafePtrEqualityOp -> mangle [mkZ, mkZ     ] mkR
2214
2215       SeqOp                -> mangle [mkO               ] mkR
2216       ParOp                -> mangle [mkO               ] mkR
2217       ParGlobalOp          -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2218       ParLocalOp           -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2219       ParAtOp              -> mangle [mkO, mkZ, mkP, mkP, mkP, mkP, mkM] mkM
2220       ParAtAbsOp           -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2221       ParAtRelOp           -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2222       ParAtForNowOp        -> mangle [mkO, mkZ, mkP, mkP, mkP, mkP, mkM] mkM
2223       CopyableOp           -> mangle [mkZ               ] mkR
2224       NoFollowOp           -> mangle [mkZ               ] mkR
2225
2226       CCallOp _ _ _ _      -> mangle [                  ] mkM
2227
2228       -- Things with no Haskell pointers inside: in actuality, usages are
2229       -- irrelevant here (hence it doesn't matter that some of these
2230       -- apparently permit duplication; since such arguments are never 
2231       -- ENTERed anyway, the usage annotation they get is entirely irrelevant
2232       -- except insofar as it propagates to infect other values that *are*
2233       -- pointed.
2234
2235       otherwise            -> nomangle
2236                                     
2237   where mkZ          = mkUsgTy UsOnce  -- pointed argument used zero
2238         mkO          = mkUsgTy UsOnce  -- pointed argument used once
2239         mkM          = mkUsgTy UsMany  -- pointed argument used multiply
2240         mkP          = mkUsgTy UsOnce  -- unpointed argument
2241         mkR          = mkUsgTy UsMany  -- unpointed result
2242   
2243         (tyvars, arg_tys, res_ty)
2244                      = primOpSig op
2245
2246         nomangle     = (tyvars, map mkP arg_tys, mkR res_ty)
2247
2248         mangle fs g  = (tyvars, zipWithEqual "primOpUsg" ($) fs arg_tys, g res_ty)
2249
2250         inFun f g ty = case splitFunTy_maybe ty of
2251                          Just (a,b) -> mkFunTy (f a) (g b)
2252                          Nothing    -> pprPanic "primOpUsg:inFun" (ppr op <+> ppr ty)
2253
2254         inUB fs ty  = case splitTyConApp_maybe ty of
2255                         Just (tc,tys) -> ASSERT( tc == unboxedTupleTyCon (length fs) )
2256                                          mkUnboxedTupleTy (length fs) (zipWithEqual "primOpUsg"
2257                                                                          ($) fs tys)
2258                         Nothing       -> pprPanic "primOpUsg:inUB" (ppr op <+> ppr ty)
2259 \end{code}
2260
2261 \begin{code}
2262 data PrimOpResultInfo
2263   = ReturnsPrim     PrimRep
2264   | ReturnsAlg      TyCon
2265
2266 -- Some PrimOps need not return a manifest primitive or algebraic value
2267 -- (i.e. they might return a polymorphic value).  These PrimOps *must*
2268 -- be out of line, or the code generator won't work.
2269
2270 getPrimOpResultInfo :: PrimOp -> PrimOpResultInfo
2271 getPrimOpResultInfo op
2272   = case (primOpInfo op) of
2273       Dyadic  _ ty               -> ReturnsPrim (typePrimRep ty)
2274       Monadic _ ty               -> ReturnsPrim (typePrimRep ty)
2275       Compare _ ty               -> ReturnsAlg boolTyCon
2276       GenPrimOp _ _ _ ty         -> 
2277         let rep = typePrimRep ty in
2278         case rep of
2279            PtrRep -> case splitAlgTyConApp_maybe ty of
2280                         Nothing -> panic "getPrimOpResultInfo"
2281                         Just (tc,_,_) -> ReturnsAlg tc
2282            other -> ReturnsPrim other
2283
2284 isCompareOp :: PrimOp -> Bool
2285 isCompareOp op
2286   = case primOpInfo op of
2287       Compare _ _ -> True
2288       _           -> False
2289 \end{code}
2290
2291 The commutable ops are those for which we will try to move constants
2292 to the right hand side for strength reduction.
2293
2294 \begin{code}
2295 commutableOp :: PrimOp -> Bool
2296
2297 commutableOp CharEqOp     = True
2298 commutableOp CharNeOp     = True
2299 commutableOp IntAddOp     = True
2300 commutableOp IntMulOp     = True
2301 commutableOp AndOp        = True
2302 commutableOp OrOp         = True
2303 commutableOp XorOp        = True
2304 commutableOp IntEqOp      = True
2305 commutableOp IntNeOp      = True
2306 commutableOp IntegerAddOp = True
2307 commutableOp IntegerMulOp = True
2308 commutableOp IntegerGcdOp = True
2309 commutableOp FloatAddOp   = True
2310 commutableOp FloatMulOp   = True
2311 commutableOp FloatEqOp    = True
2312 commutableOp FloatNeOp    = True
2313 commutableOp DoubleAddOp  = True
2314 commutableOp DoubleMulOp  = True
2315 commutableOp DoubleEqOp   = True
2316 commutableOp DoubleNeOp   = True
2317 commutableOp _            = False
2318 \end{code}
2319
2320 Utils:
2321 \begin{code}
2322 mkPrimTyApp :: [TyVar] -> PrimRep -> ([TyVar], Type)
2323         -- CharRep       -->  ([],  Char#)
2324         -- StablePtrRep  -->  ([a], StablePtr# a)
2325 mkPrimTyApp tvs kind
2326   = (forall_tvs, mkTyConApp tycon (mkTyVarTys forall_tvs))
2327   where
2328     tycon      = primRepTyCon kind
2329     forall_tvs = take (tyConArity tycon) tvs
2330
2331 dyadic_fun_ty  ty = mkFunTys [ty, ty] ty
2332 monadic_fun_ty ty = mkFunTy  ty ty
2333 compare_fun_ty ty = mkFunTys [ty, ty] boolTy
2334 \end{code}
2335
2336 Output stuff:
2337 \begin{code}
2338 pprPrimOp  :: PrimOp -> SDoc
2339
2340 pprPrimOp (CCallOp fun is_casm may_gc cconv)
2341   = let
2342         callconv = text "{-" <> pprCallConv cconv <> text "-}"
2343
2344         before
2345           | is_casm && may_gc = "casm_GC ``"
2346           | is_casm           = "casm ``"
2347           | may_gc            = "ccall_GC "
2348           | otherwise         = "ccall "
2349
2350         after
2351           | is_casm   = text "''"
2352           | otherwise = empty
2353           
2354         ppr_dyn =
2355           case fun of
2356             Right _ -> text "dyn_"
2357             _       -> empty
2358
2359         ppr_fun =
2360          case fun of
2361            Right _ -> text "\"\""
2362            Left fn -> ptext fn
2363          
2364     in
2365     hcat [ ifPprDebug callconv
2366          , text "__", ppr_dyn
2367          , text before , ppr_fun , after]
2368
2369 pprPrimOp other_op
2370   = getPprStyle $ \ sty ->
2371    if ifaceStyle sty then       -- For interfaces Print it qualified with PrelGHC.
2372         ptext SLIT("PrelGHC.") <> pprOccName occ
2373    else
2374         pprOccName occ
2375   where
2376     occ = primOpOcc other_op
2377 \end{code}