summaryrefslogtreecommitdiff
path: root/compiler/vectorise
diff options
context:
space:
mode:
authorRoman Leshchinskiy <rl@cse.unsw.edu.au>2007-08-30 01:42:57 +0000
committerRoman Leshchinskiy <rl@cse.unsw.edu.au>2007-08-30 01:42:57 +0000
commit9f695847ad2ace19c5fd0b937c34015af9735863 (patch)
tree224b965b21f2e5644c0e1f28260e7acc642b4e85 /compiler/vectorise
parent8e3058a518acedf74306f95f06a7e78cc1145ca6 (diff)
downloadhaskell-9f695847ad2ace19c5fd0b937c34015af9735863.tar.gz
Add code for looking up PA methods of primitive TyCons
Diffstat (limited to 'compiler/vectorise')
-rw-r--r--compiler/vectorise/VectBuiltIn.hs23
-rw-r--r--compiler/vectorise/VectMonad.hs4
-rw-r--r--compiler/vectorise/VectUtils.hs30
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