X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectMonad.hs;h=56aeb141c1ef85a09372af316db51ddac1517e70;hb=f64384c40b3db4fddb8fad5463da39464e52ab13;hp=0a14b6cca002548de210664e6a7c202086c8abd7;hpb=55357088ddc788000b29e6bc8697fe09471bf195;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index 0a14b6c..56aeb14 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -7,8 +7,8 @@ module VectMonad ( cloneName, cloneId, newExportedVar, newLocalVar, newDummyVar, newTyVar, - Builtins(..), - builtin, + Builtins(..), sumTyCon, prodTyCon, + builtin, builtins, GlobalEnv(..), setFamInstEnv, @@ -23,6 +23,8 @@ module VectMonad ( lookupTyCon, defTyCon, lookupDataCon, defDataCon, lookupTyConPA, defTyConPA, defTyConPAs, + lookupTyConPR, + lookupPrimMethod, lookupPrimPArray, lookupTyVarPA, defLocalTyVar, defLocalTyVarWithPA, localTyVars, {-lookupInst,-} lookupFamInst @@ -90,6 +92,9 @@ data GlobalEnv = GlobalEnv { -- , global_pa_funs :: NameEnv Var + -- Mapping from TyCons to their PR dfuns + , global_pr_funs :: NameEnv Var + -- External package inst-env & home-package inst-env for class -- instances -- @@ -129,6 +134,7 @@ initGlobalEnv info instEnvs famInstEnvs , global_tycons = mapNameEnv snd $ vectInfoTyCon info , global_datacons = mapNameEnv snd $ vectInfoDataCon info , global_pa_funs = mapNameEnv snd $ vectInfoPADFun info + , global_pr_funs = emptyVarEnv , global_inst_env = instEnvs , global_fam_inst_env = famInstEnvs , global_bindings = [] @@ -148,6 +154,10 @@ extendPAFunsEnv :: [(Name, Var)] -> GlobalEnv -> GlobalEnv extendPAFunsEnv ps genv = genv { global_pa_funs = extendNameEnvList (global_pa_funs genv) ps } +setPRFunsEnv :: [(Name, Var)] -> GlobalEnv -> GlobalEnv +setPRFunsEnv ps genv + = genv { global_pr_funs = mkNameEnv ps } + emptyLocalEnv = LocalEnv { local_vars = emptyVarEnv , local_tyvars = [] @@ -231,6 +241,9 @@ liftDs p = VM $ \bi genv lenv -> do { x <- p; return (Yes genv lenv x) } builtin :: (Builtins -> a) -> VM a builtin f = VM $ \bi genv lenv -> return (Yes genv lenv (f bi)) +builtins :: (a -> Builtins -> b) -> VM (a -> b) +builtins f = VM $ \bi genv lenv -> return (Yes genv lenv (`f` bi)) + readGEnv :: (GlobalEnv -> a) -> VM a readGEnv f = VM $ \bi genv lenv -> return (Yes genv lenv (f genv)) @@ -342,6 +355,12 @@ defDataCon :: DataCon -> DataCon -> VM () defDataCon dc dc' = updGEnv $ \env -> env { global_datacons = extendNameEnv (global_datacons env) (dataConName dc) dc' } +lookupPrimPArray :: TyCon -> VM (Maybe TyCon) +lookupPrimPArray = liftDs . primPArray + +lookupPrimMethod :: TyCon -> String -> VM (Maybe Var) +lookupPrimMethod tycon = liftDs . primMethod tycon + lookupTyConPA :: TyCon -> VM (Maybe Var) lookupTyConPA tc = readGEnv $ \env -> lookupNameEnv (global_pa_funs env) (tyConName tc) @@ -355,7 +374,10 @@ defTyConPAs ps = updGEnv $ \env -> [(tyConName tc, pa) | (tc, pa) <- ps] } lookupTyVarPA :: Var -> VM (Maybe CoreExpr) -lookupTyVarPA tv = readLEnv $ \env -> lookupVarEnv (local_tyvar_pa env) tv +lookupTyVarPA tv = readLEnv $ \env -> lookupVarEnv (local_tyvar_pa env) tv + +lookupTyConPR :: TyCon -> VM (Maybe Var) +lookupTyConPR tc = readGEnv $ \env -> lookupNameEnv (global_pr_funs env) (tyConName tc) defLocalTyVar :: TyVar -> VM () defLocalTyVar tv = updLEnv $ \env -> @@ -440,8 +462,9 @@ initV hsc_env guts info p go = do builtins <- initBuiltins - builtin_tycons <- initBuiltinTyCons - builtin_pas <- initBuiltinPAs + let builtin_tycons = initBuiltinTyCons builtins + builtin_pas <- initBuiltinPAs builtins + builtin_prs <- initBuiltinPRs builtins eps <- ioToIOEnv $ hscEPS hsc_env let famInstEnvs = (eps_fam_inst_env eps, mg_fam_inst_env guts) @@ -449,6 +472,7 @@ initV hsc_env guts info p let genv = extendTyConsEnv builtin_tycons . extendPAFunsEnv builtin_pas + . setPRFunsEnv builtin_prs $ initGlobalEnv info instEnvs famInstEnvs r <- runVM p builtins genv emptyLocalEnv