{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} module LLVM.DSL.Expression.Vector where import qualified LLVM.DSL.Expression as Expr import LLVM.DSL.Expression (Exp) import qualified LLVM.Extra.Multi.Value.Vector as MultiValueVec import qualified LLVM.Extra.Multi.Value as MultiValue import qualified LLVM.Extra.Multi.Vector.Instance as MultiVectorInst import qualified LLVM.Extra.Multi.Vector as MultiVector import qualified LLVM.Extra.Arithmetic as A import qualified LLVM.Core as LLVM import qualified Data.Tuple.HT as Tuple import Prelude hiding (replicate, take, zip, fst, snd, min, max) cons :: (LLVM.Positive n, MultiVector.C a) => LLVM.Vector n a -> Exp (LLVM.Vector n a) cons :: forall n a. (Positive n, C a) => Vector n a -> Exp (Vector n a) cons = T (Vector n a) -> Exp (Vector n a) forall a. T a -> Exp a forall (val :: * -> *) a. Value val => T a -> val a Expr.lift0 (T (Vector n a) -> Exp (Vector n a)) -> (Vector n a -> T (Vector n a)) -> Vector n a -> Exp (Vector n a) forall b c a. (b -> c) -> (a -> b) -> a -> c . Vector n a -> T (Vector n a) forall n a. (Positive n, C a) => Vector n a -> MVVector n a MultiValueVec.cons fst :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b) => Exp (LLVM.Vector n (a,b)) -> Exp (LLVM.Vector n a) fst :: forall n a b. (Positive n, C a, C b) => Exp (Vector n (a, b)) -> Exp (Vector n a) fst = (T (Vector n (a, b)) -> T (Vector n a)) -> Exp (Vector n (a, b)) -> Exp (Vector n a) forall a b. (T a -> T b) -> Exp a -> Exp b forall (val :: * -> *) a b. Value val => (T a -> T b) -> val a -> val b Expr.lift1 T (Vector n (a, b)) -> T (Vector n a) forall n a b. MVVector n (a, b) -> MVVector n a MultiValueVec.fst snd :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b) => Exp (LLVM.Vector n (a,b)) -> Exp (LLVM.Vector n b) snd :: forall n a b. (Positive n, C a, C b) => Exp (Vector n (a, b)) -> Exp (Vector n b) snd = (T (Vector n (a, b)) -> T (Vector n b)) -> Exp (Vector n (a, b)) -> Exp (Vector n b) forall a b. (T a -> T b) -> Exp a -> Exp b forall (val :: * -> *) a b. Value val => (T a -> T b) -> val a -> val b Expr.lift1 T (Vector n (a, b)) -> T (Vector n b) forall n a b. MVVector n (a, b) -> MVVector n b MultiValueVec.snd swap :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b) => Exp (LLVM.Vector n (a,b)) -> Exp (LLVM.Vector n (b,a)) swap :: forall n a b. (Positive n, C a, C b) => Exp (Vector n (a, b)) -> Exp (Vector n (b, a)) swap = (T (Vector n (a, b)) -> T (Vector n (b, a))) -> Exp (Vector n (a, b)) -> Exp (Vector n (b, a)) forall a b. (T a -> T b) -> Exp a -> Exp b forall (val :: * -> *) a b. Value val => (T a -> T b) -> val a -> val b Expr.lift1 T (Vector n (a, b)) -> T (Vector n (b, a)) forall n a b. MVVector n (a, b) -> MVVector n (b, a) MultiValueVec.swap mapFst :: (Exp (LLVM.Vector n a0) -> Exp (LLVM.Vector n a1)) -> Exp (LLVM.Vector n (a0,b)) -> Exp (LLVM.Vector n (a1,b)) mapFst :: forall n a0 a1 b. (Exp (Vector n a0) -> Exp (Vector n a1)) -> Exp (Vector n (a0, b)) -> Exp (Vector n (a1, b)) mapFst Exp (Vector n a0) -> Exp (Vector n a1) f = (forall r. Repr (Vector n (a0, b)) -> CodeGenFunction r (Repr (Vector n (a1, b)))) -> Exp (Vector n (a0, b)) -> Exp (Vector n (a1, b)) forall a b. (forall r. Repr a -> CodeGenFunction r (Repr b)) -> Exp a -> Exp b Expr.liftReprM (\(Repr n a0 a0,Repr n b b) -> do MultiValue.Cons Repr (Vector n a1) a1 <- (Exp (Vector n a0) -> Exp (Vector n a1)) -> T (Vector n a0) -> CodeGenFunction r (T (Vector n a1)) forall ae am be bm r. (Aggregate ae am, Aggregate be bm) => (ae -> be) -> am -> CodeGenFunction r bm Expr.unliftM1 Exp (Vector n a0) -> Exp (Vector n a1) f (T (Vector n a0) -> CodeGenFunction r (T (Vector n a1))) -> T (Vector n a0) -> CodeGenFunction r (T (Vector n a1)) forall a b. (a -> b) -> a -> b $ Repr (Vector n a0) -> T (Vector n a0) forall a. Repr a -> T a MultiValue.Cons Repr (Vector n a0) Repr n a0 a0 (Repr n a1, Repr n b) -> CodeGenFunction r (Repr n a1, Repr n b) forall a. a -> CodeGenFunction r a forall (m :: * -> *) a. Monad m => a -> m a return (Repr (Vector n a1) Repr n a1 a1,Repr n b b)) mapSnd :: (Exp (LLVM.Vector n b0) -> Exp (LLVM.Vector n b1)) -> Exp (LLVM.Vector n (a,b0)) -> Exp (LLVM.Vector n (a,b1)) mapSnd :: forall n b0 b1 a. (Exp (Vector n b0) -> Exp (Vector n b1)) -> Exp (Vector n (a, b0)) -> Exp (Vector n (a, b1)) mapSnd Exp (Vector n b0) -> Exp (Vector n b1) f = (forall r. Repr (Vector n (a, b0)) -> CodeGenFunction r (Repr (Vector n (a, b1)))) -> Exp (Vector n (a, b0)) -> Exp (Vector n (a, b1)) forall a b. (forall r. Repr a -> CodeGenFunction r (Repr b)) -> Exp a -> Exp b Expr.liftReprM (\(Repr n a a,Repr n b0 b0) -> do MultiValue.Cons Repr (Vector n b1) b1 <- (Exp (Vector n b0) -> Exp (Vector n b1)) -> T (Vector n b0) -> CodeGenFunction r (T (Vector n b1)) forall ae am be bm r. (Aggregate ae am, Aggregate be bm) => (ae -> be) -> am -> CodeGenFunction r bm Expr.unliftM1 Exp (Vector n b0) -> Exp (Vector n b1) f (T (Vector n b0) -> CodeGenFunction r (T (Vector n b1))) -> T (Vector n b0) -> CodeGenFunction r (T (Vector n b1)) forall a b. (a -> b) -> a -> b $ Repr (Vector n b0) -> T (Vector n b0) forall a. Repr a -> T a MultiValue.Cons Repr (Vector n b0) Repr n b0 b0 (Repr n a, Repr n b1) -> CodeGenFunction r (Repr n a, Repr n b1) forall a. a -> CodeGenFunction r a forall (m :: * -> *) a. Monad m => a -> m a return (Repr n a a,Repr (Vector n b1) Repr n b1 b1)) fst3 :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) => Exp (LLVM.Vector n (a,b,c)) -> Exp (LLVM.Vector n a) fst3 :: forall n a b c. (Positive n, C a, C b, C c) => Exp (Vector n (a, b, c)) -> Exp (Vector n a) fst3 = (T (Vector n (a, b, c)) -> T (Vector n a)) -> Exp (Vector n (a, b, c)) -> Exp (Vector n a) forall a b. (T a -> T b) -> Exp a -> Exp b forall (val :: * -> *) a b. Value val => (T a -> T b) -> val a -> val b Expr.lift1 T (Vector n (a, b, c)) -> T (Vector n a) forall n a b c. MVVector n (a, b, c) -> MVVector n a MultiValueVec.fst3 snd3 :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) => Exp (LLVM.Vector n (a,b,c)) -> Exp (LLVM.Vector n b) snd3 :: forall n a b c. (Positive n, C a, C b, C c) => Exp (Vector n (a, b, c)) -> Exp (Vector n b) snd3 = (T (Vector n (a, b, c)) -> T (Vector n b)) -> Exp (Vector n (a, b, c)) -> Exp (Vector n b) forall a b. (T a -> T b) -> Exp a -> Exp b forall (val :: * -> *) a b. Value val => (T a -> T b) -> val a -> val b Expr.lift1 T (Vector n (a, b, c)) -> T (Vector n b) forall n a b c. MVVector n (a, b, c) -> MVVector n b MultiValueVec.snd3 thd3 :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) => Exp (LLVM.Vector n (a,b,c)) -> Exp (LLVM.Vector n c) thd3 :: forall n a b c. (Positive n, C a, C b, C c) => Exp (Vector n (a, b, c)) -> Exp (Vector n c) thd3 = (T (Vector n (a, b, c)) -> T (Vector n c)) -> Exp (Vector n (a, b, c)) -> Exp (Vector n c) forall a b. (T a -> T b) -> Exp a -> Exp b forall (val :: * -> *) a b. Value val => (T a -> T b) -> val a -> val b Expr.lift1 T (Vector n (a, b, c)) -> T (Vector n c) forall n a b c. MVVector n (a, b, c) -> MVVector n c MultiValueVec.thd3 zip :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b) => Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n b) -> Exp (LLVM.Vector n (a,b)) zip :: forall n a b. (Positive n, C a, C b) => Exp (Vector n a) -> Exp (Vector n b) -> Exp (Vector n (a, b)) zip = (T (Vector n a) -> T (Vector n b) -> T (Vector n (a, b))) -> Exp (Vector n a) -> Exp (Vector n b) -> Exp (Vector n (a, b)) forall a b c. (T a -> T b -> T c) -> Exp a -> Exp b -> Exp c forall (val :: * -> *) a b c. Value val => (T a -> T b -> T c) -> val a -> val b -> val c Expr.lift2 T (Vector n a) -> T (Vector n b) -> T (Vector n (a, b)) forall n a b. MVVector n a -> MVVector n b -> MVVector n (a, b) MultiValueVec.zip zip3 :: (LLVM.Positive n, MultiVector.C a, MultiVector.C b, MultiVector.C c) => Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n b) -> Exp (LLVM.Vector n c) -> Exp (LLVM.Vector n (a,b,c)) zip3 :: forall n a b c. (Positive n, C a, C b, C c) => Exp (Vector n a) -> Exp (Vector n b) -> Exp (Vector n c) -> Exp (Vector n (a, b, c)) zip3 = (T (Vector n a) -> T (Vector n b) -> T (Vector n c) -> T (Vector n (a, b, c))) -> Exp (Vector n a) -> Exp (Vector n b) -> Exp (Vector n c) -> Exp (Vector n (a, b, c)) forall (val :: * -> *) a b c d. Value val => (T a -> T b -> T c -> T d) -> val a -> val b -> val c -> val d Expr.lift3 T (Vector n a) -> T (Vector n b) -> T (Vector n c) -> T (Vector n (a, b, c)) forall n a b c. MVVector n a -> MVVector n b -> MVVector n c -> MVVector n (a, b, c) MultiValueVec.zip3 replicate :: (LLVM.Positive n, MultiVector.C a) => Exp a -> Exp (LLVM.Vector n a) replicate :: forall n a. (Positive n, C a) => Exp a -> Exp (Vector n a) replicate = (forall r. T a -> CodeGenFunction r (T (Vector n a))) -> Exp a -> Exp (Vector n a) forall ae am b. Aggregate ae am => (forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b Expr.liftM T a -> CodeGenFunction r (T (Vector n a)) forall r. T a -> CodeGenFunction r (T (Vector n a)) forall n a r. (Positive n, C a) => T a -> CodeGenFunction r (MVVector n a) MultiValueVec.replicate iterate :: (LLVM.Positive n, MultiVector.C a) => (Exp a -> Exp a) -> Exp a -> Exp (LLVM.Vector n a) iterate :: forall n a. (Positive n, C a) => (Exp a -> Exp a) -> Exp a -> Exp (Vector n a) iterate Exp a -> Exp a f = (forall r. T a -> CodeGenFunction r (T (Vector n a))) -> Exp a -> Exp (Vector n a) forall ae am b. Aggregate ae am => (forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b Expr.liftM ((T a -> CodeGenFunction r (T a)) -> T a -> CodeGenFunction r (T (Vector n a)) forall n a r. (Positive n, C a) => (T a -> CodeGenFunction r (T a)) -> T a -> CodeGenFunction r (MVVector n a) MultiValueVec.iterate ((Exp a -> Exp a) -> T a -> CodeGenFunction r (T a) forall ae am be bm r. (Aggregate ae am, Aggregate be bm) => (ae -> be) -> am -> CodeGenFunction r bm Expr.unliftM1 Exp a -> Exp a f)) take :: (LLVM.Positive n, LLVM.Positive m, MultiVector.Select a) => Exp (LLVM.Vector n a) -> Exp (LLVM.Vector m a) take :: forall n m a. (Positive n, Positive m, Select a) => Exp (Vector n a) -> Exp (Vector m a) take = (forall r. MVVector n a -> CodeGenFunction r (T (Vector m a))) -> Exp (Vector n a) -> Exp (Vector m a) forall ae am b. Aggregate ae am => (forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b Expr.liftM MVVector n a -> CodeGenFunction r (T (Vector m a)) forall r. MVVector n a -> CodeGenFunction r (T (Vector m a)) forall n m a r. (Positive n, Positive m, C a) => MVVector n a -> CodeGenFunction r (MVVector m a) MultiValueVec.take takeRev :: (LLVM.Positive n, LLVM.Positive m, MultiVector.Select a) => Exp (LLVM.Vector n a) -> Exp (LLVM.Vector m a) takeRev :: forall n m a. (Positive n, Positive m, Select a) => Exp (Vector n a) -> Exp (Vector m a) takeRev = (forall r. MVVector n a -> CodeGenFunction r (T (Vector m a))) -> Exp (Vector n a) -> Exp (Vector m a) forall ae am b. Aggregate ae am => (forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b Expr.liftM MVVector n a -> CodeGenFunction r (T (Vector m a)) forall r. MVVector n a -> CodeGenFunction r (T (Vector m a)) forall n m a r. (Positive n, Positive m, C a) => MVVector n a -> CodeGenFunction r (MVVector m a) MultiValueVec.takeRev cumulate :: (LLVM.Positive n, MultiVector.Additive a) => Exp a -> Exp (LLVM.Vector n a) -> (Exp a, Exp (LLVM.Vector n a)) cumulate :: forall n a. (Positive n, Additive a) => Exp a -> Exp (Vector n a) -> (Exp a, Exp (Vector n a)) cumulate Exp a a0 Exp (Vector n a) v0 = Exp (a, Vector n a) -> (Exp a, Exp (Vector n a)) forall (val :: * -> *) a b. Value val => val (a, b) -> (val a, val b) Expr.unzip (Exp (a, Vector n a) -> (Exp a, Exp (Vector n a))) -> Exp (a, Vector n a) -> (Exp a, Exp (Vector n a)) forall a b. (a -> b) -> a -> b $ (forall r. T a -> MVVector n a -> CodeGenFunction r (T (a, Vector n a))) -> Exp a -> Exp (Vector n a) -> Exp (a, Vector n a) forall ae am be bm c. (Aggregate ae am, Aggregate be bm) => (forall r. am -> bm -> CodeGenFunction r (T c)) -> ae -> be -> Exp c Expr.liftM2 (\T a a MVVector n a v -> ((T a, T n a) -> T (a, Vector n a)) -> CodeGenFunction r (T a, T n a) -> CodeGenFunction r (T (a, Vector n a)) forall a b. (a -> b) -> CodeGenFunction r a -> CodeGenFunction r b forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap ((T a -> MVVector n a -> T (a, Vector n a)) -> (T a, MVVector n a) -> T (a, Vector n a) forall a b c. (a -> b -> c) -> (a, b) -> c uncurry T a -> MVVector n a -> T (a, Vector n a) forall a b. T a -> T b -> T (a, b) MultiValue.zip ((T a, MVVector n a) -> T (a, Vector n a)) -> ((T a, T n a) -> (T a, MVVector n a)) -> (T a, T n a) -> T (a, Vector n a) forall b c a. (b -> c) -> (a -> b) -> a -> c . (T n a -> MVVector n a) -> (T a, T n a) -> (T a, MVVector n a) forall b c a. (b -> c) -> (a, b) -> (a, c) Tuple.mapSnd T n a -> MVVector n a forall n a. T n a -> MVVector n a MultiVectorInst.toMultiValue) (CodeGenFunction r (T a, T n a) -> CodeGenFunction r (T (a, Vector n a))) -> CodeGenFunction r (T a, T n a) -> CodeGenFunction r (T (a, Vector n a)) forall a b. (a -> b) -> a -> b $ T a -> T n a -> CodeGenFunction r (T a, T n a) forall n a r. (Positive n, Additive a) => T a -> T n a -> CodeGenFunction r (T a, T n a) MultiVector.cumulate T a a (T n a -> CodeGenFunction r (T a, T n a)) -> T n a -> CodeGenFunction r (T a, T n a) forall a b. (a -> b) -> a -> b $ MVVector n a -> T n a forall n a. MVVector n a -> T n a MultiVectorInst.fromMultiValue MVVector n a v) Exp a a0 Exp (Vector n a) v0 cmp :: (LLVM.Positive n, MultiVector.Comparison a) => LLVM.CmpPredicate -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n Bool) cmp :: forall n a. (Positive n, Comparison a) => CmpPredicate -> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n Bool) cmp CmpPredicate ord = (forall r. MVVector n a -> MVVector n a -> CodeGenFunction r (T (Vector n Bool))) -> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n Bool) forall ae am be bm c. (Aggregate ae am, Aggregate be bm) => (forall r. am -> bm -> CodeGenFunction r (T c)) -> ae -> be -> Exp c Expr.liftM2 (CmpPredicate -> MVVector n a -> MVVector n a -> CodeGenFunction r (T (Vector n Bool)) forall n a r. (Positive n, Comparison a) => CmpPredicate -> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n Bool) MultiValueVec.cmp CmpPredicate ord) select :: (LLVM.Positive n, MultiVector.Select a) => Exp (LLVM.Vector n Bool) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) select :: forall n a. (Positive n, Select a) => Exp (Vector n Bool) -> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) select = (forall r. MVVector n Bool -> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n a)) -> Exp (Vector n Bool) -> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) forall ae am be bm ce cm d. (Aggregate ae am, Aggregate be bm, Aggregate ce cm) => (forall r. am -> bm -> cm -> CodeGenFunction r (T d)) -> ae -> be -> ce -> Exp d Expr.liftM3 MVVector n Bool -> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n a) forall r. MVVector n Bool -> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n a) forall n a r. (Positive n, Select a) => MVVector n Bool -> MVVector n a -> MVVector n a -> CodeGenFunction r (MVVector n a) MultiValueVec.select min, max :: (LLVM.Positive n, MultiVector.Real a) => Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) min :: forall n a. (Positive n, Real a) => Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) min = (forall r. T (Vector n a) -> T (Vector n a) -> CodeGenFunction r (T (Vector n a))) -> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) forall ae am be bm c. (Aggregate ae am, Aggregate be bm) => (forall r. am -> bm -> CodeGenFunction r (T c)) -> ae -> be -> Exp c Expr.liftM2 T (Vector n a) -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)) forall a r. Real a => a -> a -> CodeGenFunction r a forall r. T (Vector n a) -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)) A.min max :: forall n a. (Positive n, Real a) => Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) max = (forall r. T (Vector n a) -> T (Vector n a) -> CodeGenFunction r (T (Vector n a))) -> Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) forall ae am be bm c. (Aggregate ae am, Aggregate be bm) => (forall r. am -> bm -> CodeGenFunction r (T c)) -> ae -> be -> Exp c Expr.liftM2 T (Vector n a) -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)) forall a r. Real a => a -> a -> CodeGenFunction r a forall r. T (Vector n a) -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)) A.max limit :: (LLVM.Positive n, MultiVector.Real a) => (Exp (LLVM.Vector n a), Exp (LLVM.Vector n a)) -> Exp (LLVM.Vector n a) -> Exp (LLVM.Vector n a) limit :: forall n a. (Positive n, Real a) => (Exp (Vector n a), Exp (Vector n a)) -> Exp (Vector n a) -> Exp (Vector n a) limit (Exp (Vector n a) l,Exp (Vector n a) u) = Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) forall n a. (Positive n, Real a) => Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) max Exp (Vector n a) l (Exp (Vector n a) -> Exp (Vector n a)) -> (Exp (Vector n a) -> Exp (Vector n a)) -> Exp (Vector n a) -> Exp (Vector n a) forall b c a. (b -> c) -> (a -> b) -> a -> c . Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) forall n a. (Positive n, Real a) => Exp (Vector n a) -> Exp (Vector n a) -> Exp (Vector n a) min Exp (Vector n a) u fromIntegral :: (MultiValueVec.NativeInteger i ir, MultiValueVec.NativeFloating a ar, LLVM.ShapeOf ir ~ LLVM.ShapeOf ar) => Exp i -> Exp a fromIntegral :: forall i ir a ar. (NativeInteger i ir, NativeFloating a ar, ShapeOf ir ~ ShapeOf ar) => Exp i -> Exp a fromIntegral = (forall r. T i -> CodeGenFunction r (T a)) -> Exp i -> Exp a forall ae am b. Aggregate ae am => (forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b Expr.liftM T i -> CodeGenFunction r (T a) forall r. T i -> CodeGenFunction r (T a) forall i ir a ar r. (NativeInteger i ir, NativeFloating a ar, ShapeOf ir ~ ShapeOf ar) => T i -> CodeGenFunction r (T a) MultiValueVec.fromIntegral truncateToInt :: (MultiValueVec.NativeInteger i ir, MultiValueVec.NativeFloating a ar, LLVM.ShapeOf ir ~ LLVM.ShapeOf ar) => Exp a -> Exp i truncateToInt :: forall i ir a ar. (NativeInteger i ir, NativeFloating a ar, ShapeOf ir ~ ShapeOf ar) => Exp a -> Exp i truncateToInt = (forall r. T a -> CodeGenFunction r (T i)) -> Exp a -> Exp i forall ae am b. Aggregate ae am => (forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b Expr.liftM T a -> CodeGenFunction r (T i) forall r. T a -> CodeGenFunction r (T i) forall i ir a ar r. (NativeInteger i ir, NativeFloating a ar, ShapeOf ir ~ ShapeOf ar) => T a -> CodeGenFunction r (T i) MultiValueVec.truncateToInt splitFractionToInt :: (MultiValueVec.NativeInteger i ir, MultiValueVec.NativeFloating a ar, LLVM.ShapeOf ir ~ LLVM.ShapeOf ar) => Exp a -> (Exp i, Exp a) splitFractionToInt :: forall i ir a ar. (NativeInteger i ir, NativeFloating a ar, ShapeOf ir ~ ShapeOf ar) => Exp a -> (Exp i, Exp a) splitFractionToInt = Exp (i, a) -> (Exp i, Exp a) forall (val :: * -> *) a b. Value val => val (a, b) -> (val a, val b) Expr.unzip (Exp (i, a) -> (Exp i, Exp a)) -> (Exp a -> Exp (i, a)) -> Exp a -> (Exp i, Exp a) forall b c a. (b -> c) -> (a -> b) -> a -> c . (forall r. T a -> CodeGenFunction r (T (i, a))) -> Exp a -> Exp (i, a) forall ae am b. Aggregate ae am => (forall r. am -> CodeGenFunction r (T b)) -> ae -> Exp b Expr.liftM T a -> CodeGenFunction r (T (i, a)) forall r. T a -> CodeGenFunction r (T (i, a)) forall i ir a ar r. (NativeInteger i ir, NativeFloating a ar, ShapeOf ir ~ ShapeOf ar) => T a -> CodeGenFunction r (T (i, a)) MultiValueVec.splitFractionToInt