Split out vectoriser environments into own module
[ghc-hetmet.git] / compiler / vectorise / VectCore.hs
index 6be1542..39341ef 100644 (file)
+
+-- | Simple vectorised constructors and projections.
 module VectCore (
   Vect, VVar, VExpr, VBind,
 
   vectorised, lifted,
   mapVect,
 
+  vVarType,
+
   vNonRec, vRec,
 
   vVar, vType, vNote, vLet,
   vLams, vLamsWithoutLC, vVarApps,
-  vCaseDEFAULT, vCaseProd, vInlineMe
+  vCaseDEFAULT
 ) where
 
 #include "HsVersions.h"
 
 import CoreSyn
-import CoreUtils      ( mkInlineMe )
-import MkCore        ( mkWildCase )
-import CoreUtils      ( exprType )
-import DataCon        ( DataCon )
 import Type           ( Type )
 import Var
 
+-- | Contains the vectorised and lifted versions of some thing.
 type Vect a = (a,a)
 type VVar   = Vect Var
 type VExpr  = Vect CoreExpr
 type VBind  = Vect CoreBind
 
+
+-- | Get the vectorised version of a thing.
 vectorised :: Vect a -> a
 vectorised = fst
 
+
+-- | Get the lifted version of a thing.
 lifted :: Vect a -> a
 lifted = snd
 
+
+-- | Apply some function to both the vectorised and lifted versions of a thing.
 mapVect :: (a -> b) -> Vect a -> Vect b
 mapVect f (x,y) = (f x, f y)
 
+
+-- | Combine vectorised and lifted versions of two things componentwise.
 zipWithVect :: (a -> b -> c) -> Vect a -> Vect b -> Vect c
 zipWithVect f (x1,y1) (x2,y2) = (f x1 x2, f y1 y2)
 
+
+-- | Get the type of a vectorised variable.
+vVarType :: VVar -> Type
+vVarType = varType . vectorised
+
+
+-- | Wrap a vectorised variable as a vectorised expression.
 vVar :: VVar -> VExpr
 vVar = mapVect Var
 
+
+-- | Wrap a vectorised type as a vectorised expression.
 vType :: Type -> VExpr
 vType ty = (Type ty, Type ty)
 
+
+-- | Make a vectorised note.
 vNote :: Note -> VExpr -> VExpr
 vNote = mapVect . Note
 
+
+-- | Make a vectorised non-recursive binding.
 vNonRec :: VVar -> VExpr -> VBind
 vNonRec = zipWithVect NonRec
 
+
+-- | Make a vectorised recursive binding.
 vRec :: [VVar] -> [VExpr] -> VBind
 vRec vs es = (Rec (zip vvs ves), Rec (zip lvs les))
   where
     (vvs, lvs) = unzip vs
     (ves, les) = unzip es
 
+
+-- | Make a vectorised let expresion.
 vLet :: VBind -> VExpr -> VExpr
 vLet = zipWithVect Let
 
-vLams :: Var -> [VVar] -> VExpr -> VExpr
-vLams lc vs (ve, le) = (mkLams vvs ve, mkLams (lc:lvs) le)
+
+-- | Make a vectorised lambda abstraction.
+--   The lifted version also binds the lifting context.
+vLams  :: Var          -- ^ Var bound to the lifting context.
+       -> [VVar]       -- ^ Parameter vars for the abstraction.
+       -> VExpr        -- ^ Body of the abstraction.
+       -> VExpr
+
+vLams lc vs (ve, le) 
+  = (mkLams vvs ve, mkLams (lc:lvs) le)
   where
     (vvs,lvs) = unzip vs
 
+
+-- | Like `vLams` but the lifted version doesn't bind the lifting context.
 vLamsWithoutLC :: [VVar] -> VExpr -> VExpr
-vLamsWithoutLC vvs (ve,le) = (mkLams vs ve, mkLams ls le)
+vLamsWithoutLC vvs (ve,le) 
+  = (mkLams vs ve, mkLams ls le)
   where
     (vs,ls) = unzip vvs
 
+
+-- | Apply some argument variables to an expression.
+--   The lifted version is also applied to the variable of the lifting context.
 vVarApps :: Var -> VExpr -> [VVar] -> VExpr
-vVarApps lc (ve, le) vvs = (ve `mkVarApps` vs, le `mkVarApps` (lc : ls))
+vVarApps lc (ve, le) vvs 
+  = (ve `mkVarApps` vs, le `mkVarApps` (lc : ls))
   where
     (vs,ls) = unzip vvs 
 
-vCaseDEFAULT :: VExpr -> VVar -> Type -> Type -> VExpr -> VExpr
+
+vCaseDEFAULT
+       :: VExpr        -- scrutiniy
+       -> VVar         -- bnder
+       -> Type         -- type of vectorised version
+       -> Type         -- type of lifted version
+       -> VExpr        -- body of alternative.
+       -> VExpr
+
 vCaseDEFAULT (vscrut, lscrut) (vbndr, lbndr) vty lty (vbody, lbody)
   = (Case vscrut vbndr vty (mkDEFAULT vbody),
      Case lscrut lbndr lty (mkDEFAULT lbody))
   where
     mkDEFAULT e = [(DEFAULT, [], e)]
 
-vCaseProd :: VExpr -> Type -> Type
-          -> DataCon -> DataCon -> [Var] -> [VVar] -> VExpr -> VExpr
-vCaseProd (vscrut, lscrut) vty lty vdc ldc sh_bndrs bndrs
-          (vbody,lbody)
-  = (mkWildCase vscrut (exprType vscrut) vty
-          [(DataAlt vdc, vbndrs, vbody)],
-     mkWildCase lscrut (exprType lscrut) lty
-          [(DataAlt ldc, sh_bndrs ++ lbndrs, lbody)])
-  where
-    (vbndrs, lbndrs) = unzip bndrs
-
-vInlineMe :: VExpr -> VExpr
-vInlineMe (vexpr, lexpr) = (mkInlineMe vexpr, mkInlineMe lexpr)
-