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