2 % (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
4 \section[PrimOp]{Primitive operations (machine-level)}
8 PrimOp(..), allThePrimOps,
9 primOpType, primOpSig, primOpUsg, primOpArity,
10 mkPrimOpIdName, primOpRdrName, primOpTag, primOpOcc,
14 primOpOutOfLine, primOpNeedsWrapper,
15 primOpOkForSpeculation, primOpIsCheap, primOpIsDupable,
18 getPrimOpResultInfo, PrimOpResultInfo(..),
22 CCall(..), CCallTarget(..), ccallMayGC, ccallIsCasm, pprCCallOp,
23 isDynamicTarget, dynamicTarget, setCCallUnique
26 #include "HsVersions.h"
28 import PrimRep -- most of it
32 import Demand ( Demand, wwLazy, wwPrim, wwStrict, StrictnessInfo(..) )
33 import Var ( TyVar, Id )
34 import CallConv ( CallConv, pprCallConv )
35 import PprType ( pprParendType )
36 import Name ( Name, mkWiredInIdName )
37 import RdrName ( RdrName, mkRdrQual )
38 import OccName ( OccName, pprOccName, mkSrcVarOcc )
39 import TyCon ( TyCon, tyConArity )
40 import Type ( Type, mkForAllTys, mkForAllTy, mkFunTy, mkFunTys, mkTyVarTys,
41 mkTyConTy, mkTyConApp, typePrimRep,mkTyVarTy,
42 splitFunTy_maybe, splitAlgTyConApp_maybe, splitTyConApp_maybe,
45 import Unique ( Unique, mkPrimOpIdUnique )
46 import BasicTypes ( Arity, Boxity(..) )
47 import CStrings ( CLabelString, pprCLabelString )
48 import PrelNames ( pREL_GHC, pREL_GHC_Name )
50 import Util ( assoc, zipWithEqual )
51 import GlaExts ( Int(..), Int#, (==#) )
54 %************************************************************************
56 \subsection[PrimOp-datatype]{Datatype for @PrimOp@ (an enumeration)}
58 %************************************************************************
60 These are in \tr{state-interface.verb} order.
64 -- dig the FORTRAN/C influence on the names...
68 = CharGtOp | CharGeOp | CharEqOp | CharNeOp | CharLtOp | CharLeOp
69 | IntGtOp | IntGeOp | IntEqOp | IntNeOp | IntLtOp | IntLeOp
70 | WordGtOp | WordGeOp | WordEqOp | WordNeOp | WordLtOp | WordLeOp
71 | AddrGtOp | AddrGeOp | AddrEqOp | AddrNeOp | AddrLtOp | AddrLeOp
72 | FloatGtOp | FloatGeOp | FloatEqOp | FloatNeOp | FloatLtOp | FloatLeOp
73 | DoubleGtOp | DoubleGeOp | DoubleEqOp | DoubleNeOp | DoubleLtOp | DoubleLeOp
79 | IntAddOp | IntSubOp | IntMulOp | IntQuotOp
81 | ISllOp | ISraOp | ISrlOp -- shift {left,right} {arithmetic,logical}
88 | WordQuotOp | WordRemOp
89 | AndOp | OrOp | NotOp | XorOp
90 | SllOp | SrlOp -- shift {left,right} {logical}
91 | Int2WordOp | Word2IntOp -- casts
94 | Int2AddrOp | Addr2IntOp -- casts
96 -- Float#-related ops:
97 | FloatAddOp | FloatSubOp | FloatMulOp | FloatDivOp | FloatNegOp
98 | Float2IntOp | Int2FloatOp
100 | FloatExpOp | FloatLogOp | FloatSqrtOp
101 | FloatSinOp | FloatCosOp | FloatTanOp
102 | FloatAsinOp | FloatAcosOp | FloatAtanOp
103 | FloatSinhOp | FloatCoshOp | FloatTanhOp
104 -- not all machines have these available conveniently:
105 -- | FloatAsinhOp | FloatAcoshOp | FloatAtanhOp
106 | FloatPowerOp -- ** op
108 -- Double#-related ops:
109 | DoubleAddOp | DoubleSubOp | DoubleMulOp | DoubleDivOp | DoubleNegOp
110 | Double2IntOp | Int2DoubleOp
111 | Double2FloatOp | Float2DoubleOp
113 | DoubleExpOp | DoubleLogOp | DoubleSqrtOp
114 | DoubleSinOp | DoubleCosOp | DoubleTanOp
115 | DoubleAsinOp | DoubleAcosOp | DoubleAtanOp
116 | DoubleSinhOp | DoubleCoshOp | DoubleTanhOp
117 -- not all machines have these available conveniently:
118 -- | DoubleAsinhOp | DoubleAcoshOp | DoubleAtanhOp
119 | DoublePowerOp -- ** op
121 -- Integer (and related...) ops:
122 -- slightly weird -- to match GMP package.
123 | IntegerAddOp | IntegerSubOp | IntegerMulOp | IntegerGcdOp
124 | IntegerQuotRemOp | IntegerDivModOp | IntegerNegOp
125 | IntegerIntGcdOp | IntegerDivExactOp
126 | IntegerQuotOp | IntegerRemOp
131 | Integer2IntOp | Integer2WordOp
132 | Int2IntegerOp | Word2IntegerOp
134 -- casting to/from Integer and 64-bit (un)signed quantities.
135 | IntegerToInt64Op | Int64ToIntegerOp
136 | IntegerToWord64Op | Word64ToIntegerOp
142 -- primitive ops for primitive arrays
145 | NewByteArrayOp PrimRep
148 | SameMutableByteArrayOp
150 | ReadArrayOp | WriteArrayOp | IndexArrayOp -- for arrays of Haskell ptrs
152 | ReadByteArrayOp PrimRep
153 | WriteByteArrayOp PrimRep
154 | IndexByteArrayOp PrimRep
155 | ReadOffAddrOp PrimRep
156 | WriteOffAddrOp PrimRep
157 | IndexOffAddrOp PrimRep
158 -- PrimRep can be one of :
159 -- {Char,Int,Word,Addr,Float,Double,StablePtr,Int64,Word64}Rep.
160 -- This is just a cheesy encoding of a bunch of ops.
161 -- Note that ForeignObjRep is not included -- the only way of
162 -- creating a ForeignObj is with a ccall or casm.
163 | IndexOffForeignObjOp PrimRep
165 | UnsafeFreezeArrayOp | UnsafeFreezeByteArrayOp
167 | SizeofByteArrayOp | SizeofMutableByteArrayOp
186 | BlockAsyncExceptionsOp
187 | UnblockAsyncExceptionsOp
210 -- Operation to test two closure addresses for equality (yes really!)
211 -- BLAME ALASTAIR REID FOR THIS! THE REST OF US ARE INNOCENT!
212 | ReallyUnsafePtrEqualityOp
227 -- more parallel stuff
228 | ParGlobalOp -- named global par
229 | ParLocalOp -- named local par
230 | ParAtOp -- specifies destination of local par
231 | ParAtAbsOp -- specifies destination of local par (abs processor)
232 | ParAtRelOp -- specifies destination of local par (rel processor)
233 | ParAtForNowOp -- specifies initial destination of global par
234 | CopyableOp -- marks copyable code
235 | NoFollowOp -- marks non-followup expression
242 Used for the Ord instance
245 primOpTag :: PrimOp -> Int
246 primOpTag op = IBOX( tagOf_PrimOp op )
248 tagOf_PrimOp CharGtOp = (ILIT( 1) :: FAST_INT)
249 tagOf_PrimOp CharGeOp = ILIT( 2)
250 tagOf_PrimOp CharEqOp = ILIT( 3)
251 tagOf_PrimOp CharNeOp = ILIT( 4)
252 tagOf_PrimOp CharLtOp = ILIT( 5)
253 tagOf_PrimOp CharLeOp = ILIT( 6)
254 tagOf_PrimOp IntGtOp = ILIT( 7)
255 tagOf_PrimOp IntGeOp = ILIT( 8)
256 tagOf_PrimOp IntEqOp = ILIT( 9)
257 tagOf_PrimOp IntNeOp = ILIT( 10)
258 tagOf_PrimOp IntLtOp = ILIT( 11)
259 tagOf_PrimOp IntLeOp = ILIT( 12)
260 tagOf_PrimOp WordGtOp = ILIT( 13)
261 tagOf_PrimOp WordGeOp = ILIT( 14)
262 tagOf_PrimOp WordEqOp = ILIT( 15)
263 tagOf_PrimOp WordNeOp = ILIT( 16)
264 tagOf_PrimOp WordLtOp = ILIT( 17)
265 tagOf_PrimOp WordLeOp = ILIT( 18)
266 tagOf_PrimOp AddrGtOp = ILIT( 19)
267 tagOf_PrimOp AddrGeOp = ILIT( 20)
268 tagOf_PrimOp AddrEqOp = ILIT( 21)
269 tagOf_PrimOp AddrNeOp = ILIT( 22)
270 tagOf_PrimOp AddrLtOp = ILIT( 23)
271 tagOf_PrimOp AddrLeOp = ILIT( 24)
272 tagOf_PrimOp FloatGtOp = ILIT( 25)
273 tagOf_PrimOp FloatGeOp = ILIT( 26)
274 tagOf_PrimOp FloatEqOp = ILIT( 27)
275 tagOf_PrimOp FloatNeOp = ILIT( 28)
276 tagOf_PrimOp FloatLtOp = ILIT( 29)
277 tagOf_PrimOp FloatLeOp = ILIT( 30)
278 tagOf_PrimOp DoubleGtOp = ILIT( 31)
279 tagOf_PrimOp DoubleGeOp = ILIT( 32)
280 tagOf_PrimOp DoubleEqOp = ILIT( 33)
281 tagOf_PrimOp DoubleNeOp = ILIT( 34)
282 tagOf_PrimOp DoubleLtOp = ILIT( 35)
283 tagOf_PrimOp DoubleLeOp = ILIT( 36)
284 tagOf_PrimOp OrdOp = ILIT( 37)
285 tagOf_PrimOp ChrOp = ILIT( 38)
286 tagOf_PrimOp IntAddOp = ILIT( 39)
287 tagOf_PrimOp IntSubOp = ILIT( 40)
288 tagOf_PrimOp IntMulOp = ILIT( 41)
289 tagOf_PrimOp IntQuotOp = ILIT( 42)
290 tagOf_PrimOp IntGcdOp = ILIT( 43)
291 tagOf_PrimOp IntRemOp = ILIT( 44)
292 tagOf_PrimOp IntNegOp = ILIT( 45)
293 tagOf_PrimOp WordQuotOp = ILIT( 47)
294 tagOf_PrimOp WordRemOp = ILIT( 48)
295 tagOf_PrimOp AndOp = ILIT( 49)
296 tagOf_PrimOp OrOp = ILIT( 50)
297 tagOf_PrimOp NotOp = ILIT( 51)
298 tagOf_PrimOp XorOp = ILIT( 52)
299 tagOf_PrimOp SllOp = ILIT( 53)
300 tagOf_PrimOp SrlOp = ILIT( 54)
301 tagOf_PrimOp ISllOp = ILIT( 55)
302 tagOf_PrimOp ISraOp = ILIT( 56)
303 tagOf_PrimOp ISrlOp = ILIT( 57)
304 tagOf_PrimOp IntAddCOp = ILIT( 58)
305 tagOf_PrimOp IntSubCOp = ILIT( 59)
306 tagOf_PrimOp IntMulCOp = ILIT( 60)
307 tagOf_PrimOp Int2WordOp = ILIT( 61)
308 tagOf_PrimOp Word2IntOp = ILIT( 62)
309 tagOf_PrimOp Int2AddrOp = ILIT( 63)
310 tagOf_PrimOp Addr2IntOp = ILIT( 64)
311 tagOf_PrimOp FloatAddOp = ILIT( 65)
312 tagOf_PrimOp FloatSubOp = ILIT( 66)
313 tagOf_PrimOp FloatMulOp = ILIT( 67)
314 tagOf_PrimOp FloatDivOp = ILIT( 68)
315 tagOf_PrimOp FloatNegOp = ILIT( 69)
316 tagOf_PrimOp Float2IntOp = ILIT( 70)
317 tagOf_PrimOp Int2FloatOp = ILIT( 71)
318 tagOf_PrimOp FloatExpOp = ILIT( 72)
319 tagOf_PrimOp FloatLogOp = ILIT( 73)
320 tagOf_PrimOp FloatSqrtOp = ILIT( 74)
321 tagOf_PrimOp FloatSinOp = ILIT( 75)
322 tagOf_PrimOp FloatCosOp = ILIT( 76)
323 tagOf_PrimOp FloatTanOp = ILIT( 77)
324 tagOf_PrimOp FloatAsinOp = ILIT( 78)
325 tagOf_PrimOp FloatAcosOp = ILIT( 79)
326 tagOf_PrimOp FloatAtanOp = ILIT( 80)
327 tagOf_PrimOp FloatSinhOp = ILIT( 81)
328 tagOf_PrimOp FloatCoshOp = ILIT( 82)
329 tagOf_PrimOp FloatTanhOp = ILIT( 83)
330 tagOf_PrimOp FloatPowerOp = ILIT( 84)
331 tagOf_PrimOp DoubleAddOp = ILIT( 85)
332 tagOf_PrimOp DoubleSubOp = ILIT( 86)
333 tagOf_PrimOp DoubleMulOp = ILIT( 87)
334 tagOf_PrimOp DoubleDivOp = ILIT( 88)
335 tagOf_PrimOp DoubleNegOp = ILIT( 89)
336 tagOf_PrimOp Double2IntOp = ILIT( 90)
337 tagOf_PrimOp Int2DoubleOp = ILIT( 91)
338 tagOf_PrimOp Double2FloatOp = ILIT( 92)
339 tagOf_PrimOp Float2DoubleOp = ILIT( 93)
340 tagOf_PrimOp DoubleExpOp = ILIT( 94)
341 tagOf_PrimOp DoubleLogOp = ILIT( 95)
342 tagOf_PrimOp DoubleSqrtOp = ILIT( 96)
343 tagOf_PrimOp DoubleSinOp = ILIT( 97)
344 tagOf_PrimOp DoubleCosOp = ILIT( 98)
345 tagOf_PrimOp DoubleTanOp = ILIT( 99)
346 tagOf_PrimOp DoubleAsinOp = ILIT(100)
347 tagOf_PrimOp DoubleAcosOp = ILIT(101)
348 tagOf_PrimOp DoubleAtanOp = ILIT(102)
349 tagOf_PrimOp DoubleSinhOp = ILIT(103)
350 tagOf_PrimOp DoubleCoshOp = ILIT(104)
351 tagOf_PrimOp DoubleTanhOp = ILIT(105)
352 tagOf_PrimOp DoublePowerOp = ILIT(106)
353 tagOf_PrimOp IntegerAddOp = ILIT(107)
354 tagOf_PrimOp IntegerSubOp = ILIT(108)
355 tagOf_PrimOp IntegerMulOp = ILIT(109)
356 tagOf_PrimOp IntegerGcdOp = ILIT(110)
357 tagOf_PrimOp IntegerIntGcdOp = ILIT(111)
358 tagOf_PrimOp IntegerDivExactOp = ILIT(112)
359 tagOf_PrimOp IntegerQuotOp = ILIT(113)
360 tagOf_PrimOp IntegerRemOp = ILIT(114)
361 tagOf_PrimOp IntegerQuotRemOp = ILIT(115)
362 tagOf_PrimOp IntegerDivModOp = ILIT(116)
363 tagOf_PrimOp IntegerNegOp = ILIT(117)
364 tagOf_PrimOp IntegerCmpOp = ILIT(118)
365 tagOf_PrimOp IntegerCmpIntOp = ILIT(119)
366 tagOf_PrimOp Integer2IntOp = ILIT(120)
367 tagOf_PrimOp Integer2WordOp = ILIT(121)
368 tagOf_PrimOp Int2IntegerOp = ILIT(122)
369 tagOf_PrimOp Word2IntegerOp = ILIT(123)
370 tagOf_PrimOp Addr2IntegerOp = ILIT(125)
371 tagOf_PrimOp IntegerToInt64Op = ILIT(127)
372 tagOf_PrimOp Int64ToIntegerOp = ILIT(128)
373 tagOf_PrimOp IntegerToWord64Op = ILIT(129)
374 tagOf_PrimOp Word64ToIntegerOp = ILIT(130)
375 tagOf_PrimOp FloatDecodeOp = ILIT(131)
376 tagOf_PrimOp DoubleDecodeOp = ILIT(132)
377 tagOf_PrimOp NewArrayOp = ILIT(133)
378 tagOf_PrimOp (NewByteArrayOp CharRep) = ILIT(134)
379 tagOf_PrimOp (NewByteArrayOp IntRep) = ILIT(135)
380 tagOf_PrimOp (NewByteArrayOp WordRep) = ILIT(136)
381 tagOf_PrimOp (NewByteArrayOp AddrRep) = ILIT(137)
382 tagOf_PrimOp (NewByteArrayOp FloatRep) = ILIT(138)
383 tagOf_PrimOp (NewByteArrayOp DoubleRep) = ILIT(139)
384 tagOf_PrimOp (NewByteArrayOp StablePtrRep) = ILIT(140)
385 tagOf_PrimOp SameMutableArrayOp = ILIT(141)
386 tagOf_PrimOp SameMutableByteArrayOp = ILIT(142)
387 tagOf_PrimOp ReadArrayOp = ILIT(143)
388 tagOf_PrimOp WriteArrayOp = ILIT(144)
389 tagOf_PrimOp IndexArrayOp = ILIT(145)
390 tagOf_PrimOp (ReadByteArrayOp CharRep) = ILIT(146)
391 tagOf_PrimOp (ReadByteArrayOp IntRep) = ILIT(147)
392 tagOf_PrimOp (ReadByteArrayOp WordRep) = ILIT(148)
393 tagOf_PrimOp (ReadByteArrayOp AddrRep) = ILIT(149)
394 tagOf_PrimOp (ReadByteArrayOp FloatRep) = ILIT(150)
395 tagOf_PrimOp (ReadByteArrayOp DoubleRep) = ILIT(151)
396 tagOf_PrimOp (ReadByteArrayOp StablePtrRep) = ILIT(152)
397 tagOf_PrimOp (ReadByteArrayOp Int64Rep) = ILIT(153)
398 tagOf_PrimOp (ReadByteArrayOp Word64Rep) = ILIT(154)
399 tagOf_PrimOp (WriteByteArrayOp CharRep) = ILIT(155)
400 tagOf_PrimOp (WriteByteArrayOp IntRep) = ILIT(156)
401 tagOf_PrimOp (WriteByteArrayOp WordRep) = ILIT(157)
402 tagOf_PrimOp (WriteByteArrayOp AddrRep) = ILIT(158)
403 tagOf_PrimOp (WriteByteArrayOp FloatRep) = ILIT(159)
404 tagOf_PrimOp (WriteByteArrayOp DoubleRep) = ILIT(160)
405 tagOf_PrimOp (WriteByteArrayOp StablePtrRep) = ILIT(161)
406 tagOf_PrimOp (WriteByteArrayOp Int64Rep) = ILIT(162)
407 tagOf_PrimOp (WriteByteArrayOp Word64Rep) = ILIT(163)
408 tagOf_PrimOp (IndexByteArrayOp CharRep) = ILIT(164)
409 tagOf_PrimOp (IndexByteArrayOp IntRep) = ILIT(165)
410 tagOf_PrimOp (IndexByteArrayOp WordRep) = ILIT(166)
411 tagOf_PrimOp (IndexByteArrayOp AddrRep) = ILIT(167)
412 tagOf_PrimOp (IndexByteArrayOp FloatRep) = ILIT(168)
413 tagOf_PrimOp (IndexByteArrayOp DoubleRep) = ILIT(169)
414 tagOf_PrimOp (IndexByteArrayOp StablePtrRep) = ILIT(170)
415 tagOf_PrimOp (IndexByteArrayOp Int64Rep) = ILIT(171)
416 tagOf_PrimOp (IndexByteArrayOp Word64Rep) = ILIT(172)
417 tagOf_PrimOp (IndexOffAddrOp CharRep) = ILIT(173)
418 tagOf_PrimOp (IndexOffAddrOp IntRep) = ILIT(174)
419 tagOf_PrimOp (IndexOffAddrOp WordRep) = ILIT(175)
420 tagOf_PrimOp (IndexOffAddrOp AddrRep) = ILIT(176)
421 tagOf_PrimOp (IndexOffAddrOp FloatRep) = ILIT(177)
422 tagOf_PrimOp (IndexOffAddrOp DoubleRep) = ILIT(178)
423 tagOf_PrimOp (IndexOffAddrOp StablePtrRep) = ILIT(179)
424 tagOf_PrimOp (IndexOffAddrOp Int64Rep) = ILIT(180)
425 tagOf_PrimOp (IndexOffAddrOp Word64Rep) = ILIT(181)
426 tagOf_PrimOp (IndexOffForeignObjOp CharRep) = ILIT(182)
427 tagOf_PrimOp (IndexOffForeignObjOp IntRep) = ILIT(183)
428 tagOf_PrimOp (IndexOffForeignObjOp WordRep) = ILIT(184)
429 tagOf_PrimOp (IndexOffForeignObjOp AddrRep) = ILIT(185)
430 tagOf_PrimOp (IndexOffForeignObjOp FloatRep) = ILIT(186)
431 tagOf_PrimOp (IndexOffForeignObjOp DoubleRep) = ILIT(187)
432 tagOf_PrimOp (IndexOffForeignObjOp StablePtrRep) = ILIT(188)
433 tagOf_PrimOp (IndexOffForeignObjOp Int64Rep) = ILIT(189)
434 tagOf_PrimOp (IndexOffForeignObjOp Word64Rep) = ILIT(190)
435 tagOf_PrimOp (ReadOffAddrOp CharRep) = ILIT(191)
436 tagOf_PrimOp (ReadOffAddrOp IntRep) = ILIT(192)
437 tagOf_PrimOp (ReadOffAddrOp WordRep) = ILIT(193)
438 tagOf_PrimOp (ReadOffAddrOp AddrRep) = ILIT(194)
439 tagOf_PrimOp (ReadOffAddrOp FloatRep) = ILIT(195)
440 tagOf_PrimOp (ReadOffAddrOp DoubleRep) = ILIT(196)
441 tagOf_PrimOp (ReadOffAddrOp StablePtrRep) = ILIT(197)
442 tagOf_PrimOp (ReadOffAddrOp ForeignObjRep) = ILIT(198)
443 tagOf_PrimOp (ReadOffAddrOp Int64Rep) = ILIT(199)
444 tagOf_PrimOp (ReadOffAddrOp Word64Rep) = ILIT(200)
445 tagOf_PrimOp (WriteOffAddrOp CharRep) = ILIT(201)
446 tagOf_PrimOp (WriteOffAddrOp IntRep) = ILIT(202)
447 tagOf_PrimOp (WriteOffAddrOp WordRep) = ILIT(203)
448 tagOf_PrimOp (WriteOffAddrOp AddrRep) = ILIT(205)
449 tagOf_PrimOp (WriteOffAddrOp FloatRep) = ILIT(206)
450 tagOf_PrimOp (WriteOffAddrOp DoubleRep) = ILIT(207)
451 tagOf_PrimOp (WriteOffAddrOp StablePtrRep) = ILIT(208)
452 tagOf_PrimOp (WriteOffAddrOp ForeignObjRep) = ILIT(209)
453 tagOf_PrimOp (WriteOffAddrOp Int64Rep) = ILIT(210)
454 tagOf_PrimOp (WriteOffAddrOp Word64Rep) = ILIT(211)
455 tagOf_PrimOp UnsafeFreezeArrayOp = ILIT(212)
456 tagOf_PrimOp UnsafeFreezeByteArrayOp = ILIT(213)
457 tagOf_PrimOp UnsafeThawArrayOp = ILIT(214)
458 tagOf_PrimOp SizeofByteArrayOp = ILIT(215)
459 tagOf_PrimOp SizeofMutableByteArrayOp = ILIT(216)
460 tagOf_PrimOp NewMVarOp = ILIT(217)
461 tagOf_PrimOp TakeMVarOp = ILIT(218)
462 tagOf_PrimOp PutMVarOp = ILIT(219)
463 tagOf_PrimOp SameMVarOp = ILIT(220)
464 tagOf_PrimOp TryTakeMVarOp = ILIT(221)
465 tagOf_PrimOp IsEmptyMVarOp = ILIT(222)
466 tagOf_PrimOp MkForeignObjOp = ILIT(223)
467 tagOf_PrimOp WriteForeignObjOp = ILIT(224)
468 tagOf_PrimOp MkWeakOp = ILIT(225)
469 tagOf_PrimOp DeRefWeakOp = ILIT(226)
470 tagOf_PrimOp FinalizeWeakOp = ILIT(227)
471 tagOf_PrimOp MakeStableNameOp = ILIT(228)
472 tagOf_PrimOp EqStableNameOp = ILIT(229)
473 tagOf_PrimOp StableNameToIntOp = ILIT(230)
474 tagOf_PrimOp MakeStablePtrOp = ILIT(231)
475 tagOf_PrimOp DeRefStablePtrOp = ILIT(232)
476 tagOf_PrimOp EqStablePtrOp = ILIT(234)
477 tagOf_PrimOp ReallyUnsafePtrEqualityOp = ILIT(235)
478 tagOf_PrimOp SeqOp = ILIT(236)
479 tagOf_PrimOp ParOp = ILIT(237)
480 tagOf_PrimOp ForkOp = ILIT(238)
481 tagOf_PrimOp KillThreadOp = ILIT(239)
482 tagOf_PrimOp YieldOp = ILIT(240)
483 tagOf_PrimOp MyThreadIdOp = ILIT(241)
484 tagOf_PrimOp DelayOp = ILIT(242)
485 tagOf_PrimOp WaitReadOp = ILIT(243)
486 tagOf_PrimOp WaitWriteOp = ILIT(244)
487 tagOf_PrimOp ParGlobalOp = ILIT(245)
488 tagOf_PrimOp ParLocalOp = ILIT(246)
489 tagOf_PrimOp ParAtOp = ILIT(247)
490 tagOf_PrimOp ParAtAbsOp = ILIT(248)
491 tagOf_PrimOp ParAtRelOp = ILIT(249)
492 tagOf_PrimOp ParAtForNowOp = ILIT(250)
493 tagOf_PrimOp CopyableOp = ILIT(251)
494 tagOf_PrimOp NoFollowOp = ILIT(252)
495 tagOf_PrimOp NewMutVarOp = ILIT(253)
496 tagOf_PrimOp ReadMutVarOp = ILIT(254)
497 tagOf_PrimOp WriteMutVarOp = ILIT(255)
498 tagOf_PrimOp SameMutVarOp = ILIT(256)
499 tagOf_PrimOp CatchOp = ILIT(257)
500 tagOf_PrimOp RaiseOp = ILIT(258)
501 tagOf_PrimOp BlockAsyncExceptionsOp = ILIT(259)
502 tagOf_PrimOp UnblockAsyncExceptionsOp = ILIT(260)
503 tagOf_PrimOp DataToTagOp = ILIT(261)
504 tagOf_PrimOp TagToEnumOp = ILIT(262)
506 tagOf_PrimOp op = pprPanic# "tagOf_PrimOp: pattern-match" (ppr op)
508 instance Eq PrimOp where
509 op1 == op2 = tagOf_PrimOp op1 _EQ_ tagOf_PrimOp op2
511 instance Ord PrimOp where
512 op1 < op2 = tagOf_PrimOp op1 _LT_ tagOf_PrimOp op2
513 op1 <= op2 = tagOf_PrimOp op1 _LE_ tagOf_PrimOp op2
514 op1 >= op2 = tagOf_PrimOp op1 _GE_ tagOf_PrimOp op2
515 op1 > op2 = tagOf_PrimOp op1 _GT_ tagOf_PrimOp op2
516 op1 `compare` op2 | op1 < op2 = LT
520 instance Outputable PrimOp where
521 ppr op = pprPrimOp op
523 instance Show PrimOp where
524 showsPrec p op = showsPrecSDoc p (pprPrimOp op)
527 An @Enum@-derived list would be better; meanwhile... (ToDo)
529 allThePrimOps -- Except CCall, which is really a family of primops
661 NewByteArrayOp CharRep,
662 NewByteArrayOp IntRep,
663 NewByteArrayOp WordRep,
664 NewByteArrayOp AddrRep,
665 NewByteArrayOp FloatRep,
666 NewByteArrayOp DoubleRep,
667 NewByteArrayOp StablePtrRep,
669 SameMutableByteArrayOp,
673 ReadByteArrayOp CharRep,
674 ReadByteArrayOp IntRep,
675 ReadByteArrayOp WordRep,
676 ReadByteArrayOp AddrRep,
677 ReadByteArrayOp FloatRep,
678 ReadByteArrayOp DoubleRep,
679 ReadByteArrayOp StablePtrRep,
680 ReadByteArrayOp Int64Rep,
681 ReadByteArrayOp Word64Rep,
682 WriteByteArrayOp CharRep,
683 WriteByteArrayOp IntRep,
684 WriteByteArrayOp WordRep,
685 WriteByteArrayOp AddrRep,
686 WriteByteArrayOp FloatRep,
687 WriteByteArrayOp DoubleRep,
688 WriteByteArrayOp StablePtrRep,
689 WriteByteArrayOp Int64Rep,
690 WriteByteArrayOp Word64Rep,
691 IndexByteArrayOp CharRep,
692 IndexByteArrayOp IntRep,
693 IndexByteArrayOp WordRep,
694 IndexByteArrayOp AddrRep,
695 IndexByteArrayOp FloatRep,
696 IndexByteArrayOp DoubleRep,
697 IndexByteArrayOp StablePtrRep,
698 IndexByteArrayOp Int64Rep,
699 IndexByteArrayOp Word64Rep,
700 IndexOffForeignObjOp CharRep,
701 IndexOffForeignObjOp AddrRep,
702 IndexOffForeignObjOp IntRep,
703 IndexOffForeignObjOp WordRep,
704 IndexOffForeignObjOp FloatRep,
705 IndexOffForeignObjOp DoubleRep,
706 IndexOffForeignObjOp StablePtrRep,
707 IndexOffForeignObjOp Int64Rep,
708 IndexOffForeignObjOp Word64Rep,
709 IndexOffAddrOp CharRep,
710 IndexOffAddrOp IntRep,
711 IndexOffAddrOp WordRep,
712 IndexOffAddrOp AddrRep,
713 IndexOffAddrOp FloatRep,
714 IndexOffAddrOp DoubleRep,
715 IndexOffAddrOp StablePtrRep,
716 IndexOffAddrOp Int64Rep,
717 IndexOffAddrOp Word64Rep,
718 ReadOffAddrOp CharRep,
719 ReadOffAddrOp IntRep,
720 ReadOffAddrOp WordRep,
721 ReadOffAddrOp AddrRep,
722 ReadOffAddrOp FloatRep,
723 ReadOffAddrOp DoubleRep,
724 ReadOffAddrOp ForeignObjRep,
725 ReadOffAddrOp StablePtrRep,
726 ReadOffAddrOp Int64Rep,
727 ReadOffAddrOp Word64Rep,
728 WriteOffAddrOp CharRep,
729 WriteOffAddrOp IntRep,
730 WriteOffAddrOp WordRep,
731 WriteOffAddrOp AddrRep,
732 WriteOffAddrOp FloatRep,
733 WriteOffAddrOp DoubleRep,
734 WriteOffAddrOp ForeignObjRep,
735 WriteOffAddrOp StablePtrRep,
736 WriteOffAddrOp Int64Rep,
737 WriteOffAddrOp Word64Rep,
739 UnsafeFreezeByteArrayOp,
742 SizeofMutableByteArrayOp,
749 BlockAsyncExceptionsOp,
750 UnblockAsyncExceptionsOp,
768 ReallyUnsafePtrEqualityOp,
791 %************************************************************************
793 \subsection[PrimOp-info]{The essential info about each @PrimOp@}
795 %************************************************************************
797 The @String@ in the @PrimOpInfos@ is the ``base name'' by which the user may
798 refer to the primitive operation. The conventional \tr{#}-for-
799 unboxed ops is added on later.
801 The reason for the funny characters in the names is so we do not
802 interfere with the programmer's Haskell name spaces.
804 We use @PrimKinds@ for the ``type'' information, because they're
805 (slightly) more convenient to use than @TyCons@.
808 = Dyadic OccName -- string :: T -> T -> T
810 | Monadic OccName -- string :: T -> T
812 | Compare OccName -- string :: T -> T -> Bool
815 | GenPrimOp OccName -- string :: \/a1..an . T1 -> .. -> Tk -> T
820 mkDyadic str ty = Dyadic (mkSrcVarOcc str) ty
821 mkMonadic str ty = Monadic (mkSrcVarOcc str) ty
822 mkCompare str ty = Compare (mkSrcVarOcc str) ty
823 mkGenPrimOp str tvs tys ty = GenPrimOp (mkSrcVarOcc str) tvs tys ty
828 one_Integer_ty = [intPrimTy, byteArrayPrimTy]
830 = [intPrimTy, byteArrayPrimTy, -- first Integer pieces
831 intPrimTy, byteArrayPrimTy] -- second '' pieces
832 an_Integer_and_Int_tys
833 = [intPrimTy, byteArrayPrimTy, -- Integer
836 unboxedSingleton = mkTupleTy Unboxed 1
837 unboxedPair = mkTupleTy Unboxed 2
838 unboxedTriple = mkTupleTy Unboxed 3
839 unboxedQuadruple = mkTupleTy Unboxed 4
841 mkIOTy ty = mkFunTy realWorldStatePrimTy
842 (unboxedPair [realWorldStatePrimTy,ty])
844 integerMonadic name = mkGenPrimOp name [] one_Integer_ty
845 (unboxedPair one_Integer_ty)
847 integerDyadic name = mkGenPrimOp name [] two_Integer_tys
848 (unboxedPair one_Integer_ty)
850 integerDyadic2Results name = mkGenPrimOp name [] two_Integer_tys
851 (unboxedQuadruple two_Integer_tys)
853 integerCompare name = mkGenPrimOp name [] two_Integer_tys intPrimTy
856 %************************************************************************
858 \subsubsection{Strictness}
860 %************************************************************************
862 Not all primops are strict!
865 primOpStrictness :: Arity -> PrimOp -> StrictnessInfo
866 -- See Demand.StrictnessInfo for discussion of what the results
867 -- The arity should be the arity of the primop; that's why
868 -- this function isn't exported.
870 primOpStrictness arity SeqOp = StrictnessInfo [wwStrict] False
871 -- Seq is strict in its argument; see notes in ConFold.lhs
873 primOpStrictness arity ParOp = StrictnessInfo [wwLazy] False
874 -- Note that Par is lazy to avoid that the sparked thing
875 -- gets evaluted strictly, which it should *not* be
877 primOpStrictness arity ForkOp = StrictnessInfo [wwLazy, wwPrim] False
879 primOpStrictness arity NewArrayOp = StrictnessInfo [wwPrim, wwLazy, wwPrim] False
880 primOpStrictness arity WriteArrayOp = StrictnessInfo [wwPrim, wwPrim, wwLazy, wwPrim] False
882 primOpStrictness arity NewMutVarOp = StrictnessInfo [wwLazy, wwPrim] False
883 primOpStrictness arity WriteMutVarOp = StrictnessInfo [wwPrim, wwLazy, wwPrim] False
885 primOpStrictness arity PutMVarOp = StrictnessInfo [wwPrim, wwLazy, wwPrim] False
887 primOpStrictness arity CatchOp = StrictnessInfo [wwLazy, wwLazy, wwPrim] False
888 -- Catch is actually strict in its first argument
889 -- but we don't want to tell the strictness
890 -- analyser about that!
892 primOpStrictness arity RaiseOp = StrictnessInfo [wwLazy] True -- NB: True => result is bottom
893 primOpStrictness arity BlockAsyncExceptionsOp = StrictnessInfo [wwLazy] False
894 primOpStrictness arity UnblockAsyncExceptionsOp = StrictnessInfo [wwLazy] False
896 primOpStrictness arity MkWeakOp = StrictnessInfo [wwLazy, wwLazy, wwLazy, wwPrim] False
897 primOpStrictness arity MakeStableNameOp = StrictnessInfo [wwLazy, wwPrim] False
898 primOpStrictness arity MakeStablePtrOp = StrictnessInfo [wwLazy, wwPrim] False
900 primOpStrictness arity DataToTagOp = StrictnessInfo [wwLazy] False
902 -- The rest all have primitive-typed arguments
903 primOpStrictness arity other = StrictnessInfo (replicate arity wwPrim) False
906 %************************************************************************
908 \subsubsection[PrimOp-comparison]{PrimOpInfo basic comparison ops}
910 %************************************************************************
912 @primOpInfo@ gives all essential information (from which everything
913 else, notably a type, can be constructed) for each @PrimOp@.
916 primOpInfo :: PrimOp -> PrimOpInfo
919 There's plenty of this stuff!
922 primOpInfo CharGtOp = mkCompare SLIT("gtChar#") charPrimTy
923 primOpInfo CharGeOp = mkCompare SLIT("geChar#") charPrimTy
924 primOpInfo CharEqOp = mkCompare SLIT("eqChar#") charPrimTy
925 primOpInfo CharNeOp = mkCompare SLIT("neChar#") charPrimTy
926 primOpInfo CharLtOp = mkCompare SLIT("ltChar#") charPrimTy
927 primOpInfo CharLeOp = mkCompare SLIT("leChar#") charPrimTy
929 primOpInfo IntGtOp = mkCompare SLIT(">#") intPrimTy
930 primOpInfo IntGeOp = mkCompare SLIT(">=#") intPrimTy
931 primOpInfo IntEqOp = mkCompare SLIT("==#") intPrimTy
932 primOpInfo IntNeOp = mkCompare SLIT("/=#") intPrimTy
933 primOpInfo IntLtOp = mkCompare SLIT("<#") intPrimTy
934 primOpInfo IntLeOp = mkCompare SLIT("<=#") intPrimTy
936 primOpInfo WordGtOp = mkCompare SLIT("gtWord#") wordPrimTy
937 primOpInfo WordGeOp = mkCompare SLIT("geWord#") wordPrimTy
938 primOpInfo WordEqOp = mkCompare SLIT("eqWord#") wordPrimTy
939 primOpInfo WordNeOp = mkCompare SLIT("neWord#") wordPrimTy
940 primOpInfo WordLtOp = mkCompare SLIT("ltWord#") wordPrimTy
941 primOpInfo WordLeOp = mkCompare SLIT("leWord#") wordPrimTy
943 primOpInfo AddrGtOp = mkCompare SLIT("gtAddr#") addrPrimTy
944 primOpInfo AddrGeOp = mkCompare SLIT("geAddr#") addrPrimTy
945 primOpInfo AddrEqOp = mkCompare SLIT("eqAddr#") addrPrimTy
946 primOpInfo AddrNeOp = mkCompare SLIT("neAddr#") addrPrimTy
947 primOpInfo AddrLtOp = mkCompare SLIT("ltAddr#") addrPrimTy
948 primOpInfo AddrLeOp = mkCompare SLIT("leAddr#") addrPrimTy
950 primOpInfo FloatGtOp = mkCompare SLIT("gtFloat#") floatPrimTy
951 primOpInfo FloatGeOp = mkCompare SLIT("geFloat#") floatPrimTy
952 primOpInfo FloatEqOp = mkCompare SLIT("eqFloat#") floatPrimTy
953 primOpInfo FloatNeOp = mkCompare SLIT("neFloat#") floatPrimTy
954 primOpInfo FloatLtOp = mkCompare SLIT("ltFloat#") floatPrimTy
955 primOpInfo FloatLeOp = mkCompare SLIT("leFloat#") floatPrimTy
957 primOpInfo DoubleGtOp = mkCompare SLIT(">##") doublePrimTy
958 primOpInfo DoubleGeOp = mkCompare SLIT(">=##") doublePrimTy
959 primOpInfo DoubleEqOp = mkCompare SLIT("==##") doublePrimTy
960 primOpInfo DoubleNeOp = mkCompare SLIT("/=##") doublePrimTy
961 primOpInfo DoubleLtOp = mkCompare SLIT("<##") doublePrimTy
962 primOpInfo DoubleLeOp = mkCompare SLIT("<=##") doublePrimTy
966 %************************************************************************
968 \subsubsection[PrimOp-Char]{PrimOpInfo for @Char#@s}
970 %************************************************************************
973 primOpInfo OrdOp = mkGenPrimOp SLIT("ord#") [] [charPrimTy] intPrimTy
974 primOpInfo ChrOp = mkGenPrimOp SLIT("chr#") [] [intPrimTy] charPrimTy
977 %************************************************************************
979 \subsubsection[PrimOp-Int]{PrimOpInfo for @Int#@s}
981 %************************************************************************
984 primOpInfo IntAddOp = mkDyadic SLIT("+#") intPrimTy
985 primOpInfo IntSubOp = mkDyadic SLIT("-#") intPrimTy
986 primOpInfo IntMulOp = mkDyadic SLIT("*#") intPrimTy
987 primOpInfo IntQuotOp = mkDyadic SLIT("quotInt#") intPrimTy
988 primOpInfo IntRemOp = mkDyadic SLIT("remInt#") intPrimTy
989 primOpInfo IntGcdOp = mkDyadic SLIT("gcdInt#") intPrimTy
991 primOpInfo IntNegOp = mkMonadic SLIT("negateInt#") intPrimTy
993 primOpInfo IntAddCOp =
994 mkGenPrimOp SLIT("addIntC#") [] [intPrimTy, intPrimTy]
995 (unboxedPair [intPrimTy, intPrimTy])
997 primOpInfo IntSubCOp =
998 mkGenPrimOp SLIT("subIntC#") [] [intPrimTy, intPrimTy]
999 (unboxedPair [intPrimTy, intPrimTy])
1001 primOpInfo IntMulCOp =
1002 mkGenPrimOp SLIT("mulIntC#") [] [intPrimTy, intPrimTy]
1003 (unboxedPair [intPrimTy, intPrimTy])
1006 %************************************************************************
1008 \subsubsection[PrimOp-Word]{PrimOpInfo for @Word#@s}
1010 %************************************************************************
1012 A @Word#@ is an unsigned @Int#@.
1015 primOpInfo WordQuotOp = mkDyadic SLIT("quotWord#") wordPrimTy
1016 primOpInfo WordRemOp = mkDyadic SLIT("remWord#") wordPrimTy
1018 primOpInfo AndOp = mkDyadic SLIT("and#") wordPrimTy
1019 primOpInfo OrOp = mkDyadic SLIT("or#") wordPrimTy
1020 primOpInfo XorOp = mkDyadic SLIT("xor#") wordPrimTy
1021 primOpInfo NotOp = mkMonadic SLIT("not#") wordPrimTy
1024 = mkGenPrimOp SLIT("shiftL#") [] [wordPrimTy, intPrimTy] wordPrimTy
1026 = mkGenPrimOp SLIT("shiftRL#") [] [wordPrimTy, intPrimTy] wordPrimTy
1029 = mkGenPrimOp SLIT("iShiftL#") [] [intPrimTy, intPrimTy] intPrimTy
1031 = mkGenPrimOp SLIT("iShiftRA#") [] [intPrimTy, intPrimTy] intPrimTy
1033 = mkGenPrimOp SLIT("iShiftRL#") [] [intPrimTy, intPrimTy] intPrimTy
1035 primOpInfo Int2WordOp = mkGenPrimOp SLIT("int2Word#") [] [intPrimTy] wordPrimTy
1036 primOpInfo Word2IntOp = mkGenPrimOp SLIT("word2Int#") [] [wordPrimTy] intPrimTy
1039 %************************************************************************
1041 \subsubsection[PrimOp-Addr]{PrimOpInfo for @Addr#@s}
1043 %************************************************************************
1046 primOpInfo Int2AddrOp = mkGenPrimOp SLIT("int2Addr#") [] [intPrimTy] addrPrimTy
1047 primOpInfo Addr2IntOp = mkGenPrimOp SLIT("addr2Int#") [] [addrPrimTy] intPrimTy
1051 %************************************************************************
1053 \subsubsection[PrimOp-Float]{PrimOpInfo for @Float#@s}
1055 %************************************************************************
1057 @decodeFloat#@ is given w/ Integer-stuff (it's similar).
1060 primOpInfo FloatAddOp = mkDyadic SLIT("plusFloat#") floatPrimTy
1061 primOpInfo FloatSubOp = mkDyadic SLIT("minusFloat#") floatPrimTy
1062 primOpInfo FloatMulOp = mkDyadic SLIT("timesFloat#") floatPrimTy
1063 primOpInfo FloatDivOp = mkDyadic SLIT("divideFloat#") floatPrimTy
1064 primOpInfo FloatNegOp = mkMonadic SLIT("negateFloat#") floatPrimTy
1066 primOpInfo Float2IntOp = mkGenPrimOp SLIT("float2Int#") [] [floatPrimTy] intPrimTy
1067 primOpInfo Int2FloatOp = mkGenPrimOp SLIT("int2Float#") [] [intPrimTy] floatPrimTy
1069 primOpInfo FloatExpOp = mkMonadic SLIT("expFloat#") floatPrimTy
1070 primOpInfo FloatLogOp = mkMonadic SLIT("logFloat#") floatPrimTy
1071 primOpInfo FloatSqrtOp = mkMonadic SLIT("sqrtFloat#") floatPrimTy
1072 primOpInfo FloatSinOp = mkMonadic SLIT("sinFloat#") floatPrimTy
1073 primOpInfo FloatCosOp = mkMonadic SLIT("cosFloat#") floatPrimTy
1074 primOpInfo FloatTanOp = mkMonadic SLIT("tanFloat#") floatPrimTy
1075 primOpInfo FloatAsinOp = mkMonadic SLIT("asinFloat#") floatPrimTy
1076 primOpInfo FloatAcosOp = mkMonadic SLIT("acosFloat#") floatPrimTy
1077 primOpInfo FloatAtanOp = mkMonadic SLIT("atanFloat#") floatPrimTy
1078 primOpInfo FloatSinhOp = mkMonadic SLIT("sinhFloat#") floatPrimTy
1079 primOpInfo FloatCoshOp = mkMonadic SLIT("coshFloat#") floatPrimTy
1080 primOpInfo FloatTanhOp = mkMonadic SLIT("tanhFloat#") floatPrimTy
1081 primOpInfo FloatPowerOp = mkDyadic SLIT("powerFloat#") floatPrimTy
1084 %************************************************************************
1086 \subsubsection[PrimOp-Double]{PrimOpInfo for @Double#@s}
1088 %************************************************************************
1090 @decodeDouble#@ is given w/ Integer-stuff (it's similar).
1093 primOpInfo DoubleAddOp = mkDyadic SLIT("+##") doublePrimTy
1094 primOpInfo DoubleSubOp = mkDyadic SLIT("-##") doublePrimTy
1095 primOpInfo DoubleMulOp = mkDyadic SLIT("*##") doublePrimTy
1096 primOpInfo DoubleDivOp = mkDyadic SLIT("/##") doublePrimTy
1097 primOpInfo DoubleNegOp = mkMonadic SLIT("negateDouble#") doublePrimTy
1099 primOpInfo Double2IntOp = mkGenPrimOp SLIT("double2Int#") [] [doublePrimTy] intPrimTy
1100 primOpInfo Int2DoubleOp = mkGenPrimOp SLIT("int2Double#") [] [intPrimTy] doublePrimTy
1102 primOpInfo Double2FloatOp = mkGenPrimOp SLIT("double2Float#") [] [doublePrimTy] floatPrimTy
1103 primOpInfo Float2DoubleOp = mkGenPrimOp SLIT("float2Double#") [] [floatPrimTy] doublePrimTy
1105 primOpInfo DoubleExpOp = mkMonadic SLIT("expDouble#") doublePrimTy
1106 primOpInfo DoubleLogOp = mkMonadic SLIT("logDouble#") doublePrimTy
1107 primOpInfo DoubleSqrtOp = mkMonadic SLIT("sqrtDouble#") doublePrimTy
1108 primOpInfo DoubleSinOp = mkMonadic SLIT("sinDouble#") doublePrimTy
1109 primOpInfo DoubleCosOp = mkMonadic SLIT("cosDouble#") doublePrimTy
1110 primOpInfo DoubleTanOp = mkMonadic SLIT("tanDouble#") doublePrimTy
1111 primOpInfo DoubleAsinOp = mkMonadic SLIT("asinDouble#") doublePrimTy
1112 primOpInfo DoubleAcosOp = mkMonadic SLIT("acosDouble#") doublePrimTy
1113 primOpInfo DoubleAtanOp = mkMonadic SLIT("atanDouble#") doublePrimTy
1114 primOpInfo DoubleSinhOp = mkMonadic SLIT("sinhDouble#") doublePrimTy
1115 primOpInfo DoubleCoshOp = mkMonadic SLIT("coshDouble#") doublePrimTy
1116 primOpInfo DoubleTanhOp = mkMonadic SLIT("tanhDouble#") doublePrimTy
1117 primOpInfo DoublePowerOp= mkDyadic SLIT("**##") doublePrimTy
1120 %************************************************************************
1122 \subsubsection[PrimOp-Integer]{PrimOpInfo for @Integer@ (and related!)}
1124 %************************************************************************
1127 primOpInfo IntegerNegOp = integerMonadic SLIT("negateInteger#")
1129 primOpInfo IntegerAddOp = integerDyadic SLIT("plusInteger#")
1130 primOpInfo IntegerSubOp = integerDyadic SLIT("minusInteger#")
1131 primOpInfo IntegerMulOp = integerDyadic SLIT("timesInteger#")
1132 primOpInfo IntegerGcdOp = integerDyadic SLIT("gcdInteger#")
1133 primOpInfo IntegerIntGcdOp = mkGenPrimOp SLIT("gcdIntegerInt#") [] an_Integer_and_Int_tys intPrimTy
1134 primOpInfo IntegerDivExactOp = integerDyadic SLIT("divExactInteger#")
1135 primOpInfo IntegerQuotOp = integerDyadic SLIT("quotInteger#")
1136 primOpInfo IntegerRemOp = integerDyadic SLIT("remInteger#")
1138 primOpInfo IntegerCmpOp = integerCompare SLIT("cmpInteger#")
1139 primOpInfo IntegerCmpIntOp
1140 = mkGenPrimOp SLIT("cmpIntegerInt#") [] an_Integer_and_Int_tys intPrimTy
1142 primOpInfo IntegerQuotRemOp = integerDyadic2Results SLIT("quotRemInteger#")
1143 primOpInfo IntegerDivModOp = integerDyadic2Results SLIT("divModInteger#")
1145 primOpInfo Integer2IntOp
1146 = mkGenPrimOp SLIT("integer2Int#") [] one_Integer_ty intPrimTy
1148 primOpInfo Integer2WordOp
1149 = mkGenPrimOp SLIT("integer2Word#") [] one_Integer_ty wordPrimTy
1151 primOpInfo Int2IntegerOp
1152 = mkGenPrimOp SLIT("int2Integer#") [] [intPrimTy]
1153 (unboxedPair one_Integer_ty)
1155 primOpInfo Word2IntegerOp
1156 = mkGenPrimOp SLIT("word2Integer#") [] [wordPrimTy]
1157 (unboxedPair one_Integer_ty)
1159 primOpInfo Addr2IntegerOp
1160 = mkGenPrimOp SLIT("addr2Integer#") [] [addrPrimTy]
1161 (unboxedPair one_Integer_ty)
1163 primOpInfo IntegerToInt64Op
1164 = mkGenPrimOp SLIT("integerToInt64#") [] one_Integer_ty int64PrimTy
1166 primOpInfo Int64ToIntegerOp
1167 = mkGenPrimOp SLIT("int64ToInteger#") [] [int64PrimTy]
1168 (unboxedPair one_Integer_ty)
1170 primOpInfo Word64ToIntegerOp
1171 = mkGenPrimOp SLIT("word64ToInteger#") [] [word64PrimTy]
1172 (unboxedPair one_Integer_ty)
1174 primOpInfo IntegerToWord64Op
1175 = mkGenPrimOp SLIT("integerToWord64#") [] one_Integer_ty word64PrimTy
1178 Decoding of floating-point numbers is sorta Integer-related. Encoding
1179 is done with plain ccalls now (see PrelNumExtra.lhs).
1182 primOpInfo FloatDecodeOp
1183 = mkGenPrimOp SLIT("decodeFloat#") [] [floatPrimTy]
1184 (unboxedTriple [intPrimTy, intPrimTy, byteArrayPrimTy])
1185 primOpInfo DoubleDecodeOp
1186 = mkGenPrimOp SLIT("decodeDouble#") [] [doublePrimTy]
1187 (unboxedTriple [intPrimTy, intPrimTy, byteArrayPrimTy])
1190 %************************************************************************
1192 \subsubsection[PrimOp-Arrays]{PrimOpInfo for primitive arrays}
1194 %************************************************************************
1197 newArray# :: Int# -> a -> State# s -> (# State# s, MutArr# s a #)
1198 newFooArray# :: Int# -> State# s -> (# State# s, MutByteArr# s #)
1202 primOpInfo NewArrayOp
1204 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1205 state = mkStatePrimTy s
1207 mkGenPrimOp SLIT("newArray#") [s_tv, elt_tv]
1208 [intPrimTy, elt, state]
1209 (unboxedPair [state, mkMutableArrayPrimTy s elt])
1211 primOpInfo (NewByteArrayOp kind)
1213 s = alphaTy; s_tv = alphaTyVar
1215 op_str = _PK_ ("new" ++ primRepString kind ++ "Array#")
1216 state = mkStatePrimTy s
1218 mkGenPrimOp op_str [s_tv]
1220 (unboxedPair [state, mkMutableByteArrayPrimTy s])
1222 ---------------------------------------------------------------------------
1225 sameMutableArray# :: MutArr# s a -> MutArr# s a -> Bool
1226 sameMutableByteArray# :: MutByteArr# s -> MutByteArr# s -> Bool
1229 primOpInfo SameMutableArrayOp
1231 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1232 mut_arr_ty = mkMutableArrayPrimTy s elt
1234 mkGenPrimOp SLIT("sameMutableArray#") [s_tv, elt_tv] [mut_arr_ty, mut_arr_ty]
1237 primOpInfo SameMutableByteArrayOp
1239 s = alphaTy; s_tv = alphaTyVar;
1240 mut_arr_ty = mkMutableByteArrayPrimTy s
1242 mkGenPrimOp SLIT("sameMutableByteArray#") [s_tv] [mut_arr_ty, mut_arr_ty]
1245 ---------------------------------------------------------------------------
1246 -- Primitive arrays of Haskell pointers:
1249 readArray# :: MutArr# s a -> Int# -> State# s -> (# State# s, a #)
1250 writeArray# :: MutArr# s a -> Int# -> a -> State# s -> State# s
1251 indexArray# :: Array# a -> Int# -> (# a #)
1254 primOpInfo ReadArrayOp
1256 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1257 state = mkStatePrimTy s
1259 mkGenPrimOp SLIT("readArray#") [s_tv, elt_tv]
1260 [mkMutableArrayPrimTy s elt, intPrimTy, state]
1261 (unboxedPair [state, elt])
1264 primOpInfo WriteArrayOp
1266 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1268 mkGenPrimOp SLIT("writeArray#") [s_tv, elt_tv]
1269 [mkMutableArrayPrimTy s elt, intPrimTy, elt, mkStatePrimTy s]
1272 primOpInfo IndexArrayOp
1273 = let { elt = alphaTy; elt_tv = alphaTyVar } in
1274 mkGenPrimOp SLIT("indexArray#") [elt_tv] [mkArrayPrimTy elt, intPrimTy]
1275 (unboxedSingleton [elt])
1277 ---------------------------------------------------------------------------
1278 -- Primitive arrays full of unboxed bytes:
1280 primOpInfo (ReadByteArrayOp kind)
1282 s = alphaTy; s_tv = alphaTyVar
1284 op_str = _PK_ ("read" ++ primRepString kind ++ "Array#")
1285 (tvs, prim_ty) = mkPrimTyApp betaTyVars kind
1286 state = mkStatePrimTy s
1288 mkGenPrimOp op_str (s_tv:tvs)
1289 [mkMutableByteArrayPrimTy s, intPrimTy, state]
1290 (unboxedPair [state, prim_ty])
1292 primOpInfo (WriteByteArrayOp kind)
1294 s = alphaTy; s_tv = alphaTyVar
1295 op_str = _PK_ ("write" ++ primRepString kind ++ "Array#")
1296 (tvs, prim_ty) = mkPrimTyApp betaTyVars kind
1298 mkGenPrimOp op_str (s_tv:tvs)
1299 [mkMutableByteArrayPrimTy s, intPrimTy, prim_ty, mkStatePrimTy s]
1302 primOpInfo (IndexByteArrayOp kind)
1304 op_str = _PK_ ("index" ++ primRepString kind ++ "Array#")
1305 (tvs, prim_ty) = mkPrimTyApp alphaTyVars kind
1307 mkGenPrimOp op_str tvs [byteArrayPrimTy, intPrimTy] prim_ty
1309 primOpInfo (IndexOffForeignObjOp kind)
1311 op_str = _PK_ ("index" ++ primRepString kind ++ "OffForeignObj#")
1312 (tvs, prim_ty) = mkPrimTyApp alphaTyVars kind
1314 mkGenPrimOp op_str tvs [foreignObjPrimTy, intPrimTy] prim_ty
1316 primOpInfo (IndexOffAddrOp kind)
1318 op_str = _PK_ ("index" ++ primRepString kind ++ "OffAddr#")
1319 (tvs, prim_ty) = mkPrimTyApp alphaTyVars kind
1321 mkGenPrimOp op_str tvs [addrPrimTy, intPrimTy] prim_ty
1323 primOpInfo (ReadOffAddrOp kind)
1325 s = alphaTy; s_tv = alphaTyVar
1326 op_str = _PK_ ("read" ++ primRepString kind ++ "OffAddr#")
1327 (tvs, prim_ty) = mkPrimTyApp betaTyVars kind
1328 state = mkStatePrimTy s
1330 mkGenPrimOp op_str (s_tv:tvs)
1331 [addrPrimTy, intPrimTy, state]
1332 (unboxedPair [state, prim_ty])
1334 primOpInfo (WriteOffAddrOp kind)
1336 s = alphaTy; s_tv = alphaTyVar
1337 op_str = _PK_ ("write" ++ primRepString kind ++ "OffAddr#")
1338 (tvs, prim_ty) = mkPrimTyApp betaTyVars kind
1340 mkGenPrimOp op_str (s_tv:tvs)
1341 [addrPrimTy, intPrimTy, prim_ty, mkStatePrimTy s]
1344 ---------------------------------------------------------------------------
1346 unsafeFreezeArray# :: MutArr# s a -> State# s -> (# State# s, Array# a #)
1347 unsafeFreezeByteArray# :: MutByteArr# s -> State# s -> (# State# s, ByteArray# #)
1348 unsafeThawArray# :: Array# a -> State# s -> (# State# s, MutArr# s a #)
1351 primOpInfo UnsafeFreezeArrayOp
1353 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1354 state = mkStatePrimTy s
1356 mkGenPrimOp SLIT("unsafeFreezeArray#") [s_tv, elt_tv]
1357 [mkMutableArrayPrimTy s elt, state]
1358 (unboxedPair [state, mkArrayPrimTy elt])
1360 primOpInfo UnsafeFreezeByteArrayOp
1362 s = alphaTy; s_tv = alphaTyVar;
1363 state = mkStatePrimTy s
1365 mkGenPrimOp SLIT("unsafeFreezeByteArray#") [s_tv]
1366 [mkMutableByteArrayPrimTy s, state]
1367 (unboxedPair [state, byteArrayPrimTy])
1369 primOpInfo UnsafeThawArrayOp
1371 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1372 state = mkStatePrimTy s
1374 mkGenPrimOp SLIT("unsafeThawArray#") [s_tv, elt_tv]
1375 [mkArrayPrimTy elt, state]
1376 (unboxedPair [state, mkMutableArrayPrimTy s elt])
1378 ---------------------------------------------------------------------------
1379 primOpInfo SizeofByteArrayOp
1381 SLIT("sizeofByteArray#") []
1385 primOpInfo SizeofMutableByteArrayOp
1386 = let { s = alphaTy; s_tv = alphaTyVar } in
1388 SLIT("sizeofMutableByteArray#") [s_tv]
1389 [mkMutableByteArrayPrimTy s]
1394 %************************************************************************
1396 \subsubsection[PrimOp-MutVars]{PrimOpInfo for mutable variable ops}
1398 %************************************************************************
1401 primOpInfo NewMutVarOp
1403 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1404 state = mkStatePrimTy s
1406 mkGenPrimOp SLIT("newMutVar#") [s_tv, elt_tv]
1408 (unboxedPair [state, mkMutVarPrimTy s elt])
1410 primOpInfo ReadMutVarOp
1412 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1413 state = mkStatePrimTy s
1415 mkGenPrimOp SLIT("readMutVar#") [s_tv, elt_tv]
1416 [mkMutVarPrimTy s elt, state]
1417 (unboxedPair [state, elt])
1420 primOpInfo WriteMutVarOp
1422 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1424 mkGenPrimOp SLIT("writeMutVar#") [s_tv, elt_tv]
1425 [mkMutVarPrimTy s elt, elt, mkStatePrimTy s]
1428 primOpInfo SameMutVarOp
1430 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar;
1431 mut_var_ty = mkMutVarPrimTy s elt
1433 mkGenPrimOp SLIT("sameMutVar#") [s_tv, elt_tv] [mut_var_ty, mut_var_ty]
1437 %************************************************************************
1439 \subsubsection[PrimOp-Exceptions]{PrimOpInfo for exceptions}
1441 %************************************************************************
1443 catch# :: (State# RealWorld -> (# State# RealWorld, a))
1444 -> (b -> State# RealWorld -> (# State# RealWorld, a))
1446 -> (# State# RealWorld, a)
1448 throw :: Exception -> a
1451 blockAsyncExceptions# :: IO a -> IO a
1452 unblockAsyncExceptions# :: IO a -> IO a
1457 a = alphaTy; a_tv = alphaTyVar
1458 b = betaTy; b_tv = betaTyVar;
1461 mkGenPrimOp SLIT("catch#") [a_tv, b_tv]
1462 [io_a, mkFunTy b io_a, realWorldStatePrimTy]
1463 (unboxedPair [realWorldStatePrimTy, a])
1467 a = alphaTy; a_tv = alphaTyVar
1468 b = betaTy; b_tv = betaTyVar;
1470 mkGenPrimOp SLIT("raise#") [a_tv, b_tv] [a] b
1472 primOpInfo BlockAsyncExceptionsOp
1474 a = alphaTy; a_tv = alphaTyVar
1476 mkGenPrimOp SLIT("blockAsyncExceptions#") [a_tv]
1477 [ mkIOTy a, realWorldStatePrimTy ]
1478 (unboxedPair [realWorldStatePrimTy,a])
1480 primOpInfo UnblockAsyncExceptionsOp
1482 a = alphaTy; a_tv = alphaTyVar
1484 mkGenPrimOp SLIT("unblockAsyncExceptions#") [a_tv]
1485 [ mkIOTy a, realWorldStatePrimTy ]
1486 (unboxedPair [realWorldStatePrimTy,a])
1489 %************************************************************************
1491 \subsubsection[PrimOp-MVars]{PrimOpInfo for synchronizing Variables}
1493 %************************************************************************
1496 primOpInfo NewMVarOp
1498 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1499 state = mkStatePrimTy s
1501 mkGenPrimOp SLIT("newMVar#") [s_tv, elt_tv] [state]
1502 (unboxedPair [state, mkMVarPrimTy s elt])
1504 primOpInfo TakeMVarOp
1506 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1507 state = mkStatePrimTy s
1509 mkGenPrimOp SLIT("takeMVar#") [s_tv, elt_tv]
1510 [mkMVarPrimTy s elt, state]
1511 (unboxedPair [state, elt])
1513 primOpInfo PutMVarOp
1515 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1517 mkGenPrimOp SLIT("putMVar#") [s_tv, elt_tv]
1518 [mkMVarPrimTy s elt, elt, mkStatePrimTy s]
1521 primOpInfo SameMVarOp
1523 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1524 mvar_ty = mkMVarPrimTy s elt
1526 mkGenPrimOp SLIT("sameMVar#") [s_tv, elt_tv] [mvar_ty, mvar_ty] boolTy
1528 primOpInfo TryTakeMVarOp
1530 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1531 state = mkStatePrimTy s
1533 mkGenPrimOp SLIT("tryTakeMVar#") [s_tv, elt_tv]
1534 [mkMVarPrimTy s elt, state]
1535 (unboxedTriple [state, intPrimTy, elt])
1537 primOpInfo IsEmptyMVarOp
1539 elt = alphaTy; elt_tv = alphaTyVar; s = betaTy; s_tv = betaTyVar
1540 state = mkStatePrimTy s
1542 mkGenPrimOp SLIT("isEmptyMVar#") [s_tv, elt_tv]
1543 [mkMVarPrimTy s elt, mkStatePrimTy s]
1544 (unboxedPair [state, intPrimTy])
1548 %************************************************************************
1550 \subsubsection[PrimOp-Wait]{PrimOpInfo for delay/wait operations}
1552 %************************************************************************
1558 s = alphaTy; s_tv = alphaTyVar
1560 mkGenPrimOp SLIT("delay#") [s_tv]
1561 [intPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1563 primOpInfo WaitReadOp
1565 s = alphaTy; s_tv = alphaTyVar
1567 mkGenPrimOp SLIT("waitRead#") [s_tv]
1568 [intPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1570 primOpInfo WaitWriteOp
1572 s = alphaTy; s_tv = alphaTyVar
1574 mkGenPrimOp SLIT("waitWrite#") [s_tv]
1575 [intPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1578 %************************************************************************
1580 \subsubsection[PrimOp-Concurrency]{Concurrency Primitives}
1582 %************************************************************************
1585 -- fork# :: a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1587 = mkGenPrimOp SLIT("fork#") [alphaTyVar]
1588 [alphaTy, realWorldStatePrimTy]
1589 (unboxedPair [realWorldStatePrimTy, threadIdPrimTy])
1591 -- killThread# :: ThreadId# -> exception -> State# RealWorld -> State# RealWorld
1592 primOpInfo KillThreadOp
1593 = mkGenPrimOp SLIT("killThread#") [alphaTyVar]
1594 [threadIdPrimTy, alphaTy, realWorldStatePrimTy]
1595 realWorldStatePrimTy
1597 -- yield# :: State# RealWorld -> State# RealWorld
1599 = mkGenPrimOp SLIT("yield#") []
1600 [realWorldStatePrimTy]
1601 realWorldStatePrimTy
1603 -- myThreadId# :: State# RealWorld -> (# State# RealWorld, ThreadId# #)
1604 primOpInfo MyThreadIdOp
1605 = mkGenPrimOp SLIT("myThreadId#") []
1606 [realWorldStatePrimTy]
1607 (unboxedPair [realWorldStatePrimTy, threadIdPrimTy])
1610 ************************************************************************
1612 \subsubsection[PrimOps-Foreign]{PrimOpInfo for Foreign Objects}
1614 %************************************************************************
1617 primOpInfo MkForeignObjOp
1618 = mkGenPrimOp SLIT("mkForeignObj#") []
1619 [addrPrimTy, realWorldStatePrimTy]
1620 (unboxedPair [realWorldStatePrimTy, foreignObjPrimTy])
1622 primOpInfo WriteForeignObjOp
1624 s = alphaTy; s_tv = alphaTyVar
1626 mkGenPrimOp SLIT("writeForeignObj#") [s_tv]
1627 [foreignObjPrimTy, addrPrimTy, mkStatePrimTy s] (mkStatePrimTy s)
1630 ************************************************************************
1632 \subsubsection[PrimOps-Weak]{PrimOpInfo for Weak Pointers}
1634 %************************************************************************
1636 A @Weak@ Pointer is created by the @mkWeak#@ primitive:
1638 mkWeak# :: k -> v -> f -> State# RealWorld
1639 -> (# State# RealWorld, Weak# v #)
1641 In practice, you'll use the higher-level
1643 data Weak v = Weak# v
1644 mkWeak :: k -> v -> IO () -> IO (Weak v)
1648 = mkGenPrimOp SLIT("mkWeak#") [openAlphaTyVar, betaTyVar, gammaTyVar]
1649 [mkTyVarTy openAlphaTyVar, betaTy, gammaTy, realWorldStatePrimTy]
1650 (unboxedPair [realWorldStatePrimTy, mkWeakPrimTy betaTy])
1653 The following operation dereferences a weak pointer. The weak pointer
1654 may have been finalized, so the operation returns a result code which
1655 must be inspected before looking at the dereferenced value.
1657 deRefWeak# :: Weak# v -> State# RealWorld ->
1658 (# State# RealWorld, v, Int# #)
1660 Only look at v if the Int# returned is /= 0 !!
1662 The higher-level op is
1664 deRefWeak :: Weak v -> IO (Maybe v)
1667 primOpInfo DeRefWeakOp
1668 = mkGenPrimOp SLIT("deRefWeak#") [alphaTyVar]
1669 [mkWeakPrimTy alphaTy, realWorldStatePrimTy]
1670 (unboxedTriple [realWorldStatePrimTy, intPrimTy, alphaTy])
1673 Weak pointers can be finalized early by using the finalize# operation:
1675 finalizeWeak# :: Weak# v -> State# RealWorld ->
1676 (# State# RealWorld, Int#, IO () #)
1678 The Int# returned is either
1680 0 if the weak pointer has already been finalized, or it has no
1681 finalizer (the third component is then invalid).
1683 1 if the weak pointer is still alive, with the finalizer returned
1684 as the third component.
1687 primOpInfo FinalizeWeakOp
1688 = mkGenPrimOp SLIT("finalizeWeak#") [alphaTyVar]
1689 [mkWeakPrimTy alphaTy, realWorldStatePrimTy]
1690 (unboxedTriple [realWorldStatePrimTy, intPrimTy,
1691 mkFunTy realWorldStatePrimTy
1692 (unboxedPair [realWorldStatePrimTy,unitTy])])
1695 %************************************************************************
1697 \subsubsection[PrimOp-stable-pointers]{PrimOpInfo for stable pointers and stable names}
1699 %************************************************************************
1701 A {\em stable name/pointer} is an index into a table of stable name
1702 entries. Since the garbage collector is told about stable pointers,
1703 it is safe to pass a stable pointer to external systems such as C
1707 makeStablePtr# :: a -> State# RealWorld -> (# State# RealWorld, StablePtr# a #)
1708 freeStablePtr :: StablePtr# a -> State# RealWorld -> State# RealWorld
1709 deRefStablePtr# :: StablePtr# a -> State# RealWorld -> (# State# RealWorld, a #)
1710 eqStablePtr# :: StablePtr# a -> StablePtr# a -> Int#
1713 It may seem a bit surprising that @makeStablePtr#@ is a @IO@
1714 operation since it doesn't (directly) involve IO operations. The
1715 reason is that if some optimisation pass decided to duplicate calls to
1716 @makeStablePtr#@ and we only pass one of the stable pointers over, a
1717 massive space leak can result. Putting it into the IO monad
1718 prevents this. (Another reason for putting them in a monad is to
1719 ensure correct sequencing wrt the side-effecting @freeStablePtr@
1722 An important property of stable pointers is that if you call
1723 makeStablePtr# twice on the same object you get the same stable
1726 Note that we can implement @freeStablePtr#@ using @_ccall_@ (and,
1727 besides, it's not likely to be used from Haskell) so it's not a
1730 Question: Why @RealWorld@ - won't any instance of @_ST@ do the job? [ADR]
1735 A stable name is like a stable pointer, but with three important differences:
1737 (a) You can't deRef one to get back to the original object.
1738 (b) You can convert one to an Int.
1739 (c) You don't need to 'freeStableName'
1741 The existence of a stable name doesn't guarantee to keep the object it
1742 points to alive (unlike a stable pointer), hence (a).
1746 (a) makeStableName always returns the same value for a given
1747 object (same as stable pointers).
1749 (b) if two stable names are equal, it implies that the objects
1750 from which they were created were the same.
1752 (c) stableNameToInt always returns the same Int for a given
1756 primOpInfo MakeStablePtrOp
1757 = mkGenPrimOp SLIT("makeStablePtr#") [alphaTyVar]
1758 [alphaTy, realWorldStatePrimTy]
1759 (unboxedPair [realWorldStatePrimTy,
1760 mkTyConApp stablePtrPrimTyCon [alphaTy]])
1762 primOpInfo DeRefStablePtrOp
1763 = mkGenPrimOp SLIT("deRefStablePtr#") [alphaTyVar]
1764 [mkStablePtrPrimTy alphaTy, realWorldStatePrimTy]
1765 (unboxedPair [realWorldStatePrimTy, alphaTy])
1767 primOpInfo EqStablePtrOp
1768 = mkGenPrimOp SLIT("eqStablePtr#") [alphaTyVar, betaTyVar]
1769 [mkStablePtrPrimTy alphaTy, mkStablePtrPrimTy betaTy]
1772 primOpInfo MakeStableNameOp
1773 = mkGenPrimOp SLIT("makeStableName#") [alphaTyVar]
1774 [alphaTy, realWorldStatePrimTy]
1775 (unboxedPair [realWorldStatePrimTy,
1776 mkTyConApp stableNamePrimTyCon [alphaTy]])
1778 primOpInfo EqStableNameOp
1779 = mkGenPrimOp SLIT("eqStableName#") [alphaTyVar, betaTyVar]
1780 [mkStableNamePrimTy alphaTy, mkStableNamePrimTy betaTy]
1783 primOpInfo StableNameToIntOp
1784 = mkGenPrimOp SLIT("stableNameToInt#") [alphaTyVar]
1785 [mkStableNamePrimTy alphaTy]
1789 %************************************************************************
1791 \subsubsection[PrimOp-unsafePointerEquality]{PrimOpInfo for Pointer Equality}
1793 %************************************************************************
1795 [Alastair Reid is to blame for this!]
1797 These days, (Glasgow) Haskell seems to have a bit of everything from
1798 other languages: strict operations, mutable variables, sequencing,
1799 pointers, etc. About the only thing left is LISP's ability to test
1800 for pointer equality. So, let's add it in!
1803 reallyUnsafePtrEquality :: a -> a -> Int#
1806 which tests any two closures (of the same type) to see if they're the
1807 same. (Returns $0$ for @False@, $\neq 0$ for @True@ - to avoid
1808 difficulties of trying to box up the result.)
1810 NB This is {\em really unsafe\/} because even something as trivial as
1811 a garbage collection might change the answer by removing indirections.
1812 Still, no-one's forcing you to use it. If you're worried about little
1813 things like loss of referential transparency, you might like to wrap
1814 it all up in a monad-like thing as John O'Donnell and John Hughes did
1815 for non-determinism (1989 (Fraserburgh) Glasgow FP Workshop
1818 I'm thinking of using it to speed up a critical equality test in some
1819 graphics stuff in a context where the possibility of saying that
1820 denotationally equal things aren't isn't a problem (as long as it
1821 doesn't happen too often.) ADR
1823 To Will: Jim said this was already in, but I can't see it so I'm
1824 adding it. Up to you whether you add it. (Note that this could have
1825 been readily implemented using a @veryDangerousCCall@ before they were
1829 primOpInfo ReallyUnsafePtrEqualityOp
1830 = mkGenPrimOp SLIT("reallyUnsafePtrEquality#") [alphaTyVar]
1831 [alphaTy, alphaTy] intPrimTy
1834 %************************************************************************
1836 \subsubsection[PrimOp-parallel]{PrimOpInfo for parallelism op(s)}
1838 %************************************************************************
1841 primOpInfo SeqOp -- seq# :: a -> Int#
1842 = mkGenPrimOp SLIT("seq#") [alphaTyVar] [alphaTy] intPrimTy
1844 primOpInfo ParOp -- par# :: a -> Int#
1845 = mkGenPrimOp SLIT("par#") [alphaTyVar] [alphaTy] intPrimTy
1849 -- HWL: The first 4 Int# in all par... annotations denote:
1850 -- name, granularity info, size of result, degree of parallelism
1851 -- Same structure as _seq_ i.e. returns Int#
1852 -- KSW: v, the second arg in parAt# and parAtForNow#, is used only to determine
1853 -- `the processor containing the expression v'; it is not evaluated
1855 primOpInfo ParGlobalOp -- parGlobal# :: a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1856 = mkGenPrimOp SLIT("parGlobal#") [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1858 primOpInfo ParLocalOp -- parLocal# :: a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1859 = mkGenPrimOp SLIT("parLocal#") [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1861 primOpInfo ParAtOp -- parAt# :: a -> v -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1862 = mkGenPrimOp SLIT("parAt#") [alphaTyVar,betaTyVar,gammaTyVar] [betaTy,alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,gammaTy] intPrimTy
1864 primOpInfo ParAtAbsOp -- parAtAbs# :: a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1865 = mkGenPrimOp SLIT("parAtAbs#") [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1867 primOpInfo ParAtRelOp -- parAtRel# :: a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1868 = mkGenPrimOp SLIT("parAtRel#") [alphaTyVar,betaTyVar] [alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,betaTy] intPrimTy
1870 primOpInfo ParAtForNowOp -- parAtForNow# :: a -> v -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1871 = mkGenPrimOp SLIT("parAtForNow#") [alphaTyVar,betaTyVar,gammaTyVar] [betaTy,alphaTy,intPrimTy,intPrimTy,intPrimTy,intPrimTy,gammaTy] intPrimTy
1873 primOpInfo CopyableOp -- copyable# :: a -> Int#
1874 = mkGenPrimOp SLIT("copyable#") [alphaTyVar] [alphaTy] intPrimTy
1876 primOpInfo NoFollowOp -- noFollow# :: a -> Int#
1877 = mkGenPrimOp SLIT("noFollow#") [alphaTyVar] [alphaTy] intPrimTy
1880 %************************************************************************
1882 \subsubsection[PrimOp-tag]{PrimOpInfo for @dataToTag#@ and @tagToEnum#@}
1884 %************************************************************************
1886 These primops are pretty wierd.
1888 dataToTag# :: a -> Int (arg must be an evaluated data type)
1889 tagToEnum# :: Int -> a (result type must be an enumerated type)
1891 The constraints aren't currently checked by the front end, but the
1892 code generator will fall over if they aren't satisfied.
1895 primOpInfo DataToTagOp
1896 = mkGenPrimOp SLIT("dataToTag#") [alphaTyVar] [alphaTy] intPrimTy
1898 primOpInfo TagToEnumOp
1899 = mkGenPrimOp SLIT("tagToEnum#") [alphaTyVar] [intPrimTy] alphaTy
1902 primOpInfo op = pprPanic "primOpInfo:" (ppr op)
1906 %************************************************************************
1908 \subsubsection[PrimOp-ool]{Which PrimOps are out-of-line}
1910 %************************************************************************
1912 Some PrimOps need to be called out-of-line because they either need to
1913 perform a heap check or they block.
1919 TryTakeMVarOp -> True
1926 BlockAsyncExceptionsOp -> True
1927 UnblockAsyncExceptionsOp -> True
1929 NewByteArrayOp _ -> True
1930 IntegerAddOp -> True
1931 IntegerSubOp -> True
1932 IntegerMulOp -> True
1933 IntegerGcdOp -> True
1934 IntegerDivExactOp -> True
1935 IntegerQuotOp -> True
1936 IntegerRemOp -> True
1937 IntegerQuotRemOp -> True
1938 IntegerDivModOp -> True
1939 Int2IntegerOp -> True
1940 Word2IntegerOp -> True
1941 Addr2IntegerOp -> True
1942 Word64ToIntegerOp -> True
1943 Int64ToIntegerOp -> True
1944 FloatDecodeOp -> True
1945 DoubleDecodeOp -> True
1947 FinalizeWeakOp -> True
1948 MakeStableNameOp -> True
1949 MkForeignObjOp -> True
1953 KillThreadOp -> True
1956 UnsafeThawArrayOp -> True
1957 -- UnsafeThawArrayOp doesn't perform any heap checks,
1958 -- but it is of such an esoteric nature that
1959 -- it is done out-of-line rather than require
1960 -- the NCG to implement it.
1962 CCallOp c_call -> ccallMayGC c_call
1968 primOpOkForSpeculation
1969 ~~~~~~~~~~~~~~~~~~~~~~
1970 Sometimes we may choose to execute a PrimOp even though it isn't
1971 certain that its result will be required; ie execute them
1972 ``speculatively''. The same thing as ``cheap eagerness.'' Usually
1973 this is OK, because PrimOps are usually cheap, but it isn't OK for
1974 (a)~expensive PrimOps and (b)~PrimOps which can fail.
1976 PrimOps that have side effects also should not be executed speculatively.
1978 Ok-for-speculation also means that it's ok *not* to execute the
1982 Here the result is not used, so we can discard the primop. Anything
1983 that has side effects mustn't be dicarded in this way, of course!
1985 See also @primOpIsCheap@ (below).
1989 primOpOkForSpeculation :: PrimOp -> Bool
1990 -- See comments with CoreUtils.exprOkForSpeculation
1991 primOpOkForSpeculation op
1992 = not (primOpCanFail op || primOpHasSideEffects op || primOpOutOfLine op)
1998 @primOpIsCheap@, as used in \tr{SimplUtils.lhs}. For now (HACK
1999 WARNING), we just borrow some other predicates for a
2000 what-should-be-good-enough test. "Cheap" means willing to call it more
2001 than once. Evaluation order is unaffected.
2004 primOpIsCheap :: PrimOp -> Bool
2005 -- See comments with CoreUtils.exprOkForSpeculation
2006 primOpIsCheap op = not (primOpHasSideEffects op || primOpOutOfLine op)
2011 primOpIsDupable means that the use of the primop is small enough to
2012 duplicate into different case branches. See CoreUtils.exprIsDupable.
2015 primOpIsDupable :: PrimOp -> Bool
2016 -- See comments with CoreUtils.exprIsDupable
2017 -- We say it's dupable it isn't implemented by a C call with a wrapper
2018 primOpIsDupable op = not (primOpNeedsWrapper op)
2023 primOpCanFail :: PrimOp -> Bool
2025 primOpCanFail IntQuotOp = True -- Divide by zero
2026 primOpCanFail IntRemOp = True -- Divide by zero
2029 primOpCanFail IntegerQuotRemOp = True -- Divide by zero
2030 primOpCanFail IntegerDivModOp = True -- Divide by zero
2032 -- Float. ToDo: tan? tanh?
2033 primOpCanFail FloatDivOp = True -- Divide by zero
2034 primOpCanFail FloatLogOp = True -- Log of zero
2035 primOpCanFail FloatAsinOp = True -- Arg out of domain
2036 primOpCanFail FloatAcosOp = True -- Arg out of domain
2038 -- Double. ToDo: tan? tanh?
2039 primOpCanFail DoubleDivOp = True -- Divide by zero
2040 primOpCanFail DoubleLogOp = True -- Log of zero
2041 primOpCanFail DoubleAsinOp = True -- Arg out of domain
2042 primOpCanFail DoubleAcosOp = True -- Arg out of domain
2044 primOpCanFail other_op = False
2047 And some primops have side-effects and so, for example, must not be
2051 primOpHasSideEffects :: PrimOp -> Bool
2053 primOpHasSideEffects ParOp = True
2054 primOpHasSideEffects ForkOp = True
2055 primOpHasSideEffects KillThreadOp = True
2056 primOpHasSideEffects YieldOp = True
2057 primOpHasSideEffects SeqOp = True
2059 primOpHasSideEffects MkForeignObjOp = True
2060 primOpHasSideEffects WriteForeignObjOp = True
2061 primOpHasSideEffects MkWeakOp = True
2062 primOpHasSideEffects DeRefWeakOp = True
2063 primOpHasSideEffects FinalizeWeakOp = True
2064 primOpHasSideEffects MakeStablePtrOp = True
2065 primOpHasSideEffects MakeStableNameOp = True
2066 primOpHasSideEffects EqStablePtrOp = True -- SOF
2067 primOpHasSideEffects DeRefStablePtrOp = True -- ??? JSM & ADR
2069 -- In general, writes are considered a side effect, but
2070 -- reads and variable allocations are not
2071 -- Why? Because writes must not be omitted, but reads can be if their result is not used.
2072 -- (Sequencing of reads is maintained by data dependencies on the resulting
2074 primOpHasSideEffects WriteArrayOp = True
2075 primOpHasSideEffects (WriteByteArrayOp _) = True
2076 primOpHasSideEffects (WriteOffAddrOp _) = True
2077 primOpHasSideEffects WriteMutVarOp = True
2079 primOpHasSideEffects UnsafeFreezeArrayOp = True
2080 primOpHasSideEffects UnsafeFreezeByteArrayOp = True
2081 primOpHasSideEffects UnsafeThawArrayOp = True
2083 primOpHasSideEffects TakeMVarOp = True
2084 primOpHasSideEffects TryTakeMVarOp = True
2085 primOpHasSideEffects PutMVarOp = True
2086 primOpHasSideEffects DelayOp = True
2087 primOpHasSideEffects WaitReadOp = True
2088 primOpHasSideEffects WaitWriteOp = True
2090 primOpHasSideEffects ParGlobalOp = True
2091 primOpHasSideEffects ParLocalOp = True
2092 primOpHasSideEffects ParAtOp = True
2093 primOpHasSideEffects ParAtAbsOp = True
2094 primOpHasSideEffects ParAtRelOp = True
2095 primOpHasSideEffects ParAtForNowOp = True
2096 primOpHasSideEffects CopyableOp = True -- Possibly not. ASP
2097 primOpHasSideEffects NoFollowOp = True -- Possibly not. ASP
2098 primOpHasSideEffects (CCallOp _) = True
2100 primOpHasSideEffects other = False
2103 Inline primitive operations that perform calls need wrappers to save
2104 any live variables that are stored in caller-saves registers.
2107 primOpNeedsWrapper :: PrimOp -> Bool
2109 primOpNeedsWrapper (CCallOp _) = True
2111 primOpNeedsWrapper Integer2IntOp = True
2112 primOpNeedsWrapper Integer2WordOp = True
2113 primOpNeedsWrapper IntegerCmpOp = True
2114 primOpNeedsWrapper IntegerCmpIntOp = True
2116 primOpNeedsWrapper FloatExpOp = True
2117 primOpNeedsWrapper FloatLogOp = True
2118 primOpNeedsWrapper FloatSqrtOp = True
2119 primOpNeedsWrapper FloatSinOp = True
2120 primOpNeedsWrapper FloatCosOp = True
2121 primOpNeedsWrapper FloatTanOp = True
2122 primOpNeedsWrapper FloatAsinOp = True
2123 primOpNeedsWrapper FloatAcosOp = True
2124 primOpNeedsWrapper FloatAtanOp = True
2125 primOpNeedsWrapper FloatSinhOp = True
2126 primOpNeedsWrapper FloatCoshOp = True
2127 primOpNeedsWrapper FloatTanhOp = True
2128 primOpNeedsWrapper FloatPowerOp = True
2130 primOpNeedsWrapper DoubleExpOp = True
2131 primOpNeedsWrapper DoubleLogOp = True
2132 primOpNeedsWrapper DoubleSqrtOp = True
2133 primOpNeedsWrapper DoubleSinOp = True
2134 primOpNeedsWrapper DoubleCosOp = True
2135 primOpNeedsWrapper DoubleTanOp = True
2136 primOpNeedsWrapper DoubleAsinOp = True
2137 primOpNeedsWrapper DoubleAcosOp = True
2138 primOpNeedsWrapper DoubleAtanOp = True
2139 primOpNeedsWrapper DoubleSinhOp = True
2140 primOpNeedsWrapper DoubleCoshOp = True
2141 primOpNeedsWrapper DoubleTanhOp = True
2142 primOpNeedsWrapper DoublePowerOp = True
2144 primOpNeedsWrapper MakeStableNameOp = True
2145 primOpNeedsWrapper DeRefStablePtrOp = True
2147 primOpNeedsWrapper DelayOp = True
2148 primOpNeedsWrapper WaitReadOp = True
2149 primOpNeedsWrapper WaitWriteOp = True
2151 primOpNeedsWrapper other_op = False
2155 primOpArity :: PrimOp -> Arity
2157 = case (primOpInfo op) of
2161 GenPrimOp occ tyvars arg_tys res_ty -> length arg_tys
2163 primOpType :: PrimOp -> Type -- you may want to use primOpSig instead
2165 = case (primOpInfo op) of
2166 Dyadic occ ty -> dyadic_fun_ty ty
2167 Monadic occ ty -> monadic_fun_ty ty
2168 Compare occ ty -> compare_fun_ty ty
2170 GenPrimOp occ tyvars arg_tys res_ty ->
2171 mkForAllTys tyvars (mkFunTys arg_tys res_ty)
2173 mkPrimOpIdName :: PrimOp -> Id -> Name
2174 -- Make the name for the PrimOp's Id
2175 -- We have to pass in the Id itself because it's a WiredInId
2176 -- and hence recursive
2177 mkPrimOpIdName op id
2178 = mkWiredInIdName key pREL_GHC occ_name id
2180 occ_name = primOpOcc op
2181 key = mkPrimOpIdUnique (primOpTag op)
2184 primOpRdrName :: PrimOp -> RdrName
2185 primOpRdrName op = mkRdrQual pREL_GHC_Name (primOpOcc op)
2187 primOpOcc :: PrimOp -> OccName
2188 primOpOcc op = case (primOpInfo op) of
2190 Monadic occ _ -> occ
2191 Compare occ _ -> occ
2192 GenPrimOp occ _ _ _ -> occ
2194 -- primOpSig is like primOpType but gives the result split apart:
2195 -- (type variables, argument types, result type)
2196 -- It also gives arity, strictness info
2198 primOpSig :: PrimOp -> ([TyVar], [Type], Type, Arity, StrictnessInfo)
2200 = (tyvars, arg_tys, res_ty, arity, primOpStrictness arity op)
2202 arity = length arg_tys
2203 (tyvars, arg_tys, res_ty)
2204 = case (primOpInfo op) of
2205 Monadic occ ty -> ([], [ty], ty )
2206 Dyadic occ ty -> ([], [ty,ty], ty )
2207 Compare occ ty -> ([], [ty,ty], boolTy)
2208 GenPrimOp occ tyvars arg_tys res_ty
2209 -> (tyvars, arg_tys, res_ty)
2211 -- primOpUsg is like primOpSig but the types it yields are the
2212 -- appropriate sigma (i.e., usage-annotated) types,
2213 -- as required by the UsageSP inference.
2215 primOpUsg :: PrimOp -> ([TyVar],[Type],Type)
2219 -- Refer to comment by `otherwise' clause; we need consider here
2220 -- *only* primops that have arguments or results containing Haskell
2221 -- pointers (things that are pointed). Unpointed values are
2222 -- irrelevant to the usage analysis. The issue is whether pointed
2223 -- values may be entered or duplicated by the primop.
2225 -- Remember that primops are *never* partially applied.
2227 NewArrayOp -> mangle [mkP, mkM, mkP ] mkM
2228 SameMutableArrayOp -> mangle [mkP, mkP ] mkM
2229 ReadArrayOp -> mangle [mkM, mkP, mkP ] mkM
2230 WriteArrayOp -> mangle [mkM, mkP, mkM, mkP] mkR
2231 IndexArrayOp -> mangle [mkM, mkP ] mkM
2232 UnsafeFreezeArrayOp -> mangle [mkM, mkP ] mkM
2233 UnsafeThawArrayOp -> mangle [mkM, mkP ] mkM
2235 NewMutVarOp -> mangle [mkM, mkP ] mkM
2236 ReadMutVarOp -> mangle [mkM, mkP ] mkM
2237 WriteMutVarOp -> mangle [mkM, mkM, mkP ] mkR
2238 SameMutVarOp -> mangle [mkP, mkP ] mkM
2240 CatchOp -> -- [mkO, mkO . (inFun mkM mkO)] mkO
2241 mangle [mkM, mkM . (inFun mkM mkM), mkP] mkM
2242 -- might use caught action multiply
2243 RaiseOp -> mangle [mkM ] mkM
2245 NewMVarOp -> mangle [mkP ] mkR
2246 TakeMVarOp -> mangle [mkM, mkP ] mkM
2247 PutMVarOp -> mangle [mkM, mkM, mkP ] mkR
2248 SameMVarOp -> mangle [mkP, mkP ] mkM
2249 TryTakeMVarOp -> mangle [mkM, mkP ] mkM
2250 IsEmptyMVarOp -> mangle [mkP, mkP ] mkM
2252 ForkOp -> mangle [mkO, mkP ] mkR
2253 KillThreadOp -> mangle [mkP, mkM, mkP ] mkR
2255 MkWeakOp -> mangle [mkZ, mkM, mkM, mkP] mkM
2256 DeRefWeakOp -> mangle [mkM, mkP ] mkM
2257 FinalizeWeakOp -> mangle [mkM, mkP ] (mkR . (inUB [id,id,inFun mkR mkM]))
2259 MakeStablePtrOp -> mangle [mkM, mkP ] mkM
2260 DeRefStablePtrOp -> mangle [mkM, mkP ] mkM
2261 EqStablePtrOp -> mangle [mkP, mkP ] mkR
2262 MakeStableNameOp -> mangle [mkZ, mkP ] mkR
2263 EqStableNameOp -> mangle [mkP, mkP ] mkR
2264 StableNameToIntOp -> mangle [mkP ] mkR
2266 ReallyUnsafePtrEqualityOp -> mangle [mkZ, mkZ ] mkR
2268 SeqOp -> mangle [mkO ] mkR
2269 ParOp -> mangle [mkO ] mkR
2270 ParGlobalOp -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2271 ParLocalOp -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2272 ParAtOp -> mangle [mkO, mkZ, mkP, mkP, mkP, mkP, mkM] mkM
2273 ParAtAbsOp -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2274 ParAtRelOp -> mangle [mkO, mkP, mkP, mkP, mkP, mkM] mkM
2275 ParAtForNowOp -> mangle [mkO, mkZ, mkP, mkP, mkP, mkP, mkM] mkM
2276 CopyableOp -> mangle [mkZ ] mkR
2277 NoFollowOp -> mangle [mkZ ] mkR
2279 CCallOp _ -> mangle [ ] mkM
2281 -- Things with no Haskell pointers inside: in actuality, usages are
2282 -- irrelevant here (hence it doesn't matter that some of these
2283 -- apparently permit duplication; since such arguments are never
2284 -- ENTERed anyway, the usage annotation they get is entirely irrelevant
2285 -- except insofar as it propagates to infect other values that *are*
2288 otherwise -> nomangle
2290 where mkZ = mkUsgTy UsOnce -- pointed argument used zero
2291 mkO = mkUsgTy UsOnce -- pointed argument used once
2292 mkM = mkUsgTy UsMany -- pointed argument used multiply
2293 mkP = mkUsgTy UsOnce -- unpointed argument
2294 mkR = mkUsgTy UsMany -- unpointed result
2296 (tyvars, arg_tys, res_ty, _, _) = primOpSig op
2298 nomangle = (tyvars, map mkP arg_tys, mkR res_ty)
2300 mangle fs g = (tyvars, zipWithEqual "primOpUsg" ($) fs arg_tys, g res_ty)
2302 inFun f g ty = case splitFunTy_maybe ty of
2303 Just (a,b) -> mkFunTy (f a) (g b)
2304 Nothing -> pprPanic "primOpUsg:inFun" (ppr op <+> ppr ty)
2306 inUB fs ty = case splitTyConApp_maybe ty of
2307 Just (tc,tys) -> ASSERT( tc == tupleTyCon Unboxed (length fs) )
2308 mkTupleTy Unboxed (length fs) (zipWithEqual "primOpUsg"
2310 Nothing -> pprPanic "primOpUsg:inUB" (ppr op <+> ppr ty)
2314 data PrimOpResultInfo
2315 = ReturnsPrim PrimRep
2318 -- Some PrimOps need not return a manifest primitive or algebraic value
2319 -- (i.e. they might return a polymorphic value). These PrimOps *must*
2320 -- be out of line, or the code generator won't work.
2322 getPrimOpResultInfo :: PrimOp -> PrimOpResultInfo
2323 getPrimOpResultInfo (CCallOp _)
2324 = ReturnsAlg unboxedPairTyCon
2325 getPrimOpResultInfo op
2326 = case (primOpInfo op) of
2327 Dyadic _ ty -> ReturnsPrim (typePrimRep ty)
2328 Monadic _ ty -> ReturnsPrim (typePrimRep ty)
2329 Compare _ ty -> ReturnsAlg boolTyCon
2330 GenPrimOp _ _ _ ty ->
2331 let rep = typePrimRep ty in
2333 PtrRep -> case splitAlgTyConApp_maybe ty of
2334 Nothing -> panic "getPrimOpResultInfo"
2335 Just (tc,_,_) -> ReturnsAlg tc
2336 other -> ReturnsPrim other
2339 The commutable ops are those for which we will try to move constants
2340 to the right hand side for strength reduction.
2343 commutableOp :: PrimOp -> Bool
2345 commutableOp CharEqOp = True
2346 commutableOp CharNeOp = True
2347 commutableOp IntAddOp = True
2348 commutableOp IntMulOp = True
2349 commutableOp AndOp = True
2350 commutableOp OrOp = True
2351 commutableOp XorOp = True
2352 commutableOp IntEqOp = True
2353 commutableOp IntNeOp = True
2354 commutableOp IntegerAddOp = True
2355 commutableOp IntegerMulOp = True
2356 commutableOp IntegerGcdOp = True
2357 commutableOp IntegerIntGcdOp = True
2358 commutableOp FloatAddOp = True
2359 commutableOp FloatMulOp = True
2360 commutableOp FloatEqOp = True
2361 commutableOp FloatNeOp = True
2362 commutableOp DoubleAddOp = True
2363 commutableOp DoubleMulOp = True
2364 commutableOp DoubleEqOp = True
2365 commutableOp DoubleNeOp = True
2366 commutableOp _ = False
2371 mkPrimTyApp :: [TyVar] -> PrimRep -> ([TyVar], Type)
2372 -- CharRep --> ([], Char#)
2373 -- StablePtrRep --> ([a], StablePtr# a)
2374 mkPrimTyApp tvs kind
2375 = (forall_tvs, mkTyConApp tycon (mkTyVarTys forall_tvs))
2377 tycon = primRepTyCon kind
2378 forall_tvs = take (tyConArity tycon) tvs
2380 dyadic_fun_ty ty = mkFunTys [ty, ty] ty
2381 monadic_fun_ty ty = mkFunTy ty ty
2382 compare_fun_ty ty = mkFunTys [ty, ty] boolTy
2387 pprPrimOp :: PrimOp -> SDoc
2389 pprPrimOp (CCallOp c_call) = pprCCallOp c_call
2391 = getPprStyle $ \ sty ->
2392 if ifaceStyle sty then -- For interfaces Print it qualified with PrelGHC.
2393 ptext SLIT("PrelGHC.") <> pprOccName occ
2397 occ = primOpOcc other_op
2401 %************************************************************************
2403 \subsubsection{CCalls}
2405 %************************************************************************
2407 A special ``trap-door'' to use in making calls direct to C functions:
2411 Bool -- True <=> really a "casm"
2412 Bool -- True <=> might invoke Haskell GC
2413 CallConv -- calling convention to use.
2417 = StaticTarget CLabelString -- An "unboxed" ccall# to `fn'.
2418 | DynamicTarget Unique -- First argument (an Addr#) is the function pointer
2419 -- (unique is used to generate a 'typedef' to cast
2420 -- the function pointer if compiling the ccall# down to
2421 -- .hc code - can't do this inline for tedious reasons.)
2423 instance Eq CCallTarget where
2424 (StaticTarget l1) == (StaticTarget l2) = l1 == l2
2425 (DynamicTarget _) == (DynamicTarget _) = True
2426 -- Ignore the arbitrary unique; this is important when comparing
2427 -- a dynamic ccall read from an interface file A.hi with the
2428 -- one constructed from A.hs, when deciding whether the interface
2432 ccallMayGC :: CCall -> Bool
2433 ccallMayGC (CCall _ _ may_gc _) = may_gc
2435 ccallIsCasm :: CCall -> Bool
2436 ccallIsCasm (CCall _ c_asm _ _) = c_asm
2438 isDynamicTarget (DynamicTarget _) = True
2439 isDynamicTarget (StaticTarget _) = False
2441 dynamicTarget :: CCallTarget
2442 dynamicTarget = DynamicTarget (panic "Unique in DynamicTarget not yet set")
2443 -- The unique is really only to do with code generation, so it
2444 -- is only set in CoreToStg; before then it's just an error message
2446 setCCallUnique :: CCall -> Unique -> CCall
2447 setCCallUnique (CCall (DynamicTarget _) is_asm may_gc cconv) uniq
2448 = CCall (DynamicTarget uniq) is_asm may_gc cconv
2449 setCCallUnique ccall uniq = ccall
2453 pprCCallOp (CCall fun is_casm may_gc cconv)
2454 = hcat [ ifPprDebug callconv
2455 , text "__", ppr_dyn
2456 , text before , ppr_fun , after]
2458 callconv = text "{-" <> pprCallConv cconv <> text "-}"
2461 | is_casm && may_gc = "casm_GC ``"
2462 | is_casm = "casm ``"
2463 | may_gc = "ccall_GC "
2464 | otherwise = "ccall "
2467 | is_casm = text "''"
2470 ppr_dyn = case fun of
2471 DynamicTarget _ -> text "dyn_"
2474 ppr_fun = case fun of
2475 DynamicTarget _ -> text "\"\""
2476 StaticTarget fn -> pprCLabelString fn