1 -----------------------------------------------------------------------
2 -- $Id: primops.txt.pp,v 1.37 2005/11/25 09:46:19 simonmar Exp $
4 -- Primitive Operations and Types
6 -----------------------------------------------------------------------
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.
12 -- It should first be preprocessed.
14 -- To add a new primop, you currently need to update the following files:
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.)
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.
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)
34 -- This file is divided into named sections, each containing or more
35 -- primop entries. Section headers have the format:
37 -- section "section-name" {description}
39 -- This information is used solely when producing documentation; it is
40 -- otherwise ignored. The description is optional.
42 -- The format of each primop entry is as follows:
44 -- primop internal-name "name-in-program-text" type category {description} attributes
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.
54 has_side_effects = False
59 strictness = { \ arity -> mkStrictSig (mkTopDmdType (replicate arity lazyDmd) TopRes) }
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.
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"
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.
85 GHC also implements a primitive unsigned integer type {\tt
86 Word\#} which always has the same number of bits as {\tt
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
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.
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. }
129 -- Define synonyms for indexing ops.
131 #if WORD_SIZE_IN_BITS < 32
133 #define WORD32 Word32#
139 #if WORD_SIZE_IN_BITS < 64
141 #define WORD64 Word64#
147 ------------------------------------------------------------------------
149 {Operations on 31-bit characters.}
150 ------------------------------------------------------------------------
154 primop CharGtOp "gtChar#" Compare Char# -> Char# -> Bool
155 primop CharGeOp "geChar#" Compare Char# -> Char# -> Bool
157 primop CharEqOp "eqChar#" Compare
158 Char# -> Char# -> Bool
159 with commutable = True
161 primop CharNeOp "neChar#" Compare
162 Char# -> Char# -> Bool
163 with commutable = True
165 primop CharLtOp "ltChar#" Compare Char# -> Char# -> Bool
166 primop CharLeOp "leChar#" Compare Char# -> Char# -> Bool
168 primop OrdOp "ord#" GenPrimOp Char# -> Int#
170 ------------------------------------------------------------------------
172 {Operations on native-size integers (30+ bits).}
173 ------------------------------------------------------------------------
177 primop IntAddOp "+#" Dyadic
179 with commutable = True
181 primop IntSubOp "-#" Dyadic Int# -> Int# -> Int#
184 Dyadic Int# -> Int# -> Int#
185 {Low word of signed integer multiply.}
186 with commutable = True
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
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
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.
210 with commutable = True
212 primop IntQuotOp "quotInt#" Dyadic
214 {Rounds towards zero.}
217 primop IntRemOp "remInt#" Dyadic
219 {Satisfies \texttt{(quotInt\# x y) *\# y +\# (remInt\# x y) == x}.}
222 primop IntGcdOp "gcdInt#" Dyadic Int# -> Int# -> Int#
223 with out_of_line = True
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.}
233 primop IntGtOp ">#" Compare Int# -> Int# -> Bool
234 primop IntGeOp ">=#" Compare Int# -> Int# -> Bool
236 primop IntEqOp "==#" Compare
238 with commutable = True
240 primop IntNeOp "/=#" Compare
242 with commutable = True
244 primop IntLtOp "<#" Compare Int# -> Int# -> Bool
245 primop IntLeOp "<=#" Compare Int# -> Int# -> Bool
247 primop ChrOp "chr#" GenPrimOp Int# -> Char#
249 primop Int2WordOp "int2Word#" GenPrimOp Int# -> Word#
250 primop Int2FloatOp "int2Float#" GenPrimOp Int# -> Float#
251 primop Int2DoubleOp "int2Double#" GenPrimOp Int# -> Double#
253 primop Int2IntegerOp "int2Integer#"
254 GenPrimOp Int# -> (# Int#, ByteArr# #)
255 with out_of_line = True
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.}
267 ------------------------------------------------------------------------
269 {Operations on native-sized unsigned words (30+ bits).}
270 ------------------------------------------------------------------------
274 primop WordAddOp "plusWord#" Dyadic Word# -> Word# -> Word#
275 with commutable = True
277 primop WordSubOp "minusWord#" Dyadic Word# -> Word# -> Word#
279 primop WordMulOp "timesWord#" Dyadic Word# -> Word# -> Word#
280 with commutable = True
282 primop WordQuotOp "quotWord#" Dyadic Word# -> Word# -> Word#
285 primop WordRemOp "remWord#" Dyadic Word# -> Word# -> Word#
288 primop AndOp "and#" Dyadic Word# -> Word# -> Word#
289 with commutable = True
291 primop OrOp "or#" Dyadic Word# -> Word# -> Word#
292 with commutable = True
294 primop XorOp "xor#" Dyadic Word# -> Word# -> Word#
295 with commutable = True
297 primop NotOp "not#" Monadic Word# -> Word#
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.}
306 primop Word2IntOp "word2Int#" GenPrimOp Word# -> Int#
308 primop Word2IntegerOp "word2Integer#" GenPrimOp
309 Word# -> (# Int#, ByteArr# #)
310 with out_of_line = True
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
319 ------------------------------------------------------------------------
321 {Explicit narrowing of native-sized ints or words.}
322 ------------------------------------------------------------------------
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#
332 #if WORD_SIZE_IN_BITS < 32
333 ------------------------------------------------------------------------
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 ------------------------------------------------------------------------
342 primop Int32ToIntegerOp "int32ToInteger#" GenPrimOp
343 Int32# -> (# Int#, ByteArr# #)
344 with out_of_line = True
347 ------------------------------------------------------------------------
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 ------------------------------------------------------------------------
356 primop Word32ToIntegerOp "word32ToInteger#" GenPrimOp
357 Word32# -> (# Int#, ByteArr# #)
358 with out_of_line = True
364 #if WORD_SIZE_IN_BITS < 64
365 ------------------------------------------------------------------------
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 ------------------------------------------------------------------------
374 primop Int64ToIntegerOp "int64ToInteger#" GenPrimOp
375 Int64# -> (# Int#, ByteArr# #)
376 with out_of_line = True
378 ------------------------------------------------------------------------
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 ------------------------------------------------------------------------
387 primop Word64ToIntegerOp "word64ToInteger#" GenPrimOp
388 Word64# -> (# Int#, ByteArr# #)
389 with out_of_line = True
393 ------------------------------------------------------------------------
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
402 For .NET these operations are implemented by foreign imports, so the
403 primops are omitted.}
404 ------------------------------------------------------------------------
408 primop IntegerAddOp "plusInteger#" GenPrimOp
409 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
410 with commutable = True
413 primop IntegerSubOp "minusInteger#" GenPrimOp
414 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
415 with out_of_line = True
417 primop IntegerMulOp "timesInteger#" GenPrimOp
418 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
419 with commutable = True
422 primop IntegerGcdOp "gcdInteger#" GenPrimOp
423 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
424 {Greatest common divisor.}
425 with commutable = True
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
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
438 primop IntegerQuotOp "quotInteger#" GenPrimOp
439 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
440 {Rounds towards zero.}
441 with out_of_line = True
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
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
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
461 primop IntegerQuotRemOp "quotRemInteger#" GenPrimOp
462 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr#, Int#, ByteArr# #)
463 {Compute quot and rem simulaneously.}
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}.}
474 primop Integer2IntOp "integer2Int#" GenPrimOp
475 Int# -> ByteArr# -> Int#
476 with needs_wrapper = True
479 primop Integer2WordOp "integer2Word#" GenPrimOp
480 Int# -> ByteArr# -> Word#
481 with needs_wrapper = True
484 #if WORD_SIZE_IN_BITS < 32
485 primop IntegerToInt32Op "integerToInt32#" GenPrimOp
486 Int# -> ByteArr# -> Int32#
488 primop IntegerToWord32Op "integerToWord32#" GenPrimOp
489 Int# -> ByteArr# -> Word32#
492 primop IntegerAndOp "andInteger#" GenPrimOp
493 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
494 with out_of_line = True
496 primop IntegerOrOp "orInteger#" GenPrimOp
497 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
498 with out_of_line = True
500 primop IntegerXorOp "xorInteger#" GenPrimOp
501 Int# -> ByteArr# -> Int# -> ByteArr# -> (# Int#, ByteArr# #)
502 with out_of_line = True
504 primop IntegerComplementOp "complementInteger#" GenPrimOp
505 Int# -> ByteArr# -> (# Int#, ByteArr# #)
506 with out_of_line = True
508 #endif /* ndef ILX */
510 ------------------------------------------------------------------------
512 {Operations on double-precision (64 bit) floating-point numbers.}
513 ------------------------------------------------------------------------
517 primop DoubleGtOp ">##" Compare Double# -> Double# -> Bool
518 primop DoubleGeOp ">=##" Compare Double# -> Double# -> Bool
520 primop DoubleEqOp "==##" Compare
521 Double# -> Double# -> Bool
522 with commutable = True
524 primop DoubleNeOp "/=##" Compare
525 Double# -> Double# -> Bool
526 with commutable = True
528 primop DoubleLtOp "<##" Compare Double# -> Double# -> Bool
529 primop DoubleLeOp "<=##" Compare Double# -> Double# -> Bool
531 primop DoubleAddOp "+##" Dyadic
532 Double# -> Double# -> Double#
533 with commutable = True
535 primop DoubleSubOp "-##" Dyadic Double# -> Double# -> Double#
537 primop DoubleMulOp "*##" Dyadic
538 Double# -> Double# -> Double#
539 with commutable = True
541 primop DoubleDivOp "/##" Dyadic
542 Double# -> Double# -> Double#
545 primop DoubleNegOp "negateDouble#" Monadic Double# -> Double#
547 primop Double2IntOp "double2Int#" GenPrimOp Double# -> Int#
548 primop Double2FloatOp "double2Float#" GenPrimOp Double# -> Float#
550 primop DoubleExpOp "expDouble#" Monadic
552 with needs_wrapper = True
554 primop DoubleLogOp "logDouble#" Monadic
560 primop DoubleSqrtOp "sqrtDouble#" Monadic
562 with needs_wrapper = True
564 primop DoubleSinOp "sinDouble#" Monadic
566 with needs_wrapper = True
568 primop DoubleCosOp "cosDouble#" Monadic
570 with needs_wrapper = True
572 primop DoubleTanOp "tanDouble#" Monadic
574 with needs_wrapper = True
576 primop DoubleAsinOp "asinDouble#" Monadic
582 primop DoubleAcosOp "acosDouble#" Monadic
588 primop DoubleAtanOp "atanDouble#" Monadic
593 primop DoubleSinhOp "sinhDouble#" Monadic
595 with needs_wrapper = True
597 primop DoubleCoshOp "coshDouble#" Monadic
599 with needs_wrapper = True
601 primop DoubleTanhOp "tanhDouble#" Monadic
603 with needs_wrapper = True
605 primop DoublePowerOp "**##" Dyadic
606 Double# -> Double# -> Double#
608 with needs_wrapper = True
610 primop DoubleDecodeOp "decodeDouble#" GenPrimOp
611 Double# -> (# Int#, Int#, ByteArr# #)
612 {Convert to arbitrary-precision integer.
613 First {\tt Int\#} in result is the exponent; second {\tt Int\#} and {\tt ByteArr\#}
614 represent an {\tt Integer\#} holding the mantissa.}
615 with out_of_line = True
617 ------------------------------------------------------------------------
619 {Operations on single-precision (32-bit) floating-point numbers.}
620 ------------------------------------------------------------------------
624 primop FloatGtOp "gtFloat#" Compare Float# -> Float# -> Bool
625 primop FloatGeOp "geFloat#" Compare Float# -> Float# -> Bool
627 primop FloatEqOp "eqFloat#" Compare
628 Float# -> Float# -> Bool
629 with commutable = True
631 primop FloatNeOp "neFloat#" Compare
632 Float# -> Float# -> Bool
633 with commutable = True
635 primop FloatLtOp "ltFloat#" Compare Float# -> Float# -> Bool
636 primop FloatLeOp "leFloat#" Compare Float# -> Float# -> Bool
638 primop FloatAddOp "plusFloat#" Dyadic
639 Float# -> Float# -> Float#
640 with commutable = True
642 primop FloatSubOp "minusFloat#" Dyadic Float# -> Float# -> Float#
644 primop FloatMulOp "timesFloat#" Dyadic
645 Float# -> Float# -> Float#
646 with commutable = True
648 primop FloatDivOp "divideFloat#" Dyadic
649 Float# -> Float# -> Float#
652 primop FloatNegOp "negateFloat#" Monadic Float# -> Float#
654 primop Float2IntOp "float2Int#" GenPrimOp Float# -> Int#
656 primop FloatExpOp "expFloat#" Monadic
658 with needs_wrapper = True
660 primop FloatLogOp "logFloat#" Monadic
662 with needs_wrapper = True
665 primop FloatSqrtOp "sqrtFloat#" Monadic
667 with needs_wrapper = True
669 primop FloatSinOp "sinFloat#" Monadic
671 with needs_wrapper = True
673 primop FloatCosOp "cosFloat#" Monadic
675 with needs_wrapper = True
677 primop FloatTanOp "tanFloat#" Monadic
679 with needs_wrapper = True
681 primop FloatAsinOp "asinFloat#" Monadic
683 with needs_wrapper = True
686 primop FloatAcosOp "acosFloat#" Monadic
688 with needs_wrapper = True
691 primop FloatAtanOp "atanFloat#" Monadic
693 with needs_wrapper = True
695 primop FloatSinhOp "sinhFloat#" Monadic
697 with needs_wrapper = True
699 primop FloatCoshOp "coshFloat#" Monadic
701 with needs_wrapper = True
703 primop FloatTanhOp "tanhFloat#" Monadic
705 with needs_wrapper = True
707 primop FloatPowerOp "powerFloat#" Dyadic
708 Float# -> Float# -> Float#
709 with needs_wrapper = True
711 primop Float2DoubleOp "float2Double#" GenPrimOp Float# -> Double#
713 primop FloatDecodeOp "decodeFloat#" GenPrimOp
714 Float# -> (# Int#, Int#, ByteArr# #)
715 {Convert to arbitrary-precision integer.
716 First {\tt Int\#} in result is the exponent; second {\tt Int\#} and {\tt ByteArr\#}
717 represent an {\tt Integer\#} holding the mantissa.}
718 with out_of_line = True
720 ------------------------------------------------------------------------
722 {Operations on {\tt Array\#}.}
723 ------------------------------------------------------------------------
729 primop NewArrayOp "newArray#" GenPrimOp
730 Int# -> a -> State# s -> (# State# s, MutArr# s a #)
731 {Create a new mutable array of specified size (in bytes),
732 in the specified state thread,
733 with each element containing the specified initial value.}
737 primop SameMutableArrayOp "sameMutableArray#" GenPrimOp
738 MutArr# s a -> MutArr# s a -> Bool
740 primop ReadArrayOp "readArray#" GenPrimOp
741 MutArr# s a -> Int# -> State# s -> (# State# s, a #)
742 {Read from specified index of mutable array. Result is not yet evaluated.}
744 primop WriteArrayOp "writeArray#" GenPrimOp
745 MutArr# s a -> Int# -> a -> State# s -> State# s
746 {Write to specified index of mutable array.}
748 has_side_effects = True
750 primop IndexArrayOp "indexArray#" GenPrimOp
751 Array# a -> Int# -> (# a #)
752 {Read from specified index of immutable array. Result is packaged into
753 an unboxed singleton; the result itself is not yet evaluated.}
755 primop UnsafeFreezeArrayOp "unsafeFreezeArray#" GenPrimOp
756 MutArr# s a -> State# s -> (# State# s, Array# a #)
757 {Make a mutable array immutable, without copying.}
759 has_side_effects = True
761 primop UnsafeThawArrayOp "unsafeThawArray#" GenPrimOp
762 Array# a -> State# s -> (# State# s, MutArr# s a #)
763 {Make an immutable array mutable, without copying.}
767 ------------------------------------------------------------------------
768 section "Byte Arrays"
769 {Operations on {\tt ByteArray\#}. A {\tt ByteArray\#} is a just a region of
770 raw memory in the garbage-collected heap, which is not scanned
771 for pointers. It carries its own size (in bytes). There are
772 three sets of operations for accessing byte array contents:
773 index for reading from immutable byte arrays, and read/write
774 for mutable byte arrays. Each set contains operations for
775 a range of useful primitive data types. Each operation takes
776 an offset measured in terms of the size fo the primitive type
777 being read or written.}
779 ------------------------------------------------------------------------
783 primtype MutByteArr# s
785 primop NewByteArrayOp_Char "newByteArray#" GenPrimOp
786 Int# -> State# s -> (# State# s, MutByteArr# s #)
787 {Create a new mutable byte array of specified size (in bytes), in
788 the specified state thread.}
789 with out_of_line = True
791 primop NewPinnedByteArrayOp_Char "newPinnedByteArray#" GenPrimOp
792 Int# -> State# s -> (# State# s, MutByteArr# s #)
793 {Create a mutable byte array that the GC guarantees not to move.}
794 with out_of_line = True
796 primop ByteArrayContents_Char "byteArrayContents#" GenPrimOp
798 {Intended for use with pinned arrays; otherwise very unsafe!}
800 primop SameMutableByteArrayOp "sameMutableByteArray#" GenPrimOp
801 MutByteArr# s -> MutByteArr# s -> Bool
803 primop UnsafeFreezeByteArrayOp "unsafeFreezeByteArray#" GenPrimOp
804 MutByteArr# s -> State# s -> (# State# s, ByteArr# #)
805 {Make a mutable byte array immutable, without copying.}
807 has_side_effects = True
809 primop SizeofByteArrayOp "sizeofByteArray#" GenPrimOp
812 primop SizeofMutableByteArrayOp "sizeofMutableByteArray#" GenPrimOp
813 MutByteArr# s -> Int#
816 primop IndexByteArrayOp_Char "indexCharArray#" GenPrimOp
817 ByteArr# -> Int# -> Char#
818 {Read 8-bit character; offset in bytes.}
820 primop IndexByteArrayOp_WideChar "indexWideCharArray#" GenPrimOp
821 ByteArr# -> Int# -> Char#
822 {Read 31-bit character; offset in 4-byte words.}
824 primop IndexByteArrayOp_Int "indexIntArray#" GenPrimOp
825 ByteArr# -> Int# -> Int#
827 primop IndexByteArrayOp_Word "indexWordArray#" GenPrimOp
828 ByteArr# -> Int# -> Word#
830 primop IndexByteArrayOp_Addr "indexAddrArray#" GenPrimOp
831 ByteArr# -> Int# -> Addr#
833 primop IndexByteArrayOp_Float "indexFloatArray#" GenPrimOp
834 ByteArr# -> Int# -> Float#
836 primop IndexByteArrayOp_Double "indexDoubleArray#" GenPrimOp
837 ByteArr# -> Int# -> Double#
839 primop IndexByteArrayOp_StablePtr "indexStablePtrArray#" GenPrimOp
840 ByteArr# -> Int# -> StablePtr# a
842 primop IndexByteArrayOp_Int8 "indexInt8Array#" GenPrimOp
843 ByteArr# -> Int# -> Int#
845 primop IndexByteArrayOp_Int16 "indexInt16Array#" GenPrimOp
846 ByteArr# -> Int# -> Int#
848 primop IndexByteArrayOp_Int32 "indexInt32Array#" GenPrimOp
849 ByteArr# -> Int# -> INT32
851 primop IndexByteArrayOp_Int64 "indexInt64Array#" GenPrimOp
852 ByteArr# -> Int# -> INT64
854 primop IndexByteArrayOp_Word8 "indexWord8Array#" GenPrimOp
855 ByteArr# -> Int# -> Word#
857 primop IndexByteArrayOp_Word16 "indexWord16Array#" GenPrimOp
858 ByteArr# -> Int# -> Word#
860 primop IndexByteArrayOp_Word32 "indexWord32Array#" GenPrimOp
861 ByteArr# -> Int# -> WORD32
863 primop IndexByteArrayOp_Word64 "indexWord64Array#" GenPrimOp
864 ByteArr# -> Int# -> WORD64
866 primop ReadByteArrayOp_Char "readCharArray#" GenPrimOp
867 MutByteArr# s -> Int# -> State# s -> (# State# s, Char# #)
868 {Read 8-bit character; offset in bytes.}
870 primop ReadByteArrayOp_WideChar "readWideCharArray#" GenPrimOp
871 MutByteArr# s -> Int# -> State# s -> (# State# s, Char# #)
872 {Read 31-bit character; offset in 4-byte words.}
874 primop ReadByteArrayOp_Int "readIntArray#" GenPrimOp
875 MutByteArr# s -> Int# -> State# s -> (# State# s, Int# #)
877 primop ReadByteArrayOp_Word "readWordArray#" GenPrimOp
878 MutByteArr# s -> Int# -> State# s -> (# State# s, Word# #)
880 primop ReadByteArrayOp_Addr "readAddrArray#" GenPrimOp
881 MutByteArr# s -> Int# -> State# s -> (# State# s, Addr# #)
883 primop ReadByteArrayOp_Float "readFloatArray#" GenPrimOp
884 MutByteArr# s -> Int# -> State# s -> (# State# s, Float# #)
886 primop ReadByteArrayOp_Double "readDoubleArray#" GenPrimOp
887 MutByteArr# s -> Int# -> State# s -> (# State# s, Double# #)
889 primop ReadByteArrayOp_StablePtr "readStablePtrArray#" GenPrimOp
890 MutByteArr# s -> Int# -> State# s -> (# State# s, StablePtr# a #)
892 primop ReadByteArrayOp_Int8 "readInt8Array#" GenPrimOp
893 MutByteArr# s -> Int# -> State# s -> (# State# s, Int# #)
895 primop ReadByteArrayOp_Int16 "readInt16Array#" GenPrimOp
896 MutByteArr# s -> Int# -> State# s -> (# State# s, Int# #)
898 primop ReadByteArrayOp_Int32 "readInt32Array#" GenPrimOp
899 MutByteArr# s -> Int# -> State# s -> (# State# s, INT32 #)
901 primop ReadByteArrayOp_Int64 "readInt64Array#" GenPrimOp
902 MutByteArr# s -> Int# -> State# s -> (# State# s, INT64 #)
904 primop ReadByteArrayOp_Word8 "readWord8Array#" GenPrimOp
905 MutByteArr# s -> Int# -> State# s -> (# State# s, Word# #)
907 primop ReadByteArrayOp_Word16 "readWord16Array#" GenPrimOp
908 MutByteArr# s -> Int# -> State# s -> (# State# s, Word# #)
910 primop ReadByteArrayOp_Word32 "readWord32Array#" GenPrimOp
911 MutByteArr# s -> Int# -> State# s -> (# State# s, WORD32 #)
913 primop ReadByteArrayOp_Word64 "readWord64Array#" GenPrimOp
914 MutByteArr# s -> Int# -> State# s -> (# State# s, WORD64 #)
916 primop WriteByteArrayOp_Char "writeCharArray#" GenPrimOp
917 MutByteArr# s -> Int# -> Char# -> State# s -> State# s
918 {Write 8-bit character; offset in bytes.}
919 with has_side_effects = True
921 primop WriteByteArrayOp_WideChar "writeWideCharArray#" GenPrimOp
922 MutByteArr# s -> Int# -> Char# -> State# s -> State# s
923 {Write 31-bit character; offset in 4-byte words.}
924 with has_side_effects = True
926 primop WriteByteArrayOp_Int "writeIntArray#" GenPrimOp
927 MutByteArr# s -> Int# -> Int# -> State# s -> State# s
928 with has_side_effects = True
930 primop WriteByteArrayOp_Word "writeWordArray#" GenPrimOp
931 MutByteArr# s -> Int# -> Word# -> State# s -> State# s
932 with has_side_effects = True
934 primop WriteByteArrayOp_Addr "writeAddrArray#" GenPrimOp
935 MutByteArr# s -> Int# -> Addr# -> State# s -> State# s
936 with has_side_effects = True
938 primop WriteByteArrayOp_Float "writeFloatArray#" GenPrimOp
939 MutByteArr# s -> Int# -> Float# -> State# s -> State# s
940 with has_side_effects = True
942 primop WriteByteArrayOp_Double "writeDoubleArray#" GenPrimOp
943 MutByteArr# s -> Int# -> Double# -> State# s -> State# s
944 with has_side_effects = True
946 primop WriteByteArrayOp_StablePtr "writeStablePtrArray#" GenPrimOp
947 MutByteArr# s -> Int# -> StablePtr# a -> State# s -> State# s
948 with has_side_effects = True
950 primop WriteByteArrayOp_Int8 "writeInt8Array#" GenPrimOp
951 MutByteArr# s -> Int# -> Int# -> State# s -> State# s
952 with has_side_effects = True
954 primop WriteByteArrayOp_Int16 "writeInt16Array#" GenPrimOp
955 MutByteArr# s -> Int# -> Int# -> State# s -> State# s
956 with has_side_effects = True
958 primop WriteByteArrayOp_Int32 "writeInt32Array#" GenPrimOp
959 MutByteArr# s -> Int# -> INT32 -> State# s -> State# s
960 with has_side_effects = True
962 primop WriteByteArrayOp_Int64 "writeInt64Array#" GenPrimOp
963 MutByteArr# s -> Int# -> INT64 -> State# s -> State# s
964 with has_side_effects = True
966 primop WriteByteArrayOp_Word8 "writeWord8Array#" GenPrimOp
967 MutByteArr# s -> Int# -> Word# -> State# s -> State# s
968 with has_side_effects = True
970 primop WriteByteArrayOp_Word16 "writeWord16Array#" GenPrimOp
971 MutByteArr# s -> Int# -> Word# -> State# s -> State# s
972 with has_side_effects = True
974 primop WriteByteArrayOp_Word32 "writeWord32Array#" GenPrimOp
975 MutByteArr# s -> Int# -> WORD32 -> State# s -> State# s
976 with has_side_effects = True
978 primop WriteByteArrayOp_Word64 "writeWord64Array#" GenPrimOp
979 MutByteArr# s -> Int# -> WORD64 -> State# s -> State# s
980 with has_side_effects = True
982 ------------------------------------------------------------------------
984 ------------------------------------------------------------------------
987 { An arbitrary machine address assumed to point outside
988 the garbage-collected heap. }
990 pseudoop "nullAddr#" Addr#
991 { The null address. }
993 primop AddrAddOp "plusAddr#" GenPrimOp Addr# -> Int# -> Addr#
994 primop AddrSubOp "minusAddr#" GenPrimOp Addr# -> Addr# -> Int#
995 {Result is meaningless if two {\tt Addr\#}s are so far apart that their
996 difference doesn't fit in an {\tt Int\#}.}
997 primop AddrRemOp "remAddr#" GenPrimOp Addr# -> Int# -> Int#
998 {Return the remainder when the {\tt Addr\#} arg, treated like an {\tt Int\#},
999 is divided by the {\tt Int\#} arg.}
1000 #if (WORD_SIZE_IN_BITS == 32 || WORD_SIZE_IN_BITS == 64)
1001 primop Addr2IntOp "addr2Int#" GenPrimOp Addr# -> Int#
1002 {Coerce directly from address to int. Strongly deprecated.}
1003 primop Int2AddrOp "int2Addr#" GenPrimOp Int# -> Addr#
1004 {Coerce directly from int to address. Strongly deprecated.}
1007 primop AddrGtOp "gtAddr#" Compare Addr# -> Addr# -> Bool
1008 primop AddrGeOp "geAddr#" Compare Addr# -> Addr# -> Bool
1009 primop AddrEqOp "eqAddr#" Compare Addr# -> Addr# -> Bool
1010 primop AddrNeOp "neAddr#" Compare Addr# -> Addr# -> Bool
1011 primop AddrLtOp "ltAddr#" Compare Addr# -> Addr# -> Bool
1012 primop AddrLeOp "leAddr#" Compare Addr# -> Addr# -> Bool
1014 primop IndexOffAddrOp_Char "indexCharOffAddr#" GenPrimOp
1015 Addr# -> Int# -> Char#
1016 {Reads 8-bit character; offset in bytes.}
1018 primop IndexOffAddrOp_WideChar "indexWideCharOffAddr#" GenPrimOp
1019 Addr# -> Int# -> Char#
1020 {Reads 31-bit character; offset in 4-byte words.}
1022 primop IndexOffAddrOp_Int "indexIntOffAddr#" GenPrimOp
1023 Addr# -> Int# -> Int#
1025 primop IndexOffAddrOp_Word "indexWordOffAddr#" GenPrimOp
1026 Addr# -> Int# -> Word#
1028 primop IndexOffAddrOp_Addr "indexAddrOffAddr#" GenPrimOp
1029 Addr# -> Int# -> Addr#
1031 primop IndexOffAddrOp_Float "indexFloatOffAddr#" GenPrimOp
1032 Addr# -> Int# -> Float#
1034 primop IndexOffAddrOp_Double "indexDoubleOffAddr#" GenPrimOp
1035 Addr# -> Int# -> Double#
1037 primop IndexOffAddrOp_StablePtr "indexStablePtrOffAddr#" GenPrimOp
1038 Addr# -> Int# -> StablePtr# a
1040 primop IndexOffAddrOp_Int8 "indexInt8OffAddr#" GenPrimOp
1041 Addr# -> Int# -> Int#
1043 primop IndexOffAddrOp_Int16 "indexInt16OffAddr#" GenPrimOp
1044 Addr# -> Int# -> Int#
1046 primop IndexOffAddrOp_Int32 "indexInt32OffAddr#" GenPrimOp
1047 Addr# -> Int# -> INT32
1049 primop IndexOffAddrOp_Int64 "indexInt64OffAddr#" GenPrimOp
1050 Addr# -> Int# -> INT64
1052 primop IndexOffAddrOp_Word8 "indexWord8OffAddr#" GenPrimOp
1053 Addr# -> Int# -> Word#
1055 primop IndexOffAddrOp_Word16 "indexWord16OffAddr#" GenPrimOp
1056 Addr# -> Int# -> Word#
1058 primop IndexOffAddrOp_Word32 "indexWord32OffAddr#" GenPrimOp
1059 Addr# -> Int# -> WORD32
1061 primop IndexOffAddrOp_Word64 "indexWord64OffAddr#" GenPrimOp
1062 Addr# -> Int# -> WORD64
1064 primop ReadOffAddrOp_Char "readCharOffAddr#" GenPrimOp
1065 Addr# -> Int# -> State# s -> (# State# s, Char# #)
1066 {Reads 8-bit character; offset in bytes.}
1068 primop ReadOffAddrOp_WideChar "readWideCharOffAddr#" GenPrimOp
1069 Addr# -> Int# -> State# s -> (# State# s, Char# #)
1070 {Reads 31-bit character; offset in 4-byte words.}
1072 primop ReadOffAddrOp_Int "readIntOffAddr#" GenPrimOp
1073 Addr# -> Int# -> State# s -> (# State# s, Int# #)
1075 primop ReadOffAddrOp_Word "readWordOffAddr#" GenPrimOp
1076 Addr# -> Int# -> State# s -> (# State# s, Word# #)
1078 primop ReadOffAddrOp_Addr "readAddrOffAddr#" GenPrimOp
1079 Addr# -> Int# -> State# s -> (# State# s, Addr# #)
1081 primop ReadOffAddrOp_Float "readFloatOffAddr#" GenPrimOp
1082 Addr# -> Int# -> State# s -> (# State# s, Float# #)
1084 primop ReadOffAddrOp_Double "readDoubleOffAddr#" GenPrimOp
1085 Addr# -> Int# -> State# s -> (# State# s, Double# #)
1087 primop ReadOffAddrOp_StablePtr "readStablePtrOffAddr#" GenPrimOp
1088 Addr# -> Int# -> State# s -> (# State# s, StablePtr# a #)
1090 primop ReadOffAddrOp_Int8 "readInt8OffAddr#" GenPrimOp
1091 Addr# -> Int# -> State# s -> (# State# s, Int# #)
1093 primop ReadOffAddrOp_Int16 "readInt16OffAddr#" GenPrimOp
1094 Addr# -> Int# -> State# s -> (# State# s, Int# #)
1096 primop ReadOffAddrOp_Int32 "readInt32OffAddr#" GenPrimOp
1097 Addr# -> Int# -> State# s -> (# State# s, INT32 #)
1099 primop ReadOffAddrOp_Int64 "readInt64OffAddr#" GenPrimOp
1100 Addr# -> Int# -> State# s -> (# State# s, INT64 #)
1102 primop ReadOffAddrOp_Word8 "readWord8OffAddr#" GenPrimOp
1103 Addr# -> Int# -> State# s -> (# State# s, Word# #)
1105 primop ReadOffAddrOp_Word16 "readWord16OffAddr#" GenPrimOp
1106 Addr# -> Int# -> State# s -> (# State# s, Word# #)
1108 primop ReadOffAddrOp_Word32 "readWord32OffAddr#" GenPrimOp
1109 Addr# -> Int# -> State# s -> (# State# s, WORD32 #)
1111 primop ReadOffAddrOp_Word64 "readWord64OffAddr#" GenPrimOp
1112 Addr# -> Int# -> State# s -> (# State# s, WORD64 #)
1115 primop WriteOffAddrOp_Char "writeCharOffAddr#" GenPrimOp
1116 Addr# -> Int# -> Char# -> State# s -> State# s
1117 with has_side_effects = True
1119 primop WriteOffAddrOp_WideChar "writeWideCharOffAddr#" GenPrimOp
1120 Addr# -> Int# -> Char# -> State# s -> State# s
1121 with has_side_effects = True
1123 primop WriteOffAddrOp_Int "writeIntOffAddr#" GenPrimOp
1124 Addr# -> Int# -> Int# -> State# s -> State# s
1125 with has_side_effects = True
1127 primop WriteOffAddrOp_Word "writeWordOffAddr#" GenPrimOp
1128 Addr# -> Int# -> Word# -> State# s -> State# s
1129 with has_side_effects = True
1131 primop WriteOffAddrOp_Addr "writeAddrOffAddr#" GenPrimOp
1132 Addr# -> Int# -> Addr# -> State# s -> State# s
1133 with has_side_effects = True
1135 primop WriteOffAddrOp_Float "writeFloatOffAddr#" GenPrimOp
1136 Addr# -> Int# -> Float# -> State# s -> State# s
1137 with has_side_effects = True
1139 primop WriteOffAddrOp_Double "writeDoubleOffAddr#" GenPrimOp
1140 Addr# -> Int# -> Double# -> State# s -> State# s
1141 with has_side_effects = True
1143 primop WriteOffAddrOp_StablePtr "writeStablePtrOffAddr#" GenPrimOp
1144 Addr# -> Int# -> StablePtr# a -> State# s -> State# s
1145 with has_side_effects = True
1147 primop WriteOffAddrOp_Int8 "writeInt8OffAddr#" GenPrimOp
1148 Addr# -> Int# -> Int# -> State# s -> State# s
1149 with has_side_effects = True
1151 primop WriteOffAddrOp_Int16 "writeInt16OffAddr#" GenPrimOp
1152 Addr# -> Int# -> Int# -> State# s -> State# s
1153 with has_side_effects = True
1155 primop WriteOffAddrOp_Int32 "writeInt32OffAddr#" GenPrimOp
1156 Addr# -> Int# -> INT32 -> State# s -> State# s
1157 with has_side_effects = True
1159 primop WriteOffAddrOp_Int64 "writeInt64OffAddr#" GenPrimOp
1160 Addr# -> Int# -> INT64 -> State# s -> State# s
1161 with has_side_effects = True
1163 primop WriteOffAddrOp_Word8 "writeWord8OffAddr#" GenPrimOp
1164 Addr# -> Int# -> Word# -> State# s -> State# s
1165 with has_side_effects = True
1167 primop WriteOffAddrOp_Word16 "writeWord16OffAddr#" GenPrimOp
1168 Addr# -> Int# -> Word# -> State# s -> State# s
1169 with has_side_effects = True
1171 primop WriteOffAddrOp_Word32 "writeWord32OffAddr#" GenPrimOp
1172 Addr# -> Int# -> WORD32 -> State# s -> State# s
1173 with has_side_effects = True
1175 primop WriteOffAddrOp_Word64 "writeWord64OffAddr#" GenPrimOp
1176 Addr# -> Int# -> WORD64 -> State# s -> State# s
1177 with has_side_effects = True
1179 ------------------------------------------------------------------------
1180 section "Mutable variables"
1181 {Operations on MutVar\#s.}
1182 ------------------------------------------------------------------------
1184 primtype MutVar# s a
1185 {A {\tt MutVar\#} behaves like a single-element mutable array.}
1187 primop NewMutVarOp "newMutVar#" GenPrimOp
1188 a -> State# s -> (# State# s, MutVar# s a #)
1189 {Create {\tt MutVar\#} with specified initial value in specified state thread.}
1193 primop ReadMutVarOp "readMutVar#" GenPrimOp
1194 MutVar# s a -> State# s -> (# State# s, a #)
1195 {Read contents of {\tt MutVar\#}. Result is not yet evaluated.}
1197 primop WriteMutVarOp "writeMutVar#" GenPrimOp
1198 MutVar# s a -> a -> State# s -> State# s
1199 {Write contents of {\tt MutVar\#}.}
1201 has_side_effects = True
1203 primop SameMutVarOp "sameMutVar#" GenPrimOp
1204 MutVar# s a -> MutVar# s a -> Bool
1206 -- not really the right type, but we don't know about pairs here. The
1209 -- MutVar# s a -> (a -> (a,b)) -> State# s -> (# State# s, b #)
1211 primop AtomicModifyMutVarOp "atomicModifyMutVar#" GenPrimOp
1212 MutVar# s a -> (a -> b) -> State# s -> (# State# s, c #)
1214 has_side_effects = True
1217 ------------------------------------------------------------------------
1218 section "Exceptions"
1219 ------------------------------------------------------------------------
1221 primop CatchOp "catch#" GenPrimOp
1222 (State# RealWorld -> (# State# RealWorld, a #) )
1223 -> (b -> State# RealWorld -> (# State# RealWorld, a #) )
1225 -> (# State# RealWorld, a #)
1227 -- Catch is actually strict in its first argument
1228 -- but we don't want to tell the strictness
1229 -- analyser about that!
1230 -- might use caught action multiply
1233 primop RaiseOp "raise#" GenPrimOp
1236 strictness = { \ arity -> mkStrictSig (mkTopDmdType [lazyDmd] BotRes) }
1237 -- NB: result is bottom
1240 -- raiseIO# needs to be a primop, because exceptions in the IO monad
1241 -- must be *precise* - we don't want the strictness analyser turning
1242 -- one kind of bottom into another, as it is allowed to do in pure code.
1244 primop RaiseIOOp "raiseIO#" GenPrimOp
1245 a -> State# RealWorld -> (# State# RealWorld, b #)
1249 primop BlockAsyncExceptionsOp "blockAsyncExceptions#" GenPrimOp
1250 (State# RealWorld -> (# State# RealWorld, a #))
1251 -> (State# RealWorld -> (# State# RealWorld, a #))
1255 primop UnblockAsyncExceptionsOp "unblockAsyncExceptions#" GenPrimOp
1256 (State# RealWorld -> (# State# RealWorld, a #))
1257 -> (State# RealWorld -> (# State# RealWorld, a #))
1261 ------------------------------------------------------------------------
1262 section "STM-accessible Mutable Variables"
1263 ------------------------------------------------------------------------
1267 primop AtomicallyOp "atomically#" GenPrimOp
1268 (State# RealWorld -> (# State# RealWorld, a #) )
1269 -> State# RealWorld -> (# State# RealWorld, a #)
1272 has_side_effects = True
1274 primop RetryOp "retry#" GenPrimOp
1275 State# RealWorld -> (# State# RealWorld, a #)
1278 has_side_effects = True
1280 primop CatchRetryOp "catchRetry#" GenPrimOp
1281 (State# RealWorld -> (# State# RealWorld, a #) )
1282 -> (State# RealWorld -> (# State# RealWorld, a #) )
1283 -> (State# RealWorld -> (# State# RealWorld, a #) )
1286 has_side_effects = True
1288 primop CatchSTMOp "catchSTM#" GenPrimOp
1289 (State# RealWorld -> (# State# RealWorld, a #) )
1290 -> (b -> State# RealWorld -> (# State# RealWorld, a #) )
1291 -> (State# RealWorld -> (# State# RealWorld, a #) )
1294 has_side_effects = True
1296 primop Check "check#" GenPrimOp
1297 (State# RealWorld -> (# State# RealWorld, a #) )
1298 -> (State# RealWorld -> (# State# RealWorld, () #) )
1301 has_side_effects = True
1303 primop NewTVarOp "newTVar#" GenPrimOp
1305 -> State# s -> (# State# s, TVar# s a #)
1306 {Create a new {\tt TVar\#} holding a specified initial value.}
1310 primop ReadTVarOp "readTVar#" GenPrimOp
1312 -> State# s -> (# State# s, a #)
1313 {Read contents of {\tt TVar\#}. Result is not yet evaluated.}
1317 primop WriteTVarOp "writeTVar#" GenPrimOp
1320 -> State# s -> State# s
1321 {Write contents of {\tt TVar\#}.}
1324 has_side_effects = True
1326 primop SameTVarOp "sameTVar#" GenPrimOp
1327 TVar# s a -> TVar# s a -> Bool
1330 ------------------------------------------------------------------------
1331 section "Synchronized Mutable Variables"
1332 {Operations on {\tt MVar\#}s. }
1333 ------------------------------------------------------------------------
1336 { A shared mutable variable ({\it not} the same as a {\tt MutVar\#}!).
1337 (Note: in a non-concurrent implementation, {\tt (MVar\# a)} can be
1338 represented by {\tt (MutVar\# (Maybe a))}.) }
1340 primop NewMVarOp "newMVar#" GenPrimOp
1341 State# s -> (# State# s, MVar# s a #)
1342 {Create new {\tt MVar\#}; initially empty.}
1346 primop TakeMVarOp "takeMVar#" GenPrimOp
1347 MVar# s a -> State# s -> (# State# s, a #)
1348 {If {\tt MVar\#} is empty, block until it becomes full.
1349 Then remove and return its contents, and set it empty.}
1351 has_side_effects = True
1354 primop TryTakeMVarOp "tryTakeMVar#" GenPrimOp
1355 MVar# s a -> State# s -> (# State# s, Int#, a #)
1356 {If {\tt MVar\#} is empty, immediately return with integer 0 and value undefined.
1357 Otherwise, return with integer 1 and contents of {\tt MVar\#}, and set {\tt MVar\#} empty.}
1359 has_side_effects = True
1362 primop PutMVarOp "putMVar#" GenPrimOp
1363 MVar# s a -> a -> State# s -> State# s
1364 {If {\tt MVar\#} is full, block until it becomes empty.
1365 Then store value arg as its new contents.}
1367 has_side_effects = True
1370 primop TryPutMVarOp "tryPutMVar#" GenPrimOp
1371 MVar# s a -> a -> State# s -> (# State# s, Int# #)
1372 {If {\tt MVar\#} is full, immediately return with integer 0.
1373 Otherwise, store value arg as {\tt MVar\#}'s new contents, and return with integer 1.}
1375 has_side_effects = True
1378 primop SameMVarOp "sameMVar#" GenPrimOp
1379 MVar# s a -> MVar# s a -> Bool
1381 primop IsEmptyMVarOp "isEmptyMVar#" GenPrimOp
1382 MVar# s a -> State# s -> (# State# s, Int# #)
1383 {Return 1 if {\tt MVar\#} is empty; 0 otherwise.}
1387 ------------------------------------------------------------------------
1388 section "Delay/wait operations"
1389 ------------------------------------------------------------------------
1391 primop DelayOp "delay#" GenPrimOp
1392 Int# -> State# s -> State# s
1393 {Sleep specified number of microseconds.}
1395 needs_wrapper = True
1396 has_side_effects = True
1399 primop WaitReadOp "waitRead#" GenPrimOp
1400 Int# -> State# s -> State# s
1401 {Block until input is available on specified file descriptor.}
1403 needs_wrapper = True
1404 has_side_effects = True
1407 primop WaitWriteOp "waitWrite#" GenPrimOp
1408 Int# -> State# s -> State# s
1409 {Block until output is possible on specified file descriptor.}
1411 needs_wrapper = True
1412 has_side_effects = True
1415 #ifdef mingw32_TARGET_OS
1416 primop AsyncReadOp "asyncRead#" GenPrimOp
1417 Int# -> Int# -> Int# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1418 {Asynchronously read bytes from specified file descriptor.}
1420 needs_wrapper = True
1421 has_side_effects = True
1424 primop AsyncWriteOp "asyncWrite#" GenPrimOp
1425 Int# -> Int# -> Int# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1426 {Asynchronously write bytes from specified file descriptor.}
1428 needs_wrapper = True
1429 has_side_effects = True
1432 primop AsyncDoProcOp "asyncDoProc#" GenPrimOp
1433 Addr# -> Addr# -> State# RealWorld-> (# State# RealWorld, Int#, Int# #)
1434 {Asynchronously perform procedure (first arg), passing it 2nd arg.}
1436 needs_wrapper = True
1437 has_side_effects = True
1442 ------------------------------------------------------------------------
1443 section "Concurrency primitives"
1444 ------------------------------------------------------------------------
1447 { {\tt State\#} is the primitive, unlifted type of states. It has
1448 one type parameter, thus {\tt State\# RealWorld}, or {\tt State\# s},
1449 where s is a type variable. The only purpose of the type parameter
1450 is to keep different state threads separate. It is represented by
1454 { {\tt RealWorld} is deeply magical. It is {\it primitive}, but it is not
1455 {\it unlifted} (hence {\tt ptrArg}). We never manipulate values of type
1456 {\tt RealWorld}; it's only used in the type system, to parameterise {\tt State\#}. }
1459 {(In a non-concurrent implementation, this can be a singleton
1460 type, whose (unique) value is returned by {\tt myThreadId\#}. The
1461 other operations can be omitted.)}
1463 primop ForkOp "fork#" GenPrimOp
1464 a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1466 has_side_effects = True
1469 primop ForkOnOp "forkOn#" GenPrimOp
1470 Int# -> a -> State# RealWorld -> (# State# RealWorld, ThreadId# #)
1472 has_side_effects = True
1475 primop KillThreadOp "killThread#" GenPrimOp
1476 ThreadId# -> a -> State# RealWorld -> State# RealWorld
1478 has_side_effects = True
1481 primop YieldOp "yield#" GenPrimOp
1482 State# RealWorld -> State# RealWorld
1484 has_side_effects = True
1487 primop MyThreadIdOp "myThreadId#" GenPrimOp
1488 State# RealWorld -> (# State# RealWorld, ThreadId# #)
1492 primop LabelThreadOp "labelThread#" GenPrimOp
1493 ThreadId# -> Addr# -> State# RealWorld -> State# RealWorld
1495 has_side_effects = True
1498 primop IsCurrentThreadBoundOp "isCurrentThreadBound#" GenPrimOp
1499 State# RealWorld -> (# State# RealWorld, Int# #)
1503 primop NoDuplicateOp "noDuplicate#" GenPrimOp
1504 State# RealWorld -> State# RealWorld
1508 ------------------------------------------------------------------------
1509 section "Weak pointers"
1510 ------------------------------------------------------------------------
1514 -- note that tyvar "o" denotes openAlphaTyVar
1516 primop MkWeakOp "mkWeak#" GenPrimOp
1517 o -> b -> c -> State# RealWorld -> (# State# RealWorld, Weak# b #)
1519 has_side_effects = True
1522 primop DeRefWeakOp "deRefWeak#" GenPrimOp
1523 Weak# a -> State# RealWorld -> (# State# RealWorld, Int#, a #)
1525 has_side_effects = True
1528 primop FinalizeWeakOp "finalizeWeak#" GenPrimOp
1529 Weak# a -> State# RealWorld -> (# State# RealWorld, Int#,
1530 (State# RealWorld -> (# State# RealWorld, () #)) #)
1532 has_side_effects = True
1535 primop TouchOp "touch#" GenPrimOp
1536 o -> State# RealWorld -> State# RealWorld
1538 has_side_effects = True
1540 ------------------------------------------------------------------------
1541 section "Stable pointers and names"
1542 ------------------------------------------------------------------------
1544 primtype StablePtr# a
1546 primtype StableName# a
1548 primop MakeStablePtrOp "makeStablePtr#" GenPrimOp
1549 a -> State# RealWorld -> (# State# RealWorld, StablePtr# a #)
1551 has_side_effects = True
1554 primop DeRefStablePtrOp "deRefStablePtr#" GenPrimOp
1555 StablePtr# a -> State# RealWorld -> (# State# RealWorld, a #)
1557 needs_wrapper = True
1558 has_side_effects = True
1561 primop EqStablePtrOp "eqStablePtr#" GenPrimOp
1562 StablePtr# a -> StablePtr# a -> Int#
1564 has_side_effects = True
1566 primop MakeStableNameOp "makeStableName#" GenPrimOp
1567 a -> State# RealWorld -> (# State# RealWorld, StableName# a #)
1569 needs_wrapper = True
1570 has_side_effects = True
1573 primop EqStableNameOp "eqStableName#" GenPrimOp
1574 StableName# a -> StableName# a -> Int#
1576 primop StableNameToIntOp "stableNameToInt#" GenPrimOp
1577 StableName# a -> Int#
1579 ------------------------------------------------------------------------
1580 section "Unsafe pointer equality"
1581 -- (#1 Bad Guy: Alistair Reid :)
1582 ------------------------------------------------------------------------
1584 primop ReallyUnsafePtrEqualityOp "reallyUnsafePtrEquality#" GenPrimOp
1587 ------------------------------------------------------------------------
1588 section "Parallelism"
1589 ------------------------------------------------------------------------
1591 primop ParOp "par#" GenPrimOp
1594 -- Note that Par is lazy to avoid that the sparked thing
1595 -- gets evaluted strictly, which it should *not* be
1596 has_side_effects = True
1598 -- HWL: The first 4 Int# in all par... annotations denote:
1599 -- name, granularity info, size of result, degree of parallelism
1600 -- Same structure as _seq_ i.e. returns Int#
1601 -- KSW: v, the second arg in parAt# and parAtForNow#, is used only to determine
1602 -- `the processor containing the expression v'; it is not evaluated
1604 primop ParGlobalOp "parGlobal#" GenPrimOp
1605 a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1607 has_side_effects = True
1609 primop ParLocalOp "parLocal#" GenPrimOp
1610 a -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1612 has_side_effects = True
1614 primop ParAtOp "parAt#" GenPrimOp
1615 b -> a -> Int# -> Int# -> Int# -> Int# -> c -> Int#
1617 has_side_effects = True
1619 primop ParAtAbsOp "parAtAbs#" GenPrimOp
1620 a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1622 has_side_effects = True
1624 primop ParAtRelOp "parAtRel#" GenPrimOp
1625 a -> Int# -> Int# -> Int# -> Int# -> Int# -> b -> Int#
1627 has_side_effects = True
1629 primop ParAtForNowOp "parAtForNow#" GenPrimOp
1630 b -> a -> Int# -> Int# -> Int# -> Int# -> c -> Int#
1632 has_side_effects = True
1634 -- copyable# and noFollow# are yet to be implemented (for GpH)
1636 --primop CopyableOp "copyable#" GenPrimOp
1639 -- has_side_effects = True
1641 --primop NoFollowOp "noFollow#" GenPrimOp
1644 -- has_side_effects = True
1647 ------------------------------------------------------------------------
1648 section "Tag to enum stuff"
1649 {Convert back and forth between values of enumerated types
1650 and small integers.}
1651 ------------------------------------------------------------------------
1653 primop DataToTagOp "dataToTag#" GenPrimOp
1656 strictness = { \ arity -> mkStrictSig (mkTopDmdType [seqDmd] TopRes) }
1657 -- dataToTag# must have an evaluated argument
1659 primop TagToEnumOp "tagToEnum#" GenPrimOp
1662 ------------------------------------------------------------------------
1663 section "Bytecode operations"
1664 {Support for the bytecode interpreter and linker.}
1665 ------------------------------------------------------------------------
1668 {Primitive bytecode type.}
1670 primop AddrToHValueOp "addrToHValue#" GenPrimOp
1672 {Convert an {\tt Addr\#} to a followable type.}
1674 primop MkApUpd0_Op "mkApUpd0#" GenPrimOp
1679 primop NewBCOOp "newBCO#" GenPrimOp
1680 ByteArr# -> ByteArr# -> Array# a -> Int# -> ByteArr# -> State# s -> (# State# s, BCO# #)
1682 has_side_effects = True
1685 primop UnpackClosureOp "unpackClosure#" GenPrimOp
1686 a -> (# Addr#, Array# b, ByteArr# #)
1690 primop GetApStackValOp "getApStackVal#" GenPrimOp
1691 a -> Int# -> (# Int#, b #)
1695 ------------------------------------------------------------------------
1697 {Miscellaneous built-ins}
1698 ------------------------------------------------------------------------
1702 { Evaluates its first argument to head normal form, and then returns its second
1703 argument as the result. }
1707 { The call {\tt (inline f)} arranges that f is inlined, regardless of its size.
1708 More precisely, the call {\tt (inline f)} rewrites to the right-hand side of
1709 {\tt f}'s definition. This allows the programmer to control inlining from a
1710 particular call site rather than the definition site of the function (c.f.
1711 {\tt INLINE} pragmas in User's Guide, Section 7.10.3, "INLINE and NOINLINE
1714 This inlining occurs regardless of the argument to the call or the size of
1715 {\tt f}'s definition; it is unconditional. The main caveat is that {\tt f}'s
1716 definition must be visible to the compiler. That is, {\tt f} must be
1717 {\tt let}-bound in the current scope. If no inlining takes place, the
1718 {\tt inline} function expands to the identity function in Phase zero; so its
1719 use imposes no overhead.
1721 If the function is defined in another module, GHC only exposes its inlining
1722 in the interface file if the function is sufficiently small that it might be
1723 inlined by the automatic mechanism. There is currently no way to tell GHC to
1724 expose arbitrarily-large functions in the interface file. (This shortcoming
1725 is something that could be fixed, with some kind of pragma.) }
1729 { The {\tt lazy} function restrains strictness analysis a little. The call
1730 {\tt (lazy e)} means the same as {\tt e}, but {\tt lazy} has a magical
1731 property so far as strictness analysis is concerned: it is lazy in its first
1732 argument, even though its semantics is strict. After strictness analysis has
1733 run, calls to {\tt lazy} are inlined to be the identity function.
1735 This behaviour is occasionally useful when controlling evaluation order.
1736 Notably, {\tt lazy} is used in the library definition of {\tt Control.Parallel.par}:
1738 {\tt par :: a -> b -> b}
1740 {\tt par x y = case (par\# x) of \_ -> lazy y}
1742 If {\tt lazy} were not lazy, {\tt par} would look strict in {\tt y} which
1743 would defeat the whole purpose of {\tt par}.
1745 Like {\tt seq}, the argument of {\tt lazy} can have an unboxed type. }
1748 { The type constructor {\tt Any} is type to which you can unsafely coerce any
1749 lifted type, and back.
1751 * It is lifted, and hence represented by a pointer
1753 * It does not claim to be a {\it data} type, and that's important for
1754 the code generator, because the code gen may {\it enter} a data value
1755 but never enters a function value.
1757 It's also used to instantiate un-constrained type variables after type
1758 checking. For example
1762 Annoyingly, we sometimes need {\tt Any}s of other kinds, such as {\tt (* -> *)} etc.
1763 This is a bit like tuples. We define a couple of useful ones here,
1764 and make others up on the fly. If any of these others end up being exported
1765 into interface files, we'll get a crash; at least until we add interface-file
1766 syntax to support them. }
1768 pseudoop "unsafeCoerce#"
1770 { The function {\tt unsafeCoerce\#} allows you to side-step the typechecker entirely. That
1771 is, it allows you to coerce any type into any other type. If you use this function,
1772 you had better get it right, otherwise segmentation faults await. It is generally
1773 used when you want to write a program that you know is well-typed, but where Haskell's
1774 type system is not expressive enough to prove that it is well typed.
1776 The argument to {\tt unsafeCoerce\#} can have unboxed types, although extremely bad
1777 things will happen if you coerce a boxed type to an unboxed type. }
1780 ------------------------------------------------------------------------
1782 ------------------------------------------------------------------------