{-# OPTIONS_GHC -fno-warn-orphans #-}
-- |
-- Module      : Data.Array.Accelerate.LLVM.Native.CodeGen
-- Copyright   : [2014..2020] The Accelerate Team
-- License     : BSD3
--
-- Maintainer  : Trevor L. McDonell <trevor.mcdonell@gmail.com>
-- Stability   : experimental
-- Portability : non-portable (GHC extensions)
--

module Data.Array.Accelerate.LLVM.Native.CodeGen (

  KernelMetadata(..),

) where

-- accelerate
import Data.Array.Accelerate.LLVM.CodeGen

import Data.Array.Accelerate.LLVM.Native.CodeGen.Base
import Data.Array.Accelerate.LLVM.Native.CodeGen.Fold
import Data.Array.Accelerate.LLVM.Native.CodeGen.FoldSeg
import Data.Array.Accelerate.LLVM.Native.CodeGen.Generate
import Data.Array.Accelerate.LLVM.Native.CodeGen.Map
import Data.Array.Accelerate.LLVM.Native.CodeGen.Permute
import Data.Array.Accelerate.LLVM.Native.CodeGen.Scan
import Data.Array.Accelerate.LLVM.Native.CodeGen.Stencil
import Data.Array.Accelerate.LLVM.Native.CodeGen.Transform
import Data.Array.Accelerate.LLVM.Native.Target


instance Skeleton Native where
  map :: UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> TypeR b
-> IRFun1 Native aenv (a -> b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh b))
map         = UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> TypeR b
-> IRFun1 Native aenv (a -> b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh b))
forall aenv sh a b.
UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> TypeR b
-> IRFun1 Native aenv (a -> b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh b))
mkMap
  generate :: UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun1 Native aenv (sh -> e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh e))
