X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2Fvectorise%2FVectBuiltIn.hs;h=d4178987760179c9a76d4d33dd7b6d2b00fc0ebd;hb=222415a5b658e737a0a1f2c980c6f80635289f75;hp=be7145985286b561c42db9d4f3d3f83d20ca7cdd;hpb=501db4a71483f4a6943008dd4c84e01fb9b55170;p=ghc-hetmet.git diff --git a/compiler/vectorise/VectBuiltIn.hs b/compiler/vectorise/VectBuiltIn.hs index be71459..d417898 100644 --- a/compiler/vectorise/VectBuiltIn.hs +++ b/compiler/vectorise/VectBuiltIn.hs @@ -1,19 +1,23 @@ module VectBuiltIn ( - Builtins(..), sumTyCon, prodTyCon, - combinePAVar, + Builtins(..), sumTyCon, prodTyCon, prodDataCon, + selTy, selReplicate, selPick, selTags, selElements, + combinePDVar, scalarZip, closureCtrFun, initBuiltins, initBuiltinVars, initBuiltinTyCons, initBuiltinDataCons, initBuiltinPAs, initBuiltinPRs, - initBuiltinBoxedTyCons, + initBuiltinBoxedTyCons, initBuiltinScalars, primMethod, primPArray ) where import DsMonad import IfaceEnv ( lookupOrig ) +import InstEnv import Module import DataCon ( DataCon, dataConName, dataConWorkId ) import TyCon ( TyCon, tyConName, tyConDataCons ) +import Class ( Class, classTyCon ) +import CoreSyn ( CoreExpr, Expr(..) ) import Var ( Var ) import Id ( mkSysLocal ) import Name ( Name, getOccString ) @@ -23,13 +27,13 @@ import OccName import TypeRep ( funTyCon ) import Type ( Type, mkTyConApp ) import TysPrim -import TysWiredIn ( unitTyCon, unitDataCon, +import TysWiredIn ( unitDataCon, tupleTyCon, tupleCon, - intTyCon, intTyConName, - doubleTyCon, doubleTyConName, - boolTyCon, boolTyConName, trueDataCon, falseDataCon, + intTyCon, + doubleTyCon, + boolTyCon, trueDataCon, falseDataCon, parrTyConName ) -import PrelNames ( gHC_PARR ) +import PrelNames ( word8TyConName, gHC_PARR ) import BasicTypes ( Boxity(..) ) import FastString @@ -43,11 +47,14 @@ mAX_DPH_PROD :: Int mAX_DPH_PROD = 5 mAX_DPH_SUM :: Int -mAX_DPH_SUM = 3 +mAX_DPH_SUM = 2 mAX_DPH_COMBINE :: Int mAX_DPH_COMBINE = 2 +mAX_DPH_SCALAR_ARGS :: Int +mAX_DPH_SCALAR_ARGS = 3 + data Modules = Modules { dph_PArray :: Module , dph_Repr :: Module @@ -55,8 +62,11 @@ data Modules = Modules { , dph_Unboxed :: Module , dph_Instances :: Module , dph_Combinators :: Module + , dph_Scalar :: Module + , dph_Selector :: Module , dph_Prelude_PArr :: Module , dph_Prelude_Int :: Module + , dph_Prelude_Word8 :: Module , dph_Prelude_Double :: Module , dph_Prelude_Bool :: Module , dph_Prelude_Tuple :: Module @@ -70,9 +80,12 @@ dph_Modules pkg = Modules { , 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_Scalar = mk (fsLit "Data.Array.Parallel.Lifted.Scalar") + , dph_Selector = mk (fsLit "Data.Array.Parallel.Lifted.Selector") , dph_Prelude_PArr = mk (fsLit "Data.Array.Parallel.Prelude.Base.PArr") , dph_Prelude_Int = mk (fsLit "Data.Array.Parallel.Prelude.Base.Int") + , dph_Prelude_Word8 = mk (fsLit "Data.Array.Parallel.Prelude.Base.Word8") , 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") @@ -80,94 +93,156 @@ dph_Modules pkg = Modules { where mk = mkModule pkg . mkModuleNameFS +dph_Orphans :: [Modules -> Module] +dph_Orphans = [dph_Repr, dph_Instances] data Builtins = Builtins { dphModules :: Modules , parrayTyCon :: TyCon + , parrayDataCon :: DataCon + , pdataTyCon :: TyCon , paTyCon :: TyCon , paDataCon :: DataCon , preprTyCon :: TyCon , prTyCon :: TyCon , prDataCon :: DataCon - , intPrimArrayTy :: Type , voidTyCon :: TyCon , wrapTyCon :: TyCon - , enumerationTyCon :: TyCon + , selTys :: Array Int Type + , selReplicates :: Array Int CoreExpr + , selPicks :: Array Int CoreExpr + , selTagss :: Array Int CoreExpr + , selEls :: Array (Int, Int) CoreExpr , sumTyCons :: Array Int TyCon , closureTyCon :: TyCon , voidVar :: Var - , mkPRVar :: Var - , mkClosureVar :: Var - , applyClosureVar :: Var - , mkClosurePVar :: Var - , applyClosurePVar :: Var - , replicatePAIntPrimVar :: Var - , upToPAIntPrimVar :: Var - , selectPAIntPrimVar :: Var - , truesPABoolPrimVar :: Var - , lengthPAVar :: Var - , replicatePAVar :: Var - , emptyPAVar :: Var - , packPAVar :: Var - , combinePAVars :: Array Int Var + , pvoidVar :: Var + , fromVoidVar :: Var + , punitVar :: Var + , closureVar :: Var + , applyVar :: Var + , liftedClosureVar :: Var + , liftedApplyVar :: Var + , replicatePDVar :: Var + , emptyPDVar :: Var + , packPDVar :: Var + , packByTagPDVar :: Var + , combinePDVars :: Array Int Var + , scalarClass :: Class + , scalarZips :: Array Int Var + , closureCtrFuns :: Array Int Var , liftingContext :: Var } +indexBuiltin :: (Ix i, Outputable i) => String -> (Builtins -> Array i a) + -> i -> Builtins -> a +indexBuiltin fn f i bi + | inRange (bounds xs) i = xs ! i + | otherwise = pprPanic fn (ppr i) + where + xs = f bi + +selTy :: Int -> Builtins -> Type +selTy = indexBuiltin "selTy" selTys + +selReplicate :: Int -> Builtins -> CoreExpr +selReplicate = indexBuiltin "selReplicate" selReplicates + +selPick :: Int -> Builtins -> CoreExpr +selPick = indexBuiltin "selPick" selPicks + +selTags :: Int -> Builtins -> CoreExpr +selTags = indexBuiltin "selTags" selTagss + +selElements :: Int -> Int -> Builtins -> CoreExpr +selElements i j = indexBuiltin "selElements" selEls (i,j) + sumTyCon :: Int -> Builtins -> TyCon -sumTyCon n bi - | n >= 2 && n <= mAX_DPH_SUM = sumTyCons bi ! n - | otherwise = pprPanic "sumTyCon" (ppr n) +sumTyCon = indexBuiltin "sumTyCon" sumTyCons prodTyCon :: Int -> Builtins -> TyCon -prodTyCon n bi - | n == 1 = wrapTyCon bi - | n >= 0 && n <= mAX_DPH_PROD = tupleTyCon Boxed n +prodTyCon n _ + | n >= 2 && n <= mAX_DPH_PROD = tupleTyCon Boxed n | otherwise = pprPanic "prodTyCon" (ppr n) -combinePAVar :: Int -> Builtins -> Var -combinePAVar n bi - | n >= 2 && n <= mAX_DPH_COMBINE = combinePAVars bi ! n - | otherwise = pprPanic "combinePAVar" (ppr n) +prodDataCon :: Int -> Builtins -> DataCon +prodDataCon n bi = case tyConDataCons (prodTyCon n bi) of + [con] -> con + _ -> pprPanic "prodDataCon" (ppr n) + +combinePDVar :: Int -> Builtins -> Var +combinePDVar = indexBuiltin "combinePDVar" combinePDVars + +scalarZip :: Int -> Builtins -> Var +scalarZip = indexBuiltin "scalarZip" scalarZips + +closureCtrFun :: Int -> Builtins -> Var +closureCtrFun = indexBuiltin "closureCtrFun" closureCtrFuns initBuiltins :: PackageId -> DsM Builtins initBuiltins pkg = do + mapM_ load dph_Orphans parrayTyCon <- externalTyCon dph_PArray (fsLit "PArray") - paTyCon <- externalTyCon dph_PArray (fsLit "PA") + let [parrayDataCon] = tyConDataCons parrayTyCon + pdataTyCon <- externalTyCon dph_PArray (fsLit "PData") + paTyCon <- externalClassTyCon dph_PArray (fsLit "PA") let [paDataCon] = tyConDataCons paTyCon preprTyCon <- externalTyCon dph_PArray (fsLit "PRepr") - prTyCon <- externalTyCon dph_PArray (fsLit "PR") + prTyCon <- externalClassTyCon dph_PArray (fsLit "PR") let [prDataCon] = tyConDataCons prTyCon - 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 + sel_tys <- mapM (externalType dph_Selector) + (numbered "Sel" 2 mAX_DPH_SUM) + sel_replicates <- mapM (externalFun dph_Selector) + (numbered "replicate" 2 mAX_DPH_SUM) + sel_picks <- mapM (externalFun dph_Selector) + (numbered "pick" 2 mAX_DPH_SUM) + sel_tags <- mapM (externalFun dph_Selector) + (numbered "tagsSel" 2 mAX_DPH_SUM) + sel_els <- mapM mk_elements + [(i,j) | i <- [2..mAX_DPH_SUM], j <- [0..i-1]] + sum_tcs <- mapM (externalTyCon dph_Repr) + (numbered "Sum" 2 mAX_DPH_SUM) + + let selTys = listArray (2, mAX_DPH_SUM) sel_tys + selReplicates = listArray (2, mAX_DPH_SUM) sel_replicates + selPicks = listArray (2, mAX_DPH_SUM) sel_picks + selTagss = listArray (2, mAX_DPH_SUM) sel_tags + selEls = array ((2,0), (mAX_DPH_SUM, mAX_DPH_SUM)) sel_els + 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#") + pvoidVar <- externalVar dph_Repr (fsLit "pvoid") + fromVoidVar <- externalVar dph_Repr (fsLit "fromVoid") + punitVar <- externalVar dph_Repr (fsLit "punit") + closureVar <- externalVar dph_Closure (fsLit "closure") + applyVar <- externalVar dph_Closure (fsLit "$:") + liftedClosureVar <- externalVar dph_Closure (fsLit "liftedClosure") + liftedApplyVar <- externalVar dph_Closure (fsLit "liftedApply") + replicatePDVar <- externalVar dph_PArray (fsLit "replicatePD") + emptyPDVar <- externalVar dph_PArray (fsLit "emptyPD") + packPDVar <- externalVar dph_PArray (fsLit "packPD") + packByTagPDVar <- externalVar dph_PArray (fsLit "packByTagPD") combines <- mapM (externalVar dph_PArray) - [mkFastString ("combine" ++ show i ++ "PA#") + [mkFastString ("combine" ++ show i ++ "PD") | i <- [2..mAX_DPH_COMBINE]] - let combinePAVars = listArray (2, mAX_DPH_COMBINE) combines + let combinePDVars = listArray (2, mAX_DPH_COMBINE) combines + + scalarClass <- externalClass dph_Scalar (fsLit "Scalar") + scalar_map <- externalVar dph_Scalar (fsLit "scalar_map") + scalar_zip2 <- externalVar dph_Scalar (fsLit "scalar_zipWith") + scalar_zips <- mapM (externalVar dph_Scalar) + (numbered "scalar_zipWith" 3 mAX_DPH_SCALAR_ARGS) + let scalarZips = listArray (1, mAX_DPH_SCALAR_ARGS) + (scalar_map : scalar_zip2 : scalar_zips) + closures <- mapM (externalVar dph_Closure) + (numbered "closure" 1 mAX_DPH_SCALAR_ARGS) + let closureCtrFuns = listArray (1, mAX_DPH_COMBINE) closures liftingContext <- liftM (\u -> mkSysLocal (fsLit "lc") u intPrimTy) newUnique @@ -175,32 +250,38 @@ initBuiltins pkg return $ Builtins { dphModules = modules , parrayTyCon = parrayTyCon + , parrayDataCon = parrayDataCon + , pdataTyCon = pdataTyCon , paTyCon = paTyCon , paDataCon = paDataCon , preprTyCon = preprTyCon , prTyCon = prTyCon , prDataCon = prDataCon - , intPrimArrayTy = intPrimArrayTy , voidTyCon = voidTyCon , wrapTyCon = wrapTyCon - , enumerationTyCon = enumerationTyCon + , selTys = selTys + , selReplicates = selReplicates + , selPicks = selPicks + , selTagss = selTagss + , selEls = selEls , sumTyCons = sumTyCons , closureTyCon = closureTyCon , voidVar = voidVar - , mkPRVar = mkPRVar - , mkClosureVar = mkClosureVar - , applyClosureVar = applyClosureVar - , mkClosurePVar = mkClosurePVar - , applyClosurePVar = applyClosurePVar - , replicatePAIntPrimVar = replicatePAIntPrimVar - , upToPAIntPrimVar = upToPAIntPrimVar - , selectPAIntPrimVar = selectPAIntPrimVar - , truesPABoolPrimVar = truesPABoolPrimVar - , lengthPAVar = lengthPAVar - , replicatePAVar = replicatePAVar - , emptyPAVar = emptyPAVar - , packPAVar = packPAVar - , combinePAVars = combinePAVars + , pvoidVar = pvoidVar + , fromVoidVar = fromVoidVar + , punitVar = punitVar + , closureVar = closureVar + , applyVar = applyVar + , liftedClosureVar = liftedClosureVar + , liftedApplyVar = liftedApplyVar + , replicatePDVar = replicatePDVar + , emptyPDVar = emptyPDVar + , packPDVar = packPDVar + , packByTagPDVar = packByTagPDVar + , combinePDVars = combinePDVars + , scalarClass = scalarClass + , scalarZips = scalarZips + , closureCtrFuns = closureCtrFuns , liftingContext = liftingContext } where @@ -208,10 +289,26 @@ initBuiltins pkg dph_PArray = dph_PArray , dph_Repr = dph_Repr , dph_Closure = dph_Closure - , dph_Unboxed = dph_Unboxed + , dph_Selector = dph_Selector + , dph_Scalar = dph_Scalar }) = dph_Modules pkg + load get_mod = dsLoadModule doc mod + where + mod = get_mod modules + doc = ppr mod <+> ptext (sLit "is a DPH module") + + numbered :: String -> Int -> Int -> [FastString] + numbered pfx m n = [mkFastString (pfx ++ show i) | i <- [m..n]] + + mk_elements :: (Int, Int) -> DsM ((Int, Int), CoreExpr) + mk_elements (i,j) + = do + v <- externalVar dph_Selector + $ mkFastString ("elementsSel" ++ show i ++ "_" ++ show j ++ "#") + return ((i,j), Var v) + initBuiltinVars :: Builtins -> DsM [(Var, Var)] initBuiltinVars (Builtins { dphModules = mods }) @@ -240,6 +337,7 @@ preludeVars :: Modules -> [(Module, FastString, Module, FastString)] preludeVars (Modules { dph_Combinators = dph_Combinators , dph_PArray = dph_PArray , dph_Prelude_Int = dph_Prelude_Int + , dph_Prelude_Word8 = dph_Prelude_Word8 , dph_Prelude_Double = dph_Prelude_Double , dph_Prelude_Bool = dph_Prelude_Bool , dph_Prelude_PArr = dph_Prelude_PArr @@ -259,42 +357,31 @@ preludeVars (Modules { dph_Combinators = dph_Combinators , mk gHC_PARR (fsLit "+:+") dph_Combinators (fsLit "appPA") , mk gHC_PARR (fsLit "emptyP") dph_PArray (fsLit "emptyPA") - , mk dph_Prelude_Int (fsLit "plus") dph_Prelude_Int (fsLit "plusV") - , mk dph_Prelude_Int (fsLit "minus") dph_Prelude_Int (fsLit "minusV") - , mk dph_Prelude_Int (fsLit "mult") dph_Prelude_Int (fsLit "multV") - , mk dph_Prelude_Int (fsLit "intDiv") dph_Prelude_Int (fsLit "intDivV") - , mk dph_Prelude_Int (fsLit "intMod") dph_Prelude_Int (fsLit "intModV") - , mk dph_Prelude_Int (fsLit "intSquareRoot") dph_Prelude_Int (fsLit "intSquareRootV") - , mk dph_Prelude_Int (fsLit "intSumP") dph_Prelude_Int (fsLit "intSumPA") - , mk dph_Prelude_Int (fsLit "enumFromToP") dph_Prelude_Int (fsLit "enumFromToPA") - , mk dph_Prelude_Int (fsLit "upToP") dph_Prelude_Int (fsLit "upToPA") - - , mk dph_Prelude_Int (fsLit "eq") dph_Prelude_Int (fsLit "eqV") - , mk dph_Prelude_Int (fsLit "neq") dph_Prelude_Int (fsLit "neqV") - , mk dph_Prelude_Int (fsLit "le") dph_Prelude_Int (fsLit "leV") - , mk dph_Prelude_Int (fsLit "lt") dph_Prelude_Int (fsLit "ltV") - , mk dph_Prelude_Int (fsLit "ge") dph_Prelude_Int (fsLit "geV") - , mk dph_Prelude_Int (fsLit "gt") dph_Prelude_Int (fsLit "gtV") - - , mk dph_Prelude_Double (fsLit "plus") dph_Prelude_Double (fsLit "plusV") - , mk dph_Prelude_Double (fsLit "minus") dph_Prelude_Double (fsLit "minusV") - , mk dph_Prelude_Double (fsLit "mult") dph_Prelude_Double (fsLit "multV") - , mk dph_Prelude_Double (fsLit "divide") dph_Prelude_Double (fsLit "divideV") - , mk dph_Prelude_Double (fsLit "squareRoot") dph_Prelude_Double (fsLit "squareRootV") - , mk dph_Prelude_Double (fsLit "doubleSumP") dph_Prelude_Double (fsLit "doubleSumPA") - , mk dph_Prelude_Double (fsLit "minIndexP") - dph_Prelude_Double (fsLit "minIndexPA") - , mk dph_Prelude_Double (fsLit "maxIndexP") - dph_Prelude_Double (fsLit "maxIndexPA") - - , mk dph_Prelude_Double (fsLit "eq") dph_Prelude_Double (fsLit "eqV") - , mk dph_Prelude_Double (fsLit "neq") dph_Prelude_Double (fsLit "neqV") - , mk dph_Prelude_Double (fsLit "le") dph_Prelude_Double (fsLit "leV") - , mk dph_Prelude_Double (fsLit "lt") dph_Prelude_Double (fsLit "ltV") - , mk dph_Prelude_Double (fsLit "ge") dph_Prelude_Double (fsLit "geV") - , mk dph_Prelude_Double (fsLit "gt") dph_Prelude_Double (fsLit "gtV") - - , mk dph_Prelude_Bool (fsLit "andP") dph_Prelude_Bool (fsLit "andPA") + , 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_Word8 + ++ vars_Num dph_Prelude_Word8 + ++ + [ mk' dph_Prelude_Word8 "div" "divV" + , mk' dph_Prelude_Word8 "mod" "modV" + , mk' dph_Prelude_Word8 "fromInt" "fromIntV" + , mk' dph_Prelude_Word8 "toInt" "toIntV" + ] + + ++ 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 @@ -304,22 +391,81 @@ preludeVars (Modules { dph_Combinators = dph_Combinators , 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 dph_Prelude_PArr (fsLit "PArr") + dft_tcs <- defaultTyCons return $ (tyConName funTyCon, closureTyCon bi) : (parrTyConName, parrayTyCon bi) -- FIXME: temporary : (tyConName $ parrayTyCon bi, parrayTyCon bi) - : [(tyConName tc, tc) | tc <- defaultTyCons] + : [(tyConName tc, tc) | tc <- dft_tcs] -defaultTyCons :: [TyCon] -defaultTyCons = [intTyCon, boolTyCon, doubleTyCon] +defaultTyCons :: DsM [TyCon] +defaultTyCons + = do + word8 <- dsLookupTyCon word8TyConName + return [intTyCon, boolTyCon, doubleTyCon, word8] initBuiltinDataCons :: Builtins -> [(Name, DataCon)] initBuiltinDataCons _ = [(dataConName dc, dc)| dc <- defaultDataCons] @@ -327,65 +473,19 @@ initBuiltinDataCons _ = [(dataConName dc, dc)| dc <- defaultDataCons] defaultDataCons :: [DataCon] defaultDataCons = [trueDataCon, falseDataCon, unitDataCon] -initBuiltinDicts :: [(Name, Module, FastString)] -> DsM [(Name, Var)] -initBuiltinDicts ps - = do - dicts <- zipWithM externalVar mods fss - return $ zip tcs dicts - where - (tcs, mods, fss) = unzip3 ps +initBuiltinPAs :: Builtins -> (InstEnv, InstEnv) -> DsM [(Name, Var)] +initBuiltinPAs (Builtins { dphModules = mods }) insts + = liftM (initBuiltinDicts insts) (externalClass (dph_PArray mods) (fsLit "PA")) -initBuiltinPAs :: Builtins -> DsM [(Name, Var)] -initBuiltinPAs = initBuiltinDicts . builtinPAs +initBuiltinPRs :: Builtins -> (InstEnv, InstEnv) -> DsM [(Name, Var)] +initBuiltinPRs (Builtins { dphModules = mods }) insts + = liftM (initBuiltinDicts insts) (externalClass (dph_PArray mods) (fsLit "PR")) -builtinPAs :: Builtins -> [(Name, Module, FastString)] -builtinPAs bi@(Builtins { dphModules = mods }) - = [ - 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 +initBuiltinDicts :: (InstEnv, InstEnv) -> Class -> [(Name, Var)] +initBuiltinDicts insts cls = map find $ classInstances insts cls where - mk name mod fs = (name, mod, fs) - - tups = map mk_tup [2..mAX_DPH_PROD] - mk_tup n = mk (tyConName $ tupleTyCon Boxed n) - (dph_Instances mods) - (mkFastString $ "dPA_" ++ show n) - -initBuiltinPRs :: Builtins -> DsM [(Name, Var)] -initBuiltinPRs = initBuiltinDicts . builtinPRs - -builtinPRs :: Builtins -> [(Name, Module, FastString)] -builtinPRs bi@(Builtins { dphModules = mods }) = - [ - 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 (dph_Instances mods) (fsLit "dPR_Int") - , mk doubleTyConName (dph_Instances mods) (fsLit "dPR_Double") - ] - - ++ 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, dph_Repr mods, - mkFastString ("dPR_Sum" ++ show n)) - - mk_prod n = (tyConName $ prodTyCon n bi, dph_Repr mods, - mkFastString ("dPR_" ++ show n)) + find i | [Just tc] <- instanceRoughTcs i = (tc, instanceDFunId i) + | otherwise = pprPanic "Invalid DPH instance" (ppr i) initBuiltinBoxedTyCons :: Builtins -> DsM [(Name, TyCon)] initBuiltinBoxedTyCons = return . builtinBoxedTyCons @@ -394,13 +494,107 @@ builtinBoxedTyCons :: Builtins -> [(Name, TyCon)] builtinBoxedTyCons _ = [(tyConName intPrimTyCon, intTyCon)] + +initBuiltinScalars :: Builtins -> DsM [Var] +initBuiltinScalars bi + = mapM (uncurry externalVar) (preludeScalars $ dphModules bi) + + +preludeScalars :: Modules -> [(Module, FastString)] +preludeScalars (Modules { dph_Prelude_Int = dph_Prelude_Int + , dph_Prelude_Word8 = dph_Prelude_Word8 + , dph_Prelude_Double = dph_Prelude_Double + }) + = [ + mk dph_Prelude_Int "div" + , mk dph_Prelude_Int "mod" + , mk dph_Prelude_Int "sqrt" + ] + ++ scalars_Ord dph_Prelude_Int + ++ scalars_Num dph_Prelude_Int + + ++ scalars_Ord dph_Prelude_Word8 + ++ scalars_Num dph_Prelude_Word8 + ++ + [ mk dph_Prelude_Word8 "div" + , mk dph_Prelude_Word8 "mod" + , mk dph_Prelude_Word8 "fromInt" + , mk dph_Prelude_Word8 "toInt" + ] + + ++ scalars_Ord dph_Prelude_Double + ++ scalars_Num dph_Prelude_Double + ++ scalars_Fractional dph_Prelude_Double + ++ scalars_Floating dph_Prelude_Double + ++ scalars_RealFrac dph_Prelude_Double + where + mk mod s = (mod, fsLit s) + + scalars_Ord mod = [mk mod "==" + ,mk mod "/=" + ,mk mod "<=" + ,mk mod "<" + ,mk mod ">=" + ,mk mod ">" + ,mk mod "min" + ,mk mod "max" + ] + + scalars_Num mod = [mk mod "+" + ,mk mod "-" + ,mk mod "*" + ,mk mod "negate" + ,mk mod "abs" + ] + + scalars_Fractional mod = [mk mod "/" + ,mk mod "recip" + ] + + scalars_Floating mod = [mk mod "pi" + ,mk mod "exp" + ,mk mod "sqrt" + ,mk mod "log" + ,mk mod "sin" + ,mk mod "tan" + ,mk mod "cos" + ,mk mod "asin" + ,mk mod "atan" + ,mk mod "acos" + ,mk mod "sinh" + ,mk mod "tanh" + ,mk mod "cosh" + ,mk mod "asinh" + ,mk mod "atanh" + ,mk mod "acosh" + ,mk mod "**" + ,mk mod "logBase" + ] + + scalars_RealFrac mod = [mk mod "fromInt" + ,mk mod "truncate" + ,mk mod "round" + ,mk mod "ceiling" + ,mk mod "floor" + ] + + externalVar :: Module -> FastString -> DsM Var externalVar mod fs = dsLookupGlobalId =<< lookupOrig mod (mkVarOccFS fs) +externalFun :: Module -> FastString -> DsM CoreExpr +externalFun mod fs + = do + var <- externalVar mod fs + return $ Var var + externalTyCon :: Module -> FastString -> DsM TyCon externalTyCon mod fs - = dsLookupTyCon =<< lookupOrig mod (mkOccNameFS tcName fs) + = dsLookupTyCon =<< lookupOrig mod (mkTcOccFS fs) + +externalClassTyCon :: Module -> FastString -> DsM TyCon +externalClassTyCon mod fs = liftM classTyCon (externalClass mod fs) externalType :: Module -> FastString -> DsM Type externalType mod fs @@ -408,9 +602,9 @@ externalType mod fs tycon <- externalTyCon mod fs return $ mkTyConApp tycon [] -unitTyConName :: Name -unitTyConName = tyConName unitTyCon - +externalClass :: Module -> FastString -> DsM Class +externalClass mod fs + = dsLookupClass =<< lookupOrig mod (mkClsOccFS fs) primMethod :: TyCon -> String -> Builtins -> DsM (Maybe Var) primMethod tycon method (Builtins { dphModules = mods }) @@ -426,7 +620,7 @@ primPArray tycon (Builtins { dphModules = mods }) | Just suffix <- lookupNameEnv prim_ty_cons (tyConName tycon) = liftM Just $ dsLookupTyCon =<< lookupOrig (dph_Unboxed mods) - (mkOccName tcName $ "PArray" ++ suffix) + (mkTcOcc $ "PArray" ++ suffix) | otherwise = return Nothing