module Futhark.CodeGen.ImpGen.Transpose
( mapTransposeFunction,
transposeArgs,
)
where
import Futhark.CodeGen.ImpCode
import Futhark.IR.Prop.Types
import Futhark.Util.IntegralExp
import Prelude hiding (quot)
transposeArgs ::
PrimType ->
VName ->
Count Bytes (TExp Int64) ->
VName ->
Count Bytes (TExp Int64) ->
TExp Int64 ->
TExp Int64 ->
TExp Int64 ->
[Arg]
transposeArgs :: PrimType
-> VName
-> Count Bytes (TPrimExp Int64 VName)
-> VName
-> Count Bytes (TPrimExp Int64 VName)
-> TPrimExp Int64 VName
-> TPrimExp Int64 VName
-> TPrimExp Int64 VName
-> [Arg]
transposeArgs PrimType
pt VName
destmem Count Bytes (TPrimExp Int64 VName)
destoffset VName
srcmem Count Bytes (TPrimExp Int64 VName)
srcoffset TPrimExp Int64 VName
num_arrays TPrimExp Int64 VName
m TPrimExp Int64 VName
n =
[ VName -> Arg
MemArg VName
destmem,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ Count Bytes (TPrimExp Int64 VName) -> TPrimExp Int64 VName
forall {k} (u :: k) e. Count u e -> e
unCount Count Bytes (TPrimExp Int64 VName)
destoffset TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall e. IntegralExp e => e -> e -> e
`quot` PrimType -> TPrimExp Int64 VName
forall a. Num a => PrimType -> a
primByteSize PrimType
pt,
VName -> Arg
MemArg VName
srcmem,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ Count Bytes (TPrimExp Int64 VName) -> TPrimExp Int64 VName
forall {k} (u :: k) e. Count u e -> e
unCount Count Bytes (TPrimExp Int64 VName)
srcoffset TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall e. IntegralExp e => e -> e -> e
`quot` PrimType -> TPrimExp Int64 VName
forall a. Num a => PrimType -> a
primByteSize PrimType
pt,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp Int64 VName
num_arrays,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp Int64 VName
m,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp Int64 VName
n,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName
0 :: TExp Int64),
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp Int64 VName
m,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName
0 :: TExp Int64),
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp Int64 VName
n
]
mapTransposeFunction :: Name -> PrimType -> Function op
mapTransposeFunction :: forall op. Name -> PrimType -> Function op
mapTransposeFunction Name
fname PrimType
pt =
Maybe EntryPoint -> [Param] -> [Param] -> Code op -> FunctionT op
forall a.
Maybe EntryPoint -> [Param] -> [Param] -> Code a -> FunctionT a
Function
Maybe EntryPoint
forall a. Maybe a
Nothing
[]
[Param]
params
( [Code op] -> Code op
forall a. Monoid a => [a] -> a
mconcat
[ VName -> TPrimExp Int64 VName -> Code op
forall {k} {t :: k} {a}. VName -> TPrimExp t VName -> Code a
dec VName
r (TPrimExp Int64 VName -> Code op)
-> TPrimExp Int64 VName -> Code op
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
re TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
- VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb,
VName -> TPrimExp Int64 VName -> Code op
forall {k} {t :: k} {a}. VName -> TPrimExp t VName -> Code a
dec VName
c (TPrimExp Int64 VName -> Code op)
-> TPrimExp Int64 VName -> Code op
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
ce TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
- VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb,
TExp Bool -> Code op -> Code op -> Code op
forall a. TExp Bool -> Code a -> Code a -> Code a
If (VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
num_arrays TPrimExp Int64 VName -> TPrimExp Int64 VName -> TExp Bool
forall {k} v (t :: k).
Eq v =>
TPrimExp t v -> TPrimExp t v -> TPrimExp Bool v
.==. TPrimExp Int64 VName
1) Code op
forall {a}. Code a
doTranspose Code op
forall {a}. Code a
doMapTranspose
]
)
where
params :: [Param]
params =
[ VName -> Param
memparam VName
destmem,
VName -> Param
intparam VName
destoffset,
VName -> Param
memparam VName
srcmem,
VName -> Param
intparam VName
srcoffset,
VName -> Param
intparam VName
num_arrays,
VName -> Param
intparam VName
m,
VName -> Param
intparam VName
n,
VName -> Param
intparam VName
cb,
VName -> Param
intparam VName
ce,
VName -> Param
intparam VName
rb,
VName -> Param
intparam VName
re
]
memparam :: VName -> Param
memparam VName
v = VName -> Space -> Param
MemParam VName
v Space
DefaultSpace
intparam :: VName -> Param
intparam VName
v = VName -> PrimType -> Param
ScalarParam VName
v PrimType
int64
[ VName
destmem,
VName
destoffset,
VName
srcmem,
VName
srcoffset,
VName
num_arrays,
VName
n,
VName
m,
VName
rb,
VName
re,
VName
cb,
VName
ce,
VName
r,
VName
c,
VName
i,
VName
j,
VName
val
] =
(String -> Int -> VName) -> [String] -> [Int] -> [VName]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith
(Name -> Int -> VName
VName (Name -> Int -> VName)
-> (String -> Name) -> String -> Int -> VName
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Name
nameFromString)
[ String
"destmem",
String
"destoffset",
String
"srcmem",
String
"srcoffset",
String
"num_arrays",
String
"n",
String
"m",
String
"rb",
String
"re",
String
"cb",
String
"ce",
String
"r",
String
"c",
String
"i",
String
"j",
String
"val"
]
[Int
0 ..]
dec :: VName -> TPrimExp t VName -> Code a
dec VName
v TPrimExp t VName
e = VName -> Volatility -> PrimType -> Code a
forall a. VName -> Volatility -> PrimType -> Code a
DeclareScalar VName
v Volatility
Nonvolatile PrimType
int32 Code a -> Code a -> Code a
forall a. Semigroup a => a -> a -> a
<> VName -> Exp -> Code a
forall a. VName -> Exp -> Code a
SetScalar VName
v (TPrimExp t VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp t VName
e)
naiveTranspose :: Code a
naiveTranspose =
VName -> Exp -> Code a -> Code a
forall a. VName -> Exp -> Code a -> Code a
For VName
j (TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
c) (Code a -> Code a) -> Code a -> Code a
forall a b. (a -> b) -> a -> b
$
VName -> Exp -> Code a -> Code a
forall a. VName -> Exp -> Code a -> Code a
For VName
i (TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
r) (Code a -> Code a) -> Code a -> Code a
forall a b. (a -> b) -> a -> b
$
let i' :: TPrimExp Int64 VName
i' = VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
i TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb
j' :: TPrimExp Int64 VName
j' = VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
j TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb
in [Code a] -> Code a
forall a. Monoid a => [a] -> a
mconcat
[ VName -> Volatility -> PrimType -> Code a
forall a. VName -> Volatility -> PrimType -> Code a
DeclareScalar VName
val Volatility
Nonvolatile PrimType
pt,
VName
-> VName
-> Count Elements (TPrimExp Int64 VName)
-> PrimType
-> Space
-> Volatility
-> Code a
forall a.
VName
-> VName
-> Count Elements (TPrimExp Int64 VName)
-> PrimType
-> Space
-> Volatility
-> Code a
Read
VName
val
VName
srcmem
(TPrimExp Int64 VName -> Count Elements (TPrimExp Int64 VName)
forall a. a -> Count Elements a
elements (TPrimExp Int64 VName -> Count Elements (TPrimExp Int64 VName))
-> TPrimExp Int64 VName -> Count Elements (TPrimExp Int64 VName)
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
srcoffset TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ TPrimExp Int64 VName
i' TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
* VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
m TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ TPrimExp Int64 VName
j')
PrimType
pt
Space
DefaultSpace
Volatility
Nonvolatile,
VName
-> Count Elements (TPrimExp Int64 VName)
-> PrimType
-> Space
-> Volatility
-> Exp
-> Code a
forall a.
VName
-> Count Elements (TPrimExp Int64 VName)
-> PrimType
-> Space
-> Volatility
-> Exp
-> Code a
Write
VName
destmem
(TPrimExp Int64 VName -> Count Elements (TPrimExp Int64 VName)
forall a. a -> Count Elements a
elements (TPrimExp Int64 VName -> Count Elements (TPrimExp Int64 VName))
-> TPrimExp Int64 VName -> Count Elements (TPrimExp Int64 VName)
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
destoffset TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ TPrimExp Int64 VName
j' TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
* VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
n TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ TPrimExp Int64 VName
i')
PrimType
pt
Space
DefaultSpace
Volatility
Nonvolatile
(VName -> PrimType -> Exp
var VName
val PrimType
pt)
]
recArgs :: (TPrimExp t VName, TPrimExp t VName, TPrimExp t VName,
TPrimExp t VName)
-> [Arg]
recArgs (TPrimExp t VName
cb', TPrimExp t VName
ce', TPrimExp t VName
rb', TPrimExp t VName
re') =
[ VName -> Arg
MemArg VName
destmem,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
destoffset,
VName -> Arg
MemArg VName
srcmem,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
srcoffset,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
num_arrays,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
m,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
n,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp t VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp t VName
cb',
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp t VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp t VName
ce',
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp t VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp t VName
rb',
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp t VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped TPrimExp t VName
re'
]
cutoff :: TPrimExp Int64 VName
cutoff = TPrimExp Int64 VName
64
doTranspose :: Code a
doTranspose =
[Code a] -> Code a
forall a. Monoid a => [a] -> a
mconcat
[ TExp Bool -> Code a -> Code a -> Code a
forall a. TExp Bool -> Code a -> Code a -> Code a
If
(VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
r TPrimExp Int64 VName -> TPrimExp Int64 VName -> TExp Bool
forall {k} v (t :: k).
Eq v =>
TPrimExp t v -> TPrimExp t v -> TPrimExp Bool v
.<=. TPrimExp Int64 VName
cutoff TExp Bool -> TExp Bool -> TExp Bool
forall v.
Eq v =>
TPrimExp Bool v -> TPrimExp Bool v -> TPrimExp Bool v
.&&. VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
c TPrimExp Int64 VName -> TPrimExp Int64 VName -> TExp Bool
forall {k} v (t :: k).
Eq v =>
TPrimExp t v -> TPrimExp t v -> TPrimExp Bool v
.<=. TPrimExp Int64 VName
cutoff)
Code a
forall {a}. Code a
naiveTranspose
(Code a -> Code a) -> Code a -> Code a
forall a b. (a -> b) -> a -> b
$ TExp Bool -> Code a -> Code a -> Code a
forall a. TExp Bool -> Code a -> Code a -> Code a
If
(VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
r TPrimExp Int64 VName -> TPrimExp Int64 VName -> TExp Bool
forall {k} v (t :: k).
Eq v =>
TPrimExp t v -> TPrimExp t v -> TPrimExp Bool v
.>=. VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
c)
( [VName] -> Name -> [Arg] -> Code a
forall a. [VName] -> Name -> [Arg] -> Code a
Call
[]
Name
fname
( (TPrimExp Int64 VName, TPrimExp Int64 VName, TPrimExp Int64 VName,
TPrimExp Int64 VName)
-> [Arg]
forall {k} {k} {k} {k} {t :: k} {t :: k} {t :: k} {t :: k}.
(TPrimExp t VName, TPrimExp t VName, TPrimExp t VName,
TPrimExp t VName)
-> [Arg]
recArgs
( VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
ce,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ (VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
r TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall e. IntegralExp e => e -> e -> e
`quot` TPrimExp Int64 VName
2)
)
)
Code a -> Code a -> Code a
forall a. Semigroup a => a -> a -> a
<> [VName] -> Name -> [Arg] -> Code a
forall a. [VName] -> Name -> [Arg] -> Code a
Call
[]
Name
fname
( (TPrimExp Int64 VName, TPrimExp Int64 VName, TPrimExp Int64 VName,
TPrimExp Int64 VName)
-> [Arg]
forall {k} {k} {k} {k} {t :: k} {t :: k} {t :: k} {t :: k}.
(TPrimExp t VName, TPrimExp t VName, TPrimExp t VName,
TPrimExp t VName)
-> [Arg]
recArgs
( VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
ce,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
r TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall e. IntegralExp e => e -> e -> e
`quot` TPrimExp Int64 VName
2,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
re
)
)
)
( [VName] -> Name -> [Arg] -> Code a
forall a. [VName] -> Name -> [Arg] -> Code a
Call
[]
Name
fname
( (TPrimExp Int64 VName, TPrimExp Int64 VName, TPrimExp Int64 VName,
TPrimExp Int64 VName)
-> [Arg]
forall {k} {k} {k} {k} {t :: k} {t :: k} {t :: k} {t :: k}.
(TPrimExp t VName, TPrimExp t VName, TPrimExp t VName,
TPrimExp t VName)
-> [Arg]
recArgs
( VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ (VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
c TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall e. IntegralExp e => e -> e -> e
`quot` TPrimExp Int64 VName
2),
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
re
)
)
Code a -> Code a -> Code a
forall a. Semigroup a => a -> a -> a
<> [VName] -> Name -> [Arg] -> Code a
forall a. [VName] -> Name -> [Arg] -> Code a
Call
[]
Name
fname
( (TPrimExp Int64 VName, TPrimExp Int64 VName, TPrimExp Int64 VName,
TPrimExp Int64 VName)
-> [Arg]
forall {k} {k} {k} {k} {t :: k} {t :: k} {t :: k} {t :: k}.
(TPrimExp t VName, TPrimExp t VName, TPrimExp t VName,
TPrimExp t VName)
-> [Arg]
recArgs
( VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
c TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall e. IntegralExp e => e -> e -> e
`quot` TPrimExp Int64 VName
2,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
ce,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb,
VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
re
)
)
)
]
doMapTranspose :: Code a
doMapTranspose =
VName -> Exp -> Code a -> Code a
forall a. VName -> Exp -> Code a -> Code a
For VName
i (TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
num_arrays) (Code a -> Code a) -> Code a -> Code a
forall a b. (a -> b) -> a -> b
$
[VName] -> Name -> [Arg] -> Code a
forall a. [VName] -> Name -> [Arg] -> Code a
Call
[]
Name
fname
[ VName -> Arg
MemArg VName
destmem,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
destoffset TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
i TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
* VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
m TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
* VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
n,
VName -> Arg
MemArg VName
srcmem,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
srcoffset TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
+ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
i TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
* VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
m TPrimExp Int64 VName
-> TPrimExp Int64 VName -> TPrimExp Int64 VName
forall a. Num a => a -> a -> a
* VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
n,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName
1 :: TExp Int64),
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
m,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
n,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
cb,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
ce,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
rb,
Exp -> Arg
ExpArg (Exp -> Arg) -> Exp -> Arg
forall a b. (a -> b) -> a -> b
$ TPrimExp Int64 VName -> Exp
forall {k} (t :: k) v. TPrimExp t v -> PrimExp v
untyped (TPrimExp Int64 VName -> Exp) -> TPrimExp Int64 VName -> Exp
forall a b. (a -> b) -> a -> b
$ VName -> TPrimExp Int64 VName
forall a. a -> TPrimExp Int64 a
le64 VName
re
]