X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectBuiltIn.hs;h=35b446f383266e805808bb7bb526927b74d0cb45;hb=facf3d6c3a2eefb66ec0ecefb0e8b390ca59ac8c;hp=e6c65ac87e8910da3a8f57a3de29a1a4955dbe06;hpb=097ce0211ba8fc7aef8cd7fefc33f21f92e559ea;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs index e6c65ac..35b446f 100644 --- a/compiler/vectorise/VectBuiltIn.hs +++ b/compiler/vectorise/VectBuiltIn.hs @@ -1,6 +1,8 @@ module VectBuiltIn ( - Builtins(..), - initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs + Builtins(..), sumTyCon, prodTyCon, + initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs, + + primMethod, primPArray ) where #include "HsVersions.h" @@ -13,19 +15,29 @@ import DataCon ( DataCon ) import TyCon ( TyCon, tyConName, tyConDataCons ) import Var ( Var ) import Id ( mkSysLocal ) -import Name ( Name ) -import OccName ( mkVarOccFS ) +import Name ( Name, getOccString ) +import NameEnv +import OccName import TypeRep ( funTyCon ) -import TysPrim ( intPrimTy ) +import Type ( Type ) +import TysPrim import TysWiredIn ( unitTyCon, tupleTyCon, intTyConName ) import PrelNames import BasicTypes ( Boxity(..) ) import FastString +import Outputable +import Data.Array import Control.Monad ( liftM, zipWithM ) +mAX_NDP_PROD :: Int +mAX_NDP_PROD = 3 + +mAX_NDP_SUM :: Int +mAX_NDP_SUM = 3 + data Builtins = Builtins { parrayTyCon :: TyCon , paTyCon :: TyCon @@ -33,27 +45,39 @@ data Builtins = Builtins { , preprTyCon :: TyCon , prTyCon :: TyCon , prDataCon :: DataCon - , embedTyCon :: TyCon - , embedDataCon :: DataCon - , crossTyCon :: TyCon - , crossDataCon :: DataCon - , plusTyCon :: TyCon - , leftDataCon :: DataCon - , rightDataCon :: DataCon + , parrayIntPrimTyCon :: TyCon + , voidTyCon :: TyCon + , wrapTyCon :: TyCon + , sumTyCons :: Array Int TyCon , closureTyCon :: TyCon + , voidVar :: Var + , mkPRVar :: Var , mkClosureVar :: Var , applyClosureVar :: Var , mkClosurePVar :: Var , applyClosurePVar :: Var + , replicatePAIntPrimVar :: Var + , upToPAIntPrimVar :: Var , lengthPAVar :: Var , replicatePAVar :: Var , emptyPAVar :: Var -- , packPAVar :: Var -- , combinePAVar :: Var - , intEqPAVar :: Var , liftingContext :: Var } +sumTyCon :: Int -> Builtins -> TyCon +sumTyCon n bi + | n >= 2 && n <= mAX_NDP_SUM = sumTyCons bi ! n + | otherwise = pprPanic "sumTyCon" (ppr n) + +prodTyCon :: Int -> Builtins -> TyCon +prodTyCon n bi + | n == 0 = voidTyCon bi + | n == 1 = wrapTyCon bi + | n >= 2 && n <= mAX_NDP_PROD = tupleTyCon Boxed n + | otherwise = pprPanic "prodTyCon" (ppr n) + initBuiltins :: DsM Builtins initBuiltins = do @@ -63,24 +87,29 @@ initBuiltins preprTyCon <- dsLookupTyCon preprTyConName prTyCon <- dsLookupTyCon prTyConName let [prDataCon] = tyConDataCons prTyCon - embedTyCon <- dsLookupTyCon embedTyConName - let [embedDataCon] = tyConDataCons embedTyCon - crossTyCon <- dsLookupTyCon ndpCrossTyConName - let [crossDataCon] = tyConDataCons crossTyCon - plusTyCon <- dsLookupTyCon ndpPlusTyConName - let [leftDataCon, rightDataCon] = tyConDataCons plusTyCon + parrayIntPrimTyCon <- dsLookupTyCon parrayIntPrimTyConName closureTyCon <- dsLookupTyCon closureTyConName + voidTyCon <- lookupExternalTyCon nDP_REPR FSLIT("Void") + wrapTyCon <- lookupExternalTyCon nDP_REPR FSLIT("Wrap") + sum_tcs <- mapM (lookupExternalTyCon nDP_REPR) + [mkFastString ("Sum" ++ show i) | i <- [2..mAX_NDP_SUM]] + + let sumTyCons = listArray (2, mAX_NDP_SUM) sum_tcs + + voidVar <- lookupExternalVar nDP_REPR FSLIT("void") + mkPRVar <- dsLookupGlobalId mkPRName mkClosureVar <- dsLookupGlobalId mkClosureName applyClosureVar <- dsLookupGlobalId applyClosureName mkClosurePVar <- dsLookupGlobalId mkClosurePName applyClosurePVar <- dsLookupGlobalId applyClosurePName + replicatePAIntPrimVar <- dsLookupGlobalId replicatePAIntPrimName + upToPAIntPrimVar <- dsLookupGlobalId upToPAIntPrimName lengthPAVar <- dsLookupGlobalId lengthPAName replicatePAVar <- dsLookupGlobalId replicatePAName emptyPAVar <- dsLookupGlobalId emptyPAName -- packPAVar <- dsLookupGlobalId packPAName -- combinePAVar <- dsLookupGlobalId combinePAName - intEqPAVar <- dsLookupGlobalId intEqPAName liftingContext <- liftM (\u -> mkSysLocal FSLIT("lc") u intPrimTy) newUnique @@ -92,24 +121,24 @@ initBuiltins , preprTyCon = preprTyCon , prTyCon = prTyCon , prDataCon = prDataCon - , embedTyCon = embedTyCon - , embedDataCon = embedDataCon - , crossTyCon = crossTyCon - , crossDataCon = crossDataCon - , plusTyCon = plusTyCon - , leftDataCon = leftDataCon - , rightDataCon = rightDataCon + , parrayIntPrimTyCon = parrayIntPrimTyCon + , voidTyCon = voidTyCon + , wrapTyCon = wrapTyCon + , sumTyCons = sumTyCons , closureTyCon = closureTyCon + , voidVar = voidVar + , mkPRVar = mkPRVar , mkClosureVar = mkClosureVar , applyClosureVar = applyClosureVar , mkClosurePVar = mkClosurePVar , applyClosurePVar = applyClosurePVar + , replicatePAIntPrimVar = replicatePAIntPrimVar + , upToPAIntPrimVar = upToPAIntPrimVar , lengthPAVar = lengthPAVar , replicatePAVar = replicatePAVar , emptyPAVar = emptyPAVar -- , packPAVar = packPAVar -- , combinePAVar = combinePAVar - , intEqPAVar = intEqPAVar , liftingContext = liftingContext } @@ -132,16 +161,18 @@ initBuiltinDicts ps 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_PARRAY FSLIT("dPA_Unit") +builtinPAs :: Builtins -> [(Name, Module, FastString)] +builtinPAs bi + = [ + mk closureTyConName nDP_CLOSURE FSLIT("dPA_Clo") + , mk (tyConName $ voidTyCon bi) nDP_REPR FSLIT("dPA_Void") + , mk unitTyConName nDP_INSTANCES FSLIT("dPA_Unit") - , mk intTyConName nDP_INSTANCES FSLIT("dPA_Int") - ] - ++ tups + , mk intTyConName nDP_INSTANCES FSLIT("dPA_Int") + ] + ++ tups where mk name mod fs = (name, mod, fs) @@ -150,25 +181,58 @@ builtinPAs = [ nDP_INSTANCES (mkFastString $ "dPA_" ++ show n) -initBuiltinPRs = initBuiltinDicts builtinPRs +initBuiltinPRs = initBuiltinDicts . builtinPRs -builtinPRs :: [(Name, Module, FastString)] -builtinPRs = [ - mk (tyConName unitTyCon) nDP_PARRAY FSLIT("dPR_Unit") - , mk ndpCrossTyConName nDP_PARRAY FSLIT("dPR_Cross") - , mk ndpPlusTyConName nDP_PARRAY FSLIT("dPR_Plus") - , mk embedTyConName nDP_PARRAY FSLIT("dPR_Embed") - , mk closureTyConName nDP_CLOSURE FSLIT("dPR_Clo") +builtinPRs :: Builtins -> [(Name, Module, FastString)] +builtinPRs bi = + [ + 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 closureTyConName nDP_CLOSURE FSLIT("dPR_Clo") - -- temporary - , mk intTyConName nDP_INSTANCES FSLIT("dPR_Int") - ] + -- temporary + , mk intTyConName nDP_INSTANCES FSLIT("dPR_Int") + ] + + ++ map mk_sum [2..mAX_NDP_SUM] + ++ map mk_prod [2..mAX_NDP_PROD] where mk name mod fs = (name, mod, fs) + mk_sum n = (tyConName $ sumTyCon n bi, nDP_REPR, + mkFastString ("dPR_Sum" ++ show n)) + + mk_prod n = (tyConName $ prodTyCon n bi, nDP_REPR, + mkFastString ("dPR_" ++ show n)) + lookupExternalVar :: Module -> FastString -> DsM Var lookupExternalVar mod fs = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs) +lookupExternalTyCon :: Module -> FastString -> DsM TyCon +lookupExternalTyCon 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)