X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectBuiltIn.hs;h=83f056d64fc29ad62d4111592d435d5411a582b7;hb=66579ff945831c5fc9a17c58c722ff01f2268d76;hp=f5c27ef554725cae1940a433ebdbed0d3d380ad8;hpb=5e9f04ebeaf49c3afe836b64d72508762ad19c1a;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs index f5c27ef..83f056d 100644 --- a/compiler/vectorise/VectBuiltIn.hs +++ b/compiler/vectorise/VectBuiltIn.hs @@ -1,12 +1,6 @@ -{-# 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, combinePAVar, + Builtins(..), sumTyCon, prodTyCon, + combinePAVar, initBuiltins, initBuiltinVars, initBuiltinTyCons, initBuiltinDataCons, initBuiltinPAs, initBuiltinPRs, initBuiltinBoxedTyCons, @@ -14,12 +8,10 @@ module VectBuiltIn ( primMethod, primPArray ) where -#include "HsVersions.h" - import DsMonad import IfaceEnv ( lookupOrig ) -import Module ( Module ) +import Module import DataCon ( DataCon, dataConName, dataConWorkId ) import TyCon ( TyCon, tyConName, tyConDataCons ) import Var ( Var ) @@ -29,14 +21,15 @@ import NameEnv import OccName import TypeRep ( funTyCon ) -import Type ( Type ) +import Type ( Type, mkTyConApp ) import TysPrim -import TysWiredIn ( unitTyCon, tupleTyCon, +import TysWiredIn ( unitTyCon, unitDataCon, + tupleTyCon, tupleCon, intTyCon, intTyConName, + doubleTyCon, doubleTyConName, boolTyCon, boolTyConName, trueDataCon, falseDataCon, - parrTyCon, parrTyConName ) + parrTyConName ) import PrelNames ( gHC_PARR ) -import Module import BasicTypes ( Boxity(..) ) import FastString @@ -46,37 +39,57 @@ import Data.Array import Control.Monad ( liftM, zipWithM ) import Data.List ( unzip4 ) -mAX_NDP_PROD :: Int -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) +mAX_DPH_PROD :: Int +mAX_DPH_PROD = 5 + +mAX_DPH_SUM :: Int +mAX_DPH_SUM = 3 + +mAX_DPH_COMBINE :: Int +mAX_DPH_COMBINE = 2 + +data Modules = Modules { + dph_PArray :: Module + , dph_Repr :: Module + , dph_Closure :: Module + , dph_Unboxed :: Module + , dph_Instances :: Module + , dph_Combinators :: Module + , dph_Prelude_PArr :: Module + , dph_Prelude_Int :: Module + , dph_Prelude_Double :: Module + , dph_Prelude_Bool :: Module + , dph_Prelude_Tuple :: Module + } -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") +dph_Modules :: PackageId -> Modules +dph_Modules pkg = Modules { + dph_PArray = mk (fsLit "Data.Array.Parallel.Lifted.PArray") + , dph_Repr = mk (fsLit "Data.Array.Parallel.Lifted.Repr") + , dph_Closure = mk (fsLit "Data.Array.Parallel.Lifted.Closure") + , dph_Unboxed = mk (fsLit "Data.Array.Parallel.Lifted.Unboxed") + , dph_Instances = mk (fsLit "Data.Array.Parallel.Lifted.Instances") + , dph_Combinators = mk (fsLit "Data.Array.Parallel.Lifted.Combinators") + + , dph_Prelude_PArr = mk (fsLit "Data.Array.Parallel.Prelude.Base.PArr") + , dph_Prelude_Int = mk (fsLit "Data.Array.Parallel.Prelude.Base.Int") + , dph_Prelude_Double = mk (fsLit "Data.Array.Parallel.Prelude.Base.Double") + , dph_Prelude_Bool = mk (fsLit "Data.Array.Parallel.Prelude.Base.Bool") + , dph_Prelude_Tuple = mk (fsLit "Data.Array.Parallel.Prelude.Base.Tuple") + } + where + mk = mkModule pkg . mkModuleNameFS -nDP_PRELUDE_PARR = gHC_PARR -- mkNDPModule FSLIT("Data.Array.Parallel.Prelude.PArr") -nDP_PRELUDE_INT = mkNDPModule FSLIT("Data.Array.Parallel.Prelude.Int") data Builtins = Builtins { - parrayTyCon :: TyCon + dphModules :: Modules + , parrayTyCon :: TyCon , paTyCon :: TyCon , paDataCon :: DataCon , preprTyCon :: TyCon , prTyCon :: TyCon , prDataCon :: DataCon - , parrayIntPrimTyCon :: TyCon - , parrayBoolPrimTyCon :: TyCon + , intPrimArrayTy :: Type , voidTyCon :: TyCon , wrapTyCon :: TyCon , enumerationTyCon :: TyCon @@ -102,73 +115,72 @@ data Builtins = Builtins { sumTyCon :: Int -> Builtins -> TyCon sumTyCon n bi - | n >= 2 && n <= mAX_NDP_SUM = sumTyCons bi ! n + | n >= 2 && n <= mAX_DPH_SUM = sumTyCons bi ! n | otherwise = pprPanic "sumTyCon" (ppr n) prodTyCon :: Int -> Builtins -> TyCon prodTyCon n bi | n == 1 = wrapTyCon bi - | n >= 0 && n <= mAX_NDP_PROD = tupleTyCon Boxed n + | n >= 0 && n <= mAX_DPH_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 + | n >= 2 && n <= mAX_DPH_COMBINE = combinePAVars bi ! n | otherwise = pprPanic "combinePAVar" (ppr n) -initBuiltins :: DsM Builtins -initBuiltins +initBuiltins :: PackageId -> DsM Builtins +initBuiltins pkg = do - parrayTyCon <- externalTyCon nDP_PARRAY FSLIT("PArray") - paTyCon <- externalTyCon nDP_PARRAY FSLIT("PA") + parrayTyCon <- externalTyCon dph_PArray (fsLit "PArray") + paTyCon <- externalTyCon dph_PArray (fsLit "PA") let [paDataCon] = tyConDataCons paTyCon - preprTyCon <- externalTyCon nDP_PARRAY FSLIT("PRepr") - prTyCon <- externalTyCon nDP_PARRAY FSLIT("PR") + preprTyCon <- externalTyCon dph_PArray (fsLit "PRepr") + prTyCon <- externalTyCon dph_PArray (fsLit "PR") let [prDataCon] = tyConDataCons prTyCon - 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 - - 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) + intPrimArrayTy <- externalType dph_Unboxed (fsLit "PArray_Int#") + closureTyCon <- externalTyCon dph_Closure (fsLit ":->") + + voidTyCon <- externalTyCon dph_Repr (fsLit "Void") + wrapTyCon <- externalTyCon dph_Repr (fsLit "Wrap") + enumerationTyCon <- externalTyCon dph_Repr (fsLit "Enumeration") + sum_tcs <- mapM (externalTyCon dph_Repr) + [mkFastString ("Sum" ++ show i) | i <- [2..mAX_DPH_SUM]] + + let sumTyCons = listArray (2, mAX_DPH_SUM) sum_tcs + + voidVar <- externalVar dph_Repr (fsLit "void") + mkPRVar <- externalVar dph_PArray (fsLit "mkPR") + mkClosureVar <- externalVar dph_Closure (fsLit "mkClosure") + applyClosureVar <- externalVar dph_Closure (fsLit "$:") + mkClosurePVar <- externalVar dph_Closure (fsLit "mkClosureP") + applyClosurePVar <- externalVar dph_Closure (fsLit "$:^") + replicatePAIntPrimVar <- externalVar dph_Unboxed (fsLit "replicatePA_Int#") + upToPAIntPrimVar <- externalVar dph_Unboxed (fsLit "upToPA_Int#") + selectPAIntPrimVar <- externalVar dph_Unboxed (fsLit "selectPA_Int#") + truesPABoolPrimVar <- externalVar dph_Unboxed (fsLit "truesPA_Bool#") + lengthPAVar <- externalVar dph_PArray (fsLit "lengthPA#") + replicatePAVar <- externalVar dph_PArray (fsLit "replicatePA#") + emptyPAVar <- externalVar dph_PArray (fsLit "emptyPA") + packPAVar <- externalVar dph_PArray (fsLit "packPA#") + + combines <- mapM (externalVar dph_PArray) + [mkFastString ("combine" ++ show i ++ "PA#") + | i <- [2..mAX_DPH_COMBINE]] + let combinePAVars = listArray (2, mAX_DPH_COMBINE) combines + + liftingContext <- liftM (\u -> mkSysLocal (fsLit "lc") u intPrimTy) newUnique return $ Builtins { - parrayTyCon = parrayTyCon + dphModules = modules + , parrayTyCon = parrayTyCon , paTyCon = paTyCon , paDataCon = paDataCon , preprTyCon = preprTyCon , prTyCon = prTyCon , prDataCon = prDataCon - , parrayIntPrimTyCon = parrayIntPrimTyCon - , parrayBoolPrimTyCon = parrayBoolPrimTyCon + , intPrimArrayTy = intPrimArrayTy , voidTyCon = voidTyCon , wrapTyCon = wrapTyCon , enumerationTyCon = enumerationTyCon @@ -191,49 +203,164 @@ initBuiltins , combinePAVars = combinePAVars , liftingContext = liftingContext } + where + modules@(Modules { + dph_PArray = dph_PArray + , dph_Repr = dph_Repr + , dph_Closure = dph_Closure + , dph_Unboxed = dph_Unboxed + }) + = dph_Modules pkg + initBuiltinVars :: Builtins -> DsM [(Var, Var)] -initBuiltinVars bi +initBuiltinVars (Builtins { dphModules = mods }) = do uvars <- zipWithM externalVar umods ufs vvars <- zipWithM externalVar vmods vfs + cvars <- zipWithM externalVar cmods cfs return $ [(v,v) | v <- map dataConWorkId defaultDataConWorkers] + ++ zip (map dataConWorkId cons) cvars ++ zip uvars vvars where - (umods, ufs, vmods, vfs) = unzip4 preludeVars + (umods, ufs, vmods, vfs) = unzip4 (preludeVars mods) + + (cons, cmods, cfs) = unzip3 (preludeDataCons mods) defaultDataConWorkers :: [DataCon] -defaultDataConWorkers = [trueDataCon, falseDataCon] +defaultDataConWorkers = [trueDataCon, falseDataCon, unitDataCon] -preludeVars :: [(Module, FastString, Module, FastString)] -preludeVars +preludeDataCons :: Modules -> [(DataCon, Module, FastString)] +preludeDataCons (Modules { dph_Prelude_Tuple = dph_Prelude_Tuple }) + = [mk_tup n dph_Prelude_Tuple (mkFastString $ "tup" ++ show n) | n <- [2..3]] + where + mk_tup n mod name = (tupleCon Boxed n, mod, name) + +preludeVars :: Modules -> [(Module, FastString, Module, FastString)] +preludeVars (Modules { dph_Combinators = dph_Combinators + , dph_PArray = dph_PArray + , dph_Prelude_Int = dph_Prelude_Int + , dph_Prelude_Double = dph_Prelude_Double + , dph_Prelude_Bool = dph_Prelude_Bool + , dph_Prelude_PArr = dph_Prelude_PArr + }) = [ - mk nDP_PRELUDE_PARR FSLIT("mapP") nDP_COMBINATORS FSLIT("mapPA") - , mk nDP_PRELUDE_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") + mk gHC_PARR (fsLit "mapP") dph_Combinators (fsLit "mapPA") + , mk gHC_PARR (fsLit "zipWithP") dph_Combinators (fsLit "zipWithPA") + , mk gHC_PARR (fsLit "zipP") dph_Combinators (fsLit "zipPA") + , mk gHC_PARR (fsLit "unzipP") dph_Combinators (fsLit "unzipPA") + , mk gHC_PARR (fsLit "filterP") dph_Combinators (fsLit "filterPA") + , mk gHC_PARR (fsLit "lengthP") dph_Combinators (fsLit "lengthPA") + , mk gHC_PARR (fsLit "replicateP") dph_Combinators (fsLit "replicatePA") + , mk gHC_PARR (fsLit "!:") dph_Combinators (fsLit "indexPA") + , mk gHC_PARR (fsLit "crossMapP") dph_Combinators (fsLit "crossMapPA") + , mk gHC_PARR (fsLit "singletonP") dph_Combinators (fsLit "singletonPA") + , mk gHC_PARR (fsLit "concatP") dph_Combinators (fsLit "concatPA") + , mk gHC_PARR (fsLit "+:+") dph_Combinators (fsLit "appPA") + , mk gHC_PARR (fsLit "emptyP") dph_PArray (fsLit "emptyPA") + + , mk' dph_Prelude_Int "div" "divV" + , mk' dph_Prelude_Int "mod" "modV" + , mk' dph_Prelude_Int "sqrt" "sqrtV" + , mk' dph_Prelude_Int "enumFromToP" "enumFromToPA" + , mk' dph_Prelude_Int "upToP" "upToPA" + ] + ++ vars_Ord dph_Prelude_Int + ++ vars_Num dph_Prelude_Int + + ++ vars_Ord dph_Prelude_Double + ++ vars_Num dph_Prelude_Double + ++ vars_Fractional dph_Prelude_Double + ++ vars_Floating dph_Prelude_Double + ++ vars_RealFrac dph_Prelude_Double + ++ + [ mk dph_Prelude_Bool (fsLit "andP") dph_Prelude_Bool (fsLit "andPA") + , mk dph_Prelude_Bool (fsLit "orP") dph_Prelude_Bool (fsLit "orPA") + + -- FIXME: temporary + , mk dph_Prelude_PArr (fsLit "fromPArrayP") dph_Prelude_PArr (fsLit "fromPArrayPA") + , mk dph_Prelude_PArr (fsLit "toPArrayP") dph_Prelude_PArr (fsLit "toPArrayPA") + , mk dph_Prelude_PArr (fsLit "fromNestedPArrayP") dph_Prelude_PArr (fsLit "fromNestedPArrayPA") + , mk dph_Prelude_PArr (fsLit "combineP") dph_Combinators (fsLit "combine2PA") ] where - mk = (,,,) + mk = (,,,) + mk' mod v v' = mk mod (fsLit v) mod (fsLit v') + + vars_Ord mod = [mk' mod "==" "eqV" + ,mk' mod "/=" "neqV" + ,mk' mod "<=" "leV" + ,mk' mod "<" "ltV" + ,mk' mod ">=" "geV" + ,mk' mod ">" "gtV" + ,mk' mod "min" "minV" + ,mk' mod "max" "maxV" + ,mk' mod "minimumP" "minimumPA" + ,mk' mod "maximumP" "maximumPA" + ,mk' mod "minIndexP" "minIndexPA" + ,mk' mod "maxIndexP" "maxIndexPA" + ] + + vars_Num mod = [mk' mod "+" "plusV" + ,mk' mod "-" "minusV" + ,mk' mod "*" "multV" + ,mk' mod "negate" "negateV" + ,mk' mod "abs" "absV" + ,mk' mod "sumP" "sumPA" + ,mk' mod "productP" "productPA" + ] + + vars_Fractional mod = [mk' mod "/" "divideV" + ,mk' mod "recip" "recipV" + ] + + vars_Floating mod = [mk' mod "pi" "pi" + ,mk' mod "exp" "expV" + ,mk' mod "sqrt" "sqrtV" + ,mk' mod "log" "logV" + ,mk' mod "sin" "sinV" + ,mk' mod "tan" "tanV" + ,mk' mod "cos" "cosV" + ,mk' mod "asin" "asinV" + ,mk' mod "atan" "atanV" + ,mk' mod "acos" "acosV" + ,mk' mod "sinh" "sinhV" + ,mk' mod "tanh" "tanhV" + ,mk' mod "cosh" "coshV" + ,mk' mod "asinh" "asinhV" + ,mk' mod "atanh" "atanhV" + ,mk' mod "acosh" "acoshV" + ,mk' mod "**" "powV" + ,mk' mod "logBase" "logBaseV" + ] + + vars_RealFrac mod = [mk' mod "fromInt" "fromIntV" + ,mk' mod "truncate" "truncateV" + ,mk' mod "round" "roundV" + ,mk' mod "ceiling" "ceilingV" + ,mk' mod "floor" "floorV" + ] initBuiltinTyCons :: Builtins -> DsM [(Name, TyCon)] initBuiltinTyCons bi = do - -- parr <- externalTyCon nDP_PRELUDE_PARR FSLIT("PArr") + -- parr <- externalTyCon dph_Prelude_PArr (fsLit "PArr") return $ (tyConName funTyCon, closureTyCon bi) : (parrTyConName, parrayTyCon bi) + + -- FIXME: temporary + : (tyConName $ parrayTyCon bi, parrayTyCon bi) + : [(tyConName tc, tc) | tc <- defaultTyCons] defaultTyCons :: [TyCon] -defaultTyCons = [intTyCon, boolTyCon] +defaultTyCons = [intTyCon, boolTyCon, doubleTyCon] initBuiltinDataCons :: Builtins -> [(Name, DataCon)] -initBuiltinDataCons bi = [(dataConName dc, dc)| dc <- defaultDataCons] +initBuiltinDataCons _ = [(dataConName dc, dc)| dc <- defaultDataCons] defaultDataCons :: [DataCon] -defaultDataCons = [trueDataCon, falseDataCon] +defaultDataCons = [trueDataCon, falseDataCon, unitDataCon] initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)] initBuiltinDicts ps @@ -243,59 +370,63 @@ initBuiltinDicts ps where (tcs, mods, fss) = unzip3 ps +initBuiltinPAs :: Builtins -> DsM [(Name, Var)] initBuiltinPAs = initBuiltinDicts . builtinPAs builtinPAs :: Builtins -> [(Name, Module, FastString)] -builtinPAs bi +builtinPAs bi@(Builtins { dphModules = mods }) = [ - 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") - , mk boolTyConName nDP_INSTANCES FSLIT("dPA_Bool") + mk (tyConName $ closureTyCon bi) (dph_Closure mods) (fsLit "dPA_Clo") + , mk (tyConName $ voidTyCon bi) (dph_Repr mods) (fsLit "dPA_Void") + , mk (tyConName $ parrayTyCon bi) (dph_Instances mods) (fsLit "dPA_PArray") + , mk unitTyConName (dph_Instances mods) (fsLit "dPA_Unit") + + , mk intTyConName (dph_Instances mods) (fsLit "dPA_Int") + , mk doubleTyConName (dph_Instances mods) (fsLit "dPA_Double") + , mk boolTyConName (dph_Instances mods) (fsLit "dPA_Bool") ] ++ tups where mk name mod fs = (name, mod, fs) - tups = map mk_tup [2..3] + tups = map mk_tup [2..mAX_DPH_PROD] mk_tup n = mk (tyConName $ tupleTyCon Boxed n) - nDP_INSTANCES + (dph_Instances mods) (mkFastString $ "dPA_" ++ show n) +initBuiltinPRs :: Builtins -> DsM [(Name, Var)] initBuiltinPRs = initBuiltinDicts . builtinPRs builtinPRs :: Builtins -> [(Name, Module, FastString)] -builtinPRs bi = +builtinPRs bi@(Builtins { dphModules = mods }) = [ - 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") + mk (tyConName unitTyCon) (dph_Repr mods) (fsLit "dPR_Unit") + , mk (tyConName $ voidTyCon bi) (dph_Repr mods) (fsLit "dPR_Void") + , mk (tyConName $ wrapTyCon bi) (dph_Repr mods) (fsLit "dPR_Wrap") + , mk (tyConName $ enumerationTyCon bi) (dph_Repr mods) (fsLit "dPR_Enumeration") + , mk (tyConName $ closureTyCon bi) (dph_Closure mods) (fsLit "dPR_Clo") -- temporary - , mk intTyConName nDP_INSTANCES FSLIT("dPR_Int") + , mk intTyConName (dph_Instances mods) (fsLit "dPR_Int") + , mk doubleTyConName (dph_Instances mods) (fsLit "dPR_Double") ] - ++ map mk_sum [2..mAX_NDP_SUM] - ++ map mk_prod [2..mAX_NDP_PROD] + ++ map mk_sum [2..mAX_DPH_SUM] + ++ map mk_prod [2..mAX_DPH_PROD] where mk name mod fs = (name, mod, fs) - mk_sum n = (tyConName $ sumTyCon n bi, nDP_REPR, + mk_sum n = (tyConName $ sumTyCon n bi, dph_Repr mods, mkFastString ("dPR_Sum" ++ show n)) - mk_prod n = (tyConName $ prodTyCon n bi, nDP_REPR, + mk_prod n = (tyConName $ prodTyCon n bi, dph_Repr mods, mkFastString ("dPR_" ++ show n)) initBuiltinBoxedTyCons :: Builtins -> DsM [(Name, TyCon)] initBuiltinBoxedTyCons = return . builtinBoxedTyCons builtinBoxedTyCons :: Builtins -> [(Name, TyCon)] -builtinBoxedTyCons bi = +builtinBoxedTyCons _ = [(tyConName intPrimTyCon, intTyCon)] externalVar :: Module -> FastString -> DsM Var @@ -304,27 +435,38 @@ externalVar mod fs externalTyCon :: Module -> FastString -> DsM TyCon externalTyCon mod fs - = dsLookupTyCon =<< lookupOrig mod (mkOccNameFS tcName fs) + = dsLookupTyCon =<< lookupOrig mod (mkTcOccFS fs) +externalType :: Module -> FastString -> DsM Type +externalType mod fs + = do + tycon <- externalTyCon mod fs + return $ mkTyConApp tycon [] + +unitTyConName :: Name unitTyConName = tyConName unitTyCon -primMethod :: TyCon -> String -> DsM (Maybe Var) -primMethod tycon method +primMethod :: TyCon -> String -> Builtins -> DsM (Maybe Var) +primMethod tycon method (Builtins { dphModules = mods }) | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon) = liftM Just - $ dsLookupGlobalId =<< lookupOrig nDP_PRIM (mkVarOcc $ method ++ suffix) + $ dsLookupGlobalId =<< lookupOrig (dph_Unboxed mods) + (mkVarOcc $ method ++ suffix) | otherwise = return Nothing -primPArray :: TyCon -> DsM (Maybe TyCon) -primPArray tycon +primPArray :: TyCon -> Builtins -> DsM (Maybe TyCon) +primPArray tycon (Builtins { dphModules = mods }) | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon) = liftM Just - $ dsLookupTyCon =<< lookupOrig nDP_PRIM (mkOccName tcName $ "PArray" ++ suffix) + $ dsLookupTyCon =<< lookupOrig (dph_Unboxed mods) + (mkTcOcc $ "PArray" ++ suffix) | otherwise = return Nothing +prim_ty_cons :: NameEnv String prim_ty_cons = mkNameEnv [mk_prim intPrimTyCon] where mk_prim tycon = (tyConName tycon, '_' : getOccString tycon) +