generate    = UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun1 Native aenv (sh -> e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh e))
forall aenv sh e.
UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun1 Native aenv (sh -> e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh e))
mkGenerate
  transform :: UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> ArrayR (Array sh' b)
-> IRFun1 Native aenv (sh' -> sh)
-> IRFun1 Native aenv (a -> b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh' b))
transform   = UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> ArrayR (Array sh' b)
-> IRFun1 Native aenv (sh' -> sh)
-> IRFun1 Native aenv (a -> b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh' b))
forall aenv sh a sh' b.
UID
-> Gamma aenv
-> ArrayR (Array sh a)
-> ArrayR (Array sh' b)
-> IRFun1 Native aenv (sh' -> sh)
-> IRFun1 Native aenv (a -> b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh' b))
mkTransform
  fold :: UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh e))
fold        = UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh e))
forall aenv sh e.
UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh e))
mkFold
  foldSeg :: UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> IntegralType i
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> MIRDelayed Native aenv (Segments i)
-> CodeGen Native (IROpenAcc Native aenv (Array (sh, Int) e))
foldSeg     = UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> IntegralType i
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> MIRDelayed Native aenv (Segments i)
-> CodeGen Native (IROpenAcc Native aenv (Array (sh, Int) e))
forall aenv sh e i.
UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> IntegralType i
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> MIRDelayed Native aenv (Segments i)
-> CodeGen Native (IROpenAcc Native aenv (Array (sh, Int) e))
mkFoldSeg
  scan :: UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen Native (IROpenAcc Native aenv (Array (sh, Int) e))
scan        = UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen Native (IROpenAcc Native aenv (Array (sh, Int) e))
forall aenv sh e.
UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 Native aenv (e -> e -> e)
-> Maybe (IRExp Native aenv e)
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen Native (IROpenAcc Native aenv (Array (sh, Int) e))
mkScan
  scan' :: UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 Native aenv (e -> e -> e)
-> IRExp Native aenv e
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen
     Native (IROpenAcc Native aenv (Array (sh, Int) e, Array sh e))
scan'       = UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 Native aenv (e -> e -> e)
-> IRExp Native aenv e
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen
     Native (IROpenAcc Native aenv (Array (sh, Int) e, Array sh e))
forall aenv sh e.
UID
-> Gamma aenv
-> ArrayR (Array (sh, Int) e)
-> Direction
-> IRFun2 Native aenv (e -> e -> e)
-> IRExp Native aenv e
-> MIRDelayed Native aenv (Array (sh, Int) e)
-> CodeGen
     Native (IROpenAcc Native aenv (Array (sh, Int) e, Array sh e))
mkScan'
  permute :: UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> ShapeR sh'
-> IRPermuteFun Native aenv (e -> e -> e)
-> IRFun1 Native aenv (sh -> PrimMaybe sh')
-> MIRDelayed Native aenv (Array sh e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh' e))
permute     = UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> ShapeR sh'
-> IRPermuteFun Native aenv (e -> e -> e)
-> IRFun1 Native aenv (sh -> PrimMaybe sh')
-> MIRDelayed Native aenv (Array sh e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh' e))
forall aenv sh e sh'.
HasCallStack =>
UID
-> Gamma aenv
-> ArrayR (Array sh e)
-> ShapeR sh'
-> IRPermuteFun Native aenv (e -> e -> e)
-> IRFun1 Native aenv (sh -> PrimMaybe sh')
-> MIRDelayed Native aenv (Array sh e)
-> CodeGen Native (IROpenAcc Native aenv (Array sh' e))
mkPermute
  stencil1 :: UID
-> Gamma aenv
-> StencilR sh a stencil
-> TypeR b
-> IRFun1 Native aenv (stencil -> b)
-> IRBoundary Native aenv (Array sh a)
-> MIRDelayed Native aenv (Array sh a)
-> CodeGen Native (IROpenAcc Native aenv (Array sh b))
stencil1    = UID
-> Gamma aenv
-> StencilR sh a stencil
-> TypeR b
-> IRFun1 Native aenv (stencil -> b)
-> IRBoundary Native aenv (Array sh a)
-> MIRDelayed Native aenv (Array sh a)
-> CodeGen Native (IROpenAcc Native aenv (Array sh b))
forall aenv sh a stencil b.
UID
-> Gamma aenv
-> StencilR sh a stencil
-> TypeR b
-> IRFun1 Native aenv (stencil -> b)
-> IRBoundary Native aenv (Array sh a)
-> MIRDelayed Native aenv (Array sh a)
-> CodeGen Native (IROpenAcc Native aenv (Array sh b))
mkStencil1
  stencil2 :: UID
-> Gamma aenv
-> StencilR sh a stencil1
-> StencilR sh b stencil2
-> TypeR c
-> IRFun2 Native aenv (stencil1 -> stencil2 -> c)
-> IRBoundary Native aenv (Array sh a)
-> MIRDelayed Native aenv (Array sh a)
-> IRBoundary Native aenv (Array sh b)
-> MIRDelayed Native aenv (Array sh b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh c))
stencil2    = UID
-> Gamma aenv
-> StencilR sh a stencil1
-> StencilR sh b stencil2
-> TypeR c
-> IRFun2 Native aenv (stencil1 -> stencil2 -> c)
-> IRBoundary Native aenv (Array sh a)
-> MIRDelayed Native aenv (Array sh a)
-> IRBoundary Native aenv (Array sh b)
-> MIRDelayed Native aenv (Array sh b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh c))
forall aenv sh a stencil1 b stencil2 c.
UID
-> Gamma aenv
-> StencilR sh a stencil1
-> StencilR sh b stencil2
-> TypeR c
-> IRFun2 Native aenv (stencil1 -> stencil2 -> c)
-> IRBoundary Native aenv (Array sh a)
-> MIRDelayed Native aenv (Array sh a)
-> IRBoundary Native aenv (Array sh b)
-> MIRDelayed Native aenv (Array sh b)
-> CodeGen Native (IROpenAcc Native aenv (Array sh c))
mkStencil2