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