X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectBuiltIn.hs;h=2fc9bbeac6b40b5fc0bfc06a583ee9d35eb52938;hb=f7b0bddc293f35c0a1d86b1e399b418221c9020c;hp=0afef5b455f8b2d28a76f51aa05624daaae06a0b;hpb=a52f14894e48d47e62b5b33f7d7f4b3f2cc88a79;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs index 0afef5b..2fc9bbe 100644 --- a/compiler/vectorise/VectBuiltIn.hs +++ b/compiler/vectorise/VectBuiltIn.hs @@ -1,6 +1,17 @@ +{-# OPTIONS -w #-} +-- The above warning supression flag is a temporary kludge. +-- While working on this module you are encouraged to remove it and fix +-- any warnings in the module. See +-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings +-- for details + module VectBuiltIn ( - Builtins(..), sumTyCon, prodTyCon, - initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs + Builtins(..), sumTyCon, prodTyCon, combinePAVar, + initBuiltins, initBuiltinVars, initBuiltinTyCons, initBuiltinDataCons, + initBuiltinPAs, initBuiltinPRs, + initBuiltinBoxedTyCons, + + primMethod, primPArray ) where #include "HsVersions.h" @@ -9,17 +20,23 @@ import DsMonad import IfaceEnv ( lookupOrig ) import Module ( Module ) -import DataCon ( DataCon ) +import DataCon ( DataCon, dataConName, dataConWorkId ) import TyCon ( TyCon, tyConName, tyConDataCons ) import Var ( Var ) import Id ( mkSysLocal ) -import Name ( Name ) -import OccName ( mkVarOccFS, mkOccNameFS, tcName ) +import Name ( Name, getOccString ) +import NameEnv +import OccName import TypeRep ( funTyCon ) -import TysPrim ( intPrimTy ) -import TysWiredIn ( unitTyCon, tupleTyCon, intTyConName ) -import PrelNames +import Type ( Type ) +import TysPrim +import TysWiredIn ( unitTyCon, tupleTyCon, + intTyCon, intTyConName, + boolTyCon, boolTyConName, trueDataCon, falseDataCon, + parrTyCon, parrTyConName ) +import PrelNames ( gHC_PARR ) +import Module import BasicTypes ( Boxity(..) ) import FastString @@ -27,6 +44,7 @@ import Outputable import Data.Array import Control.Monad ( liftM, zipWithM ) +import Data.List ( unzip4 ) mAX_NDP_PROD :: Int mAX_NDP_PROD = 3 @@ -34,6 +52,22 @@ mAX_NDP_PROD = 3 mAX_NDP_SUM :: Int mAX_NDP_SUM = 3 +mAX_NDP_COMBINE :: Int +mAX_NDP_COMBINE = 2 + +mkNDPModule :: FastString -> Module +mkNDPModule m = mkModule ndpPackageId (mkModuleNameFS m) + +nDP_PARRAY = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.PArray") +nDP_REPR = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Repr") +nDP_CLOSURE = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Closure") +nDP_PRIM = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Prim") +nDP_INSTANCES = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Instances") +nDP_COMBINATORS = mkNDPModule FSLIT("Data.Array.Parallel.Lifted.Combinators") + +nDP_PRELUDE_PARR = mkNDPModule FSLIT("Data.Array.Parallel.Prelude.Base.PArr") +nDP_PRELUDE_INT = mkNDPModule FSLIT("Data.Array.Parallel.Prelude.Base.Int") + data Builtins = Builtins { parrayTyCon :: TyCon , paTyCon :: TyCon @@ -41,20 +75,28 @@ data Builtins = Builtins { , preprTyCon :: TyCon , prTyCon :: TyCon , prDataCon :: DataCon - , embedTyCon :: TyCon - , embedDataCon :: DataCon + , parrayIntPrimTyCon :: TyCon + , parrayBoolPrimTyCon :: TyCon + , voidTyCon :: TyCon + , wrapTyCon :: TyCon + , enumerationTyCon :: TyCon , sumTyCons :: Array Int TyCon , closureTyCon :: TyCon + , voidVar :: Var + , mkPRVar :: Var , mkClosureVar :: Var , applyClosureVar :: Var , mkClosurePVar :: Var , applyClosurePVar :: Var + , replicatePAIntPrimVar :: Var + , upToPAIntPrimVar :: Var + , selectPAIntPrimVar :: Var + , truesPABoolPrimVar :: Var , lengthPAVar :: Var , replicatePAVar :: Var , emptyPAVar :: Var - -- , packPAVar :: Var - -- , combinePAVar :: Var - , intEqPAVar :: Var + , packPAVar :: Var + , combinePAVars :: Array Int Var , liftingContext :: Var } @@ -65,38 +107,55 @@ sumTyCon n bi prodTyCon :: Int -> Builtins -> TyCon prodTyCon n bi - | n >= 2 && n <= mAX_NDP_PROD = tupleTyCon Boxed n + | n == 1 = wrapTyCon bi + | n >= 0 && n <= mAX_NDP_PROD = tupleTyCon Boxed n | otherwise = pprPanic "prodTyCon" (ppr n) +combinePAVar :: Int -> Builtins -> Var +combinePAVar n bi + | n >= 2 && n <= mAX_NDP_COMBINE = combinePAVars bi ! n + | otherwise = pprPanic "combinePAVar" (ppr n) initBuiltins :: DsM Builtins initBuiltins = do - parrayTyCon <- dsLookupTyCon parrayTyConName - paTyCon <- dsLookupTyCon paTyConName + parrayTyCon <- externalTyCon nDP_PARRAY FSLIT("PArray") + paTyCon <- externalTyCon nDP_PARRAY FSLIT("PA") let [paDataCon] = tyConDataCons paTyCon - preprTyCon <- dsLookupTyCon preprTyConName - prTyCon <- dsLookupTyCon prTyConName + preprTyCon <- externalTyCon nDP_PARRAY FSLIT("PRepr") + prTyCon <- externalTyCon nDP_PARRAY FSLIT("PR") let [prDataCon] = tyConDataCons prTyCon - embedTyCon <- dsLookupTyCon embedTyConName - let [embedDataCon] = tyConDataCons embedTyCon - closureTyCon <- dsLookupTyCon closureTyConName - - sum_tcs <- mapM (lookupExternalTyCon nDP_REPR) + parrayIntPrimTyCon <- externalTyCon nDP_PRIM FSLIT("PArray_Int#") + parrayBoolPrimTyCon <- externalTyCon nDP_PRIM FSLIT("PArray_Bool#") + closureTyCon <- externalTyCon nDP_CLOSURE FSLIT(":->") + + voidTyCon <- externalTyCon nDP_REPR FSLIT("Void") + wrapTyCon <- externalTyCon nDP_REPR FSLIT("Wrap") + enumerationTyCon <- externalTyCon nDP_REPR FSLIT("Enumeration") + sum_tcs <- mapM (externalTyCon nDP_REPR) [mkFastString ("Sum" ++ show i) | i <- [2..mAX_NDP_SUM]] let sumTyCons = listArray (2, mAX_NDP_SUM) sum_tcs - mkClosureVar <- dsLookupGlobalId mkClosureName - applyClosureVar <- dsLookupGlobalId applyClosureName - mkClosurePVar <- dsLookupGlobalId mkClosurePName - applyClosurePVar <- dsLookupGlobalId applyClosurePName - lengthPAVar <- dsLookupGlobalId lengthPAName - replicatePAVar <- dsLookupGlobalId replicatePAName - emptyPAVar <- dsLookupGlobalId emptyPAName - -- packPAVar <- dsLookupGlobalId packPAName - -- combinePAVar <- dsLookupGlobalId combinePAName - intEqPAVar <- dsLookupGlobalId intEqPAName + voidVar <- externalVar nDP_REPR FSLIT("void") + mkPRVar <- externalVar nDP_PARRAY FSLIT("mkPR") + mkClosureVar <- externalVar nDP_CLOSURE FSLIT("mkClosure") + applyClosureVar <- externalVar nDP_CLOSURE FSLIT("$:") + mkClosurePVar <- externalVar nDP_CLOSURE FSLIT("mkClosureP") + applyClosurePVar <- externalVar nDP_CLOSURE FSLIT("$:^") + replicatePAIntPrimVar <- externalVar nDP_PRIM FSLIT("replicatePA_Int#") + upToPAIntPrimVar <- externalVar nDP_PRIM FSLIT("upToPA_Int#") + selectPAIntPrimVar <- externalVar nDP_PRIM FSLIT("selectPA_Int#") + truesPABoolPrimVar <- externalVar nDP_PRIM FSLIT("truesPA_Bool#") + lengthPAVar <- externalVar nDP_PARRAY FSLIT("lengthPA") + replicatePAVar <- externalVar nDP_PARRAY FSLIT("replicatePA") + emptyPAVar <- externalVar nDP_PARRAY FSLIT("emptyPA") + packPAVar <- externalVar nDP_PARRAY FSLIT("packPA") + + combines <- mapM (externalVar nDP_PARRAY) + [mkFastString ("combine" ++ show i ++ "PA") + | i <- [2..mAX_NDP_COMBINE]] + let combinePAVars = listArray (2, mAX_NDP_COMBINE) combines liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy) newUnique @@ -108,52 +167,103 @@ initBuiltins , preprTyCon = preprTyCon , prTyCon = prTyCon , prDataCon = prDataCon - , embedTyCon = embedTyCon - , embedDataCon = embedDataCon + , parrayIntPrimTyCon = parrayIntPrimTyCon + , parrayBoolPrimTyCon = parrayBoolPrimTyCon + , voidTyCon = voidTyCon + , wrapTyCon = wrapTyCon + , enumerationTyCon = enumerationTyCon , sumTyCons = sumTyCons , closureTyCon = closureTyCon + , voidVar = voidVar + , mkPRVar = mkPRVar , mkClosureVar = mkClosureVar , applyClosureVar = applyClosureVar , mkClosurePVar = mkClosurePVar , applyClosurePVar = applyClosurePVar + , replicatePAIntPrimVar = replicatePAIntPrimVar + , upToPAIntPrimVar = upToPAIntPrimVar + , selectPAIntPrimVar = selectPAIntPrimVar + , truesPABoolPrimVar = truesPABoolPrimVar , lengthPAVar = lengthPAVar , replicatePAVar = replicatePAVar , emptyPAVar = emptyPAVar - -- , packPAVar = packPAVar - -- , combinePAVar = combinePAVar - , intEqPAVar = intEqPAVar + , packPAVar = packPAVar + , combinePAVars = combinePAVars , liftingContext = liftingContext } -initBuiltinTyCons :: DsM [(Name, TyCon)] -initBuiltinTyCons +initBuiltinVars :: Builtins -> DsM [(Var, Var)] +initBuiltinVars bi = do - vects <- sequence vs - return (zip origs vects) + uvars <- zipWithM externalVar umods ufs + vvars <- zipWithM externalVar vmods vfs + return $ [(v,v) | v <- map dataConWorkId defaultDataConWorkers] + ++ zip uvars vvars + where + (umods, ufs, vmods, vfs) = unzip4 preludeVars + +defaultDataConWorkers :: [DataCon] +defaultDataConWorkers = [trueDataCon, falseDataCon] + +preludeVars :: [(Module, FastString, Module, FastString)] +preludeVars + = [ + mk gHC_PARR FSLIT("mapP") nDP_COMBINATORS FSLIT("mapPA") + , mk gHC_PARR FSLIT("zipWithP") nDP_COMBINATORS FSLIT("zipWithPA") + , mk nDP_PRELUDE_INT FSLIT("plus") nDP_PRELUDE_INT FSLIT("plusV") + , mk nDP_PRELUDE_INT FSLIT("minus") nDP_PRELUDE_INT FSLIT("minusV") + , mk nDP_PRELUDE_INT FSLIT("sumP") nDP_PRELUDE_INT FSLIT("sumPA") + , mk nDP_PRELUDE_INT FSLIT("upToP") nDP_PRELUDE_INT FSLIT("upToPA") + + -- FIXME: temporary + , mk nDP_PRELUDE_PARR FSLIT("fromPArrayP") nDP_PRELUDE_PARR FSLIT("fromPArrayPA") + ] where - (origs, vs) = unzip builtinTyCons + mk = (,,,) + +initBuiltinTyCons :: Builtins -> DsM [(Name, TyCon)] +initBuiltinTyCons bi + = do + -- parr <- externalTyCon nDP_PRELUDE_PARR FSLIT("PArr") + return $ (tyConName funTyCon, closureTyCon bi) + : (parrTyConName, parrayTyCon bi) + + -- FIXME: temporary + : (tyConName $ parrayTyCon bi, parrayTyCon bi) -builtinTyCons :: [(Name, DsM TyCon)] -builtinTyCons = [(tyConName funTyCon, dsLookupTyCon closureTyConName)] + : [(tyConName tc, tc) | tc <- defaultTyCons] + +defaultTyCons :: [TyCon] +defaultTyCons = [intTyCon, boolTyCon] + +initBuiltinDataCons :: Builtins -> [(Name, DataCon)] +initBuiltinDataCons bi = [(dataConName dc, dc)| dc <- defaultDataCons] + +defaultDataCons :: [DataCon] +defaultDataCons = [trueDataCon, falseDataCon] initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)] initBuiltinDicts ps = do - dicts <- zipWithM lookupExternalVar mods fss + dicts <- zipWithM externalVar mods fss return $ zip tcs dicts where (tcs, mods, fss) = unzip3 ps -initBuiltinPAs = initBuiltinDicts builtinPAs +initBuiltinPAs = initBuiltinDicts . builtinPAs -builtinPAs :: [(Name, Module, FastString)] -builtinPAs = [ - mk closureTyConName nDP_CLOSURE FSLIT("dPA_Clo") - , mk unitTyConName nDP_INSTANCES FSLIT("dPA_Unit") +builtinPAs :: Builtins -> [(Name, Module, FastString)] +builtinPAs bi + = [ + mk (tyConName $ closureTyCon bi) nDP_CLOSURE FSLIT("dPA_Clo") + , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPA_Void") + , mk (tyConName $ parrayTyCon bi) nDP_INSTANCES FSLIT("dPA_PArray") + , mk unitTyConName nDP_INSTANCES FSLIT("dPA_Unit") - , mk intTyConName nDP_INSTANCES FSLIT("dPA_Int") - ] - ++ tups + , mk intTyConName nDP_INSTANCES FSLIT("dPA_Int") + , mk boolTyConName nDP_INSTANCES FSLIT("dPA_Bool") + ] + ++ tups where mk name mod fs = (name, mod, fs) @@ -167,9 +277,11 @@ initBuiltinPRs = initBuiltinDicts . builtinPRs builtinPRs :: Builtins -> [(Name, Module, FastString)] builtinPRs bi = [ - mk (tyConName unitTyCon) nDP_REPR FSLIT("dPR_Unit") - , mk embedTyConName nDP_REPR FSLIT("dPR_Embed") - , mk closureTyConName nDP_CLOSURE FSLIT("dPR_Clo") + mk (tyConName unitTyCon) nDP_REPR FSLIT("dPR_Unit") + , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPR_Void") + , mk (tyConName $ wrapTyCon bi) nDP_REPR FSLIT("dPR_Wrap") + , mk (tyConName $ enumerationTyCon bi) nDP_REPR FSLIT("dPR_Enumeration") + , mk (tyConName $ closureTyCon bi) nDP_CLOSURE FSLIT("dPR_Clo") -- temporary , mk intTyConName nDP_INSTANCES FSLIT("dPR_Int") @@ -186,13 +298,40 @@ builtinPRs bi = mk_prod n = (tyConName $ prodTyCon n bi, nDP_REPR, mkFastString ("dPR_" ++ show n)) -lookupExternalVar :: Module -> FastString -> DsM Var -lookupExternalVar mod fs +initBuiltinBoxedTyCons :: Builtins -> DsM [(Name, TyCon)] +initBuiltinBoxedTyCons = return . builtinBoxedTyCons + +builtinBoxedTyCons :: Builtins -> [(Name, TyCon)] +builtinBoxedTyCons bi = + [(tyConName intPrimTyCon, intTyCon)] + +externalVar :: Module -> FastString -> DsM Var +externalVar mod fs = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs) -lookupExternalTyCon :: Module -> FastString -> DsM TyCon -lookupExternalTyCon mod fs +externalTyCon :: Module -> FastString -> DsM TyCon +externalTyCon mod fs = dsLookupTyCon =<< lookupOrig mod (mkOccNameFS tcName fs) unitTyConName = tyConName unitTyCon + +primMethod :: TyCon -> String -> DsM (Maybe Var) +primMethod tycon method + | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon) + = liftM Just + $ dsLookupGlobalId =<< lookupOrig nDP_PRIM (mkVarOcc $ method ++ suffix) + + | otherwise = return Nothing + +primPArray :: TyCon -> DsM (Maybe TyCon) +primPArray tycon + | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon) + = liftM Just + $ dsLookupTyCon =<< lookupOrig nDP_PRIM (mkOccName tcName $ "PArray" ++ suffix) + + | otherwise = return Nothing + +prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon] + where + mk_prim tycon = (tyConName tycon, '_' : getOccString tycon)