diff options
author | Roman Leshchinskiy <rl@cse.unsw.edu.au> | 2007-08-30 01:42:57 +0000 |
---|---|---|
committer | Roman Leshchinskiy <rl@cse.unsw.edu.au> | 2007-08-30 01:42:57 +0000 |
commit | 9f695847ad2ace19c5fd0b937c34015af9735863 (patch) | |
tree | 224b965b21f2e5644c0e1f28260e7acc642b4e85 /compiler/vectorise | |
parent | 8e3058a518acedf74306f95f06a7e78cc1145ca6 (diff) | |
download | haskell-9f695847ad2ace19c5fd0b937c34015af9735863.tar.gz |
Add code for looking up PA methods of primitive TyCons
Diffstat (limited to 'compiler/vectorise')
-rw-r--r-- | compiler/vectorise/VectBuiltIn.hs | 23 | ||||
-rw-r--r-- | compiler/vectorise/VectMonad.hs | 4 | ||||
-rw-r--r-- | compiler/vectorise/VectUtils.hs | 30 |
3 files changed, 47 insertions, 10 deletions
diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs index 3eb39030c6..36159cfcbf 100644 --- a/compiler/vectorise/VectBuiltIn.hs +++ b/compiler/vectorise/VectBuiltIn.hs @@ -1,6 +1,8 @@ module VectBuiltIn ( Builtins(..), sumTyCon, prodTyCon, - initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs + initBuiltins, initBuiltinTyCons, initBuiltinPAs, initBuiltinPRs, + + primMethod ) where #include "HsVersions.h" @@ -13,11 +15,12 @@ import DataCon ( DataCon ) 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 TysPrim import TysWiredIn ( unitTyCon, tupleTyCon, intTyConName ) import PrelNames import BasicTypes ( Boxity(..) ) @@ -191,3 +194,15 @@ lookupExternalTyCon mod 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 + +prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon] + where + mk_prim tycon = (tyConName tycon, '_' : getOccString tycon) diff --git a/compiler/vectorise/VectMonad.hs b/compiler/vectorise/VectMonad.hs index 320d192869..07638ac459 100644 --- a/compiler/vectorise/VectMonad.hs +++ b/compiler/vectorise/VectMonad.hs @@ -24,6 +24,7 @@ module VectMonad ( lookupDataCon, defDataCon, lookupTyConPA, defTyConPA, defTyConPAs, lookupTyConPR, + lookupPrimMethod, lookupTyVarPA, defLocalTyVar, defLocalTyVarWithPA, localTyVars, {-lookupInst,-} lookupFamInst @@ -354,6 +355,9 @@ defDataCon :: DataCon -> DataCon -> VM () defDataCon dc dc' = updGEnv $ \env -> env { global_datacons = extendNameEnv (global_datacons env) (dataConName dc) dc' } +lookupPrimMethod :: TyCon -> String -> VM (Maybe Var) +lookupPrimMethod tycon method = liftDs $ primMethod tycon method + lookupTyConPA :: TyCon -> VM (Maybe Var) lookupTyConPA tc = readGEnv $ \env -> lookupNameEnv (global_pa_funs env) (tyConName tc) diff --git a/compiler/vectorise/VectUtils.hs b/compiler/vectorise/VectUtils.hs index 709a3c018d..3c9d921aa5 100644 --- a/compiler/vectorise/VectUtils.hs +++ b/compiler/vectorise/VectUtils.hs @@ -221,27 +221,45 @@ paDFunApply dfun tys dicts <- mapM paDictOfType tys return $ mkApps (mkTyApps dfun tys) dicts -paMethod :: (Builtins -> Var) -> Type -> VM CoreExpr -paMethod method ty +type PAMethod = (Builtins -> Var, String) + +pa_length = (lengthPAVar, "lengthPA") +pa_replicate = (replicatePAVar, "replicatePA") +pa_empty = (emptyPAVar, "emptyPA") + +paMethod :: PAMethod -> Type -> VM CoreExpr +paMethod (method, name) ty + | Just (tycon, []) <- splitTyConApp_maybe ty + , isPrimTyCon tycon + = do + fn <- traceMaybeV "paMethod" (ppr tycon <+> text name) + $ lookupPrimMethod tycon name + return (Var fn) + +paMethod (method, name) ty = do fn <- builtin method dict <- paDictOfType ty return $ mkApps (Var fn) [Type ty, dict] mkPR :: Type -> VM CoreExpr -mkPR = paMethod mkPRVar +mkPR ty + = do + fn <- builtin mkPRVar + dict <- paDictOfType ty + return $ mkApps (Var fn) [Type ty, dict] lengthPA :: CoreExpr -> VM CoreExpr -lengthPA x = liftM (`App` x) (paMethod lengthPAVar ty) +lengthPA x = liftM (`App` x) (paMethod pa_length ty) where ty = splitPArrayTy (exprType x) replicatePA :: CoreExpr -> CoreExpr -> VM CoreExpr replicatePA len x = liftM (`mkApps` [len,x]) - (paMethod replicatePAVar (exprType x)) + (paMethod pa_replicate (exprType x)) emptyPA :: Type -> VM CoreExpr -emptyPA = paMethod emptyPAVar +emptyPA = paMethod pa_empty liftPA :: CoreExpr -> VM CoreExpr liftPA x |