fix non-GHC-specific variant of FastTypes
[ghc-hetmet.git] / compiler / utils / FastTypes.lhs
1 %
2 % (c) The University of Glasgow, 2000-2006
3 %
4 \section{Fast integers and booleans}
5
6 \begin{code}
7 module FastTypes (
8     FastInt, _ILIT, iBox, iUnbox,
9     (+#), (-#), (*#), quotFastInt, negateFastInt,
10     (==#), (<#), (<=#), (>=#), (>#),
11
12     FastBool, fastBool, isFastTrue, fastOr, fastAnd
13   ) where
14
15 #include "HsVersions.h"
16
17 #if defined(__GLASGOW_HASKELL__)
18
19 -- Import the beggars
20 import GHC.Exts
21         ( Int(..), Int#, (+#), (-#), (*#), 
22           quotInt#, negateInt#, (==#), (<#), (<=#), (>=#), (>#)
23         )
24
25 type FastInt = Int#
26 _ILIT (I# x) = x
27 iBox x = I# x
28 iUnbox (I# x) = x
29 quotFastInt   = quotInt#
30 negateFastInt = negateInt#
31
32 type FastBool = Int#
33 fastBool True  = 1#
34 fastBool False = 0#
35 isFastTrue x = x ==# 1#
36
37 fastOr 1# _ = 1#
38 fastOr 0# x = x
39
40 fastAnd 0# x = 0#
41 fastAnd 1# x = x
42
43 #else /* ! __GLASGOW_HASKELL__ */
44
45 type FastInt = Int
46 _ILIT x = x
47 iBox x = x
48 iUnbox x = x
49 (+#) = (+)
50 (-#) = (-)
51 (*#) = (*)
52 quotFastInt   = quot
53 negateFastInt = negate
54 (==#) = (==)
55 (<#)  = (<)
56 (<=#) = (<=)
57 (>=#) = (>=)
58 (>#)  = (>)
59
60 type FastBool = Bool
61 fastBool x = x
62 isFastTrue x = x
63 fastOr = (||)
64 fastAnd = (&&)
65
66 --These are among the type-signatures necessary for !ghc to compile
67 -- but break ghc (can't give a signature for an import...)
68 (+#) :: FastInt -> FastInt -> FastInt
69 (-#) :: FastInt -> FastInt -> FastInt
70 (*#) :: FastInt -> FastInt -> FastInt
71 (==#) :: FastInt -> FastInt -> Bool
72 (<#) :: FastInt -> FastInt -> Bool
73 (<=#) :: FastInt -> FastInt -> Bool
74 (>=#) :: FastInt -> FastInt -> Bool
75 (>#) :: FastInt -> FastInt -> Bool
76
77 #endif /* ! __GLASGOW_HASKELL__ */
78 -- however it's still possible to check that these are
79 -- valid signatures nonetheless (e.g., ==# returns Bool
80 -- not FastBool/Int# !)
81 _signatures =
82  ( (+#) :: FastInt -> FastInt -> FastInt
83  , (-#) :: FastInt -> FastInt -> FastInt
84  , (*#) :: FastInt -> FastInt -> FastInt
85  , (==#) :: FastInt -> FastInt -> Bool
86  , (<#) :: FastInt -> FastInt -> Bool
87  , (<=#) :: FastInt -> FastInt -> Bool
88  , (>=#) :: FastInt -> FastInt -> Bool
89  , (>#) :: FastInt -> FastInt -> Bool
90  )
91
92 -- type-signatures will improve the non-ghc-specific versions
93 -- and keep things accurate (and ABLE to compile!)
94 _ILIT :: Int -> FastInt
95 iBox :: FastInt -> Int
96 iUnbox :: Int -> FastInt
97
98 quotFastInt :: FastInt -> FastInt -> FastInt
99 negateFastInt :: FastInt -> FastInt
100
101 fastBool :: Bool -> FastBool
102 isFastTrue :: FastBool -> Bool
103 fastOr :: FastBool -> FastBool -> FastBool
104 fastAnd :: FastBool -> FastBool -> FastBool
105
106 \end{code}