{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Data.Array.Accelerate.LLVM.Native.CodeGen.Generate
where
import Data.Array.Accelerate.Array.Sugar ( Array, Shape, Elt )
import Data.Array.Accelerate.LLVM.CodeGen.Array
import Data.Array.Accelerate.LLVM.CodeGen.Base
import Data.Array.Accelerate.LLVM.CodeGen.Environment
import Data.Array.Accelerate.LLVM.CodeGen.Exp
import Data.Array.Accelerate.LLVM.CodeGen.Monad
import Data.Array.Accelerate.LLVM.CodeGen.Sugar
import Data.Array.Accelerate.LLVM.Compile.Cache
import Data.Array.Accelerate.LLVM.Native.Target ( Native )
import Data.Array.Accelerate.LLVM.Native.CodeGen.Base
import Data.Array.Accelerate.LLVM.Native.CodeGen.Loop
mkGenerate
:: forall aenv sh e. (Shape sh, Elt e)
=> UID
-> Gamma aenv
-> IRFun1 Native aenv (sh -> e)
-> CodeGen (IROpenAcc Native aenv (Array sh e))
mkGenerate uid aenv apply =
let
(start, end, paramGang) = gangParam
(arrOut, paramOut) = mutableArray ("out" :: Name (Array sh e))
paramEnv = envParam aenv
in
makeOpenAcc uid "generate" (paramGang ++ paramOut ++ paramEnv) $ do
imapFromTo start end $ \i -> do
ix <- indexOfInt (irArrayShape arrOut) i
r <- app1 apply ix
writeArray arrOut i r
return_