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