adb2e110ff8ced4fc4348f767daa93185a37c4bf
[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 ByteArr\# -> Int\#
117          -> Int\#}; otherwise it has type {\tt ByteArr\# -> 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#, ByteArr# #)
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#, ByteArr# #)
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#, ByteArr# #)
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#, ByteArr# #)
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#, ByteArr# #)
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#, ByteArr# #)
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 ByteArr\#} 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# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
410    with commutable = True
411         out_of_line = True
412
413 primop   IntegerSubOp   "minusInteger#" GenPrimOp  
414    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
415    with out_of_line = True
416
417 primop   IntegerMulOp   "timesInteger#" GenPrimOp   
418    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
419    with commutable = True
420         out_of_line = True
421
422 primop   IntegerGcdOp   "gcdInteger#" GenPrimOp    
423    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
424    {Greatest common divisor.}
425    with commutable = True
426         out_of_line = True
427
428 primop   IntegerIntGcdOp   "gcdIntegerInt#" GenPrimOp
429    Int# -> ByteArr# -> 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# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
435    {Divisor is guaranteed to be a factor of dividend.}
436    with out_of_line = True
437
438 primop   IntegerQuotOp   "quotInteger#" GenPrimOp
439    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
440    {Rounds towards zero.}
441    with out_of_line = True
442
443 primop   IntegerRemOp   "remInteger#" GenPrimOp
444    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
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# -> ByteArr# -> Int# -> ByteArr# -> 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# -> ByteArr# -> 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# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr#, Int#, ByteArr# #)
463    {Compute quot and rem simulaneously.}
464    with can_fail = True
465         out_of_line = True
466
467 primop   IntegerDivModOp    "divModInteger#"  GenPrimOp
468    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr#, Int#, ByteArr# #)
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# -> ByteArr# -> Int#
476    with needs_wrapper = True
477         out_of_line = True
478
479 primop   Integer2WordOp   "integer2Word#"   GenPrimOp
480    Int# -> ByteArr# -> 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# -> ByteArr# -> Int32#
487
488 primop   IntegerToWord32Op   "integerToWord32#" GenPrimOp
489    Int# -> ByteArr# -> Word32#
490 #endif
491
492 primop   IntegerAndOp  "andInteger#" GenPrimOp
493    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
494    with out_of_line = True
495
496 primop   IntegerOrOp  "orInteger#" GenPrimOp
497    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
498    with out_of_line = True
499
500 primop   IntegerXorOp  "xorInteger#" GenPrimOp
501    Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
502    with out_of_line = True
503
504 primop   IntegerComplementOp  "complementInteger#" GenPrimOp
505    Int# -> ByteArr# -> (# Int#, ByteArr# #)
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#, ByteArr# #)
616    {Convert to arbitrary-precision integer.
617     First {\tt Int\#} in result is the exponent; second {\tt Int\#} and {\tt ByteArr\#}
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#, Int#, Int# #)
623    {Convert to arbitrary-precision integer.
624     First {\tt Int\#} in result is the high 32 bits of the mantissa, and the
625     second is the low 32. The third is the exponent.}
626    with out_of_line = True
627
628 ------------------------------------------------------------------------
629 section "Float#" 
630         {Operations on single-precision (32-bit) floating-point numbers.}
631 ------------------------------------------------------------------------
632
633 primtype Float#
634
635 primop   FloatGtOp  "gtFloat#"   Compare   Float# -> Float# -> Bool
636 primop   FloatGeOp  "geFloat#"   Compare   Float# -> Float# -> Bool
637
638 primop   FloatEqOp  "eqFloat#"   Compare
639    Float# -> Float# -> Bool
640    with commutable = True
641
642 primop   FloatNeOp  "neFloat#"   Compare
643    Float# -> Float# -> Bool
644    with commutable = True
645
646 primop   FloatLtOp  "ltFloat#"   Compare   Float# -> Float# -> Bool
647 primop   FloatLeOp  "leFloat#"   Compare   Float# -> Float# -> Bool
648
649 primop   FloatAddOp   "plusFloat#"      Dyadic            
650    Float# -> Float# -> Float#
651    with commutable = True
652
653 primop   FloatSubOp   "minusFloat#"      Dyadic      Float# -> Float# -> Float#
654
655 primop   FloatMulOp   "timesFloat#"      Dyadic    
656    Float# -> Float# -> Float#
657    with commutable = True
658
659 primop   FloatDivOp   "divideFloat#"      Dyadic  
660    Float# -> Float# -> Float#
661    with can_fail = True
662
663 primop   FloatNegOp   "negateFloat#"      Monadic    Float# -> Float#
664
665 primop   Float2IntOp   "float2Int#"      GenPrimOp  Float# -> Int#
666    {Truncates a {\tt Float#} value to the nearest {\tt Int#}.
667     Results are undefined if the truncation if truncation yields
668     a value outside the range of {\tt Int#}.}
669
670 primop   FloatExpOp   "expFloat#"      Monadic          
671    Float# -> Float#
672    with needs_wrapper = True
673
674 primop   FloatLogOp   "logFloat#"      Monadic          
675    Float# -> Float#
676    with needs_wrapper = True
677         can_fail = True
678
679 primop   FloatSqrtOp   "sqrtFloat#"      Monadic          
680    Float# -> Float#
681    with needs_wrapper = True
682
683 primop   FloatSinOp   "sinFloat#"      Monadic          
684    Float# -> Float#
685    with needs_wrapper = True
686
687 primop   FloatCosOp   "cosFloat#"      Monadic          
688    Float# -> Float#
689    with needs_wrapper = True
690
691 primop   FloatTanOp   "tanFloat#"      Monadic          
692    Float# -> Float#
693    with needs_wrapper = True
694
695 primop   FloatAsinOp   "asinFloat#"      Monadic          
696    Float# -> Float#
697    with needs_wrapper = True
698         can_fail = True
699
700 primop   FloatAcosOp   "acosFloat#"      Monadic          
701    Float# -> Float#
702    with needs_wrapper = True
703         can_fail = True
704
705 primop   FloatAtanOp   "atanFloat#"      Monadic          
706    Float# -> Float#
707    with needs_wrapper = True
708
709 primop   FloatSinhOp   "sinhFloat#"      Monadic          
710    Float# -> Float#
711    with needs_wrapper = True
712
713 primop   FloatCoshOp   "coshFloat#"      Monadic          
714    Float# -> Float#
715    with needs_wrapper = True
716
717 primop   FloatTanhOp   "tanhFloat#"      Monadic          
718    Float# -> Float#
719    with needs_wrapper = True
720
721 primop   FloatPowerOp   "powerFloat#"      Dyadic   
722    Float# -> Float# -> Float#
723    with needs_wrapper = True
724
725 primop   Float2DoubleOp   "float2Double#" GenPrimOp  Float# -> Double#
726
727 primop   FloatDecodeOp   "decodeFloat#" GenPrimOp
728    Float# -> (# Int#, Int#, ByteArr# #)
729    {Convert to arbitrary-precision integer.
730     First {\tt Int\#} in result is the exponent; second {\tt Int\#} and {\tt ByteArr\#}
731     represent an {\tt Integer\#} holding the mantissa.}
732    with out_of_line = True
733
734 primop   FloatDecode_IntOp   "decodeFloat_Int#" GenPrimOp
735    Float# -> (# Int#, Int# #)
736    {Convert to arbitrary-precision integer.
737     First {\tt Int\#} in result is the mantissa; second is the exponent.}
738    with out_of_line = True
739
740 ------------------------------------------------------------------------
741 section "Arrays"
742         {Operations on {\tt Array\#}.}
743 ------------------------------------------------------------------------
744
745 primtype Array# a
746
747 primtype MutArr# s a
748
749 primop  NewArrayOp "newArray#" GenPrimOp
750    Int# -> a -> State# s -> (# State# s, MutArr# s a #)
751    {Create a new mutable array of specified size (in bytes),
752     in the specified state thread,
753     with each element containing the specified initial value.}
754    with
755    out_of_line = True
756
757 primop  SameMutableArrayOp "sameMutableArray#" GenPrimOp
758    MutArr# s a -> MutArr# s a -> Bool
759
760 primop  ReadArrayOp "readArray#" GenPrimOp
761    MutArr# s a -> Int# -> State# s -> (# State# s, a #)
762    {Read from specified index of mutable array. Result is not yet evaluated.}
763
764 primop  WriteArrayOp "writeArray#" GenPrimOp
765    MutArr# s a -> Int# -> a -> State# s -> State# s
766    {Write to specified index of mutable array.}
767    with
768    has_side_effects = True
769
770 primop  IndexArrayOp "indexArray#" GenPrimOp
771    Array# a -> Int# -> (# a #)
772    {Read from specified index of immutable array. Result is packaged into
773     an unboxed singleton; the result itself is not yet evaluated.}
774
775 primop  UnsafeFreezeArrayOp "unsafeFreezeArray#" GenPrimOp
776    MutArr# s a -> State# s -> (# State# s, Array# a #)
777    {Make a mutable array immutable, without copying.}
778    with
779    has_side_effects = True
780
781 primop  UnsafeThawArrayOp  "unsafeThawArray#" GenPrimOp
782    Array# a -> State# s -> (# State# s, MutArr# s a #)
783    {Make an immutable array mutable, without copying.}
784    with
785    out_of_line = True
786
787 ------------------------------------------------------------------------
788 section "Byte Arrays"
789         {Operations on {\tt ByteArray\#}. A {\tt ByteArray\#} is a just a region of
790          raw memory in the garbage-collected heap, which is not scanned
791          for pointers. It carries its own size (in bytes). There are
792          three sets of operations for accessing byte array contents:
793          index for reading from immutable byte arrays, and read/write
794          for mutable byte arrays.  Each set contains operations for 
795          a range of useful primitive data types.  Each operation takes  
796          an offset measured in terms of the size fo the primitive type
797          being read or written.}
798
799 ------------------------------------------------------------------------
800
801 primtype ByteArr#
802
803 primtype MutByteArr# s
804
805 primop  NewByteArrayOp_Char "newByteArray#" GenPrimOp
806    Int# -> State# s -> (# State# s, MutByteArr# s #)
807    {Create a new mutable byte array of specified size (in bytes), in
808     the specified state thread.}
809    with out_of_line = True
810
811 primop  NewPinnedByteArrayOp_Char "newPinnedByteArray#" GenPrimOp
812    Int# -> State# s -> (# State# s, MutByteArr# s #)
813    {Create a mutable byte array that the GC guarantees not to move.}
814    with out_of_line = True
815
816 primop  ByteArrayContents_Char "byteArrayContents#" GenPrimOp
817    ByteArr# -> Addr#
818    {Intended for use with pinned arrays; otherwise very unsafe!}
819
820 primop  SameMutableByteArrayOp "sameMutableByteArray#" GenPrimOp
821    MutByteArr# s -> MutByteArr# s -> Bool
822
823 primop  UnsafeFreezeByteArrayOp "unsafeFreezeByteArray#" GenPrimOp
824    MutByteArr# s -> State# s -> (# State# s, ByteArr# #)
825    {Make a mutable byte array immutable, without copying.}
826    with
827    has_side_effects = True
828
829 primop  SizeofByteArrayOp "sizeofByteArray#" GenPrimOp  
830    ByteArr# -> Int#
831
832 primop  SizeofMutableByteArrayOp "sizeofMutableByteArray#" GenPrimOp
833    MutByteArr# s -> Int#
834
835
836 primop IndexByteArrayOp_Char "indexCharArray#" GenPrimOp
837    ByteArr# -> Int# -> Char#
838    {Read 8-bit character; offset in bytes.}
839
840 primop IndexByteArrayOp_WideChar "indexWideCharArray#" GenPrimOp
841    ByteArr# -> Int# -> Char#
842    {Read 31-bit character; offset in 4-byte words.}
843
844 primop IndexByteArrayOp_Int "indexIntArray#" GenPrimOp
845    ByteArr# -> Int# -> Int#
846
847 primop IndexByteArrayOp_Word "indexWordArray#" GenPrimOp
848    ByteArr# -> Int# -> Word#
849
850 primop IndexByteArrayOp_Addr "indexAddrArray#" GenPrimOp
851    ByteArr# -> Int# -> Addr#
852
853 primop IndexByteArrayOp_Float "indexFloatArray#" GenPrimOp
854    ByteArr# -> Int# -> Float#
855
856 primop IndexByteArrayOp_Double "indexDoubleArray#" GenPrimOp
857    ByteArr# -> Int# -> Double#
858
859 primop IndexByteArrayOp_StablePtr "indexStablePtrArray#" GenPrimOp
860    ByteArr# -> Int# -> StablePtr# a
861
862 primop IndexByteArrayOp_Int8 "indexInt8Array#" GenPrimOp
863    ByteArr# -> Int# -> Int#
864
865 primop IndexByteArrayOp_Int16 "indexInt16Array#" GenPrimOp
866    ByteArr# -> Int# -> Int#
867
868 primop IndexByteArrayOp_Int32 "indexInt32Array#" GenPrimOp
869    ByteArr# -> Int# -> INT32
870
871 primop IndexByteArrayOp_Int64 "indexInt64Array#" GenPrimOp
872    ByteArr# -> Int# -> INT64
873
874 primop IndexByteArrayOp_Word8 "indexWord8Array#" GenPrimOp
875    ByteArr# -> Int# -> Word#
876
877 primop IndexByteArrayOp_Word16 "indexWord16Array#" GenPrimOp
878    ByteArr# -> Int# -> Word#
879
880 primop IndexByteArrayOp_Word32 "indexWord32Array#" GenPrimOp
881    ByteArr# -> Int# -> WORD32
882
883 primop IndexByteArrayOp_Word64 "indexWord64Array#" GenPrimOp
884    ByteArr# -> Int# -> WORD64
885
886 primop  ReadByteArrayOp_Char "readCharArray#" GenPrimOp
887    MutByteArr# s -> Int# -> State# s -> (# State# s, Char# #)
888    {Read 8-bit character; offset in bytes.}
889
890 primop  ReadByteArrayOp_WideChar "readWideCharArray#" GenPrimOp
891    MutByteArr# s -> Int# -> State# s -> (# State# s, Char# #)
892    {Read 31-bit character; offset in 4-byte words.}
893
894 primop  ReadByteArrayOp_Int "readIntArray#" GenPrimOp
895    MutByteArr# s -> Int# -> State# s -> (# State# s, Int# #)
896
897 primop  ReadByteArrayOp_Word "readWordArray#" GenPrimOp
898    MutByteArr# s -> Int# -> State# s -> (# State# s, Word# #)
899
900 primop  ReadByteArrayOp_Addr "readAddrArray#" GenPrimOp
901    MutByteArr# s -> Int# -> State# s -> (# State# s, Addr# #)
902
903 primop  ReadByteArrayOp_Float "readFloatArray#" GenPrimOp
904    MutByteArr# s -> Int# -> State# s -> (# State# s, Float# #)
905
906 primop  ReadByteArrayOp_Double "readDoubleArray#" GenPrimOp
907    MutByteArr# s -> Int# -> State# s -> (# State# s, Double# #)
908
909 primop  ReadByteArrayOp_StablePtr "readStablePtrArray#" GenPrimOp
910    MutByteArr# s -> Int# -> State# s -> (# State# s, StablePtr# a #)
911
912 primop  ReadByteArrayOp_Int8 "readInt8Array#" GenPrimOp
913    MutByteArr# s -> Int# -> State# s -> (# State# s, Int# #)
914
915 primop  ReadByteArrayOp_Int16 "readInt16Array#" GenPrimOp
916    MutByteArr# s -> Int# -> State# s -> (# State# s, Int# #)
917
918 primop  ReadByteArrayOp_Int32 "readInt32Array#" GenPrimOp
919    MutByteArr# s -> Int# -> State# s -> (# State# s, INT32 #)
920
921 primop  ReadByteArrayOp_Int64 "readInt64Array#" GenPrimOp
922    MutByteArr# s -> Int# -> State# s -> (# State# s, INT64 #)
923
924 primop  ReadByteArrayOp_Word8 "readWord8Array#" GenPrimOp
925    MutByteArr# s -> Int# -> State# s -> (# State# s, Word# #)
926
927 primop  ReadByteArrayOp_Word16 "readWord16Array#" GenPrimOp
928    MutByteArr# s -> Int# -> State# s -> (# State# s, Word# #)
929
930 primop  ReadByteArrayOp_Word32 "readWord32Array#" GenPrimOp
931    MutByteArr# s -> Int# -> State# s -> (# State# s, WORD32 #)
932
933 primop  ReadByteArrayOp_Word64 "readWord64Array#" GenPrimOp
934    MutByteArr# s -> Int# -> State# s -> (# State# s, WORD64 #)
935
936 primop  WriteByteArrayOp_Char "writeCharArray#" GenPrimOp
937    MutByteArr# s -> Int# -> Char# -> State# s -> State# s
938    {Write 8-bit character; offset in bytes.}
939    with has_side_effects = True
940
941 primop  WriteByteArrayOp_WideChar "writeWideCharArray#" GenPrimOp
942    MutByteArr# s -> Int# -> Char# -> State# s -> State# s
943    {Write 31-bit character; offset in 4-byte words.}
944    with has_side_effects = True
945
946 primop  WriteByteArrayOp_Int "writeIntArray#" GenPrimOp
947    MutByteArr# s -> Int# -> Int# -> State# s -> State# s
948    with has_side_effects = True
949
950 primop  WriteByteArrayOp_Word "writeWordArray#" GenPrimOp
951    MutByteArr# s -> Int# -> Word# -> State# s -> State# s
952    with has_side_effects = True
953
954 primop  WriteByteArrayOp_Addr "writeAddrArray#" GenPrimOp
955    MutByteArr# s -> Int# -> Addr# -> State# s -> State# s
956    with has_side_effects = True
957
958 primop  WriteByteArrayOp_Float "writeFloatArray#" GenPrimOp
959    MutByteArr# s -> Int# -> Float# -> State# s -> State# s
960    with has_side_effects = True
961
962 primop  WriteByteArrayOp_Double "writeDoubleArray#" GenPrimOp
963    MutByteArr# s -> Int# -> Double# -> State# s -> State# s
964    with has_side_effects = True
965
966 primop  WriteByteArrayOp_StablePtr "writeStablePtrArray#" GenPrimOp
967    MutByteArr# s -> Int# -> StablePtr# a -> State# s -> State# s
968    with has_side_effects = True
969
970 primop  WriteByteArrayOp_Int8 "writeInt8Array#" GenPrimOp
971    MutByteArr# s -> Int# -> Int# -> State# s -> State# s
972    with has_side_effects = True
973
974 primop  WriteByteArrayOp_Int16 "writeInt16Array#" GenPrimOp
975    MutByteArr# s -> Int# -> Int# -> State# s -> State# s
976    with has_side_effects = True
977
978 primop  WriteByteArrayOp_Int32 "writeInt32Array#" GenPrimOp
979    MutByteArr# s -> Int# -> INT32 -> State# s -> State# s
980    with has_side_effects = True
981
982 primop  WriteByteArrayOp_Int64 "writeInt64Array#" GenPrimOp
983    MutByteArr# s -> Int# -> INT64 -> State# s -> State# s
984    with has_side_effects = True
985
986 primop  WriteByteArrayOp_Word8 "writeWord8Array#" GenPrimOp
987    MutByteArr# s -> Int# -> Word# -> State# s -> State# s
988    with has_side_effects = True
989
990 primop  WriteByteArrayOp_Word16 "writeWord16Array#" GenPrimOp
991    MutByteArr# s -> Int# -> Word# -> State# s -> State# s
992    with has_side_effects = True
993
994 primop  WriteByteArrayOp_Word32 "writeWord32Array#" GenPrimOp
995    MutByteArr# s -> Int# -> WORD32 -> State# s -> State# s
996    with has_side_effects = True
997
998 primop  WriteByteArrayOp_Word64 "writeWord64Array#" GenPrimOp
999    MutByteArr# s -> Int# -> WORD64 -> State# s -> State# s
1000    with has_side_effects = True
1001
1002 ------------------------------------------------------------------------
1003 section "Addr#"
1004 ------------------------------------------------------------------------
1005
1006 primtype Addr#
1007         { An arbitrary machine address assumed to point outside
1008          the garbage-collected heap. }
1009
1010 pseudoop "nullAddr#" Addr#
1011         { The null address. }
1012
1013 primop   AddrAddOp "plusAddr#" GenPrimOp Addr# -> Int# -> Addr#
1014 primop   AddrSubOp "minusAddr#" GenPrimOp Addr# -> Addr# -> Int#
1015          {Result is meaningless if two {\tt Addr\#}s are so far apart that their
1016          difference doesn't fit in an {\tt Int\#}.}
1017 primop   AddrRemOp "remAddr#" GenPrimOp Addr# -> Int# -> Int#
1018          {Return the remainder when the {\tt Addr\#} arg, treated like an {\tt Int\#},
1019           is divided by the {\tt Int\#} arg.}
1020 #if (WORD_SIZE_IN_BITS == 32 || WORD_SIZE_IN_BITS == 64)
1021 primop   Addr2IntOp  "addr2Int#"     GenPrimOp   Addr# -> Int#
1022         {Coerce directly from address to int. Strongly deprecated.}
1023 primop   Int2AddrOp   "int2Addr#"    GenPrimOp  Int# -> Addr#
1024         {Coerce directly from int to address. Strongly deprecated.}
1025 #endif
1026
1027 primop   AddrGtOp  "gtAddr#"   Compare   Addr# -> Addr# -> Bool
1028 primop   AddrGeOp  "geAddr#"   Compare   Addr# -> Addr# -> Bool
1029 primop   AddrEqOp  "eqAddr#"   Compare   Addr# -> Addr# -> Bool
1030 primop   AddrNeOp  "neAddr#"   Compare   Addr# -> Addr# -> Bool
1031 primop   AddrLtOp  "ltAddr#"   Compare   Addr# -> Addr# -> Bool
1032 primop   AddrLeOp  "leAddr#"   Compare   Addr# -> Addr# -> Bool
1033
1034 primop IndexOffAddrOp_Char "indexCharOffAddr#" GenPrimOp
1035    Addr# -> Int# -> Char#
1036    {Reads 8-bit character; offset in bytes.}
1037
1038 primop IndexOffAddrOp_WideChar "indexWideCharOffAddr#" GenPrimOp
1039    Addr# -> Int# -> Char#
1040    {Reads 31-bit character; offset in 4-byte words.}
1041
1042 primop IndexOffAddrOp_Int "indexIntOffAddr#" GenPrimOp
1043    Addr# -> Int# -> Int#
1044
1045 primop IndexOffAddrOp_Word "indexWordOffAddr#" GenPrimOp
1046    Addr# -> Int# -> Word#
1047
1048 primop IndexOffAddrOp_Addr "indexAddrOffAddr#" GenPrimOp
1049    Addr# -> Int# -> Addr#
1050
1051 primop IndexOffAddrOp_Float "indexFloatOffAddr#" GenPrimOp
1052    Addr# -> Int# -> Float#
1053
1054 primop IndexOffAddrOp_Double "indexDoubleOffAddr#" GenPrimOp
1055    Addr# -> Int# -> Double#
1056
1057 primop IndexOffAddrOp_StablePtr "indexStablePtrOffAddr#" GenPrimOp
1058    Addr# -> Int# -> StablePtr# a
1059
1060 primop IndexOffAddrOp_Int8 "indexInt8OffAddr#" GenPrimOp
1061    Addr# -> Int# -> Int#
1062
1063 primop IndexOffAddrOp_Int16 "indexInt16OffAddr#" GenPrimOp
1064    Addr# -> Int# -> Int#
1065
1066 primop IndexOffAddrOp_Int32 "indexInt32OffAddr#" GenPrimOp
1067    Addr# -> Int# -> INT32
1068
1069 primop IndexOffAddrOp_Int64 "indexInt64OffAddr#" GenPrimOp
1070    Addr# -> Int# -> INT64
1071
1072 primop IndexOffAddrOp_Word8 "indexWord8OffAddr#" GenPrimOp
1073    Addr# -> Int# -> Word#
1074
1075 primop IndexOffAddrOp_Word16 "indexWord16OffAddr#" GenPrimOp
1076    Addr# -> Int# -> Word#
1077
1078 primop IndexOffAddrOp_Word32 "indexWord32OffAddr#" GenPrimOp
1079    Addr# -> Int# -> WORD32
1080
1081 primop IndexOffAddrOp_Word64 "indexWord64OffAddr#" GenPrimOp
1082    Addr# -> Int# -> WORD64
1083
1084 primop ReadOffAddrOp_Char "readCharOffAddr#" GenPrimOp
1085    Addr# -> Int# -> State# s -> (# State# s, Char# #)
1086    {Reads 8-bit character; offset in bytes.}
1087
1088 primop ReadOffAddrOp_WideChar "readWideCharOffAddr#" GenPrimOp
1089    Addr# -> Int# -> State# s -> (# State# s, Char# #)
1090    {Reads 31-bit character; offset in 4-byte words.}
1091
1092 primop ReadOffAddrOp_Int "readIntOffAddr#" GenPrimOp
1093    Addr# -> Int# -> State# s -> (# State# s, Int# #)
1094
1095 primop ReadOffAddrOp_Word "readWordOffAddr#" GenPrimOp
1096    Addr# -> Int# -> State# s -> (# State# s, Word# #)
1097
1098 primop ReadOffAddrOp_Addr "readAddrOffAddr#" GenPrimOp
1099    Addr# -> Int# -> State# s -> (# State# s, Addr# #)
1100
1101 primop ReadOffAddrOp_Float "readFloatOffAddr#" GenPrimOp
1102    Addr# -> Int# -> State# s -> (# State# s, Float# #)
1103
1104 primop ReadOffAddrOp_Double "readDoubleOffAddr#" GenPrimOp
1105    Addr# -> Int# -> State# s -> (# State# s, Double# #)
1106
1107 primop ReadOffAddrOp_StablePtr "readStablePtrOffAddr#" GenPrimOp
1108    Addr# -> Int# -> State# s -> (# State# s, StablePtr# a #)
1109
1110 primop ReadOffAddrOp_Int8 "readInt8OffAddr#" GenPrimOp
1111    Addr# -> Int# -> State# s -> (# State# s, Int# #)
1112
1113 primop ReadOffAddrOp_Int16 "readInt16OffAddr#" GenPrimOp
1114    Addr# -> Int# -> State# s -> (# State# s, Int# #)
1115
1116 primop ReadOffAddrOp_Int32 "readInt32OffAddr#" GenPrimOp
1117    Addr# -> Int# -> State# s -> (# State# s, INT32 #)
1118
1119 primop ReadOffAddrOp_Int64 "readInt64OffAddr#" GenPrimOp
1120    Addr# -> Int# -> State# s -> (# State# s, INT64 #)
1121
1122 primop ReadOffAddrOp_Word8 "readWord8OffAddr#" GenPrimOp
1123    Addr# -> Int# -> State# s -> (# State# s, Word# #)
1124
1125 primop ReadOffAddrOp_Word16 "readWord16OffAddr#" GenPrimOp
1126    Addr# -> Int# -> State# s -> (# State# s, Word# #)
1127
1128 primop ReadOffAddrOp_Word32 "readWord32OffAddr#" GenPrimOp
1129    Addr# -> Int# -> State# s -> (# State# s, WORD32 #)
1130
1131 primop ReadOffAddrOp_Word64 "readWord64OffAddr#" GenPrimOp
1132    Addr# -> Int# -> State# s -> (# State# s, WORD64 #)
1133
1134
1135 primop  WriteOffAddrOp_Char "writeCharOffAddr#" GenPrimOp
1136    Addr# -> Int# -> Char# -> State# s -> State# s
1137    with has_side_effects = True
1138
1139 primop  WriteOffAddrOp_WideChar "writeWideCharOffAddr#" GenPrimOp
1140    Addr# -> Int# -> Char# -> State# s -> State# s
1141    with has_side_effects = True
1142
1143 primop  WriteOffAddrOp_Int "writeIntOffAddr#" GenPrimOp
1144    Addr# -> Int# -> Int# -> State# s -> State# s
1145    with has_side_effects = True
1146
1147 primop  WriteOffAddrOp_Word "writeWordOffAddr#" GenPrimOp
1148    Addr# -> Int# -> Word# -> State# s -> State# s
1149    with has_side_effects = True
1150
1151 primop  WriteOffAddrOp_Addr "writeAddrOffAddr#" GenPrimOp
1152    Addr# -> Int# -> Addr# -> State# s -> State# s
1153    with has_side_effects = True
1154
1155 primop  WriteOffAddrOp_Float "writeFloatOffAddr#" GenPrimOp
1156    Addr# -> Int# -> Float# -> State# s -> State# s
1157    with has_side_effects = True
1158
1159 primop  WriteOffAddrOp_Double "writeDoubleOffAddr#" GenPrimOp
1160    Addr# -> Int# -> Double# -> State# s -> State# s
1161    with has_side_effects = True
1162
1163 primop  WriteOffAddrOp_StablePtr "writeStablePtrOffAddr#" GenPrimOp
1164    Addr# -> Int# -> StablePtr# a -> State# s -> State# s
1165    with has_side_effects = True
1166
1167 primop  WriteOffAddrOp_Int8 "writeInt8OffAddr#" GenPrimOp
1168    Addr# -> Int# -> Int# -> State# s -> State# s
1169    with has_side_effects = True
1170
1171 primop  WriteOffAddrOp_Int16 "writeInt16OffAddr#" GenPrimOp
1172    Addr# -> Int# -> Int# -> State# s -> State# s
1173    with has_side_effects = True
1174
1175 primop  WriteOffAddrOp_Int32 "writeInt32OffAddr#" GenPrimOp
1176    Addr# -> Int# -> INT32 -> State# s -> State# s
1177    with has_side_effects = True
1178
1179 primop  WriteOffAddrOp_Int64 "writeInt64OffAddr#" GenPrimOp
1180    Addr# -> Int# -> INT64 -> State# s -> State# s
1181    with has_side_effects = True
1182
1183 primop  WriteOffAddrOp_Word8 "writeWord8OffAddr#" GenPrimOp
1184    Addr# -> Int# -> Word# -> State# s -> State# s
1185    with has_side_effects = True
1186
1187 primop  WriteOffAddrOp_Word16 "writeWord16OffAddr#" GenPrimOp
1188    Addr# -> Int# -> Word# -> State# s -> State# s
1189    with has_side_effects = True
1190
1191 primop  WriteOffAddrOp_Word32 "writeWord32OffAddr#" GenPrimOp
1192    Addr# -> Int# -> WORD32 -> State# s -> State# s
1193    with has_side_effects = True
1194
1195 primop  WriteOffAddrOp_Word64 "writeWord64OffAddr#" GenPrimOp
1196    Addr# -> Int# -> WORD64 -> State# s -> State# s
1197    with has_side_effects = True
1198
1199 ------------------------------------------------------------------------
1200 section "Mutable variables"
1201         {Operations on MutVar\#s.}
1202 ------------------------------------------------------------------------
1203
1204 primtype MutVar# s a
1205         {A {\tt MutVar\#} behaves like a single-element mutable array.}
1206
1207 primop  NewMutVarOp "newMutVar#" GenPrimOp
1208    a -> State# s -> (# State# s, MutVar# s a #)
1209    {Create {\tt MutVar\#} with specified initial value in specified state thread.}
1210    with
1211    out_of_line = True
1212
1213 primop  ReadMutVarOp "readMutVar#" GenPrimOp
1214    MutVar# s a -> State# s -> (# State# s, a #)
1215    {Read contents of {\tt MutVar\#}. Result is not yet evaluated.}
1216
1217 primop  WriteMutVarOp "writeMutVar#"  GenPrimOp
1218    MutVar# s a -> a -> State# s -> State# s
1219    {Write contents of {\tt MutVar\#}.}
1220    with
1221    has_side_effects = True
1222
1223 primop  SameMutVarOp "sameMutVar#" GenPrimOp
1224    MutVar# s a -> MutVar# s a -> Bool
1225
1226 -- not really the right type, but we don't know about pairs here.  The
1227 -- correct type is
1228 --
1229 --   MutVar# s a -> (a -> (a,b)) -> State# s -> (# State# s, b #)
1230 --
1231 primop  AtomicModifyMutVarOp "atomicModifyMutVar#" GenPrimOp
1232    MutVar# s a -> (a -> b) -> State# s -> (# State# s, c #)
1233    with
1234    has_side_effects = True
1235    out_of_line = True
1236
1237 ------------------------------------------------------------------------
1238 section "Exceptions"
1239 ------------------------------------------------------------------------
1240
1241 primop  CatchOp "catch#" GenPrimOp
1242           (State# RealWorld -> (# State# RealWorld, a #) )
1243        -> (b -> State# RealWorld -> (# State# RealWorld, a #) ) 
1244        -> State# RealWorld
1245        -> (# State# RealWorld, a #)
1246    with
1247         -- Catch is actually strict in its first argument
1248         -- but we don't want to tell the strictness
1249         -- analyser about that!
1250         -- might use caught action multiply
1251    out_of_line = True
1252
1253 primop  RaiseOp "raise#" GenPrimOp
1254    a -> b
1255    with
1256    strictness  = { \ _arity -> mkStrictSig (mkTopDmdType [lazyDmd] BotRes) }
1257       -- NB: result is bottom
1258    out_of_line = True
1259
1260 -- raiseIO# needs to be a primop, because exceptions in the IO monad
1261 -- must be *precise* - we don't want the strictness analyser turning
1262 -- one kind of bottom into another, as it is allowed to do in pure code.
1263
1264 primop  RaiseIOOp "raiseIO#" GenPrimOp
1265    a -> State# RealWorld -> (# State# RealWorld, b #)
1266    with
1267    out_of_line = True
1268
1269 primop  BlockAsyncExceptionsOp "blockAsyncExceptions#" GenPrimOp
1270         (State# RealWorld -> (# State# RealWorld, a #))
1271      -> (State# RealWorld -> (# State# RealWorld, a #))
1272    with
1273    out_of_line = True
1274
1275 primop  UnblockAsyncExceptionsOp "unblockAsyncExceptions#" GenPrimOp
1276         (State# RealWorld -> (# State# RealWorld, a #))
1277      -> (State# RealWorld -> (# State# RealWorld, a #))
1278    with
1279    out_of_line = True
1280
1281 ------------------------------------------------------------------------
1282 section "STM-accessible Mutable Variables"
1283 ------------------------------------------------------------------------
1284
1285 primtype TVar# s a
1286
1287 primop  AtomicallyOp "atomically#" GenPrimOp
1288       (State# RealWorld -> (# State# RealWorld, a #) )
1289    -> State# RealWorld -> (# State# RealWorld, a #)
1290    with
1291    out_of_line = True
1292    has_side_effects = True
1293
1294 primop  RetryOp "retry#" GenPrimOp
1295    State# RealWorld -> (# State# RealWorld, a #)
1296    with 
1297    out_of_line = True
1298    has_side_effects = True
1299
1300 primop  CatchRetryOp "catchRetry#" GenPrimOp
1301       (State# RealWorld -> (# State# RealWorld, a #) )
1302    -> (State# RealWorld -> (# State# RealWorld, a #) )
1303    -> (State# RealWorld -> (# State# RealWorld, a #) )
1304    with 
1305    out_of_line = True
1306    has_side_effects = True
1307
1308 primop  CatchSTMOp "catchSTM#" GenPrimOp
1309       (State# RealWorld -> (# State# RealWorld, a #) )
1310    -> (b -> State# RealWorld -> (# State# RealWorld, a #) )
1311    -> (State# RealWorld -> (# State# RealWorld, a #) )
1312    with 
1313    out_of_line = True
1314    has_side_effects = True
1315
1316 primop  Check "check#" GenPrimOp
1317       (State# RealWorld -> (# State# RealWorld, a #) )
1318    -> (State# RealWorld -> (# State# RealWorld, () #) )
1319    with 
1320    out_of_line = True
1321    has_side_effects = True
1322
1323 primop  NewTVarOp "newTVar#" GenPrimOp
1324        a
1325     -> State# s -> (# State# s, TVar# s a #)
1326    {Create a new {\tt TVar\#} holding a specified initial value.}
1327    with
1328    out_of_line  = True
1329
1330 primop  ReadTVarOp "readTVar#" GenPrimOp
1331        TVar# s a
1332     -> State# s -> (# State# s, a #)
1333    {Read contents of {\tt TVar\#}.  Result is not yet evaluated.}
1334    with
1335    out_of_line  = True
1336
1337 primop  WriteTVarOp "writeTVar#" GenPrimOp
1338        TVar# s a
1339     -> a
1340     -> State# s -> State# s
1341    {Write contents of {\tt TVar\#}.}
1342    with
1343    out_of_line      = True
1344    has_side_effects = True
1345
1346 primop  SameTVarOp "sameTVar#" GenPrimOp
1347    TVar# s a -> TVar# s a -> Bool
1348
1349
1350 ------------------------------------------------------------------------
1351 section "Synchronized Mutable Variables"
1352         {Operations on {\tt MVar\#}s. }
1353 ------------------------------------------------------------------------
1354
1355 primtype MVar# s a
1356         { A shared mutable variable ({\it not} the same as a {\tt MutVar\#}!).
1357         (Note: in a non-concurrent implementation, {\tt (MVar\# a)} can be
1358         represented by {\tt (MutVar\# (Maybe a))}.) }
1359
1360 primop  NewMVarOp "newMVar#"  GenPrimOp
1361    State# s -> (# State# s, MVar# s a #)
1362    {Create new {\tt MVar\#}; initially empty.}
1363    with
1364    out_of_line = True
1365
1366 primop  TakeMVarOp "takeMVar#" GenPrimOp
1367    MVar# s a -> State# s -> (# State# s, a #)
1368    {If {\tt MVar\#} is empty, block until it becomes full.
1369    Then remove and return its contents, and set it empty.}
1370    with
1371    has_side_effects = True
1372    out_of_line      = True
1373
1374 primop  TryTakeMVarOp "tryTakeMVar#" GenPrimOp
1375    MVar# s a -> State# s -> (# State# s, Int#, a #)
1376    {If {\tt MVar\#} is empty, immediately return with integer 0 and value undefined.
1377    Otherwise, return with integer 1 and contents of {\tt MVar\#}, and set {\tt MVar\#} empty.}
1378    with
1379    has_side_effects = True
1380    out_of_line      = True
1381
1382 primop  PutMVarOp "putMVar#" GenPrimOp
1383    MVar# s a -> a -> State# s -> State# s
1384    {If {\tt MVar\#} is full, block until it becomes empty.
1385    Then store value arg as its new contents.}
1386    with
1387    has_side_effects = True
1388    out_of_line      = True
1389
1390 primop  TryPutMVarOp "tryPutMVar#" GenPrimOp
1391    MVar# s a -> a -> State# s -> (# State# s, Int# #)
1392    {If {\tt MVar\#} is full, immediately return with integer 0.
1393     Otherwise, store value arg as {\tt MVar\#}'s new contents, and return with integer 1.}
1394    with
1395    has_side_effects = True
1396    out_of_line      = True
1397
1398 primop  SameMVarOp "sameMVar#" GenPrimOp
1399    MVar# s a -> MVar# s a -> Bool
1400
1401 primop  IsEmptyMVarOp "isEmptyMVar#" GenPrimOp
1402    MVar# s a -> State# s -> (# State# s, Int# #)
1403    {Return 1 if {\tt MVar\#} is empty; 0 otherwise.}
1404    with
1405    out_of_line = True
1406
1407 ------------------------------------------------------------------------
1408 section "Delay/wait operations"
1409 ------------------------------------------------------------------------
1410
1411 primop  DelayOp "delay#" GenPrimOp
1412    Int# -> State# s -> State# s
1413    {Sleep specified number of microseconds.}
1414    with
1415    needs_wrapper    = True
1416    has_side_effects = True
1417    out_of_line      = True
1418
1419 primop  WaitReadOp "waitRead#" GenPrimOp
1420    Int# -> State# s -> State# s
1421    {Block until input is available on specified file descriptor.}
1422    with
1423    needs_wrapper    = True
1424    has_side_effects = True
1425    out_of_line      = True
1426
1427 primop  WaitWriteOp "waitWrite#" GenPrimOp
1428    Int# -> State# s -> State# s
1429    {Block until output is possible on specified file descriptor.}
1430    with
1431    needs_wrapper    = True
1432    has_side_effects = True
1433    out_of_line      = True
1434
1435 #ifdef mingw32_TARGET_OS
1436 primop  AsyncReadOp "asyncRead#" GenPrimOp
1437    Int# -> Int# -> Int# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1438    {Asynchronously read bytes from specified file descriptor.}
1439    with
1440    needs_wrapper    = True
1441    has_side_effects = True
1442    out_of_line      = True
1443
1444 primop  AsyncWriteOp "asyncWrite#" GenPrimOp
1445    Int# -> Int# -> Int# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1446    {Asynchronously write bytes from specified file descriptor.}
1447    with
1448    needs_wrapper    = True
1449    has_side_effects = True
1450    out_of_line      = True
1451
1452 primop  AsyncDoProcOp "asyncDoProc#" GenPrimOp
1453    Addr# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1454    {Asynchronously perform procedure (first arg), passing it 2nd arg.}
1455    with
1456    needs_wrapper    = True
1457    has_side_effects = True
1458    out_of_line      = True
1459
1460 #endif
1461
1462 ------------------------------------------------------------------------
1463 section "Concurrency primitives"
1464 ------------------------------------------------------------------------
1465
1466 primtype State# s
1467         { {\tt State\#} is the primitive, unlifted type of states.  It has
1468         one type parameter, thus {\tt State\# RealWorld}, or {\tt State\# s},
1469         where s is a type variable. The only purpose of the type parameter
1470         is to keep different state threads separate.  It is represented by
1471         nothing at all. }
1472
1473 primtype RealWorld
1474         { {\tt RealWorld} is deeply magical.  It is {\it primitive}, but it is not
1475         {\it unlifted} (hence {\tt ptrArg}).  We never manipulate values of type
1476         {\tt RealWorld}; it's only used in the type system, to parameterise {\tt State\#}. }
1477
1478 primtype ThreadId#
1479         {(In a non-concurrent implementation, this can be a singleton
1480         type, whose (unique) value is returned by {\tt myThreadId\#}.  The 
1481         other operations can be omitted.)}
1482
1483 primop  ForkOp "fork#" GenPrimOp
1484    a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1485    with
1486    has_side_effects = True
1487    out_of_line      = True
1488
1489 primop  ForkOnOp "forkOn#" GenPrimOp
1490    Int# -> a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1491    with
1492    has_side_effects = True
1493    out_of_line      = True
1494
1495 primop  KillThreadOp "killThread#"  GenPrimOp
1496    ThreadId# -> a -> State# RealWorld -> State# RealWorld
1497    with
1498    has_side_effects = True
1499    out_of_line      = True
1500
1501 primop  YieldOp "yield#" GenPrimOp
1502    State# RealWorld -> State# RealWorld
1503    with
1504    has_side_effects = True
1505    out_of_line      = True
1506
1507 primop  MyThreadIdOp "myThreadId#" GenPrimOp
1508    State# RealWorld -> (# State# RealWorld, ThreadId# #)
1509    with
1510    out_of_line = True
1511
1512 primop LabelThreadOp "labelThread#" GenPrimOp
1513    ThreadId# -> Addr# -> State# RealWorld -> State# RealWorld
1514    with
1515    has_side_effects = True
1516    out_of_line      = True
1517    
1518 primop  IsCurrentThreadBoundOp "isCurrentThreadBound#" GenPrimOp
1519    State# RealWorld -> (# State# RealWorld, Int# #)
1520    with
1521    out_of_line = True
1522
1523 primop  NoDuplicateOp "noDuplicate#" GenPrimOp
1524    State# RealWorld -> State# RealWorld
1525    with
1526    out_of_line = True
1527
1528 ------------------------------------------------------------------------
1529 section "Weak pointers"
1530 ------------------------------------------------------------------------
1531
1532 primtype Weak# b
1533
1534 -- note that tyvar "o" denotes openAlphaTyVar
1535
1536 primop  MkWeakOp "mkWeak#" GenPrimOp
1537    o -> b -> c -> State# RealWorld -> (# State# RealWorld, Weak# b #)
1538    with
1539    has_side_effects = True
1540    out_of_line      = True
1541
1542 primop  DeRefWeakOp "deRefWeak#" GenPrimOp
1543    Weak# a -> State# RealWorld -> (# State# RealWorld, Int#, a #)
1544    with
1545    has_side_effects = True
1546    out_of_line      = True
1547
1548 primop  FinalizeWeakOp "finalizeWeak#" GenPrimOp
1549    Weak# a -> State# RealWorld -> (# State# RealWorld, Int#, 
1550               (State# RealWorld -> (# State# RealWorld, () #)) #)
1551    with
1552    has_side_effects = True
1553    out_of_line      = True
1554
1555 primop TouchOp "touch#" GenPrimOp
1556    o -> State# RealWorld -> State# RealWorld
1557    with
1558    has_side_effects = True
1559
1560 ------------------------------------------------------------------------
1561 section "Stable pointers and names"
1562 ------------------------------------------------------------------------
1563
1564 primtype StablePtr# a
1565
1566 primtype StableName# a
1567
1568 primop  MakeStablePtrOp "makeStablePtr#" GenPrimOp
1569    a -> State# RealWorld -> (# State# RealWorld, StablePtr# a #)
1570    with
1571    has_side_effects = True
1572    out_of_line      = True
1573
1574 primop  DeRefStablePtrOp "deRefStablePtr#" GenPrimOp
1575    StablePtr# a -> State# RealWorld -> (# State# RealWorld, a #)
1576    with
1577    needs_wrapper    = True
1578    has_side_effects = True
1579    out_of_line      = True
1580
1581 primop  EqStablePtrOp "eqStablePtr#" GenPrimOp
1582    StablePtr# a -> StablePtr# a -> Int#
1583    with
1584    has_side_effects = True
1585
1586 primop  MakeStableNameOp "makeStableName#" GenPrimOp
1587    a -> State# RealWorld -> (# State# RealWorld, StableName# a #)
1588    with
1589    needs_wrapper    = True
1590    has_side_effects = True
1591    out_of_line      = True
1592
1593 primop  EqStableNameOp "eqStableName#" GenPrimOp
1594    StableName# a -> StableName# a -> Int#
1595
1596 primop  StableNameToIntOp "stableNameToInt#" GenPrimOp
1597    StableName# a -> Int#
1598
1599 ------------------------------------------------------------------------
1600 section "Unsafe pointer equality"
1601 --  (#1 Bad Guy: Alistair Reid :)   
1602 ------------------------------------------------------------------------
1603
1604 primop  ReallyUnsafePtrEqualityOp "reallyUnsafePtrEquality#" GenPrimOp
1605    a -> a -> Int#
1606
1607 ------------------------------------------------------------------------
1608 section "Parallelism"
1609 ------------------------------------------------------------------------
1610
1611 primop  ParOp "par#" GenPrimOp
1612    a -> Int#
1613    with
1614       -- Note that Par is lazy to avoid that the sparked thing
1615       -- gets evaluted strictly, which it should *not* be
1616    has_side_effects = True
1617
1618 -- HWL: The first 4 Int# in all par... annotations denote:
1619 --   name, granularity info, size of result, degree of parallelism
1620 --      Same  structure as _seq_ i.e. returns Int#
1621 -- KSW: v, the second arg in parAt# and parAtForNow#, is used only to determine
1622 --   `the processor containing the expression v'; it is not evaluated
1623
1624 primop  ParGlobalOp  "parGlobal#"  GenPrimOp
1625    a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1626    with
1627    has_side_effects = True
1628
1629 primop  ParLocalOp  "parLocal#"  GenPrimOp
1630    a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1631    with
1632    has_side_effects = True
1633
1634 primop  ParAtOp  "parAt#"  GenPrimOp
1635    b -> a -> Int# -> Int# -> Int# -> Int# -> c -> Int#
1636    with
1637    has_side_effects = True
1638
1639 primop  ParAtAbsOp  "parAtAbs#"  GenPrimOp
1640    a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1641    with
1642    has_side_effects = True
1643
1644 primop  ParAtRelOp  "parAtRel#" GenPrimOp
1645    a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1646    with
1647    has_side_effects = True
1648
1649 primop  ParAtForNowOp  "parAtForNow#" GenPrimOp
1650    b -> a -> Int# -> Int# -> Int# -> Int# -> c -> Int#
1651    with
1652    has_side_effects = True
1653
1654 -- copyable# and noFollow# are yet to be implemented (for GpH)
1655 --
1656 --primop  CopyableOp  "copyable#" GenPrimOp
1657 --   a -> Int#
1658 --   with
1659 --   has_side_effects = True
1660 --
1661 --primop  NoFollowOp "noFollow#" GenPrimOp
1662 --   a -> Int#
1663 --   with
1664 --   has_side_effects = True
1665
1666
1667 ------------------------------------------------------------------------
1668 section "Tag to enum stuff"
1669         {Convert back and forth between values of enumerated types
1670         and small integers.}
1671 ------------------------------------------------------------------------
1672
1673 primop  DataToTagOp "dataToTag#" GenPrimOp
1674    a -> Int#
1675    with
1676    strictness  = { \ _arity -> mkStrictSig (mkTopDmdType [seqDmd] TopRes) }
1677         -- dataToTag# must have an evaluated argument
1678
1679 primop  TagToEnumOp "tagToEnum#" GenPrimOp     
1680    Int# -> a
1681
1682 ------------------------------------------------------------------------
1683 section "Bytecode operations" 
1684         {Support for the bytecode interpreter and linker.}
1685 ------------------------------------------------------------------------
1686
1687 primtype BCO#
1688    {Primitive bytecode type.}
1689
1690 primop   AddrToHValueOp "addrToHValue#" GenPrimOp
1691    Addr# -> (# a #)
1692    {Convert an {\tt Addr\#} to a followable type.}
1693
1694 primop   MkApUpd0_Op "mkApUpd0#" GenPrimOp
1695    BCO# -> (# a #)
1696    with
1697    out_of_line = True
1698
1699 primop  NewBCOOp "newBCO#" GenPrimOp
1700    ByteArr# -> ByteArr# -> Array# a -> Int# -> ByteArr# -> State# s -> (# State# s, BCO# #)
1701    with
1702    has_side_effects = True
1703    out_of_line      = True
1704
1705 primop  UnpackClosureOp "unpackClosure#" GenPrimOp
1706    a -> (# Addr#, Array# b, ByteArr# #)
1707    with
1708    out_of_line = True
1709
1710 primop  GetApStackValOp "getApStackVal#" GenPrimOp
1711    a -> Int# -> (# Int#, b #)
1712    with
1713    out_of_line = True
1714
1715 ------------------------------------------------------------------------
1716 section "Etc" 
1717         {Miscellaneous built-ins}
1718 ------------------------------------------------------------------------
1719
1720 pseudoop   "seq"
1721    a -> b -> b
1722    { Evaluates its first argument to head normal form, and then returns its second
1723         argument as the result. }
1724
1725 pseudoop   "inline"
1726    a -> a
1727    { The call {\tt (inline f)} arranges that f is inlined, regardless of its size.
1728         More precisely, the call {\tt (inline f)} rewrites to the right-hand side of
1729         {\tt f}'s definition. This allows the programmer to control inlining from a
1730         particular call site rather than the definition site of the function (c.f.
1731         {\tt INLINE} pragmas in User's Guide, Section 7.10.3, "INLINE and NOINLINE
1732         pragmas").
1733
1734         This inlining occurs regardless of the argument to the call or the size of
1735         {\tt f}'s definition; it is unconditional. The main caveat is that {\tt f}'s
1736         definition must be visible to the compiler. That is, {\tt f} must be
1737         {\tt let}-bound in the current scope. If no inlining takes place, the
1738         {\tt inline} function expands to the identity function in Phase zero; so its
1739         use imposes no overhead.
1740
1741         If the function is defined in another module, GHC only exposes its inlining
1742         in the interface file if the function is sufficiently small that it might be
1743         inlined by the automatic mechanism. There is currently no way to tell GHC to
1744         expose arbitrarily-large functions in the interface file. (This shortcoming
1745         is something that could be fixed, with some kind of pragma.) }
1746
1747 pseudoop   "lazy"
1748    a -> a
1749    { The {\tt lazy} function restrains strictness analysis a little. The call
1750         {\tt (lazy e)} means the same as {\tt e}, but {\tt lazy} has a magical
1751         property so far as strictness analysis is concerned: it is lazy in its first
1752         argument, even though its semantics is strict. After strictness analysis has
1753         run, calls to {\tt lazy} are inlined to be the identity function.
1754
1755         This behaviour is occasionally useful when controlling evaluation order.
1756         Notably, {\tt lazy} is used in the library definition of {\tt Control.Parallel.par}:
1757
1758         {\tt par :: a -> b -> b}
1759
1760         {\tt par x y = case (par\# x) of \_ -> lazy y}
1761
1762         If {\tt lazy} were not lazy, {\tt par} would look strict in {\tt y} which
1763         would defeat the whole purpose of {\tt par}.
1764
1765         Like {\tt seq}, the argument of {\tt lazy} can have an unboxed type. }
1766
1767 primtype Any a
1768         { The type constructor {\tt Any} is type to which you can unsafely coerce any
1769         lifted type, and back. 
1770
1771           * It is lifted, and hence represented by a pointer
1772
1773           * It does not claim to be a {\it data} type, and that's important for
1774             the code generator, because the code gen may {\it enter} a data value
1775             but never enters a function value.  
1776
1777         It's also used to instantiate un-constrained type variables after type
1778         checking.  For example
1779
1780         {\tt length Any []}
1781
1782         Annoyingly, we sometimes need {\tt Any}s of other kinds, such as {\tt (* -> *)} etc.
1783         This is a bit like tuples.   We define a couple of useful ones here,
1784         and make others up on the fly.  If any of these others end up being exported
1785         into interface files, we'll get a crash; at least until we add interface-file
1786         syntax to support them. }
1787
1788 pseudoop   "unsafeCoerce#"
1789    a -> b
1790    { The function {\tt unsafeCoerce\#} allows you to side-step the typechecker entirely. That
1791         is, it allows you to coerce any type into any other type. If you use this function,
1792         you had better get it right, otherwise segmentation faults await. It is generally
1793         used when you want to write a program that you know is well-typed, but where Haskell's
1794         type system is not expressive enough to prove that it is well typed.
1795
1796         The following uses of {\tt unsafeCoerce\#} are supposed to work (i.e. not lead to
1797         spurious compile-time or run-time crashes):
1798
1799          * Casting any lifted type to {\tt Any}
1800
1801          * Casting {\tt Any} back to the real type
1802
1803          * Casting an unboxed type to another unboxed type of the same size
1804
1805          * Casting between two types that have the same runtime representation.  One case is when
1806            the two types differ only in "phantom" type parameters, for example
1807            {\tt Ptr Int} to {\tt Ptr Float}, or {\tt [Int]} to {\tt [Float]} when the list is 
1808            known to be empty.  Also, a {\tt newtype} of a type {\tt T} has the same representation
1809            at runtime as {\tt T}.
1810
1811         Other uses of {\tt unsafeCoerce\#} are undefined.  In particular, you should not use
1812         {\tt unsafeCoerce\#} to cast a T to an algebraic data type D, unless T is also
1813         an algebraic data type.  For example, do not cast {\tt Int->Int} to {\tt Bool}, even if
1814         you later cast that {\tt Bool} back to {\tt Int->Int} before applying it.  The reasons
1815         have to do with GHC's internal representation details (for the congnoscenti, data values
1816         can be entered but function closures cannot).  If you want a safe type to cast things
1817         to, use {\tt Any}, which is not an algebraic data type.
1818         
1819         }
1820
1821 -- NB. It is tempting to think that casting a value to a type that it doesn't have is safe
1822 -- as long as you don't "do anything" with the value in its cast form, such as seq on it.  This
1823 -- isn't the case: the compiler can insert seqs itself, and if these happen at the wrong type,
1824 -- Bad Things Might Happen.  See bug #1616: in this case we cast a function of type (a,b) -> (a,b)
1825 -- to () -> () and back again.  The strictness analyser saw that the function was strict, but
1826 -- the wrapper had type () -> (), and hence the wrapper de-constructed the (), the worker re-constructed
1827 -- a new (), with the result that the code ended up with "case () of (a,b) -> ...".
1828
1829 ------------------------------------------------------------------------
1830 ---                                                                  ---
1831 ------------------------------------------------------------------------
1832
1833 thats_all_folks
1834
1835
1836