Delete all /* ! __GLASGOW_HASKELL__ */ code
[ghc.git] / compiler / utils / FastTypes.lhs
1 %
2 % (c) The University of Glasgow, 2000-2006
3 %
4 \section{Fast integers, etc... booleans moved to FastBool for using panic}
5
6 \begin{code}
7 {-# LANGUAGE CPP, MagicHash #-}
8
9 --Even if the optimizer could handle boxed arithmetic equally well,
10 --this helps automatically check the sources to make sure that
11 --it's only used in an appropriate pattern of efficiency.
12 --(it also makes `let`s and `case`s stricter...)
13
14 -- | Fast integers, characters and pointer types for use in many parts of GHC
15 module FastTypes (
16     -- * FastInt
17     FastInt,
18
19     -- ** Getting in and out of FastInt
20     _ILIT, iBox, iUnbox,
21
22     -- ** Arithmetic on FastInt
23     (+#), (-#), (*#), quotFastInt, negateFastInt,
24     --quotRemFastInt is difficult because unboxed values can't
25     --be tupled, but unboxed tuples aren't portable.  Just use
26     -- nuisance boxed quotRem and rely on optimization.
27     (==#), (/=#), (<#), (<=#), (>=#), (>#),
28     minFastInt, maxFastInt,
29     --prefer to distinguish operations, not types, between
30     --signed and unsigned.
31     --left-shift is the same for 'signed' and 'unsigned' numbers
32     shiftLFastInt,
33     --right-shift isn't the same for negative numbers (ones with
34     --the highest-order bit '1').  If you don't care because the
35     --number you're shifting is always nonnegative, use the '_' version
36     --which should just be the fastest one.
37     shiftR_FastInt,
38     --"L' = logical or unsigned shift; 'A' = arithmetic or signed shift
39     shiftRLFastInt, shiftRAFastInt,
40     bitAndFastInt, bitOrFastInt,
41     --add more operations to this file as you need them
42
43     -- * FastChar
44     FastChar,
45
46     -- ** Getting in and out of FastChar
47     _CLIT, cBox, cUnbox,
48
49     -- ** Operations on FastChar
50     fastOrd, fastChr, eqFastChar,
51     --note, fastChr is "unsafe"Chr: it doesn't check for
52     --character values above the range of Unicode
53
54     -- * FastPtr
55     FastPtr,
56
57     -- ** Getting in and out of FastPtr
58     pBox, pUnbox,
59
60     -- ** Casting FastPtrs
61     castFastPtr
62   ) where
63
64 #include "HsVersions.h"
65
66 -- Import the beggars
67 import ExtsCompat46
68
69 type FastInt = Int#
70
71 --in case it's a macro, don't lexically feed an argument!
72 --e.g. #define _ILIT(x) (x#) , #define _ILIT(x) (x :: FastInt)
73 _ILIT = \(I# x) -> x
74 --perhaps for accomodating caseless-leading-underscore treatment,
75 --something like _iLIT or iLIT would be better?
76
77 iBox x = I# x
78 iUnbox (I# x) = x
79 quotFastInt   = quotInt#
80 negateFastInt = negateInt#
81
82 --I think uncheckedIShiftL# and uncheckedIShiftRL# are the same
83 --as uncheckedShiftL# and uncheckedShiftRL# ...
84 --should they be used? How new are they?
85 --They existed as far back as GHC 6.0 at least...
86 shiftLFastInt x y = uncheckedIShiftL# x y
87 shiftR_FastInt x y = uncheckedIShiftRL# x y
88 shiftRLFastInt x y = uncheckedIShiftRL# x y
89 shiftRAFastInt x y = uncheckedIShiftRA# x y
90 --{-# INLINE shiftLNonnegativeFastInt #-}
91 --{-# INLINE shiftRNonnegativeFastInt #-}
92 --shiftLNonnegativeFastInt n p = word2Int#((int2Word# n) `uncheckedShiftL#` p)
93 --shiftRNonnegativeFastInt n p = word2Int#((int2Word# n) `uncheckedShiftRL#` p)
94 bitAndFastInt x y = word2Int# (and# (int2Word# x) (int2Word# y))
95 bitOrFastInt x y = word2Int# (or# (int2Word# x) (int2Word# y))
96
97 type FastChar = Char#
98 _CLIT = \(C# c) -> c
99 cBox c = C# c
100 cUnbox (C# c) = c
101 fastOrd c = ord# c
102 fastChr x = chr# x
103 eqFastChar a b = eqChar# a b
104
105 --note that the type-parameter doesn't provide any safety
106 --when it's a synonym, but as long as we keep it compiling
107 --with and without __GLASGOW_HASKELL__ defined, it's fine.
108 type FastPtr a = Addr#
109 pBox p = Ptr p
110 pUnbox (Ptr p) = p
111 castFastPtr p = p
112
113 minFastInt, maxFastInt :: FastInt -> FastInt -> FastInt
114 minFastInt x y = if x <# y then x else y
115 maxFastInt x y = if x <# y then y else x
116
117 -- type-signatures will improve the non-ghc-specific versions
118 -- and keep things accurate (and ABLE to compile!)
119 _ILIT :: Int -> FastInt
120 iBox :: FastInt -> Int
121 iUnbox :: Int -> FastInt
122
123 quotFastInt :: FastInt -> FastInt -> FastInt
124 negateFastInt :: FastInt -> FastInt
125 shiftLFastInt, shiftR_FastInt, shiftRAFastInt, shiftRLFastInt
126    :: FastInt -> FastInt -> FastInt
127 bitAndFastInt, bitOrFastInt :: FastInt -> FastInt -> FastInt
128
129 _CLIT :: Char -> FastChar
130 cBox :: FastChar -> Char
131 cUnbox :: Char -> FastChar
132 fastOrd :: FastChar -> FastInt
133 fastChr :: FastInt -> FastChar
134 eqFastChar :: FastChar -> FastChar -> Bool
135
136 pBox :: FastPtr a -> Ptr a
137 pUnbox :: Ptr a -> FastPtr a
138 castFastPtr :: FastPtr a -> FastPtr b
139
140 \end{code}