2338d875b9b154fe17a9c2f50773c1231224dbbb
[ghc-hetmet.git] / compiler / vectorise / VectBuiltIn.hs
1 module VectBuiltIn (
2   Builtins(..), sumTyCon, prodTyCon,
3   initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs,
4
5   primMethod, primPArray
6 ) where
7
8 #include "HsVersions.h"
9
10 import DsMonad
11 import IfaceEnv        ( lookupOrig )
12
13 import Module          ( Module )
14 import DataCon         ( DataCon )
15 import TyCon           ( TyCon, tyConName, tyConDataCons )
16 import Var             ( Var )
17 import Id              ( mkSysLocal )
18 import Name            ( Name, getOccString )
19 import NameEnv
20 import OccName
21
22 import TypeRep         ( funTyCon )
23 import Type            ( Type )
24 import TysPrim
25 import TysWiredIn      ( unitTyCon, tupleTyCon, intTyConName )
26 import PrelNames
27 import BasicTypes      ( Boxity(..) )
28
29 import FastString
30 import Outputable
31
32 import Data.Array
33 import Control.Monad   ( liftM, zipWithM )
34
35 mAX_NDP_PROD :: Int
36 mAX_NDP_PROD = 3
37
38 mAX_NDP_SUM :: Int
39 mAX_NDP_SUM = 3
40
41 data Builtins = Builtins {
42                   parrayTyCon      :: TyCon
43                 , paTyCon          :: TyCon
44                 , paDataCon        :: DataCon
45                 , preprTyCon       :: TyCon
46                 , prTyCon          :: TyCon
47                 , prDataCon        :: DataCon
48                 , parrayIntPrimTyCon :: TyCon
49                 , sumTyCons        :: Array Int TyCon
50                 , closureTyCon     :: TyCon
51                 , mkPRVar          :: Var
52                 , mkClosureVar     :: Var
53                 , applyClosureVar  :: Var
54                 , mkClosurePVar    :: Var
55                 , applyClosurePVar :: Var
56                 , lengthPAVar      :: Var
57                 , replicatePAVar   :: Var
58                 , emptyPAVar       :: Var
59                 -- , packPAVar        :: Var
60                 -- , combinePAVar     :: Var
61                 , liftingContext   :: Var
62                 }
63
64 sumTyCon :: Int -> Builtins -> TyCon
65 sumTyCon n bi
66   | n >= 2 && n <= mAX_NDP_SUM = sumTyCons bi ! n
67   | otherwise = pprPanic "sumTyCon" (ppr n)
68
69 prodTyCon :: Int -> Builtins -> TyCon
70 prodTyCon n bi
71   | n >= 2 && n <= mAX_NDP_PROD = tupleTyCon Boxed n
72   | otherwise = pprPanic "prodTyCon" (ppr n)
73
74 initBuiltins :: DsM Builtins
75 initBuiltins
76   = do
77       parrayTyCon  <- dsLookupTyCon parrayTyConName
78       paTyCon      <- dsLookupTyCon paTyConName
79       let [paDataCon] = tyConDataCons paTyCon
80       preprTyCon   <- dsLookupTyCon preprTyConName
81       prTyCon      <- dsLookupTyCon prTyConName
82       let [prDataCon] = tyConDataCons prTyCon
83       parrayIntPrimTyCon <- dsLookupTyCon parrayIntPrimTyConName
84       closureTyCon <- dsLookupTyCon closureTyConName
85
86       sum_tcs <- mapM (lookupExternalTyCon nDP_REPR)
87                       [mkFastString ("Sum" ++ show i) | i <- [2..mAX_NDP_SUM]]
88
89       let sumTyCons = listArray (2, mAX_NDP_SUM) sum_tcs
90
91       mkPRVar          <- dsLookupGlobalId mkPRName
92       mkClosureVar     <- dsLookupGlobalId mkClosureName
93       applyClosureVar  <- dsLookupGlobalId applyClosureName
94       mkClosurePVar    <- dsLookupGlobalId mkClosurePName
95       applyClosurePVar <- dsLookupGlobalId applyClosurePName
96       lengthPAVar      <- dsLookupGlobalId lengthPAName
97       replicatePAVar   <- dsLookupGlobalId replicatePAName
98       emptyPAVar       <- dsLookupGlobalId emptyPAName
99       -- packPAVar        <- dsLookupGlobalId packPAName
100       -- combinePAVar     <- dsLookupGlobalId combinePAName
101
102       liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy)
103                               newUnique
104
105       return $ Builtins {
106                  parrayTyCon      = parrayTyCon
107                , paTyCon          = paTyCon
108                , paDataCon        = paDataCon
109                , preprTyCon       = preprTyCon
110                , prTyCon          = prTyCon
111                , prDataCon        = prDataCon
112                , parrayIntPrimTyCon = parrayIntPrimTyCon
113                , sumTyCons        = sumTyCons
114                , closureTyCon     = closureTyCon
115                , mkPRVar          = mkPRVar
116                , mkClosureVar     = mkClosureVar
117                , applyClosureVar  = applyClosureVar
118                , mkClosurePVar    = mkClosurePVar
119                , applyClosurePVar = applyClosurePVar
120                , lengthPAVar      = lengthPAVar
121                , replicatePAVar   = replicatePAVar
122                , emptyPAVar       = emptyPAVar
123                -- , packPAVar        = packPAVar
124                -- , combinePAVar     = combinePAVar
125                , liftingContext   = liftingContext
126                }
127
128 initBuiltinTyCons :: DsM [(Name, TyCon)]
129 initBuiltinTyCons
130   = do
131       vects <- sequence vs
132       return (zip origs vects)
133   where
134     (origs, vs) = unzip builtinTyCons
135
136 builtinTyCons :: [(Name, DsM TyCon)]
137 builtinTyCons = [(tyConName funTyCon, dsLookupTyCon closureTyConName)]
138
139 initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)]
140 initBuiltinDicts ps
141   = do
142       dicts <- zipWithM lookupExternalVar mods fss
143       return $ zip tcs dicts
144   where
145     (tcs, mods, fss) = unzip3 ps
146
147 initBuiltinPAs = initBuiltinDicts builtinPAs
148
149 builtinPAs :: [(Name, Module, FastString)]
150 builtinPAs = [
151                mk closureTyConName  nDP_CLOSURE   FSLIT("dPA_Clo")
152              , mk unitTyConName     nDP_INSTANCES FSLIT("dPA_Unit")
153
154              , mk intTyConName      nDP_INSTANCES FSLIT("dPA_Int")
155              ]
156              ++ tups
157   where
158     mk name mod fs = (name, mod, fs)
159
160     tups = map mk_tup [2..3]
161     mk_tup n = mk (tyConName $ tupleTyCon Boxed n)
162                   nDP_INSTANCES
163                   (mkFastString $ "dPA_" ++ show n)
164
165 initBuiltinPRs = initBuiltinDicts . builtinPRs
166
167 builtinPRs :: Builtins -> [(Name, Module, FastString)]
168 builtinPRs bi =
169   [
170     mk (tyConName unitTyCon) nDP_REPR      FSLIT("dPR_Unit")
171   , mk closureTyConName      nDP_CLOSURE   FSLIT("dPR_Clo")
172
173     -- temporary
174   , mk intTyConName          nDP_INSTANCES FSLIT("dPR_Int")
175   ]
176
177   ++ map mk_sum  [2..mAX_NDP_SUM]
178   ++ map mk_prod [2..mAX_NDP_PROD]
179   where
180     mk name mod fs = (name, mod, fs)
181
182     mk_sum n = (tyConName $ sumTyCon n bi, nDP_REPR,
183                 mkFastString ("dPR_Sum" ++ show n))
184
185     mk_prod n = (tyConName $ prodTyCon n bi, nDP_REPR,
186                  mkFastString ("dPR_" ++ show n))
187
188 lookupExternalVar :: Module -> FastString -> DsM Var
189 lookupExternalVar mod fs
190   = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs)
191
192 lookupExternalTyCon :: Module -> FastString -> DsM TyCon
193 lookupExternalTyCon mod fs
194   = dsLookupTyCon =<< lookupOrig mod (mkOccNameFS tcName fs)
195
196 unitTyConName = tyConName unitTyCon
197
198
199 primMethod :: TyCon -> String -> DsM (Maybe Var)
200 primMethod tycon method
201   | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
202   = liftM Just
203   $ dsLookupGlobalId =<< lookupOrig nDP_PRIM (mkVarOcc $ method ++ suffix)
204
205   | otherwise = return Nothing
206
207 primPArray :: TyCon -> DsM (Maybe TyCon)
208 primPArray tycon
209   | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
210   = liftM Just
211   $ dsLookupTyCon =<< lookupOrig nDP_PRIM (mkOccName tcName $ "PArray" ++ suffix)
212
213   | otherwise = return Nothing
214
215 prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon]
216   where
217     mk_prim tycon = (tyConName tycon, '_' : getOccString tycon)