Remove some old code.
[ghc-hetmet.git] / compiler / vectorise / Vectorise / Builtins / Base.hs
1
2 -- | Builtin types and functions used by the vectoriser.
3 --   These are all defined in the DPH package.
4 module Vectorise.Builtins.Base (
5         -- * Hard config
6         mAX_DPH_PROD,
7         mAX_DPH_SUM,
8         mAX_DPH_COMBINE,
9         mAX_DPH_SCALAR_ARGS,
10         
11         -- * Builtins
12         Builtins(..),
13         indexBuiltin,
14         
15         -- * Projections
16         selTy,
17         selReplicate,
18         selPick,
19         selTags,
20         selElements,
21         sumTyCon,
22         prodTyCon,
23         prodDataCon,
24         combinePDVar,
25         scalarZip,
26         closureCtrFun
27 ) where
28 import Vectorise.Builtins.Modules
29 import BasicTypes
30 import Class
31 import CoreSyn
32 import TysWiredIn
33 import Type
34 import TyCon
35 import DataCon
36 import Var
37 import Outputable
38 import Data.Array
39
40
41 -- Numbers of things exported by the DPH library.
42 mAX_DPH_PROD :: Int
43 mAX_DPH_PROD = 5
44
45 mAX_DPH_SUM :: Int
46 mAX_DPH_SUM = 2
47
48 mAX_DPH_COMBINE :: Int
49 mAX_DPH_COMBINE = 2
50
51 mAX_DPH_SCALAR_ARGS :: Int
52 mAX_DPH_SCALAR_ARGS = 3
53
54
55 -- | Holds the names of the builtin types and functions used by the vectoriser.
56 data Builtins 
57         = Builtins 
58         { dphModules       :: Modules
59
60         -- From dph-common:Data.Array.Parallel.Lifted.PArray
61         , parrayTyCon      :: TyCon                     -- ^ PArray
62         , parrayDataCon    :: DataCon                   -- ^ PArray
63         , pdataTyCon       :: TyCon                     -- ^ PData
64         , paClass          :: Class                     -- ^ PA
65         , paTyCon          :: TyCon                     -- ^ PA
66         , paDataCon        :: DataCon                   -- ^ PA
67         , paPRSel          :: Var                       -- ^ PA
68         , preprTyCon       :: TyCon                     -- ^ PRepr
69         , prClass          :: Class                     -- ^ PR
70         , prTyCon          :: TyCon                     -- ^ PR
71         , prDataCon        :: DataCon                   -- ^ PR
72         , replicatePDVar   :: Var                       -- ^ replicatePD
73         , emptyPDVar       :: Var                       -- ^ emptyPD
74         , packByTagPDVar   :: Var                       -- ^ packByTagPD
75         , combinePDVars    :: Array Int Var             -- ^ combinePD
76         , scalarClass      :: Class                     -- ^ Scalar
77
78         -- From dph-common:Data.Array.Parallel.Lifted.Closure
79         , closureTyCon     :: TyCon                     -- ^ :->
80         , closureVar       :: Var                       -- ^ closure
81         , applyVar         :: Var                       -- ^ $: 
82         , liftedClosureVar :: Var                       -- ^ liftedClosure
83         , liftedApplyVar   :: Var                       -- ^ liftedApply
84         , closureCtrFuns   :: Array Int Var             -- ^ closure1 .. closure2
85
86         -- From dph-common:Data.Array.Parallel.Lifted.Repr
87         , voidTyCon        :: TyCon                     -- ^ Void
88         , wrapTyCon        :: TyCon                     -- ^ Wrap
89         , sumTyCons        :: Array Int TyCon           -- ^ Sum2 .. Sum3
90         , voidVar          :: Var                       -- ^ void
91         , pvoidVar         :: Var                       -- ^ pvoid
92         , fromVoidVar      :: Var                       -- ^ fromVoid
93         , punitVar         :: Var                       -- ^ punit
94
95         -- From dph-common:Data.Array.Parallel.Lifted.Selector
96         , selTys           :: Array Int Type            -- ^ Sel2
97         , selReplicates    :: Array Int CoreExpr        -- ^ replicate2
98         , selPicks         :: Array Int CoreExpr        -- ^ pick2
99         , selTagss         :: Array Int CoreExpr        -- ^ tagsSel2
100         , selEls           :: Array (Int, Int) CoreExpr -- ^ elementsSel2_0 .. elementsSel_2_1
101
102         -- From dph-common:Data.Array.Parallel.Lifted.Scalar
103         -- NOTE: map is counted as a zipWith fn with one argument array.
104         , scalarZips       :: Array Int Var             -- ^ map, zipWith, zipWith3
105
106         -- A Fresh variable
107         , liftingContext   :: Var                       -- ^ lc
108         }
109
110
111 -- | Get an element from one of the arrays of contained by a `Builtins`.
112 --   If the indexed thing is not in the array then panic.
113 indexBuiltin 
114         :: (Ix i, Outputable i) 
115         => String                       -- ^ Name of the selector we've used, for panic messages.
116         -> (Builtins -> Array i a)      -- ^ Field selector for the `Builtins`.
117         -> i                            -- ^ Index into the array.
118         -> Builtins 
119         -> a
120
121 indexBuiltin fn f i bi
122   | inRange (bounds xs) i = xs ! i
123   | otherwise             
124   = pprSorry "Vectorise.Builtins.indexBuiltin" 
125         (vcat   [ text ""
126                 , text "DPH builtin function '" <> text fn <> text "' of size '" <> ppr i <> text "' is not yet implemented."
127                 , text "This function does not appear in your source program, but it is needed"
128                 , text "to compile your code in the backend. This is a known, current limitation"
129                 , text "of DPH. If you want it to to work you should send mail to cvs-ghc@haskell.org"
130                 , text "and ask what you can do to help (it might involve some GHC hacking)."])
131
132   where xs = f bi
133
134
135 -- Projections ----------------------------------------------------------------
136 -- We use these wrappers instead of indexing the `Builtin` structure directly
137 -- because they give nicer panic messages if the indexed thing cannot be found.
138
139 selTy :: Int -> Builtins -> Type
140 selTy           = indexBuiltin "selTy" selTys
141
142 selReplicate :: Int -> Builtins -> CoreExpr
143 selReplicate    = indexBuiltin "selReplicate" selReplicates 
144
145 selPick :: Int -> Builtins -> CoreExpr
146 selPick         = indexBuiltin "selPick" selPicks
147
148 selTags :: Int -> Builtins -> CoreExpr
149 selTags         = indexBuiltin "selTags" selTagss
150
151 selElements :: Int -> Int -> Builtins -> CoreExpr
152 selElements i j = indexBuiltin "selElements" selEls (i,j)
153
154 sumTyCon :: Int -> Builtins -> TyCon
155 sumTyCon        = indexBuiltin "sumTyCon" sumTyCons
156
157 prodTyCon :: Int -> Builtins -> TyCon
158 prodTyCon n _
159         | n >= 2 && n <= mAX_DPH_PROD 
160         = tupleTyCon Boxed n
161
162         | otherwise
163         = pprPanic "prodTyCon" (ppr n)
164
165 prodDataCon :: Int -> Builtins -> DataCon
166 prodDataCon n bi 
167  = case tyConDataCons (prodTyCon n bi) of
168         [con]   -> con
169         _       -> pprPanic "prodDataCon" (ppr n)
170
171 combinePDVar :: Int -> Builtins -> Var
172 combinePDVar    = indexBuiltin "combinePDVar" combinePDVars
173
174 scalarZip :: Int -> Builtins -> Var
175 scalarZip       = indexBuiltin "scalarZip" scalarZips
176
177 closureCtrFun :: Int -> Builtins -> Var
178 closureCtrFun   = indexBuiltin "closureCtrFun" closureCtrFuns
179
180