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