{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeApplications #-}
module Data.Array.Accelerate.LLVM.Native.CodeGen.Loop
where
import Data.Array.Accelerate.Representation.Type
import Data.Array.Accelerate.Representation.Shape
import Data.Array.Accelerate.LLVM.CodeGen.Arithmetic
import Data.Array.Accelerate.LLVM.CodeGen.Exp
import Data.Array.Accelerate.LLVM.CodeGen.IR
import Data.Array.Accelerate.LLVM.CodeGen.Monad
import qualified Data.Array.Accelerate.LLVM.CodeGen.Loop as Loop
import Data.Array.Accelerate.LLVM.Native.Target ( Native )
imapFromTo
:: Operands Int
-> Operands Int
-> (Operands Int -> CodeGen Native ())
-> CodeGen Native ()
imapFromTo :: Operands Int
-> Operands Int
-> (Operands Int -> CodeGen Native ())
-> CodeGen Native ()
imapFromTo Operands Int
start Operands Int
end Operands Int -> CodeGen Native ()
body =
Operands Int
-> Operands Int
-> Operands Int
-> (Operands Int -> CodeGen Native ())
-> CodeGen Native ()
forall i arch.
IsNum i =>
Operands i
-> Operands i
-> Operands i
-> (Operands i -> CodeGen arch ())
-> CodeGen arch ()
Loop.imapFromStepTo Operands Int
start (Int -> Operands Int
liftInt Int
1) Operands Int
end Operands Int -> CodeGen Native ()
body
imapNestFromTo
:: ShapeR sh
-> Operands sh
-> Operands sh
-> Operands sh
-> (Operands sh -> Operands Int -> CodeGen Native ())
-> CodeGen Native ()
imapNestFromTo :: ShapeR sh
-> Operands sh
-> Operands sh
-> Operands sh
-> (Operands sh -> Operands Int -> CodeGen Native ())
-> CodeGen Native ()
imapNestFromTo ShapeR sh
shr Operands sh
start Operands sh
end Operands sh
extent Operands sh -> Operands Int -> CodeGen Native ()
body =
ShapeR sh
-> Operands sh
-> Operands sh
-> (Operands sh -> CodeGen Native ())
-> CodeGen Native ()
forall t.
ShapeR t
-> Operands t
-> Operands t
-> (Operands t -> CodeGen Native ())
-> CodeGen Native ()
go ShapeR sh
shr Operands sh
start Operands sh
end Operands sh -> CodeGen Native ()
body'
where
body' :: Operands sh -> CodeGen Native ()
body' Operands sh
ix = Operands sh -> Operands Int -> CodeGen Native ()
body Operands sh
ix (Operands Int -> CodeGen Native ())
-> CodeGen Native (Operands Int) -> CodeGen Native ()
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< ShapeR sh
-> Operands sh -> Operands sh -> CodeGen Native (Operands Int)
forall sh arch.
ShapeR sh
-> Operands sh -> Operands sh -> CodeGen arch (Operands Int)
intOfIndex ShapeR sh
shr Operands sh
extent Operands sh
ix
go :: ShapeR t -> Operands t -> Operands t -> (Operands t -> CodeGen Native ()) -> CodeGen Native ()
go :: ShapeR t
-> Operands t
-> Operands t
-> (Operands t -> CodeGen Native ())
-> CodeGen Native ()
go ShapeR t
ShapeRz Operands t
OP_Unit Operands t
OP_Unit Operands t -> CodeGen Native ()
k
= Operands t -> CodeGen Native ()
k Operands t
Operands ()
OP_Unit
go (ShapeRsnoc ShapeR sh1
shr') (OP_Pair ssh ssz) (OP_Pair esh esz) Operands t -> CodeGen Native ()
k
= ShapeR sh1
-> Operands sh1
-> Operands sh1
-> (Operands sh1 -> CodeGen Native ())
-> CodeGen Native ()
forall t.
ShapeR t
-> Operands t
-> Operands t
-> (Operands t -> CodeGen Native ())
-> CodeGen Native ()
go ShapeR sh1
shr' Operands sh1
ssh Operands sh1
esh
((Operands sh1 -> CodeGen Native ()) -> CodeGen Native ())
-> (Operands sh1 -> CodeGen Native ()) -> CodeGen Native ()
forall a b. (a -> b) -> a -> b
$ \Operands sh1
sz -> Operands Int
-> Operands Int
-> (Operands Int -> CodeGen Native ())
-> CodeGen Native ()
imapFromTo Operands Int
ssz Operands Int
esz
((Operands Int -> CodeGen Native ()) -> CodeGen Native ())
-> (Operands Int -> CodeGen Native ()) -> CodeGen Native ()
forall a b. (a -> b) -> a -> b
$ \Operands Int
i -> Operands t -> CodeGen Native ()
k (Operands sh1 -> Operands Int -> Operands (sh1, Int)
forall a b. Operands a -> Operands b -> Operands (a, b)
OP_Pair Operands sh1
sz Operands Int
i)
iterFromTo
:: TypeR a
-> Operands Int
-> Operands Int
-> Operands a
-> (Operands Int -> Operands a -> CodeGen Native (Operands a))
-> CodeGen Native (Operands a)
iterFromTo :: TypeR a
-> Operands Int
-> Operands Int
-> Operands a
-> (Operands Int -> Operands a -> CodeGen Native (Operands a))
-> CodeGen Native (Operands a)
iterFromTo TypeR a
tp Operands Int
start Operands Int
end Operands a
seed Operands Int -> Operands a -> CodeGen Native (Operands a)
body =
TypeR a
-> Operands Int
-> Operands Int
-> Operands Int
-> Operands a
-> (Operands Int -> Operands a -> CodeGen Native (Operands a))
-> CodeGen Native (Operands a)
forall i a arch.
IsNum i =>
TypeR a
-> Operands i
-> Operands i
-> Operands i
-> Operands a
-> (Operands i -> Operands a -> CodeGen arch (Operands a))
-> CodeGen arch (Operands a)
Loop.iterFromStepTo TypeR a
tp Operands Int
start (Int -> Operands Int
liftInt Int
1) Operands Int
end Operands a
seed Operands Int -> Operands a -> CodeGen Native (Operands a)
body