primops.txt.pp: add missing type application in description of GHC.Prim.Any
[ghc-hetmet.git] / compiler / prelude / primops.txt.pp
1 -----------------------------------------------------------------------
2 -- 
3 -- (c) 2010 The University of Glasgow
4 --
5 -- Primitive Operations and Types
6 --
7 -- For more information on PrimOps, see
8 --   http://hackage.haskell.org/trac/ghc/wiki/Commentary/PrimOps
9 --
10 -----------------------------------------------------------------------
11
12 -- This file is processed by the utility program genprimopcode to produce
13 -- a number of include files within the compiler and optionally to produce
14 -- human-readable documentation.
15 --
16 -- It should first be preprocessed.
17 --
18 -- Information on how PrimOps are implemented and the steps necessary to
19 -- add a new one can be found in the Commentary:
20 --
21 --  http://hackage.haskell.org/trac/ghc/wiki/Commentary/PrimOps
22
23 -- This file is divided into named sections, each containing or more
24 -- primop entries. Section headers have the format:
25 --
26 --      section "section-name" {description}
27 --
28 -- This information is used solely when producing documentation; it is
29 -- otherwise ignored.  The description is optional.
30 --
31 -- The format of each primop entry is as follows:
32 --
33 --      primop internal-name "name-in-program-text" type category {description} attributes
34
35 -- The default attribute values which apply if you don't specify
36 -- other ones.  Attribute values can be True, False, or arbitrary
37 -- text between curly brackets.  This is a kludge to enable 
38 -- processors of this file to easily get hold of simple info
39 -- (eg, out_of_line), whilst avoiding parsing complex expressions
40 -- needed for strictness info.
41
42 defaults
43    has_side_effects = False
44    out_of_line      = False
45    commutable       = False
46    needs_wrapper    = False
47    can_fail         = False
48    strictness       = { \ arity -> mkStrictSig (mkTopDmdType (replicate arity lazyDmd) TopRes) }
49
50 -- Currently, documentation is produced using latex, so contents of
51 -- description fields should be legal latex. Descriptions can contain
52 -- matched pairs of embedded curly brackets.
53
54 #include "MachDeps.h"
55
56 -- We need platform defines (tests for mingw32 below).  However, we only
57 -- test the TARGET platform, which doesn't vary between stages, so the
58 -- stage1 platform defines are fine:
59 #include "../stage1/ghc_boot_platform.h"
60
61 section "The word size story."
62         {Haskell98 specifies that signed integers (type {\tt Int})
63          must contain at least 30 bits. GHC always implements {\tt
64          Int} using the primitive type {\tt Int\#}, whose size equals
65          the {\tt MachDeps.h} constant {\tt WORD\_SIZE\_IN\_BITS}.
66          This is normally set based on the {\tt config.h} parameter
67          {\tt SIZEOF\_HSWORD}, i.e., 32 bits on 32-bit machines, 64
68          bits on 64-bit machines.  However, it can also be explicitly
69          set to a smaller number, e.g., 31 bits, to allow the
70          possibility of using tag bits. Currently GHC itself has only
71          32-bit and 64-bit variants, but 30 or 31-bit code can be
72          exported as an external core file for use in other back ends.
73
74          GHC also implements a primitive unsigned integer type {\tt
75          Word\#} which always has the same number of bits as {\tt
76          Int\#}.
77         
78          In addition, GHC supports families of explicit-sized integers
79          and words at 8, 16, 32, and 64 bits, with the usual
80          arithmetic operations, comparisons, and a range of
81          conversions.  The 8-bit and 16-bit sizes are always
82          represented as {\tt Int\#} and {\tt Word\#}, and the
83          operations implemented in terms of the the primops on these
84          types, with suitable range restrictions on the results (using
85          the {\tt narrow$n$Int\#} and {\tt narrow$n$Word\#} families
86          of primops.  The 32-bit sizes are represented using {\tt
87          Int\#} and {\tt Word\#} when {\tt WORD\_SIZE\_IN\_BITS}
88          $\geq$ 32; otherwise, these are represented using distinct
89          primitive types {\tt Int32\#} and {\tt Word32\#}. These (when
90          needed) have a complete set of corresponding operations;
91          however, nearly all of these are implemented as external C
92          functions rather than as primops.  Exactly the same story
93          applies to the 64-bit sizes.  All of these details are hidden
94          under the {\tt PrelInt} and {\tt PrelWord} modules, which use
95          {\tt \#if}-defs to invoke the appropriate types and
96          operators.
97
98          Word size also matters for the families of primops for
99          indexing/reading/writing fixed-size quantities at offsets
100          from an array base, address, or foreign pointer.  Here, a
101          slightly different approach is taken.  The names of these
102          primops are fixed, but their {\it types} vary according to
103          the value of {\tt WORD\_SIZE\_IN\_BITS}. For example, if word
104          size is at least 32 bits then an operator like
105          \texttt{indexInt32Array\#} has type {\tt ByteArray\# -> Int\#
106          -> Int\#}; otherwise it has type {\tt ByteArray\# -> Int\# ->
107          Int32\#}.  This approach confines the necessary {\tt
108          \#if}-defs to this file; no conditional compilation is needed
109          in the files that expose these primops.
110
111          Finally, there are strongly deprecated primops for coercing
112          between {\tt Addr\#}, the primitive type of machine
113          addresses, and {\tt Int\#}.  These are pretty bogus anyway,
114          but will work on existing 32-bit and 64-bit GHC targets; they
115          are completely bogus when tag bits are used in {\tt Int\#},
116          so are not available in this case.  }
117         
118 -- Define synonyms for indexing ops. 
119
120 #if WORD_SIZE_IN_BITS < 32 
121 #define INT32 Int32#
122 #define WORD32 Word32#
123 #else
124 #define INT32 Int#
125 #define WORD32 Word#
126 #endif
127
128 #if WORD_SIZE_IN_BITS < 64
129 #define INT64 Int64#
130 #define WORD64 Word64#
131 #else
132 #define INT64 Int#
133 #define WORD64 Word#
134 #endif
135
136 ------------------------------------------------------------------------
137 section "Char#" 
138         {Operations on 31-bit characters.}
139 ------------------------------------------------------------------------
140
141 primtype Char#
142
143 primop   CharGtOp  "gtChar#"   Compare   Char# -> Char# -> Bool
144 primop   CharGeOp  "geChar#"   Compare   Char# -> Char# -> Bool
145
146 primop   CharEqOp  "eqChar#"   Compare
147    Char# -> Char# -> Bool
148    with commutable = True
149
150 primop   CharNeOp  "neChar#"   Compare
151    Char# -> Char# -> Bool
152    with commutable = True
153
154 primop   CharLtOp  "ltChar#"   Compare   Char# -> Char# -> Bool
155 primop   CharLeOp  "leChar#"   Compare   Char# -> Char# -> Bool
156
157 primop   OrdOp   "ord#"  GenPrimOp   Char# -> Int#
158
159 ------------------------------------------------------------------------
160 section "Int#"
161         {Operations on native-size integers (30+ bits).}
162 ------------------------------------------------------------------------
163
164 primtype Int#
165
166 primop   IntAddOp    "+#"    Dyadic
167    Int# -> Int# -> Int#
168    with commutable = True
169
170 primop   IntSubOp    "-#"    Dyadic   Int# -> Int# -> Int#
171
172 primop   IntMulOp    "*#" 
173    Dyadic   Int# -> Int# -> Int#
174    {Low word of signed integer multiply.}
175    with commutable = True
176
177 primop   IntMulMayOfloOp  "mulIntMayOflo#" 
178    Dyadic   Int# -> Int# -> Int#
179    {Return non-zero if there is any possibility that the upper word of a
180     signed integer multiply might contain useful information.  Return
181     zero only if you are completely sure that no overflow can occur.
182     On a 32-bit platform, the recommmended implementation is to do a 
183     32 x 32 -> 64 signed multiply, and subtract result[63:32] from
184     (result[31] >>signed 31).  If this is zero, meaning that the 
185     upper word is merely a sign extension of the lower one, no
186     overflow can occur.
187
188     On a 64-bit platform it is not always possible to 
189     acquire the top 64 bits of the result.  Therefore, a recommended 
190     implementation is to take the absolute value of both operands, and 
191     return 0 iff bits[63:31] of them are zero, since that means that their 
192     magnitudes fit within 31 bits, so the magnitude of the product must fit 
193     into 62 bits.
194
195     If in doubt, return non-zero, but do make an effort to create the
196     correct answer for small args, since otherwise the performance of
197     \texttt{(*) :: Integer -> Integer -> Integer} will be poor.
198    }
199    with commutable = True
200
201 primop   IntQuotOp    "quotInt#"    Dyadic
202    Int# -> Int# -> Int#
203    {Rounds towards zero.}
204    with can_fail = True
205
206 primop   IntRemOp    "remInt#"    Dyadic
207    Int# -> Int# -> Int#
208    {Satisfies \texttt{(quotInt\# x y) *\# y +\# (remInt\# x y) == x}.}
209    with can_fail = True
210
211 primop   IntNegOp    "negateInt#"    Monadic   Int# -> Int#
212 primop   IntAddCOp   "addIntC#"    GenPrimOp   Int# -> Int# -> (# Int#, Int# #)
213          {Add with carry.  First member of result is (wrapped) sum; 
214           second member is 0 iff no overflow occured.}
215 primop   IntSubCOp   "subIntC#"    GenPrimOp   Int# -> Int# -> (# Int#, Int# #)
216          {Subtract with carry.  First member of result is (wrapped) difference; 
217           second member is 0 iff no overflow occured.}
218
219 primop   IntGtOp  ">#"   Compare   Int# -> Int# -> Bool
220 primop   IntGeOp  ">=#"   Compare   Int# -> Int# -> Bool
221
222 primop   IntEqOp  "==#"   Compare
223    Int# -> Int# -> Bool
224    with commutable = True
225
226 primop   IntNeOp  "/=#"   Compare
227    Int# -> Int# -> Bool
228    with commutable = True
229
230 primop   IntLtOp  "<#"   Compare   Int# -> Int# -> Bool
231 primop   IntLeOp  "<=#"   Compare   Int# -> Int# -> Bool
232
233 primop   ChrOp   "chr#"   GenPrimOp   Int# -> Char#
234
235 primop   Int2WordOp "int2Word#" GenPrimOp Int# -> Word#
236 primop   Int2FloatOp   "int2Float#"      GenPrimOp  Int# -> Float#
237 primop   Int2DoubleOp   "int2Double#"          GenPrimOp  Int# -> Double#
238
239 primop   ISllOp   "uncheckedIShiftL#" GenPrimOp  Int# -> Int# -> Int#
240          {Shift left.  Result undefined if shift amount is not
241           in the range 0 to word size - 1 inclusive.}
242 primop   ISraOp   "uncheckedIShiftRA#" GenPrimOp Int# -> Int# -> Int#
243          {Shift right arithmetic.  Result undefined if shift amount is not
244           in the range 0 to word size - 1 inclusive.}
245 primop   ISrlOp   "uncheckedIShiftRL#" GenPrimOp Int# -> Int# -> Int#
246          {Shift right logical.  Result undefined if shift amount is not
247           in the range 0 to word size - 1 inclusive.}
248
249 ------------------------------------------------------------------------
250 section "Word#"
251         {Operations on native-sized unsigned words (30+ bits).}
252 ------------------------------------------------------------------------
253
254 primtype Word#
255
256 primop   WordAddOp   "plusWord#"   Dyadic   Word# -> Word# -> Word#
257    with commutable = True
258
259 primop   WordSubOp   "minusWord#"   Dyadic   Word# -> Word# -> Word#
260
261 primop   WordMulOp   "timesWord#"   Dyadic   Word# -> Word# -> Word#
262    with commutable = True
263
264 primop   WordQuotOp   "quotWord#"   Dyadic   Word# -> Word# -> Word#
265    with can_fail = True
266
267 primop   WordRemOp   "remWord#"   Dyadic   Word# -> Word# -> Word#
268    with can_fail = True
269
270 primop   AndOp   "and#"   Dyadic   Word# -> Word# -> Word#
271    with commutable = True
272
273 primop   OrOp   "or#"   Dyadic   Word# -> Word# -> Word#
274    with commutable = True
275
276 primop   XorOp   "xor#"   Dyadic   Word# -> Word# -> Word#
277    with commutable = True
278
279 primop   NotOp   "not#"   Monadic   Word# -> Word#
280
281 primop   SllOp   "uncheckedShiftL#"   GenPrimOp   Word# -> Int# -> Word#
282          {Shift left logical.   Result undefined if shift amount is not
283           in the range 0 to word size - 1 inclusive.}
284 primop   SrlOp   "uncheckedShiftRL#"   GenPrimOp   Word# -> Int# -> Word#
285          {Shift right logical.   Result undefined if shift  amount is not
286           in the range 0 to word size - 1 inclusive.}
287
288 primop   Word2IntOp   "word2Int#"   GenPrimOp   Word# -> Int#
289
290 primop   WordGtOp   "gtWord#"   Compare   Word# -> Word# -> Bool
291 primop   WordGeOp   "geWord#"   Compare   Word# -> Word# -> Bool
292 primop   WordEqOp   "eqWord#"   Compare   Word# -> Word# -> Bool
293 primop   WordNeOp   "neWord#"   Compare   Word# -> Word# -> Bool
294 primop   WordLtOp   "ltWord#"   Compare   Word# -> Word# -> Bool
295 primop   WordLeOp   "leWord#"   Compare   Word# -> Word# -> Bool
296
297 ------------------------------------------------------------------------
298 section "Narrowings" 
299         {Explicit narrowing of native-sized ints or words.}
300 ------------------------------------------------------------------------
301
302 primop   Narrow8IntOp      "narrow8Int#"      Monadic   Int# -> Int#
303 primop   Narrow16IntOp     "narrow16Int#"     Monadic   Int# -> Int#
304 primop   Narrow32IntOp     "narrow32Int#"     Monadic   Int# -> Int#
305 primop   Narrow8WordOp     "narrow8Word#"     Monadic   Word# -> Word#
306 primop   Narrow16WordOp    "narrow16Word#"    Monadic   Word# -> Word#
307 primop   Narrow32WordOp    "narrow32Word#"    Monadic   Word# -> Word#
308
309
310 #if WORD_SIZE_IN_BITS < 32
311 ------------------------------------------------------------------------
312 section "Int32#"
313         {Operations on 32-bit integers ({\tt Int32\#}).  This type is only used
314          if plain {\tt Int\#} has less than 32 bits.  In any case, the operations
315          are not primops; they are implemented (if needed) as ccalls instead.}
316 ------------------------------------------------------------------------
317
318 primtype Int32#
319
320 ------------------------------------------------------------------------
321 section "Word32#"
322         {Operations on 32-bit unsigned words. This type is only used 
323          if plain {\tt Word\#} has less than 32 bits. In any case, the operations
324          are not primops; they are implemented (if needed) as ccalls instead.}
325 ------------------------------------------------------------------------
326
327 primtype Word32#
328
329 #endif 
330
331
332 #if WORD_SIZE_IN_BITS < 64
333 ------------------------------------------------------------------------
334 section "Int64#"
335         {Operations on 64-bit unsigned words. This type is only used 
336          if plain {\tt Int\#} has less than 64 bits. In any case, the operations
337          are not primops; they are implemented (if needed) as ccalls instead.}
338 ------------------------------------------------------------------------
339
340 primtype Int64#
341
342 ------------------------------------------------------------------------
343 section "Word64#"
344         {Operations on 64-bit unsigned words. This type is only used 
345          if plain {\tt Word\#} has less than 64 bits. In any case, the operations
346          are not primops; they are implemented (if needed) as ccalls instead.}
347 ------------------------------------------------------------------------
348
349 primtype Word64#
350
351 #endif
352
353 ------------------------------------------------------------------------
354 section "Double#"
355         {Operations on double-precision (64 bit) floating-point numbers.}
356 ------------------------------------------------------------------------
357
358 primtype Double#
359
360 primop   DoubleGtOp ">##"   Compare   Double# -> Double# -> Bool
361 primop   DoubleGeOp ">=##"   Compare   Double# -> Double# -> Bool
362
363 primop DoubleEqOp "==##"   Compare
364    Double# -> Double# -> Bool
365    with commutable = True
366
367 primop DoubleNeOp "/=##"   Compare
368    Double# -> Double# -> Bool
369    with commutable = True
370
371 primop   DoubleLtOp "<##"   Compare   Double# -> Double# -> Bool
372 primop   DoubleLeOp "<=##"   Compare   Double# -> Double# -> Bool
373
374 primop   DoubleAddOp   "+##"   Dyadic
375    Double# -> Double# -> Double#
376    with commutable = True
377
378 primop   DoubleSubOp   "-##"   Dyadic   Double# -> Double# -> Double#
379
380 primop   DoubleMulOp   "*##"   Dyadic
381    Double# -> Double# -> Double#
382    with commutable = True
383
384 primop   DoubleDivOp   "/##"   Dyadic
385    Double# -> Double# -> Double#
386    with can_fail = True
387
388 primop   DoubleNegOp   "negateDouble#"  Monadic   Double# -> Double#
389
390 primop   Double2IntOp   "double2Int#"          GenPrimOp  Double# -> Int#
391    {Truncates a {\tt Double#} value to the nearest {\tt Int#}.
392     Results are undefined if the truncation if truncation yields
393     a value outside the range of {\tt Int#}.}
394
395 primop   Double2FloatOp   "double2Float#" GenPrimOp Double# -> Float#
396
397 primop   DoubleExpOp   "expDouble#"      Monadic
398    Double# -> Double#
399    with needs_wrapper = True
400
401 primop   DoubleLogOp   "logDouble#"      Monadic         
402    Double# -> Double#
403    with
404    needs_wrapper = True
405    can_fail = True
406
407 primop   DoubleSqrtOp   "sqrtDouble#"      Monadic  
408    Double# -> Double#
409    with needs_wrapper = True
410
411 primop   DoubleSinOp   "sinDouble#"      Monadic          
412    Double# -> Double#
413    with needs_wrapper = True
414
415 primop   DoubleCosOp   "cosDouble#"      Monadic          
416    Double# -> Double#
417    with needs_wrapper = True
418
419 primop   DoubleTanOp   "tanDouble#"      Monadic          
420    Double# -> Double#
421    with needs_wrapper = True
422
423 primop   DoubleAsinOp   "asinDouble#"      Monadic 
424    Double# -> Double#
425    with
426    needs_wrapper = True
427    can_fail = True
428
429 primop   DoubleAcosOp   "acosDouble#"      Monadic  
430    Double# -> Double#
431    with
432    needs_wrapper = True
433    can_fail = True
434
435 primop   DoubleAtanOp   "atanDouble#"      Monadic  
436    Double# -> Double#
437    with
438    needs_wrapper = True
439
440 primop   DoubleSinhOp   "sinhDouble#"      Monadic  
441    Double# -> Double#
442    with needs_wrapper = True
443
444 primop   DoubleCoshOp   "coshDouble#"      Monadic  
445    Double# -> Double#
446    with needs_wrapper = True
447
448 primop   DoubleTanhOp   "tanhDouble#"      Monadic  
449    Double# -> Double#
450    with needs_wrapper = True
451
452 primop   DoublePowerOp   "**##" Dyadic  
453    Double# -> Double# -> Double#
454    {Exponentiation.}
455    with needs_wrapper = True
456
457 primop   DoubleDecode_2IntOp   "decodeDouble_2Int#" GenPrimOp    
458    Double# -> (# Int#, Word#, Word#, Int# #)
459    {Convert to integer.
460     First component of the result is -1 or 1, indicating the sign of the
461     mantissa. The next two are the high and low 32 bits of the mantissa
462     respectively, and the last is the exponent.}
463    with out_of_line = True
464
465 ------------------------------------------------------------------------
466 section "Float#" 
467         {Operations on single-precision (32-bit) floating-point numbers.}
468 ------------------------------------------------------------------------
469
470 primtype Float#
471
472 primop   FloatGtOp  "gtFloat#"   Compare   Float# -> Float# -> Bool
473 primop   FloatGeOp  "geFloat#"   Compare   Float# -> Float# -> Bool
474
475 primop   FloatEqOp  "eqFloat#"   Compare
476    Float# -> Float# -> Bool
477    with commutable = True
478
479 primop   FloatNeOp  "neFloat#"   Compare
480    Float# -> Float# -> Bool
481    with commutable = True
482
483 primop   FloatLtOp  "ltFloat#"   Compare   Float# -> Float# -> Bool
484 primop   FloatLeOp  "leFloat#"   Compare   Float# -> Float# -> Bool
485
486 primop   FloatAddOp   "plusFloat#"      Dyadic            
487    Float# -> Float# -> Float#
488    with commutable = True
489
490 primop   FloatSubOp   "minusFloat#"      Dyadic      Float# -> Float# -> Float#
491
492 primop   FloatMulOp   "timesFloat#"      Dyadic    
493    Float# -> Float# -> Float#
494    with commutable = True
495
496 primop   FloatDivOp   "divideFloat#"      Dyadic  
497    Float# -> Float# -> Float#
498    with can_fail = True
499
500 primop   FloatNegOp   "negateFloat#"      Monadic    Float# -> Float#
501
502 primop   Float2IntOp   "float2Int#"      GenPrimOp  Float# -> Int#
503    {Truncates a {\tt Float#} value to the nearest {\tt Int#}.
504     Results are undefined if the truncation if truncation yields
505     a value outside the range of {\tt Int#}.}
506
507 primop   FloatExpOp   "expFloat#"      Monadic          
508    Float# -> Float#
509    with needs_wrapper = True
510
511 primop   FloatLogOp   "logFloat#"      Monadic          
512    Float# -> Float#
513    with needs_wrapper = True
514         can_fail = True
515
516 primop   FloatSqrtOp   "sqrtFloat#"      Monadic          
517    Float# -> Float#
518    with needs_wrapper = True
519
520 primop   FloatSinOp   "sinFloat#"      Monadic          
521    Float# -> Float#
522    with needs_wrapper = True
523
524 primop   FloatCosOp   "cosFloat#"      Monadic          
525    Float# -> Float#
526    with needs_wrapper = True
527
528 primop   FloatTanOp   "tanFloat#"      Monadic          
529    Float# -> Float#
530    with needs_wrapper = True
531
532 primop   FloatAsinOp   "asinFloat#"      Monadic          
533    Float# -> Float#
534    with needs_wrapper = True
535         can_fail = True
536
537 primop   FloatAcosOp   "acosFloat#"      Monadic          
538    Float# -> Float#
539    with needs_wrapper = True
540         can_fail = True
541
542 primop   FloatAtanOp   "atanFloat#"      Monadic          
543    Float# -> Float#
544    with needs_wrapper = True
545
546 primop   FloatSinhOp   "sinhFloat#"      Monadic          
547    Float# -> Float#
548    with needs_wrapper = True
549
550 primop   FloatCoshOp   "coshFloat#"      Monadic          
551    Float# -> Float#
552    with needs_wrapper = True
553
554 primop   FloatTanhOp   "tanhFloat#"      Monadic          
555    Float# -> Float#
556    with needs_wrapper = True
557
558 primop   FloatPowerOp   "powerFloat#"      Dyadic   
559    Float# -> Float# -> Float#
560    with needs_wrapper = True
561
562 primop   Float2DoubleOp   "float2Double#" GenPrimOp  Float# -> Double#
563
564 primop   FloatDecode_IntOp   "decodeFloat_Int#" GenPrimOp
565    Float# -> (# Int#, Int# #)
566    {Convert to integers.
567     First {\tt Int\#} in result is the mantissa; second is the exponent.}
568    with out_of_line = True
569
570 ------------------------------------------------------------------------
571 section "Arrays"
572         {Operations on {\tt Array\#}.}
573 ------------------------------------------------------------------------
574
575 primtype Array# a
576
577 primtype MutableArray# s a
578
579 primop  NewArrayOp "newArray#" GenPrimOp
580    Int# -> a -> State# s -> (# State# s, MutableArray# s a #)
581    {Create a new mutable array with the specified number of elements,
582     in the specified state thread,
583     with each element containing the specified initial value.}
584    with
585    out_of_line = True
586    has_side_effects = True
587
588 primop  SameMutableArrayOp "sameMutableArray#" GenPrimOp
589    MutableArray# s a -> MutableArray# s a -> Bool
590
591 primop  ReadArrayOp "readArray#" GenPrimOp
592    MutableArray# s a -> Int# -> State# s -> (# State# s, a #)
593    {Read from specified index of mutable array. Result is not yet evaluated.}
594    with
595    has_side_effects = True
596
597 primop  WriteArrayOp "writeArray#" GenPrimOp
598    MutableArray# s a -> Int# -> a -> State# s -> State# s
599    {Write to specified index of mutable array.}
600    with
601    has_side_effects = True
602
603 primop  SizeofArrayOp "sizeofArray#" GenPrimOp
604    Array# a -> Int#
605    {Return the number of elements in the array.}
606
607 primop  SizeofMutableArrayOp "sizeofMutableArray#" GenPrimOp
608    MutableArray# s a -> Int#
609    {Return the number of elements in the array.}
610
611 primop  IndexArrayOp "indexArray#" GenPrimOp
612    Array# a -> Int# -> (# a #)
613    {Read from specified index of immutable array. Result is packaged into
614     an unboxed singleton; the result itself is not yet evaluated.}
615
616 primop  UnsafeFreezeArrayOp "unsafeFreezeArray#" GenPrimOp
617    MutableArray# s a -> State# s -> (# State# s, Array# a #)
618    {Make a mutable array immutable, without copying.}
619    with
620    has_side_effects = True
621
622 primop  UnsafeThawArrayOp  "unsafeThawArray#" GenPrimOp
623    Array# a -> State# s -> (# State# s, MutableArray# s a #)
624    {Make an immutable array mutable, without copying.}
625    with
626    out_of_line = True
627    has_side_effects = True
628
629 ------------------------------------------------------------------------
630 section "Byte Arrays"
631         {Operations on {\tt ByteArray\#}. A {\tt ByteArray\#} is a just a region of
632          raw memory in the garbage-collected heap, which is not
633          scanned for pointers. It carries its own size (in bytes).
634          There are
635          three sets of operations for accessing byte array contents:
636          index for reading from immutable byte arrays, and read/write
637          for mutable byte arrays.  Each set contains operations for a
638          range of useful primitive data types.  Each operation takes
639          an offset measured in terms of the size fo the primitive type
640          being read or written.}
641
642 ------------------------------------------------------------------------
643
644 primtype ByteArray#
645
646 primtype MutableByteArray# s
647
648 primop  NewByteArrayOp_Char "newByteArray#" GenPrimOp
649    Int# -> State# s -> (# State# s, MutableByteArray# s #)
650    {Create a new mutable byte array of specified size (in bytes), in
651     the specified state thread.}
652    with out_of_line = True
653         has_side_effects = True
654
655 primop  NewPinnedByteArrayOp_Char "newPinnedByteArray#" GenPrimOp
656    Int# -> State# s -> (# State# s, MutableByteArray# s #)
657    {Create a mutable byte array that the GC guarantees not to move.}
658    with out_of_line = True
659         has_side_effects = True
660
661 primop  NewAlignedPinnedByteArrayOp_Char "newAlignedPinnedByteArray#" GenPrimOp
662    Int# -> Int# -> State# s -> (# State# s, MutableByteArray# s #)
663    {Create a mutable byte array, aligned by the specified amount, that the GC guarantees not to move.}
664    with out_of_line = True
665         has_side_effects = True
666
667 primop  ByteArrayContents_Char "byteArrayContents#" GenPrimOp
668    ByteArray# -> Addr#
669    {Intended for use with pinned arrays; otherwise very unsafe!}
670
671 primop  SameMutableByteArrayOp "sameMutableByteArray#" GenPrimOp
672    MutableByteArray# s -> MutableByteArray# s -> Bool
673
674 primop  UnsafeFreezeByteArrayOp "unsafeFreezeByteArray#" GenPrimOp
675    MutableByteArray# s -> State# s -> (# State# s, ByteArray# #)
676    {Make a mutable byte array immutable, without copying.}
677    with
678    has_side_effects = True
679
680 primop  SizeofByteArrayOp "sizeofByteArray#" GenPrimOp  
681    ByteArray# -> Int#
682    {Return the size of the array in bytes.}
683
684 primop  SizeofMutableByteArrayOp "sizeofMutableByteArray#" GenPrimOp
685    MutableByteArray# s -> Int#
686    {Return the size of the array in bytes.}
687
688 primop IndexByteArrayOp_Char "indexCharArray#" GenPrimOp
689    ByteArray# -> Int# -> Char#
690    {Read 8-bit character; offset in bytes.}
691
692 primop IndexByteArrayOp_WideChar "indexWideCharArray#" GenPrimOp
693    ByteArray# -> Int# -> Char#
694    {Read 31-bit character; offset in 4-byte words.}
695
696 primop IndexByteArrayOp_Int "indexIntArray#" GenPrimOp
697    ByteArray# -> Int# -> Int#
698
699 primop IndexByteArrayOp_Word "indexWordArray#" GenPrimOp
700    ByteArray# -> Int# -> Word#
701
702 primop IndexByteArrayOp_Addr "indexAddrArray#" GenPrimOp
703    ByteArray# -> Int# -> Addr#
704
705 primop IndexByteArrayOp_Float "indexFloatArray#" GenPrimOp
706    ByteArray# -> Int# -> Float#
707
708 primop IndexByteArrayOp_Double "indexDoubleArray#" GenPrimOp
709    ByteArray# -> Int# -> Double#
710
711 primop IndexByteArrayOp_StablePtr "indexStablePtrArray#" GenPrimOp
712    ByteArray# -> Int# -> StablePtr# a
713
714 primop IndexByteArrayOp_Int8 "indexInt8Array#" GenPrimOp
715    ByteArray# -> Int# -> Int#
716
717 primop IndexByteArrayOp_Int16 "indexInt16Array#" GenPrimOp
718    ByteArray# -> Int# -> Int#
719
720 primop IndexByteArrayOp_Int32 "indexInt32Array#" GenPrimOp
721    ByteArray# -> Int# -> INT32
722
723 primop IndexByteArrayOp_Int64 "indexInt64Array#" GenPrimOp
724    ByteArray# -> Int# -> INT64
725
726 primop IndexByteArrayOp_Word8 "indexWord8Array#" GenPrimOp
727    ByteArray# -> Int# -> Word#
728
729 primop IndexByteArrayOp_Word16 "indexWord16Array#" GenPrimOp
730    ByteArray# -> Int# -> Word#
731
732 primop IndexByteArrayOp_Word32 "indexWord32Array#" GenPrimOp
733    ByteArray# -> Int# -> WORD32
734
735 primop IndexByteArrayOp_Word64 "indexWord64Array#" GenPrimOp
736    ByteArray# -> Int# -> WORD64
737
738 primop  ReadByteArrayOp_Char "readCharArray#" GenPrimOp
739    MutableByteArray# s -> Int# -> State# s -> (# State# s, Char# #)
740    {Read 8-bit character; offset in bytes.}
741    with has_side_effects = True
742
743 primop  ReadByteArrayOp_WideChar "readWideCharArray#" GenPrimOp
744    MutableByteArray# s -> Int# -> State# s -> (# State# s, Char# #)
745    {Read 31-bit character; offset in 4-byte words.}
746    with has_side_effects = True
747
748 primop  ReadByteArrayOp_Int "readIntArray#" GenPrimOp
749    MutableByteArray# s -> Int# -> State# s -> (# State# s, Int# #)
750    with has_side_effects = True
751
752 primop  ReadByteArrayOp_Word "readWordArray#" GenPrimOp
753    MutableByteArray# s -> Int# -> State# s -> (# State# s, Word# #)
754    with has_side_effects = True
755
756 primop  ReadByteArrayOp_Addr "readAddrArray#" GenPrimOp
757    MutableByteArray# s -> Int# -> State# s -> (# State# s, Addr# #)
758    with has_side_effects = True
759
760 primop  ReadByteArrayOp_Float "readFloatArray#" GenPrimOp
761    MutableByteArray# s -> Int# -> State# s -> (# State# s, Float# #)
762    with has_side_effects = True
763
764 primop  ReadByteArrayOp_Double "readDoubleArray#" GenPrimOp
765    MutableByteArray# s -> Int# -> State# s -> (# State# s, Double# #)
766    with has_side_effects = True
767
768 primop  ReadByteArrayOp_StablePtr "readStablePtrArray#" GenPrimOp
769    MutableByteArray# s -> Int# -> State# s -> (# State# s, StablePtr# a #)
770    with has_side_effects = True
771
772 primop  ReadByteArrayOp_Int8 "readInt8Array#" GenPrimOp
773    MutableByteArray# s -> Int# -> State# s -> (# State# s, Int# #)
774    with has_side_effects = True
775
776 primop  ReadByteArrayOp_Int16 "readInt16Array#" GenPrimOp
777    MutableByteArray# s -> Int# -> State# s -> (# State# s, Int# #)
778    with has_side_effects = True
779
780 primop  ReadByteArrayOp_Int32 "readInt32Array#" GenPrimOp
781    MutableByteArray# s -> Int# -> State# s -> (# State# s, INT32 #)
782    with has_side_effects = True
783
784 primop  ReadByteArrayOp_Int64 "readInt64Array#" GenPrimOp
785    MutableByteArray# s -> Int# -> State# s -> (# State# s, INT64 #)
786    with has_side_effects = True
787
788 primop  ReadByteArrayOp_Word8 "readWord8Array#" GenPrimOp
789    MutableByteArray# s -> Int# -> State# s -> (# State# s, Word# #)
790    with has_side_effects = True
791
792 primop  ReadByteArrayOp_Word16 "readWord16Array#" GenPrimOp
793    MutableByteArray# s -> Int# -> State# s -> (# State# s, Word# #)
794    with has_side_effects = True
795
796 primop  ReadByteArrayOp_Word32 "readWord32Array#" GenPrimOp
797    MutableByteArray# s -> Int# -> State# s -> (# State# s, WORD32 #)
798    with has_side_effects = True
799
800 primop  ReadByteArrayOp_Word64 "readWord64Array#" GenPrimOp
801    MutableByteArray# s -> Int# -> State# s -> (# State# s, WORD64 #)
802    with has_side_effects = True
803
804 primop  WriteByteArrayOp_Char "writeCharArray#" GenPrimOp
805    MutableByteArray# s -> Int# -> Char# -> State# s -> State# s
806    {Write 8-bit character; offset in bytes.}
807    with has_side_effects = True
808
809 primop  WriteByteArrayOp_WideChar "writeWideCharArray#" GenPrimOp
810    MutableByteArray# s -> Int# -> Char# -> State# s -> State# s
811    {Write 31-bit character; offset in 4-byte words.}
812    with has_side_effects = True
813
814 primop  WriteByteArrayOp_Int "writeIntArray#" GenPrimOp
815    MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
816    with has_side_effects = True
817
818 primop  WriteByteArrayOp_Word "writeWordArray#" GenPrimOp
819    MutableByteArray# s -> Int# -> Word# -> State# s -> State# s
820    with has_side_effects = True
821
822 primop  WriteByteArrayOp_Addr "writeAddrArray#" GenPrimOp
823    MutableByteArray# s -> Int# -> Addr# -> State# s -> State# s
824    with has_side_effects = True
825
826 primop  WriteByteArrayOp_Float "writeFloatArray#" GenPrimOp
827    MutableByteArray# s -> Int# -> Float# -> State# s -> State# s
828    with has_side_effects = True
829
830 primop  WriteByteArrayOp_Double "writeDoubleArray#" GenPrimOp
831    MutableByteArray# s -> Int# -> Double# -> State# s -> State# s
832    with has_side_effects = True
833
834 primop  WriteByteArrayOp_StablePtr "writeStablePtrArray#" GenPrimOp
835    MutableByteArray# s -> Int# -> StablePtr# a -> State# s -> State# s
836    with has_side_effects = True
837
838 primop  WriteByteArrayOp_Int8 "writeInt8Array#" GenPrimOp
839    MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
840    with has_side_effects = True
841
842 primop  WriteByteArrayOp_Int16 "writeInt16Array#" GenPrimOp
843    MutableByteArray# s -> Int# -> Int# -> State# s -> State# s
844    with has_side_effects = True
845
846 primop  WriteByteArrayOp_Int32 "writeInt32Array#" GenPrimOp
847    MutableByteArray# s -> Int# -> INT32 -> State# s -> State# s
848    with has_side_effects = True
849
850 primop  WriteByteArrayOp_Int64 "writeInt64Array#" GenPrimOp
851    MutableByteArray# s -> Int# -> INT64 -> State# s -> State# s
852    with has_side_effects = True
853
854 primop  WriteByteArrayOp_Word8 "writeWord8Array#" GenPrimOp
855    MutableByteArray# s -> Int# -> Word# -> State# s -> State# s
856    with has_side_effects = True
857
858 primop  WriteByteArrayOp_Word16 "writeWord16Array#" GenPrimOp
859    MutableByteArray# s -> Int# -> Word# -> State# s -> State# s
860    with has_side_effects = True
861
862 primop  WriteByteArrayOp_Word32 "writeWord32Array#" GenPrimOp
863    MutableByteArray# s -> Int# -> WORD32 -> State# s -> State# s
864    with has_side_effects = True
865
866 primop  WriteByteArrayOp_Word64 "writeWord64Array#" GenPrimOp
867    MutableByteArray# s -> Int# -> WORD64 -> State# s -> State# s
868    with has_side_effects = True
869
870 ------------------------------------------------------------------------
871 section "Addr#"
872 ------------------------------------------------------------------------
873
874 primtype Addr#
875         { An arbitrary machine address assumed to point outside
876          the garbage-collected heap. }
877
878 pseudoop "nullAddr#" Addr#
879         { The null address. }
880
881 primop   AddrAddOp "plusAddr#" GenPrimOp Addr# -> Int# -> Addr#
882 primop   AddrSubOp "minusAddr#" GenPrimOp Addr# -> Addr# -> Int#
883          {Result is meaningless if two {\tt Addr\#}s are so far apart that their
884          difference doesn't fit in an {\tt Int\#}.}
885 primop   AddrRemOp "remAddr#" GenPrimOp Addr# -> Int# -> Int#
886          {Return the remainder when the {\tt Addr\#} arg, treated like an {\tt Int\#},
887           is divided by the {\tt Int\#} arg.}
888 #if (WORD_SIZE_IN_BITS == 32 || WORD_SIZE_IN_BITS == 64)
889 primop   Addr2IntOp  "addr2Int#"     GenPrimOp   Addr# -> Int#
890         {Coerce directly from address to int. Strongly deprecated.}
891 primop   Int2AddrOp   "int2Addr#"    GenPrimOp  Int# -> Addr#
892         {Coerce directly from int to address. Strongly deprecated.}
893 #endif
894
895 primop   AddrGtOp  "gtAddr#"   Compare   Addr# -> Addr# -> Bool
896 primop   AddrGeOp  "geAddr#"   Compare   Addr# -> Addr# -> Bool
897 primop   AddrEqOp  "eqAddr#"   Compare   Addr# -> Addr# -> Bool
898 primop   AddrNeOp  "neAddr#"   Compare   Addr# -> Addr# -> Bool
899 primop   AddrLtOp  "ltAddr#"   Compare   Addr# -> Addr# -> Bool
900 primop   AddrLeOp  "leAddr#"   Compare   Addr# -> Addr# -> Bool
901
902 primop IndexOffAddrOp_Char "indexCharOffAddr#" GenPrimOp
903    Addr# -> Int# -> Char#
904    {Reads 8-bit character; offset in bytes.}
905
906 primop IndexOffAddrOp_WideChar "indexWideCharOffAddr#" GenPrimOp
907    Addr# -> Int# -> Char#
908    {Reads 31-bit character; offset in 4-byte words.}
909
910 primop IndexOffAddrOp_Int "indexIntOffAddr#" GenPrimOp
911    Addr# -> Int# -> Int#
912
913 primop IndexOffAddrOp_Word "indexWordOffAddr#" GenPrimOp
914    Addr# -> Int# -> Word#
915
916 primop IndexOffAddrOp_Addr "indexAddrOffAddr#" GenPrimOp
917    Addr# -> Int# -> Addr#
918
919 primop IndexOffAddrOp_Float "indexFloatOffAddr#" GenPrimOp
920    Addr# -> Int# -> Float#
921
922 primop IndexOffAddrOp_Double "indexDoubleOffAddr#" GenPrimOp
923    Addr# -> Int# -> Double#
924
925 primop IndexOffAddrOp_StablePtr "indexStablePtrOffAddr#" GenPrimOp
926    Addr# -> Int# -> StablePtr# a
927
928 primop IndexOffAddrOp_Int8 "indexInt8OffAddr#" GenPrimOp
929    Addr# -> Int# -> Int#
930
931 primop IndexOffAddrOp_Int16 "indexInt16OffAddr#" GenPrimOp
932    Addr# -> Int# -> Int#
933
934 primop IndexOffAddrOp_Int32 "indexInt32OffAddr#" GenPrimOp
935    Addr# -> Int# -> INT32
936
937 primop IndexOffAddrOp_Int64 "indexInt64OffAddr#" GenPrimOp
938    Addr# -> Int# -> INT64
939
940 primop IndexOffAddrOp_Word8 "indexWord8OffAddr#" GenPrimOp
941    Addr# -> Int# -> Word#
942
943 primop IndexOffAddrOp_Word16 "indexWord16OffAddr#" GenPrimOp
944    Addr# -> Int# -> Word#
945
946 primop IndexOffAddrOp_Word32 "indexWord32OffAddr#" GenPrimOp
947    Addr# -> Int# -> WORD32
948
949 primop IndexOffAddrOp_Word64 "indexWord64OffAddr#" GenPrimOp
950    Addr# -> Int# -> WORD64
951
952 primop ReadOffAddrOp_Char "readCharOffAddr#" GenPrimOp
953    Addr# -> Int# -> State# s -> (# State# s, Char# #)
954    {Reads 8-bit character; offset in bytes.}
955    with has_side_effects = True
956
957 primop ReadOffAddrOp_WideChar "readWideCharOffAddr#" GenPrimOp
958    Addr# -> Int# -> State# s -> (# State# s, Char# #)
959    {Reads 31-bit character; offset in 4-byte words.}
960    with has_side_effects = True
961
962 primop ReadOffAddrOp_Int "readIntOffAddr#" GenPrimOp
963    Addr# -> Int# -> State# s -> (# State# s, Int# #)
964    with has_side_effects = True
965
966 primop ReadOffAddrOp_Word "readWordOffAddr#" GenPrimOp
967    Addr# -> Int# -> State# s -> (# State# s, Word# #)
968    with has_side_effects = True
969
970 primop ReadOffAddrOp_Addr "readAddrOffAddr#" GenPrimOp
971    Addr# -> Int# -> State# s -> (# State# s, Addr# #)
972    with has_side_effects = True
973
974 primop ReadOffAddrOp_Float "readFloatOffAddr#" GenPrimOp
975    Addr# -> Int# -> State# s -> (# State# s, Float# #)
976    with has_side_effects = True
977
978 primop ReadOffAddrOp_Double "readDoubleOffAddr#" GenPrimOp
979    Addr# -> Int# -> State# s -> (# State# s, Double# #)
980    with has_side_effects = True
981
982 primop ReadOffAddrOp_StablePtr "readStablePtrOffAddr#" GenPrimOp
983    Addr# -> Int# -> State# s -> (# State# s, StablePtr# a #)
984    with has_side_effects = True
985
986 primop ReadOffAddrOp_Int8 "readInt8OffAddr#" GenPrimOp
987    Addr# -> Int# -> State# s -> (# State# s, Int# #)
988    with has_side_effects = True
989
990 primop ReadOffAddrOp_Int16 "readInt16OffAddr#" GenPrimOp
991    Addr# -> Int# -> State# s -> (# State# s, Int# #)
992    with has_side_effects = True
993
994 primop ReadOffAddrOp_Int32 "readInt32OffAddr#" GenPrimOp
995    Addr# -> Int# -> State# s -> (# State# s, INT32 #)
996    with has_side_effects = True
997
998 primop ReadOffAddrOp_Int64 "readInt64OffAddr#" GenPrimOp
999    Addr# -> Int# -> State# s -> (# State# s, INT64 #)
1000    with has_side_effects = True
1001
1002 primop ReadOffAddrOp_Word8 "readWord8OffAddr#" GenPrimOp
1003    Addr# -> Int# -> State# s -> (# State# s, Word# #)
1004    with has_side_effects = True
1005
1006 primop ReadOffAddrOp_Word16 "readWord16OffAddr#" GenPrimOp
1007    Addr# -> Int# -> State# s -> (# State# s, Word# #)
1008    with has_side_effects = True
1009
1010 primop ReadOffAddrOp_Word32 "readWord32OffAddr#" GenPrimOp
1011    Addr# -> Int# -> State# s -> (# State# s, WORD32 #)
1012    with has_side_effects = True
1013
1014 primop ReadOffAddrOp_Word64 "readWord64OffAddr#" GenPrimOp
1015    Addr# -> Int# -> State# s -> (# State# s, WORD64 #)
1016    with has_side_effects = True
1017
1018
1019 primop  WriteOffAddrOp_Char "writeCharOffAddr#" GenPrimOp
1020    Addr# -> Int# -> Char# -> State# s -> State# s
1021    with has_side_effects = True
1022
1023 primop  WriteOffAddrOp_WideChar "writeWideCharOffAddr#" GenPrimOp
1024    Addr# -> Int# -> Char# -> State# s -> State# s
1025    with has_side_effects = True
1026
1027 primop  WriteOffAddrOp_Int "writeIntOffAddr#" GenPrimOp
1028    Addr# -> Int# -> Int# -> State# s -> State# s
1029    with has_side_effects = True
1030
1031 primop  WriteOffAddrOp_Word "writeWordOffAddr#" GenPrimOp
1032    Addr# -> Int# -> Word# -> State# s -> State# s
1033    with has_side_effects = True
1034
1035 primop  WriteOffAddrOp_Addr "writeAddrOffAddr#" GenPrimOp
1036    Addr# -> Int# -> Addr# -> State# s -> State# s
1037    with has_side_effects = True
1038
1039 primop  WriteOffAddrOp_Float "writeFloatOffAddr#" GenPrimOp
1040    Addr# -> Int# -> Float# -> State# s -> State# s
1041    with has_side_effects = True
1042
1043 primop  WriteOffAddrOp_Double "writeDoubleOffAddr#" GenPrimOp
1044    Addr# -> Int# -> Double# -> State# s -> State# s
1045    with has_side_effects = True
1046
1047 primop  WriteOffAddrOp_StablePtr "writeStablePtrOffAddr#" GenPrimOp
1048    Addr# -> Int# -> StablePtr# a -> State# s -> State# s
1049    with has_side_effects = True
1050
1051 primop  WriteOffAddrOp_Int8 "writeInt8OffAddr#" GenPrimOp
1052    Addr# -> Int# -> Int# -> State# s -> State# s
1053    with has_side_effects = True
1054
1055 primop  WriteOffAddrOp_Int16 "writeInt16OffAddr#" GenPrimOp
1056    Addr# -> Int# -> Int# -> State# s -> State# s
1057    with has_side_effects = True
1058
1059 primop  WriteOffAddrOp_Int32 "writeInt32OffAddr#" GenPrimOp
1060    Addr# -> Int# -> INT32 -> State# s -> State# s
1061    with has_side_effects = True
1062
1063 primop  WriteOffAddrOp_Int64 "writeInt64OffAddr#" GenPrimOp
1064    Addr# -> Int# -> INT64 -> State# s -> State# s
1065    with has_side_effects = True
1066
1067 primop  WriteOffAddrOp_Word8 "writeWord8OffAddr#" GenPrimOp
1068    Addr# -> Int# -> Word# -> State# s -> State# s
1069    with has_side_effects = True
1070
1071 primop  WriteOffAddrOp_Word16 "writeWord16OffAddr#" GenPrimOp
1072    Addr# -> Int# -> Word# -> State# s -> State# s
1073    with has_side_effects = True
1074
1075 primop  WriteOffAddrOp_Word32 "writeWord32OffAddr#" GenPrimOp
1076    Addr# -> Int# -> WORD32 -> State# s -> State# s
1077    with has_side_effects = True
1078
1079 primop  WriteOffAddrOp_Word64 "writeWord64OffAddr#" GenPrimOp
1080    Addr# -> Int# -> WORD64 -> State# s -> State# s
1081    with has_side_effects = True
1082
1083 ------------------------------------------------------------------------
1084 section "Mutable variables"
1085         {Operations on MutVar\#s.}
1086 ------------------------------------------------------------------------
1087
1088 primtype MutVar# s a
1089         {A {\tt MutVar\#} behaves like a single-element mutable array.}
1090
1091 primop  NewMutVarOp "newMutVar#" GenPrimOp
1092    a -> State# s -> (# State# s, MutVar# s a #)
1093    {Create {\tt MutVar\#} with specified initial value in specified state thread.}
1094    with
1095    out_of_line = True
1096    has_side_effects = True
1097
1098 primop  ReadMutVarOp "readMutVar#" GenPrimOp
1099    MutVar# s a -> State# s -> (# State# s, a #)
1100    {Read contents of {\tt MutVar\#}. Result is not yet evaluated.}
1101    with
1102    has_side_effects = True
1103
1104 primop  WriteMutVarOp "writeMutVar#"  GenPrimOp
1105    MutVar# s a -> a -> State# s -> State# s
1106    {Write contents of {\tt MutVar\#}.}
1107    with
1108    has_side_effects = True
1109
1110 primop  SameMutVarOp "sameMutVar#" GenPrimOp
1111    MutVar# s a -> MutVar# s a -> Bool
1112
1113 -- not really the right type, but we don't know about pairs here.  The
1114 -- correct type is
1115 --
1116 --   MutVar# s a -> (a -> (a,b)) -> State# s -> (# State# s, b #)
1117 --
1118 primop  AtomicModifyMutVarOp "atomicModifyMutVar#" GenPrimOp
1119    MutVar# s a -> (a -> b) -> State# s -> (# State# s, c #)
1120    with
1121    out_of_line = True
1122    has_side_effects = True
1123
1124 primop  CasMutVarOp "casMutVar#" GenPrimOp
1125   MutVar# s a -> a -> a -> State# s -> (# State# s, Int#, a #)
1126    with
1127    out_of_line = True
1128    has_side_effects = True
1129
1130 ------------------------------------------------------------------------
1131 section "Exceptions"
1132 ------------------------------------------------------------------------
1133
1134 primop  CatchOp "catch#" GenPrimOp
1135           (State# RealWorld -> (# State# RealWorld, a #) )
1136        -> (b -> State# RealWorld -> (# State# RealWorld, a #) ) 
1137        -> State# RealWorld
1138        -> (# State# RealWorld, a #)
1139    with
1140         -- Catch is actually strict in its first argument
1141         -- but we don't want to tell the strictness
1142         -- analyser about that!
1143         -- might use caught action multiply
1144    out_of_line = True
1145    has_side_effects = True
1146
1147 primop  RaiseOp "raise#" GenPrimOp
1148    a -> b
1149    with
1150    strictness  = { \ _arity -> mkStrictSig (mkTopDmdType [lazyDmd] BotRes) }
1151       -- NB: result is bottom
1152    out_of_line = True
1153
1154 -- raiseIO# needs to be a primop, because exceptions in the IO monad
1155 -- must be *precise* - we don't want the strictness analyser turning
1156 -- one kind of bottom into another, as it is allowed to do in pure code.
1157 --
1158 -- But we *do* want to know that it returns bottom after 
1159 -- being applied to two arguments
1160
1161 primop  RaiseIOOp "raiseIO#" GenPrimOp
1162    a -> State# RealWorld -> (# State# RealWorld, b #)
1163    with
1164    strictness  = { \ _arity -> mkStrictSig (mkTopDmdType [lazyDmd,lazyDmd] BotRes) }
1165    out_of_line = True
1166    has_side_effects = True
1167
1168 primop  MaskAsyncExceptionsOp "maskAsyncExceptions#" GenPrimOp
1169         (State# RealWorld -> (# State# RealWorld, a #))
1170      -> (State# RealWorld -> (# State# RealWorld, a #))
1171    with
1172    out_of_line = True
1173    has_side_effects = True
1174
1175 primop  MaskUninterruptibleOp "maskUninterruptible#" GenPrimOp
1176         (State# RealWorld -> (# State# RealWorld, a #))
1177      -> (State# RealWorld -> (# State# RealWorld, a #))
1178    with
1179    out_of_line = True
1180    has_side_effects = True
1181
1182 primop  UnmaskAsyncExceptionsOp "unmaskAsyncExceptions#" GenPrimOp
1183         (State# RealWorld -> (# State# RealWorld, a #))
1184      -> (State# RealWorld -> (# State# RealWorld, a #))
1185    with
1186    out_of_line = True
1187    has_side_effects = True
1188
1189 primop  MaskStatus "getMaskingState#" GenPrimOp
1190         State# RealWorld -> (# State# RealWorld, Int# #)
1191    with
1192    out_of_line = True
1193    has_side_effects = True
1194
1195 ------------------------------------------------------------------------
1196 section "STM-accessible Mutable Variables"
1197 ------------------------------------------------------------------------
1198
1199 primtype TVar# s a
1200
1201 primop  AtomicallyOp "atomically#" GenPrimOp
1202       (State# RealWorld -> (# State# RealWorld, a #) )
1203    -> State# RealWorld -> (# State# RealWorld, a #)
1204    with
1205    out_of_line = True
1206    has_side_effects = True
1207
1208 primop  RetryOp "retry#" GenPrimOp
1209    State# RealWorld -> (# State# RealWorld, a #)
1210    with 
1211    out_of_line = True
1212    has_side_effects = True
1213
1214 primop  CatchRetryOp "catchRetry#" GenPrimOp
1215       (State# RealWorld -> (# State# RealWorld, a #) )
1216    -> (State# RealWorld -> (# State# RealWorld, a #) )
1217    -> (State# RealWorld -> (# State# RealWorld, a #) )
1218    with 
1219    out_of_line = True
1220    has_side_effects = True
1221
1222 primop  CatchSTMOp "catchSTM#" GenPrimOp
1223       (State# RealWorld -> (# State# RealWorld, a #) )
1224    -> (b -> State# RealWorld -> (# State# RealWorld, a #) )
1225    -> (State# RealWorld -> (# State# RealWorld, a #) )
1226    with 
1227    out_of_line = True
1228    has_side_effects = True
1229
1230 primop  Check "check#" GenPrimOp
1231       (State# RealWorld -> (# State# RealWorld, a #) )
1232    -> (State# RealWorld -> (# State# RealWorld, () #) )
1233    with 
1234    out_of_line = True
1235    has_side_effects = True
1236
1237 primop  NewTVarOp "newTVar#" GenPrimOp
1238        a
1239     -> State# s -> (# State# s, TVar# s a #)
1240    {Create a new {\tt TVar\#} holding a specified initial value.}
1241    with
1242    out_of_line  = True
1243    has_side_effects = True
1244
1245 primop  ReadTVarOp "readTVar#" GenPrimOp
1246        TVar# s a
1247     -> State# s -> (# State# s, a #)
1248    {Read contents of {\tt TVar\#}.  Result is not yet evaluated.}
1249    with
1250    out_of_line  = True
1251    has_side_effects = True
1252
1253 primop ReadTVarIOOp "readTVarIO#" GenPrimOp
1254        TVar# s a
1255     -> State# s -> (# State# s, a #)
1256    {Read contents of {\tt TVar\#} outside an STM transaction}
1257    with
1258    out_of_line  = True
1259    has_side_effects = True
1260
1261 primop  WriteTVarOp "writeTVar#" GenPrimOp
1262        TVar# s a
1263     -> a
1264     -> State# s -> State# s
1265    {Write contents of {\tt TVar\#}.}
1266    with
1267    out_of_line      = True
1268    has_side_effects = True
1269
1270 primop  SameTVarOp "sameTVar#" GenPrimOp
1271    TVar# s a -> TVar# s a -> Bool
1272
1273
1274 ------------------------------------------------------------------------
1275 section "Synchronized Mutable Variables"
1276         {Operations on {\tt MVar\#}s. }
1277 ------------------------------------------------------------------------
1278
1279 primtype MVar# s a
1280         { A shared mutable variable ({\it not} the same as a {\tt MutVar\#}!).
1281         (Note: in a non-concurrent implementation, {\tt (MVar\# a)} can be
1282         represented by {\tt (MutVar\# (Maybe a))}.) }
1283
1284 primop  NewMVarOp "newMVar#"  GenPrimOp
1285    State# s -> (# State# s, MVar# s a #)
1286    {Create new {\tt MVar\#}; initially empty.}
1287    with
1288    out_of_line = True
1289    has_side_effects = True
1290
1291 primop  TakeMVarOp "takeMVar#" GenPrimOp
1292    MVar# s a -> State# s -> (# State# s, a #)
1293    {If {\tt MVar\#} is empty, block until it becomes full.
1294    Then remove and return its contents, and set it empty.}
1295    with
1296    out_of_line      = True
1297    has_side_effects = True
1298
1299 primop  TryTakeMVarOp "tryTakeMVar#" GenPrimOp
1300    MVar# s a -> State# s -> (# State# s, Int#, a #)
1301    {If {\tt MVar\#} is empty, immediately return with integer 0 and value undefined.
1302    Otherwise, return with integer 1 and contents of {\tt MVar\#}, and set {\tt MVar\#} empty.}
1303    with
1304    out_of_line      = True
1305    has_side_effects = True
1306
1307 primop  PutMVarOp "putMVar#" GenPrimOp
1308    MVar# s a -> a -> State# s -> State# s
1309    {If {\tt MVar\#} is full, block until it becomes empty.
1310    Then store value arg as its new contents.}
1311    with
1312    out_of_line      = True
1313    has_side_effects = True
1314
1315 primop  TryPutMVarOp "tryPutMVar#" GenPrimOp
1316    MVar# s a -> a -> State# s -> (# State# s, Int# #)
1317    {If {\tt MVar\#} is full, immediately return with integer 0.
1318     Otherwise, store value arg as {\tt MVar\#}'s new contents, and return with integer 1.}
1319    with
1320    out_of_line      = True
1321    has_side_effects = True
1322
1323 primop  SameMVarOp "sameMVar#" GenPrimOp
1324    MVar# s a -> MVar# s a -> Bool
1325
1326 primop  IsEmptyMVarOp "isEmptyMVar#" GenPrimOp
1327    MVar# s a -> State# s -> (# State# s, Int# #)
1328    {Return 1 if {\tt MVar\#} is empty; 0 otherwise.}
1329    with
1330    out_of_line = True
1331    has_side_effects = True
1332
1333 ------------------------------------------------------------------------
1334 section "Delay/wait operations"
1335 ------------------------------------------------------------------------
1336
1337 primop  DelayOp "delay#" GenPrimOp
1338    Int# -> State# s -> State# s
1339    {Sleep specified number of microseconds.}
1340    with
1341    needs_wrapper    = True
1342    has_side_effects = True
1343    out_of_line      = True
1344
1345 primop  WaitReadOp "waitRead#" GenPrimOp
1346    Int# -> State# s -> State# s
1347    {Block until input is available on specified file descriptor.}
1348    with
1349    needs_wrapper    = True
1350    has_side_effects = True
1351    out_of_line      = True
1352
1353 primop  WaitWriteOp "waitWrite#" GenPrimOp
1354    Int# -> State# s -> State# s
1355    {Block until output is possible on specified file descriptor.}
1356    with
1357    needs_wrapper    = True
1358    has_side_effects = True
1359    out_of_line      = True
1360
1361 #ifdef mingw32_TARGET_OS
1362 primop  AsyncReadOp "asyncRead#" GenPrimOp
1363    Int# -> Int# -> Int# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1364    {Asynchronously read bytes from specified file descriptor.}
1365    with
1366    needs_wrapper    = True
1367    has_side_effects = True
1368    out_of_line      = True
1369
1370 primop  AsyncWriteOp "asyncWrite#" GenPrimOp
1371    Int# -> Int# -> Int# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1372    {Asynchronously write bytes from specified file descriptor.}
1373    with
1374    needs_wrapper    = True
1375    has_side_effects = True
1376    out_of_line      = True
1377
1378 primop  AsyncDoProcOp "asyncDoProc#" GenPrimOp
1379    Addr# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1380    {Asynchronously perform procedure (first arg), passing it 2nd arg.}
1381    with
1382    needs_wrapper    = True
1383    has_side_effects = True
1384    out_of_line      = True
1385
1386 #endif
1387
1388 ------------------------------------------------------------------------
1389 section "Concurrency primitives"
1390 ------------------------------------------------------------------------
1391
1392 primtype State# s
1393         { {\tt State\#} is the primitive, unlifted type of states.  It has
1394         one type parameter, thus {\tt State\# RealWorld}, or {\tt State\# s},
1395         where s is a type variable. The only purpose of the type parameter
1396         is to keep different state threads separate.  It is represented by
1397         nothing at all. }
1398
1399 primtype RealWorld
1400         { {\tt RealWorld} is deeply magical.  It is {\it primitive}, but it is not
1401         {\it unlifted} (hence {\tt ptrArg}).  We never manipulate values of type
1402         {\tt RealWorld}; it's only used in the type system, to parameterise {\tt State\#}. }
1403
1404 primtype ThreadId#
1405         {(In a non-concurrent implementation, this can be a singleton
1406         type, whose (unique) value is returned by {\tt myThreadId\#}.  The 
1407         other operations can be omitted.)}
1408
1409 primop  ForkOp "fork#" GenPrimOp
1410    a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1411    with
1412    has_side_effects = True
1413    out_of_line      = True
1414
1415 primop  ForkOnOp "forkOn#" GenPrimOp
1416    Int# -> a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1417    with
1418    has_side_effects = True
1419    out_of_line      = True
1420
1421 primop  KillThreadOp "killThread#"  GenPrimOp
1422    ThreadId# -> a -> State# RealWorld -> State# RealWorld
1423    with
1424    has_side_effects = True
1425    out_of_line      = True
1426
1427 primop  YieldOp "yield#" GenPrimOp
1428    State# RealWorld -> State# RealWorld
1429    with
1430    has_side_effects = True
1431    out_of_line      = True
1432
1433 primop  MyThreadIdOp "myThreadId#" GenPrimOp
1434    State# RealWorld -> (# State# RealWorld, ThreadId# #)
1435    with
1436    out_of_line = True
1437    has_side_effects = True
1438
1439 primop LabelThreadOp "labelThread#" GenPrimOp
1440    ThreadId# -> Addr# -> State# RealWorld -> State# RealWorld
1441    with
1442    has_side_effects = True
1443    out_of_line      = True
1444    
1445 primop  IsCurrentThreadBoundOp "isCurrentThreadBound#" GenPrimOp
1446    State# RealWorld -> (# State# RealWorld, Int# #)
1447    with
1448    out_of_line = True
1449    has_side_effects = True
1450
1451 primop  NoDuplicateOp "noDuplicate#" GenPrimOp
1452    State# RealWorld -> State# RealWorld
1453    with
1454    out_of_line = True
1455    has_side_effects = True
1456
1457 primop  ThreadStatusOp "threadStatus#" GenPrimOp
1458    ThreadId# -> State# RealWorld -> (# State# RealWorld, Int#, Int#, Int# #)
1459    with
1460    out_of_line = True
1461    has_side_effects = True
1462
1463 ------------------------------------------------------------------------
1464 section "Weak pointers"
1465 ------------------------------------------------------------------------
1466
1467 primtype Weak# b
1468
1469 -- note that tyvar "o" denotes openAlphaTyVar
1470
1471 primop  MkWeakOp "mkWeak#" GenPrimOp
1472    o -> b -> c -> State# RealWorld -> (# State# RealWorld, Weak# b #)
1473    with
1474    has_side_effects = True
1475    out_of_line      = True
1476
1477 primop  MkWeakForeignEnvOp "mkWeakForeignEnv#" GenPrimOp
1478    o -> b -> Addr# -> Addr# -> Int# -> Addr# -> State# RealWorld -> (# State# RealWorld, Weak# b #)
1479    with
1480    has_side_effects = True
1481    out_of_line      = True
1482
1483 primop  DeRefWeakOp "deRefWeak#" GenPrimOp
1484    Weak# a -> State# RealWorld -> (# State# RealWorld, Int#, a #)
1485    with
1486    has_side_effects = True
1487    out_of_line      = True
1488
1489 primop  FinalizeWeakOp "finalizeWeak#" GenPrimOp
1490    Weak# a -> State# RealWorld -> (# State# RealWorld, Int#, 
1491               (State# RealWorld -> (# State# RealWorld, () #)) #)
1492    with
1493    has_side_effects = True
1494    out_of_line      = True
1495
1496 primop TouchOp "touch#" GenPrimOp
1497    o -> State# RealWorld -> State# RealWorld
1498    with
1499    has_side_effects = True
1500
1501 ------------------------------------------------------------------------
1502 section "Stable pointers and names"
1503 ------------------------------------------------------------------------
1504
1505 primtype StablePtr# a
1506
1507 primtype StableName# a
1508
1509 primop  MakeStablePtrOp "makeStablePtr#" GenPrimOp
1510    a -> State# RealWorld -> (# State# RealWorld, StablePtr# a #)
1511    with
1512    has_side_effects = True
1513    out_of_line      = True
1514
1515 primop  DeRefStablePtrOp "deRefStablePtr#" GenPrimOp
1516    StablePtr# a -> State# RealWorld -> (# State# RealWorld, a #)
1517    with
1518    needs_wrapper    = True
1519    has_side_effects = True
1520    out_of_line      = True
1521
1522 primop  EqStablePtrOp "eqStablePtr#" GenPrimOp
1523    StablePtr# a -> StablePtr# a -> Int#
1524    with
1525    has_side_effects = True
1526
1527 primop  MakeStableNameOp "makeStableName#" GenPrimOp
1528    a -> State# RealWorld -> (# State# RealWorld, StableName# a #)
1529    with
1530    needs_wrapper    = True
1531    has_side_effects = True
1532    out_of_line      = True
1533
1534 primop  EqStableNameOp "eqStableName#" GenPrimOp
1535    StableName# a -> StableName# a -> Int#
1536
1537 primop  StableNameToIntOp "stableNameToInt#" GenPrimOp
1538    StableName# a -> Int#
1539
1540 ------------------------------------------------------------------------
1541 section "Unsafe pointer equality"
1542 --  (#1 Bad Guy: Alistair Reid :)   
1543 ------------------------------------------------------------------------
1544
1545 primop  ReallyUnsafePtrEqualityOp "reallyUnsafePtrEquality#" GenPrimOp
1546    a -> a -> Int#
1547
1548 ------------------------------------------------------------------------
1549 section "Parallelism"
1550 ------------------------------------------------------------------------
1551
1552 primop  ParOp "par#" GenPrimOp
1553    a -> Int#
1554    with
1555       -- Note that Par is lazy to avoid that the sparked thing
1556       -- gets evaluted strictly, which it should *not* be
1557    has_side_effects = True
1558
1559 primop GetSparkOp "getSpark#" GenPrimOp
1560    State# s -> (# State# s, Int#, a #)
1561    with
1562    has_side_effects = True
1563    out_of_line = True
1564
1565 primop NumSparks "numSparks#" GenPrimOp
1566    State# s -> (# State# s, Int# #)
1567    { Returns the number of sparks in the local spark pool. }
1568    with
1569    has_side_effects = True
1570    out_of_line = True
1571
1572 -- HWL: The first 4 Int# in all par... annotations denote:
1573 --   name, granularity info, size of result, degree of parallelism
1574 --      Same  structure as _seq_ i.e. returns Int#
1575 -- KSW: v, the second arg in parAt# and parAtForNow#, is used only to determine
1576 --   `the processor containing the expression v'; it is not evaluated
1577
1578 primop  ParGlobalOp  "parGlobal#"  GenPrimOp
1579    a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1580    with
1581    has_side_effects = True
1582
1583 primop  ParLocalOp  "parLocal#"  GenPrimOp
1584    a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1585    with
1586    has_side_effects = True
1587
1588 primop  ParAtOp  "parAt#"  GenPrimOp
1589    b -> a -> Int# -> Int# -> Int# -> Int# -> c -> Int#
1590    with
1591    has_side_effects = True
1592
1593 primop  ParAtAbsOp  "parAtAbs#"  GenPrimOp
1594    a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1595    with
1596    has_side_effects = True
1597
1598 primop  ParAtRelOp  "parAtRel#" GenPrimOp
1599    a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1600    with
1601    has_side_effects = True
1602
1603 primop  ParAtForNowOp  "parAtForNow#" GenPrimOp
1604    b -> a -> Int# -> Int# -> Int# -> Int# -> c -> Int#
1605    with
1606    has_side_effects = True
1607
1608 -- copyable# and noFollow# are yet to be implemented (for GpH)
1609 --
1610 --primop  CopyableOp  "copyable#" GenPrimOp
1611 --   a -> Int#
1612 --   with
1613 --   has_side_effects = True
1614 --
1615 --primop  NoFollowOp "noFollow#" GenPrimOp
1616 --   a -> Int#
1617 --   with
1618 --   has_side_effects = True
1619
1620
1621 ------------------------------------------------------------------------
1622 section "Tag to enum stuff"
1623         {Convert back and forth between values of enumerated types
1624         and small integers.}
1625 ------------------------------------------------------------------------
1626
1627 primop  DataToTagOp "dataToTag#" GenPrimOp
1628    a -> Int#
1629    with
1630    strictness  = { \ _arity -> mkStrictSig (mkTopDmdType [seqDmd] TopRes) }
1631         -- dataToTag# must have an evaluated argument
1632
1633 primop  TagToEnumOp "tagToEnum#" GenPrimOp     
1634    Int# -> a
1635
1636 ------------------------------------------------------------------------
1637 section "Bytecode operations" 
1638         {Support for the bytecode interpreter and linker.}
1639 ------------------------------------------------------------------------
1640
1641 primtype BCO#
1642    {Primitive bytecode type.}
1643
1644 primop   AddrToHValueOp "addrToHValue#" GenPrimOp
1645    Addr# -> (# a #)
1646    {Convert an {\tt Addr\#} to a followable type.}
1647
1648 primop   MkApUpd0_Op "mkApUpd0#" GenPrimOp
1649    BCO# -> (# a #)
1650    with
1651    out_of_line = True
1652
1653 primop  NewBCOOp "newBCO#" GenPrimOp
1654    ByteArray# -> ByteArray# -> Array# a -> Int# -> ByteArray# -> State# s -> (# State# s, BCO# #)
1655    with
1656    has_side_effects = True
1657    out_of_line      = True
1658
1659 primop  UnpackClosureOp "unpackClosure#" GenPrimOp
1660    a -> (# Addr#, Array# b, ByteArray# #)
1661    with
1662    out_of_line = True
1663
1664 primop  GetApStackValOp "getApStackVal#" GenPrimOp
1665    a -> Int# -> (# Int#, b #)
1666    with
1667    out_of_line = True
1668
1669 ------------------------------------------------------------------------
1670 section "Misc"
1671         {These aren't nearly as wired in as Etc...}
1672 ------------------------------------------------------------------------
1673
1674 primop  TraceCcsOp "traceCcs#" GenPrimOp
1675    a -> b -> b
1676    with
1677    has_side_effects = True
1678    out_of_line = True
1679
1680 ------------------------------------------------------------------------
1681 section "Etc" 
1682         {Miscellaneous built-ins}
1683 ------------------------------------------------------------------------
1684
1685 pseudoop   "seq"
1686    a -> b -> b
1687    { Evaluates its first argument to head normal form, and then returns its second
1688         argument as the result. }
1689
1690 pseudoop   "inline"
1691    a -> a
1692    { The call {\tt (inline f)} arranges that f is inlined, regardless of its size.
1693         More precisely, the call {\tt (inline f)} rewrites to the right-hand side of
1694         {\tt f}'s definition. This allows the programmer to control inlining from a
1695         particular call site rather than the definition site of the function (c.f.
1696         {\tt INLINE} pragmas in User's Guide, Section 7.10.3, "INLINE and NOINLINE
1697         pragmas").
1698
1699         This inlining occurs regardless of the argument to the call or the size of
1700         {\tt f}'s definition; it is unconditional. The main caveat is that {\tt f}'s
1701         definition must be visible to the compiler. That is, {\tt f} must be
1702         {\tt let}-bound in the current scope. If no inlining takes place, the
1703         {\tt inline} function expands to the identity function in Phase zero; so its
1704         use imposes no overhead.
1705
1706         It is good practice to mark the function with an INLINABLE pragma at
1707         its definition, (a) so that GHC guarantees to expose its unfolding regardless
1708         of size, and (b) so that you have control over exactly what is inlined. }
1709
1710 pseudoop   "lazy"
1711    a -> a
1712    { The {\tt lazy} function restrains strictness analysis a little. The call
1713         {\tt (lazy e)} means the same as {\tt e}, but {\tt lazy} has a magical
1714         property so far as strictness analysis is concerned: it is lazy in its first
1715         argument, even though its semantics is strict. After strictness analysis has
1716         run, calls to {\tt lazy} are inlined to be the identity function.
1717
1718         This behaviour is occasionally useful when controlling evaluation order.
1719         Notably, {\tt lazy} is used in the library definition of {\tt Control.Parallel.par}:
1720
1721         {\tt par :: a -> b -> b}
1722
1723         {\tt par x y = case (par\# x) of \_ -> lazy y}
1724
1725         If {\tt lazy} were not lazy, {\tt par} would look strict in {\tt y} which
1726         would defeat the whole purpose of {\tt par}.
1727
1728         Like {\tt seq}, the argument of {\tt lazy} can have an unboxed type. }
1729
1730 primtype Any a
1731         { The type constructor {\tt Any} is type to which you can unsafely coerce any
1732         lifted type, and back. 
1733
1734           * It is lifted, and hence represented by a pointer
1735
1736           * It does not claim to be a {\it data} type, and that's important for
1737             the code generator, because the code gen may {\it enter} a data value
1738             but never enters a function value.  
1739
1740         It's also used to instantiate un-constrained type variables after type
1741         checking.  For example, {\tt length} has type
1742
1743         {\tt length :: forall a. [a] -> Int}
1744
1745         and the list datacon for the empty list has type
1746
1747         {\tt [] :: forall a. [a]}
1748
1749         In order to compose these two terms as {\tt length []} a type
1750         application is required, but there is no constraint on the
1751         choice.  In this situation GHC uses {\tt Any}:
1752
1753         {\tt length Any ([] Any)}
1754
1755         Annoyingly, we sometimes need {\tt Any}s of other kinds, such as {\tt (* -> *)} etc.
1756         This is a bit like tuples.   We define a couple of useful ones here,
1757         and make others up on the fly.  If any of these others end up being exported
1758         into interface files, we'll get a crash; at least until we add interface-file
1759         syntax to support them. }
1760
1761 pseudoop   "unsafeCoerce#"
1762    a -> b
1763    { The function {\tt unsafeCoerce\#} allows you to side-step the typechecker entirely. That
1764         is, it allows you to coerce any type into any other type. If you use this function,
1765         you had better get it right, otherwise segmentation faults await. It is generally
1766         used when you want to write a program that you know is well-typed, but where Haskell's
1767         type system is not expressive enough to prove that it is well typed.
1768
1769         The following uses of {\tt unsafeCoerce\#} are supposed to work (i.e. not lead to
1770         spurious compile-time or run-time crashes):
1771
1772          * Casting any lifted type to {\tt Any}
1773
1774          * Casting {\tt Any} back to the real type
1775
1776          * Casting an unboxed type to another unboxed type of the same size
1777            (but not coercions between floating-point and integral types)
1778
1779          * Casting between two types that have the same runtime representation.  One case is when
1780            the two types differ only in "phantom" type parameters, for example
1781            {\tt Ptr Int} to {\tt Ptr Float}, or {\tt [Int]} to {\tt [Float]} when the list is 
1782            known to be empty.  Also, a {\tt newtype} of a type {\tt T} has the same representation
1783            at runtime as {\tt T}.
1784
1785         Other uses of {\tt unsafeCoerce\#} are undefined.  In particular, you should not use
1786         {\tt unsafeCoerce\#} to cast a T to an algebraic data type D, unless T is also
1787         an algebraic data type.  For example, do not cast {\tt Int->Int} to {\tt Bool}, even if
1788         you later cast that {\tt Bool} back to {\tt Int->Int} before applying it.  The reasons
1789         have to do with GHC's internal representation details (for the congnoscenti, data values
1790         can be entered but function closures cannot).  If you want a safe type to cast things
1791         to, use {\tt Any}, which is not an algebraic data type.
1792         
1793         }
1794
1795 -- NB. It is tempting to think that casting a value to a type that it doesn't have is safe
1796 -- as long as you don't "do anything" with the value in its cast form, such as seq on it.  This
1797 -- isn't the case: the compiler can insert seqs itself, and if these happen at the wrong type,
1798 -- Bad Things Might Happen.  See bug #1616: in this case we cast a function of type (a,b) -> (a,b)
1799 -- to () -> () and back again.  The strictness analyser saw that the function was strict, but
1800 -- the wrapper had type () -> (), and hence the wrapper de-constructed the (), the worker re-constructed
1801 -- a new (), with the result that the code ended up with "case () of (a,b) -> ...".
1802
1803 primop  TraceEventOp "traceEvent#" GenPrimOp
1804    Addr# -> State# s -> State# s
1805    { Emits an event via the RTS tracing framework.  The contents
1806      of the event is the zero-terminated byte string passed as the first
1807      argument.  The event will be emitted either to the .eventlog file,
1808      or to stderr, depending on the runtime RTS flags. }
1809    with
1810    has_side_effects = True
1811    out_of_line      = True
1812
1813 ------------------------------------------------------------------------
1814 ---                                                                  ---
1815 ------------------------------------------------------------------------
1816
1817 thats_all_folks
1818
1819
1820