Refactoring
[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                 , voidTyCon        :: TyCon
50                 , wrapTyCon        :: TyCon
51                 , sumTyCons        :: Array Int TyCon
52                 , closureTyCon     :: TyCon
53                 , voidVar          :: Var
54                 , mkPRVar          :: Var
55                 , mkClosureVar     :: Var
56                 , applyClosureVar  :: Var
57                 , mkClosurePVar    :: Var
58                 , applyClosurePVar :: Var
59                 , replicatePAIntPrimVar :: Var
60                 , upToPAIntPrimVar :: Var
61                 , lengthPAVar      :: Var
62                 , replicatePAVar   :: Var
63                 , emptyPAVar       :: Var
64                 -- , packPAVar        :: Var
65                 -- , combinePAVar     :: Var
66                 , liftingContext   :: Var
67                 }
68
69 sumTyCon :: Int -> Builtins -> TyCon
70 sumTyCon n bi
71   | n >= 2 && n <= mAX_NDP_SUM = sumTyCons bi ! n
72   | otherwise = pprPanic "sumTyCon" (ppr n)
73
74 prodTyCon :: Int -> Builtins -> TyCon
75 prodTyCon n bi
76   | n == 1                      = wrapTyCon bi
77   | n >= 0 && n <= mAX_NDP_PROD = tupleTyCon Boxed n
78   | otherwise = pprPanic "prodTyCon" (ppr n)
79
80 initBuiltins :: DsM Builtins
81 initBuiltins
82   = do
83       parrayTyCon  <- dsLookupTyCon parrayTyConName
84       paTyCon      <- dsLookupTyCon paTyConName
85       let [paDataCon] = tyConDataCons paTyCon
86       preprTyCon   <- dsLookupTyCon preprTyConName
87       prTyCon      <- dsLookupTyCon prTyConName
88       let [prDataCon] = tyConDataCons prTyCon
89       parrayIntPrimTyCon <- dsLookupTyCon parrayIntPrimTyConName
90       closureTyCon <- dsLookupTyCon closureTyConName
91
92       voidTyCon    <- lookupExternalTyCon nDP_REPR FSLIT("Void")
93       wrapTyCon    <- lookupExternalTyCon nDP_REPR FSLIT("Wrap")
94       sum_tcs <- mapM (lookupExternalTyCon nDP_REPR)
95                       [mkFastString ("Sum" ++ show i) | i <- [2..mAX_NDP_SUM]]
96
97       let sumTyCons = listArray (2, mAX_NDP_SUM) sum_tcs
98
99       voidVar          <- lookupExternalVar nDP_REPR FSLIT("void")
100       mkPRVar          <- dsLookupGlobalId mkPRName
101       mkClosureVar     <- dsLookupGlobalId mkClosureName
102       applyClosureVar  <- dsLookupGlobalId applyClosureName
103       mkClosurePVar    <- dsLookupGlobalId mkClosurePName
104       applyClosurePVar <- dsLookupGlobalId applyClosurePName
105       replicatePAIntPrimVar <- dsLookupGlobalId replicatePAIntPrimName
106       upToPAIntPrimVar <- dsLookupGlobalId upToPAIntPrimName
107       lengthPAVar      <- dsLookupGlobalId lengthPAName
108       replicatePAVar   <- dsLookupGlobalId replicatePAName
109       emptyPAVar       <- dsLookupGlobalId emptyPAName
110       -- packPAVar        <- dsLookupGlobalId packPAName
111       -- combinePAVar     <- dsLookupGlobalId combinePAName
112
113       liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy)
114                               newUnique
115
116       return $ Builtins {
117                  parrayTyCon      = parrayTyCon
118                , paTyCon          = paTyCon
119                , paDataCon        = paDataCon
120                , preprTyCon       = preprTyCon
121                , prTyCon          = prTyCon
122                , prDataCon        = prDataCon
123                , parrayIntPrimTyCon = parrayIntPrimTyCon
124                , voidTyCon        = voidTyCon
125                , wrapTyCon        = wrapTyCon
126                , sumTyCons        = sumTyCons
127                , closureTyCon     = closureTyCon
128                , voidVar          = voidVar
129                , mkPRVar          = mkPRVar
130                , mkClosureVar     = mkClosureVar
131                , applyClosureVar  = applyClosureVar
132                , mkClosurePVar    = mkClosurePVar
133                , applyClosurePVar = applyClosurePVar
134                , replicatePAIntPrimVar = replicatePAIntPrimVar
135                , upToPAIntPrimVar = upToPAIntPrimVar
136                , lengthPAVar      = lengthPAVar
137                , replicatePAVar   = replicatePAVar
138                , emptyPAVar       = emptyPAVar
139                -- , packPAVar        = packPAVar
140                -- , combinePAVar     = combinePAVar
141                , liftingContext   = liftingContext
142                }
143
144 initBuiltinTyCons :: DsM [(Name, TyCon)]
145 initBuiltinTyCons
146   = do
147       vects <- sequence vs
148       return (zip origs vects)
149   where
150     (origs, vs) = unzip builtinTyCons
151
152 builtinTyCons :: [(Name, DsM TyCon)]
153 builtinTyCons = [(tyConName funTyCon, dsLookupTyCon closureTyConName)]
154
155 initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)]
156 initBuiltinDicts ps
157   = do
158       dicts <- zipWithM lookupExternalVar mods fss
159       return $ zip tcs dicts
160   where
161     (tcs, mods, fss) = unzip3 ps
162
163 initBuiltinPAs = initBuiltinDicts . builtinPAs
164
165 builtinPAs :: Builtins -> [(Name, Module, FastString)]
166 builtinPAs bi
167   = [
168       mk closureTyConName  nDP_CLOSURE       FSLIT("dPA_Clo")
169     , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPA_Void")
170     , mk unitTyConName     nDP_INSTANCES     FSLIT("dPA_Unit")
171
172     , mk intTyConName      nDP_INSTANCES FSLIT("dPA_Int")
173     ]
174     ++ tups
175   where
176     mk name mod fs = (name, mod, fs)
177
178     tups = map mk_tup [2..3]
179     mk_tup n = mk (tyConName $ tupleTyCon Boxed n)
180                   nDP_INSTANCES
181                   (mkFastString $ "dPA_" ++ show n)
182
183 initBuiltinPRs = initBuiltinDicts . builtinPRs
184
185 builtinPRs :: Builtins -> [(Name, Module, FastString)]
186 builtinPRs bi =
187   [
188     mk (tyConName unitTyCon) nDP_REPR      FSLIT("dPR_Unit")
189   , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPR_Void")
190   , mk (tyConName $ wrapTyCon bi) nDP_REPR FSLIT("dPR_Wrap")
191   , mk closureTyConName      nDP_CLOSURE   FSLIT("dPR_Clo")
192
193     -- temporary
194   , mk intTyConName          nDP_INSTANCES FSLIT("dPR_Int")
195   ]
196
197   ++ map mk_sum  [2..mAX_NDP_SUM]
198   ++ map mk_prod [2..mAX_NDP_PROD]
199   where
200     mk name mod fs = (name, mod, fs)
201
202     mk_sum n = (tyConName $ sumTyCon n bi, nDP_REPR,
203                 mkFastString ("dPR_Sum" ++ show n))
204
205     mk_prod n = (tyConName $ prodTyCon n bi, nDP_REPR,
206                  mkFastString ("dPR_" ++ show n))
207
208 lookupExternalVar :: Module -> FastString -> DsM Var
209 lookupExternalVar mod fs
210   = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs)
211
212 lookupExternalTyCon :: Module -> FastString -> DsM TyCon
213 lookupExternalTyCon mod fs
214   = dsLookupTyCon =<< lookupOrig mod (mkOccNameFS tcName fs)
215
216 unitTyConName = tyConName unitTyCon
217
218
219 primMethod :: TyCon -> String -> DsM (Maybe Var)
220 primMethod tycon method
221   | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
222   = liftM Just
223   $ dsLookupGlobalId =<< lookupOrig nDP_PRIM (mkVarOcc $ method ++ suffix)
224
225   | otherwise = return Nothing
226
227 primPArray :: TyCon -> DsM (Maybe TyCon)
228 primPArray tycon
229   | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon)
230   = liftM Just
231   $ dsLookupTyCon =<< lookupOrig nDP_PRIM (mkOccName tcName $ "PArray" ++ suffix)
232
233   | otherwise = return Nothing
234
235 prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon]
236   where
237     mk_prim tycon = (tyConName tycon, '_' : getOccString tycon)