{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
module LLVM.Extra.Multi.Vector (
   T(Cons), consPrim, deconsPrim,
   C(..),
   Value,
   map,
   zip, zip3, unzip, unzip3,
   replicate,
   iterate,
   take,
   takeRev,

   sum,
   dotProduct,
   cumulate,
   cumulate1,

   lift1,

   modify,
   assemble,
   dissect,
   dissectList,

   assemble1,
   dissect1,
   dissectList1,

   assembleFromVector,

   reverse,
   rotateUp,
   rotateDown,
   shiftUp,
   shiftDown,
   shiftUpMultiZero,
   shiftDownMultiZero,
   shiftUpMultiUndef,
   shiftDownMultiUndef,

   undefPrimitive,
   shufflePrimitive,
   extractPrimitive,
   insertPrimitive,

   shuffleMatchTraversable,
   insertTraversable,
   extractTraversable,

   IntegerConstant(..),
   RationalConstant(..),
   Additive(..),
   PseudoRing(..),
   Field(..),
   scale,
   PseudoModule(..),
   Real(..),
   Fraction(..),
   NativeInteger, NativeFloating, fromIntegral,
   Algebraic(..),
   Transcendental(..),
   FloatingComparison(..),
   Select(..),
   Comparison(..),
   Logic(..),
   BitShift(..),
   ) where

import qualified LLVM.Extra.Multi.Value.Private as MultiValue
import qualified LLVM.Extra.ScalarOrVector as SoV
import qualified LLVM.Extra.Arithmetic as A
import qualified LLVM.Extra.Tuple as Tuple

import qualified LLVM.Core as LLVM
import LLVM.Core (CodeGenFunction, IsPrimitive, valueOf, value, )

import qualified Type.Data.Num.Decimal as TypeNum

import qualified Foreign.Storable.Record.Tuple as StoreTuple

import qualified Data.Traversable as Trav
import qualified Data.NonEmpty.Class as NonEmptyC
import qualified Data.NonEmpty as NonEmpty
import qualified Data.List as List
import qualified Data.Bool8 as Bool8
import Data.Traversable (mapM, sequence, )
import Data.Foldable (foldlM)
import Data.NonEmpty ((!:), )
import Data.Function (flip, (.), ($), )
import Data.Tuple (snd, )
import Data.Maybe (maybe, )
import Data.Ord ((<), )
import Data.Word (Word8, Word16, Word32, Word64, Word)
import Data.Int (Int8, Int16, Int32, Int64, )
import Data.Bool8 (Bool8)
import Data.Bool (Bool, )

import qualified Control.Monad.HT as Monad
import qualified Control.Applicative as App
import qualified Control.Functor.HT as FuncHT
import Control.Monad.HT ((<=<), )
import Control.Monad (Monad, join, fmap, return, (>>), (=<<))
import Control.Applicative (liftA2, (<$>))

import qualified Prelude as P
import Prelude
         (Float, Double, Integer, Int, Rational, asTypeOf, (-), (+), (*), error)


newtype T n a = Cons (Repr n a)

type Value n a = LLVM.Value (LLVM.Vector n a)


consPrim :: (Repr n a ~ Value n ar) => Value n ar -> T n a
consPrim :: forall n a ar. (Repr n a ~ Value n ar) => Value n ar -> T n a
consPrim = Value n ar -> T n a
Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons

deconsPrim :: (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim :: forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim (Cons Repr n a
a) = Value n ar
Repr n a
a


instance (TypeNum.Positive n, C a) => Tuple.Undefined (T n a) where
   undef :: T n a
undef = T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef

instance (TypeNum.Positive n, C a) => Tuple.Zero (T n a) where
   zero :: T n a
zero = T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
zero

instance (TypeNum.Positive n, C a) => Tuple.Phi (T n a) where
   phi :: forall r. BasicBlock -> T n a -> CodeGenFunction r (T n a)
phi = BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phi
   addPhi :: forall r. BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhi = BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhi


sizeS :: TypeNum.Positive n => T n a -> TypeNum.Singleton n
sizeS :: forall n a. Positive n => T n a -> Singleton n
sizeS T n a
_ = Singleton n
forall x. Integer x => Singleton x
TypeNum.singleton

size :: (TypeNum.Positive n, P.Integral i) => T n a -> i
size :: forall n i a. (Positive n, Integral i) => T n a -> i
size = Singleton n -> i
forall n a. (Integer n, Num a) => Singleton n -> a
TypeNum.integralFromSingleton (Singleton n -> i) -> (T n a -> Singleton n) -> T n a -> i
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n a -> Singleton n
forall n a. Positive n => T n a -> Singleton n
sizeS

last ::
   (TypeNum.Positive n, C a) =>
   T n a -> CodeGenFunction r (MultiValue.T a)
last :: forall n a r. (Positive n, C a) => T n a -> CodeGenFunction r (T a)
last T n a
x = Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract (Word32 -> Value Word32
forall a. IsConst a => a -> Value a
valueOf (T n a -> Word32
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1)) T n a
x


zip :: T n a -> T n b -> T n (a,b)
zip :: forall n a b. T n a -> T n b -> T n (a, b)
zip (Cons Repr n a
a) (Cons Repr n b
b) = Repr n (a, b) -> T n (a, b)
forall n a. Repr n a -> T n a
Cons (Repr n a
a,Repr n b
b)

zip3 :: T n a -> T n b -> T n c -> T n (a,b,c)
zip3 :: forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3 (Cons Repr n a
a) (Cons Repr n b
b) (Cons Repr n c
c) = Repr n (a, b, c) -> T n (a, b, c)
forall n a. Repr n a -> T n a
Cons (Repr n a
a,Repr n b
b,Repr n c
c)

unzip :: T n (a,b) -> (T n a, T n b)
unzip :: forall n a b. T n (a, b) -> (T n a, T n b)
unzip (Cons (Repr n a
a,Repr n b
b)) = (Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons Repr n a
a, Repr n b -> T n b
forall n a. Repr n a -> T n a
Cons Repr n b
b)

unzip3 :: T n (a,b,c) -> (T n a, T n b, T n c)
unzip3 :: forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 (Cons (Repr n a
a,Repr n b
b,Repr n c
c)) = (Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons Repr n a
a, Repr n b -> T n b
forall n a. Repr n a -> T n a
Cons Repr n b
b, Repr n c -> T n c
forall n a. Repr n a -> T n a
Cons Repr n c
c)


class (MultiValue.C a) => C a where
   type Repr n a
   cons :: (TypeNum.Positive n) => LLVM.Vector n a -> T n a
   undef :: (TypeNum.Positive n) => T n a
   zero :: (TypeNum.Positive n) => T n a
   phi ::
      (TypeNum.Positive n) =>
      LLVM.BasicBlock -> T n a -> LLVM.CodeGenFunction r (T n a)
   addPhi ::
      (TypeNum.Positive n) =>
      LLVM.BasicBlock -> T n a -> T n a -> LLVM.CodeGenFunction r ()

   shuffle ::
      (TypeNum.Positive n, TypeNum.Positive m) =>
      LLVM.ConstValue (LLVM.Vector m Word32) -> T n a -> T n a ->
      CodeGenFunction r (T m a)
   extract ::
      (TypeNum.Positive n) =>
      LLVM.Value Word32 -> T n a -> CodeGenFunction r (MultiValue.T a)
   insert ::
      (TypeNum.Positive n) =>
      LLVM.Value Word32 -> MultiValue.T a ->
      T n a -> CodeGenFunction r (T n a)

instance C Bool where
   type Repr n Bool = LLVM.Value (LLVM.Vector n Bool)
   cons :: forall n. Positive n => Vector n Bool -> T n Bool
cons = Vector n Bool -> T n Bool
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Bool
undef = T n Bool
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Bool
zero = T n Bool
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Bool -> CodeGenFunction r (T n Bool)
phi = BasicBlock -> T n Bool -> CodeGenFunction r (T n Bool)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Bool -> T n Bool -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Bool -> T n Bool -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Bool -> T n Bool -> CodeGenFunction r (T m Bool)
shuffle = ConstValue (Vector m Word32)
-> T n Bool -> T n Bool -> CodeGenFunction r (T m Bool)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Bool -> CodeGenFunction r (T Bool)
extract = Value Word32 -> T n Bool -> CodeGenFunction r (T Bool)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32 -> T Bool -> T n Bool -> CodeGenFunction r (T n Bool)
insert = Value Word32 -> T Bool -> T n Bool -> CodeGenFunction r (T n Bool)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Bool8 where
   type Repr n Bool8 = LLVM.Value (LLVM.Vector n Bool)
   cons :: forall n. Positive n => Vector n Bool8 -> T n Bool8
cons = Vector n Bool -> T n Bool8
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive (Vector n Bool -> T n Bool8)
-> (Vector n Bool8 -> Vector n Bool) -> Vector n Bool8 -> T n Bool8
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Bool8 -> Bool) -> Vector n Bool8 -> Vector n Bool
forall a b. (a -> b) -> Vector n a -> Vector n b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Bool8 -> Bool
Bool8.toBool
   undef :: forall n. Positive n => T n Bool8
undef = T n Bool8
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Bool8
zero = T n Bool8
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Bool8 -> CodeGenFunction r (T n Bool8)
phi = BasicBlock -> T n Bool8 -> CodeGenFunction r (T n Bool8)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Bool8 -> T n Bool8 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Bool8 -> T n Bool8 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Bool8 -> T n Bool8 -> CodeGenFunction r (T m Bool8)
shuffle = ConstValue (Vector m Word32)
-> T n Bool8 -> T n Bool8 -> CodeGenFunction r (T m Bool8)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Bool8 -> CodeGenFunction r (T Bool8)
extract = Value Word32 -> T n Bool8 -> CodeGenFunction r (T Bool8)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Bool8 -> T n Bool8 -> CodeGenFunction r (T n Bool8)
insert = Value Word32
-> T Bool8 -> T n Bool8 -> CodeGenFunction r (T n Bool8)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Float where
   type Repr n Float = LLVM.Value (LLVM.Vector n Float)
   cons :: forall n. Positive n => Vector n Float -> T n Float
cons = Vector n Float -> T n Float
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Float
undef = T n Float
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Float
zero = T n Float
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Float -> CodeGenFunction r (T n Float)
phi = BasicBlock -> T n Float -> CodeGenFunction r (T n Float)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Float -> T n Float -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Float -> T n Float -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Float -> T n Float -> CodeGenFunction r (T m Float)
shuffle = ConstValue (Vector m Word32)
-> T n Float -> T n Float -> CodeGenFunction r (T m Float)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Float -> CodeGenFunction r (T Float)
extract = Value Word32 -> T n Float -> CodeGenFunction r (T Float)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Float -> T n Float -> CodeGenFunction r (T n Float)
insert = Value Word32
-> T Float -> T n Float -> CodeGenFunction r (T n Float)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Double where
   type Repr n Double = LLVM.Value (LLVM.Vector n Double)
   cons :: forall n. Positive n => Vector n Double -> T n Double
cons = Vector n Double -> T n Double
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Double
undef = T n Double
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Double
zero = T n Double
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Double -> CodeGenFunction r (T n Double)
phi = BasicBlock -> T n Double -> CodeGenFunction r (T n Double)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Double -> T n Double -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Double -> T n Double -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Double -> T n Double -> CodeGenFunction r (T m Double)
shuffle = ConstValue (Vector m Word32)
-> T n Double -> T n Double -> CodeGenFunction r (T m Double)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Double -> CodeGenFunction r (T Double)
extract = Value Word32 -> T n Double -> CodeGenFunction r (T Double)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Double -> T n Double -> CodeGenFunction r (T n Double)
insert = Value Word32
-> T Double -> T n Double -> CodeGenFunction r (T n Double)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Int where
   type Repr n Int = LLVM.Value (LLVM.Vector n Int)
   cons :: forall n. Positive n => Vector n Int -> T n Int
cons = Vector n Int -> T n Int
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Int
undef = T n Int
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Int
zero = T n Int
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Int -> CodeGenFunction r (T n Int)
phi = BasicBlock -> T n Int -> CodeGenFunction r (T n Int)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Int -> T n Int -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Int -> T n Int -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Int -> T n Int -> CodeGenFunction r (T m Int)
shuffle = ConstValue (Vector m Word32)
-> T n Int -> T n Int -> CodeGenFunction r (T m Int)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Int -> CodeGenFunction r (T Int)
extract = Value Word32 -> T n Int -> CodeGenFunction r (T Int)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32 -> T Int -> T n Int -> CodeGenFunction r (T n Int)
insert = Value Word32 -> T Int -> T n Int -> CodeGenFunction r (T n Int)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Int8 where
   type Repr n Int8 = LLVM.Value (LLVM.Vector n Int8)
   cons :: forall n. Positive n => Vector n Int8 -> T n Int8
cons = Vector n Int8 -> T n Int8
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Int8
undef = T n Int8
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Int8
zero = T n Int8
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Int8 -> CodeGenFunction r (T n Int8)
phi = BasicBlock -> T n Int8 -> CodeGenFunction r (T n Int8)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Int8 -> T n Int8 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Int8 -> T n Int8 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T m Int8)
shuffle = ConstValue (Vector m Word32)
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T m Int8)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Int8 -> CodeGenFunction r (T Int8)
extract = Value Word32 -> T n Int8 -> CodeGenFunction r (T Int8)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32 -> T Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
insert = Value Word32 -> T Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Int16 where
   type Repr n Int16 = LLVM.Value (LLVM.Vector n Int16)
   cons :: forall n. Positive n => Vector n Int16 -> T n Int16
cons = Vector n Int16 -> T n Int16
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Int16
undef = T n Int16
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Int16
zero = T n Int16
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Int16 -> CodeGenFunction r (T n Int16)
phi = BasicBlock -> T n Int16 -> CodeGenFunction r (T n Int16)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Int16 -> T n Int16 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Int16 -> T n Int16 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T m Int16)
shuffle = ConstValue (Vector m Word32)
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T m Int16)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Int16 -> CodeGenFunction r (T Int16)
extract = Value Word32 -> T n Int16 -> CodeGenFunction r (T Int16)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
insert = Value Word32
-> T Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Int32 where
   type Repr n Int32 = LLVM.Value (LLVM.Vector n Int32)
   cons :: forall n. Positive n => Vector n Int32 -> T n Int32
cons = Vector n Int32 -> T n Int32
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Int32
undef = T n Int32
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Int32
zero = T n Int32
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Int32 -> CodeGenFunction r (T n Int32)
phi = BasicBlock -> T n Int32 -> CodeGenFunction r (T n Int32)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Int32 -> T n Int32 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Int32 -> T n Int32 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T m Int32)
shuffle = ConstValue (Vector m Word32)
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T m Int32)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Int32 -> CodeGenFunction r (T Int32)
extract = Value Word32 -> T n Int32 -> CodeGenFunction r (T Int32)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
insert = Value Word32
-> T Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Int64 where
   type Repr n Int64 = LLVM.Value (LLVM.Vector n Int64)
   cons :: forall n. Positive n => Vector n Int64 -> T n Int64
cons = Vector n Int64 -> T n Int64
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Int64
undef = T n Int64
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Int64
zero = T n Int64
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Int64 -> CodeGenFunction r (T n Int64)
phi = BasicBlock -> T n Int64 -> CodeGenFunction r (T n Int64)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Int64 -> T n Int64 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Int64 -> T n Int64 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T m Int64)
shuffle = ConstValue (Vector m Word32)
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T m Int64)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Int64 -> CodeGenFunction r (T Int64)
extract = Value Word32 -> T n Int64 -> CodeGenFunction r (T Int64)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
insert = Value Word32
-> T Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Word where
   type Repr n Word = LLVM.Value (LLVM.Vector n Word)
   cons :: forall n. Positive n => Vector n Word -> T n Word
cons = Vector n Word -> T n Word
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Word
undef = T n Word
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Word
zero = T n Word
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Word -> CodeGenFunction r (T n Word)
phi = BasicBlock -> T n Word -> CodeGenFunction r (T n Word)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Word -> T n Word -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Word -> T n Word -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Word -> T n Word -> CodeGenFunction r (T m Word)
shuffle = ConstValue (Vector m Word32)
-> T n Word -> T n Word -> CodeGenFunction r (T m Word)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Word -> CodeGenFunction r (T Word)
extract = Value Word32 -> T n Word -> CodeGenFunction r (T Word)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32 -> T Word -> T n Word -> CodeGenFunction r (T n Word)
insert = Value Word32 -> T Word -> T n Word -> CodeGenFunction r (T n Word)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Word8 where
   type Repr n Word8 = LLVM.Value (LLVM.Vector n Word8)
   cons :: forall n. Positive n => Vector n Word8 -> T n Word8
cons = Vector n Word8 -> T n Word8
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Word8
undef = T n Word8
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Word8
zero = T n Word8
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Word8 -> CodeGenFunction r (T n Word8)
phi = BasicBlock -> T n Word8 -> CodeGenFunction r (T n Word8)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Word8 -> T n Word8 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Word8 -> T n Word8 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T m Word8)
shuffle = ConstValue (Vector m Word32)
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T m Word8)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Word8 -> CodeGenFunction r (T Word8)
extract = Value Word32 -> T n Word8 -> CodeGenFunction r (T Word8)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
insert = Value Word32
-> T Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Word16 where
   type Repr n Word16 = LLVM.Value (LLVM.Vector n Word16)
   cons :: forall n. Positive n => Vector n Word16 -> T n Word16
cons = Vector n Word16 -> T n Word16
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Word16
undef = T n Word16
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Word16
zero = T n Word16
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Word16 -> CodeGenFunction r (T n Word16)
phi = BasicBlock -> T n Word16 -> CodeGenFunction r (T n Word16)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Word16 -> T n Word16 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Word16 -> T n Word16 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T m Word16)
shuffle = ConstValue (Vector m Word32)
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T m Word16)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Word16 -> CodeGenFunction r (T Word16)
extract = Value Word32 -> T n Word16 -> CodeGenFunction r (T Word16)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
insert = Value Word32
-> T Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Word32 where
   type Repr n Word32 = LLVM.Value (LLVM.Vector n Word32)
   cons :: forall n. Positive n => Vector n Word32 -> T n Word32
cons = Vector n Word32 -> T n Word32
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Word32
undef = T n Word32
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Word32
zero = T n Word32
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Word32 -> CodeGenFunction r (T n Word32)
phi = BasicBlock -> T n Word32 -> CodeGenFunction r (T n Word32)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Word32 -> T n Word32 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Word32 -> T n Word32 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T m Word32)
shuffle = ConstValue (Vector m Word32)
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T m Word32)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Word32 -> CodeGenFunction r (T Word32)
extract = Value Word32 -> T n Word32 -> CodeGenFunction r (T Word32)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
insert = Value Word32
-> T Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

instance C Word64 where
   type Repr n Word64 = LLVM.Value (LLVM.Vector n Word64)
   cons :: forall n. Positive n => Vector n Word64 -> T n Word64
cons = Vector n Word64 -> T n Word64
forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive
   undef :: forall n. Positive n => T n Word64
undef = T n Word64
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive
   zero :: forall n. Positive n => T n Word64
zero = T n Word64
forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive
   phi :: forall n r.
Positive n =>
BasicBlock -> T n Word64 -> CodeGenFunction r (T n Word64)
phi = BasicBlock -> T n Word64 -> CodeGenFunction r (T n Word64)
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n Word64 -> T n Word64 -> CodeGenFunction r ()
addPhi = BasicBlock -> T n Word64 -> T n Word64 -> CodeGenFunction r ()
forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T m Word64)
shuffle = ConstValue (Vector m Word32)
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T m Word64)
forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive
   extract :: forall n r.
Positive n =>
Value Word32 -> T n Word64 -> CodeGenFunction r (T Word64)
extract = Value Word32 -> T n Word64 -> CodeGenFunction r (T Word64)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive
   insert :: forall n r.
Positive n =>
Value Word32
-> T Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
insert = Value Word32
-> T Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive

consPrimitive ::
   (TypeNum.Positive n, LLVM.IsConst al, IsPrimitive al,
    Repr n a ~ Value n al) =>
   LLVM.Vector n al -> T n a
consPrimitive :: forall n al a.
(Positive n, IsConst al, IsPrimitive al, Repr n a ~ Value n al) =>
Vector n al -> T n a
consPrimitive = Value n al -> T n a
Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons (Value n al -> T n a)
-> (Vector n al -> Value n al) -> Vector n al -> T n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector n al -> Value n al
forall a. IsConst a => a -> Value a
LLVM.valueOf

undefPrimitive ::
   (TypeNum.Positive n, IsPrimitive al,
    Repr n a ~ Value n al) =>
   T n a
undefPrimitive :: forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
undefPrimitive = Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons (Repr n a -> T n a) -> Repr n a -> T n a
forall a b. (a -> b) -> a -> b
$ ConstValue (Vector n al) -> Value n al
forall a. ConstValue a -> Value a
LLVM.value ConstValue (Vector n al)
forall a. IsType a => ConstValue a
LLVM.undef

zeroPrimitive ::
   (TypeNum.Positive n, IsPrimitive al,
    Repr n a ~ Value n al) =>
   T n a
zeroPrimitive :: forall n al a.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
T n a
zeroPrimitive = Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons (Repr n a -> T n a) -> Repr n a -> T n a
forall a b. (a -> b) -> a -> b
$ ConstValue (Vector n al) -> Value n al
forall a. ConstValue a -> Value a
LLVM.value ConstValue (Vector n al)
forall a. IsType a => ConstValue a
LLVM.zero

phiPrimitive ::
   (TypeNum.Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
   LLVM.BasicBlock -> T n a -> LLVM.CodeGenFunction r (T n a)
phiPrimitive :: forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phiPrimitive BasicBlock
bb (Cons Repr n a
a) = (Value n al -> T n a)
-> CodeGenFunction r (Value n al) -> CodeGenFunction r (T 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 Value n al -> T n a
Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons (CodeGenFunction r (Value n al) -> CodeGenFunction r (T n a))
-> CodeGenFunction r (Value n al) -> CodeGenFunction r (T n a)
forall a b. (a -> b) -> a -> b
$ BasicBlock -> Value n al -> CodeGenFunction r (Value n al)
forall r.
BasicBlock -> Value n al -> CodeGenFunction r (Value n al)
forall a r. Phi a => BasicBlock -> a -> CodeGenFunction r a
Tuple.phi BasicBlock
bb Value n al
Repr n a
a

addPhiPrimitive ::
   (TypeNum.Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
   LLVM.BasicBlock -> T n a -> T n a -> LLVM.CodeGenFunction r ()
addPhiPrimitive :: forall n al a r.
(Positive n, IsPrimitive al, Repr n a ~ Value n al) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhiPrimitive BasicBlock
bb (Cons Repr n a
a) (Cons Repr n a
b) = BasicBlock -> Value n al -> Value n al -> CodeGenFunction r ()
forall r.
BasicBlock -> Value n al -> Value n al -> CodeGenFunction r ()
forall a r. Phi a => BasicBlock -> a -> a -> CodeGenFunction r ()
Tuple.addPhi BasicBlock
bb Value n al
Repr n a
a Value n al
Repr n a
b


shufflePrimitive ::
   (TypeNum.Positive n, TypeNum.Positive m, IsPrimitive al,
    MultiValue.Repr a ~ LLVM.Value al,
    Repr n a ~ Value n al,
    Repr m a ~ Value m al) =>
   LLVM.ConstValue (LLVM.Vector m Word32) ->
   T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive :: forall n m al a r.
(Positive n, Positive m, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al, Repr m a ~ Value m al) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shufflePrimitive ConstValue (Vector m Word32)
k (Cons Repr n a
u) (Cons Repr n a
v) =
   (Value m al -> T m a)
-> CodeGenFunction r (Value m al) -> CodeGenFunction r (T m 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 Value m al -> T m a
Repr m a -> T m a
forall n a. Repr n a -> T n a
Cons (CodeGenFunction r (Value m al) -> CodeGenFunction r (T m a))
-> CodeGenFunction r (Value m al) -> CodeGenFunction r (T m a)
forall a b. (a -> b) -> a -> b
$ Value n al
-> Value n al
-> ConstValue (Vector m Word32)
-> CodeGenFunction r (Value m al)
forall n m a r.
(Positive n, Positive m, IsPrimitive a) =>
Value (Vector n a)
-> Value (Vector n a)
-> ConstValue (Vector m Word32)
-> CodeGenFunction r (Value (Vector m a))
LLVM.shufflevector Value n al
Repr n a
u Value n al
Repr n a
v ConstValue (Vector m Word32)
k

extractPrimitive ::
   (TypeNum.Positive n, IsPrimitive al,
    MultiValue.Repr a ~ LLVM.Value al,
    Repr n a ~ Value n al) =>
   LLVM.Value Word32 -> T n a -> CodeGenFunction r (MultiValue.T a)
extractPrimitive :: forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extractPrimitive Value Word32
k (Cons Repr n a
v) =
   (Value al -> T a)
-> CodeGenFunction r (Value al) -> CodeGenFunction r (T 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 Value al -> T a
Repr a -> T a
forall a. Repr a -> T a
MultiValue.Cons (CodeGenFunction r (Value al) -> CodeGenFunction r (T a))
-> CodeGenFunction r (Value al) -> CodeGenFunction r (T a)
forall a b. (a -> b) -> a -> b
$ Value n al -> Value Word32 -> CodeGenFunction r (Value al)
forall n a r.
(Positive n, IsPrimitive a) =>
Value (Vector n a) -> Value Word32 -> CodeGenFunction r (Value a)
LLVM.extractelement Value n al
Repr n a
v Value Word32
k

insertPrimitive ::
   (TypeNum.Positive n, IsPrimitive al,
    MultiValue.Repr a ~ LLVM.Value al,
    Repr n a ~ Value n al) =>
   LLVM.Value Word32 ->
   MultiValue.T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive :: forall n al a r.
(Positive n, IsPrimitive al, Repr a ~ Value al,
 Repr n a ~ Value n al) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insertPrimitive Value Word32
k (MultiValue.Cons Repr a
a) (Cons Repr n a
v) =
   (Value n al -> T n a)
-> CodeGenFunction r (Value n al) -> CodeGenFunction r (T 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 Value n al -> T n a
Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons (CodeGenFunction r (Value n al) -> CodeGenFunction r (T n a))
-> CodeGenFunction r (Value n al) -> CodeGenFunction r (T n a)
forall a b. (a -> b) -> a -> b
$ Value n al
-> Value al -> Value Word32 -> CodeGenFunction r (Value n al)
forall n a r.
(Positive n, IsPrimitive a) =>
Value (Vector n a)
-> Value a
-> Value Word32
-> CodeGenFunction r (Value (Vector n a))
LLVM.insertelement Value n al
Repr n a
v Value al
Repr a
a Value Word32
k


instance (C a, C b) => C (a,b) where
   type Repr n (a,b) = (Repr n a, Repr n b)
   cons :: forall n. Positive n => Vector n (a, b) -> T n (a, b)
cons Vector n (a, b)
v = case Vector n (a, b) -> (Vector n a, Vector n b)
forall (f :: * -> *) a b. Functor f => f (a, b) -> (f a, f b)
FuncHT.unzip Vector n (a, b)
v of (Vector n a
a,Vector n b
b) -> T n a -> T n b -> T n (a, b)
forall n a b. T n a -> T n b -> T n (a, b)
zip (Vector n a -> T n a
forall n. Positive n => Vector n a -> T n a
forall a n. (C a, Positive n) => Vector n a -> T n a
cons Vector n a
a) (Vector n b -> T n b
forall n. Positive n => Vector n b -> T n b
forall a n. (C a, Positive n) => Vector n a -> T n a
cons Vector n b
b)
   undef :: forall n. Positive n => T n (a, b)
undef = T n a -> T n b -> T n (a, b)
forall n a b. T n a -> T n b -> T n (a, b)
zip T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef T n b
forall n. Positive n => T n b
forall a n. (C a, Positive n) => T n a
undef
   zero :: forall n. Positive n => T n (a, b)
zero = T n a -> T n b -> T n (a, b)
forall n a b. T n a -> T n b -> T n (a, b)
zip T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
zero T n b
forall n. Positive n => T n b
forall a n. (C a, Positive n) => T n a
zero

   phi :: forall n r.
Positive n =>
BasicBlock -> T n (a, b) -> CodeGenFunction r (T n (a, b))
phi BasicBlock
bb T n (a, b)
a =
      case T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
a of
         (T n a
a0,T n b
a1) ->
            (T n a -> T n b -> T n (a, b))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n b)
-> CodeGenFunction r (T n (a, b))
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 T n a -> T n b -> T n (a, b)
forall n a b. T n a -> T n b -> T n (a, b)
zip (BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phi BasicBlock
bb T n a
a0) (BasicBlock -> T n b -> CodeGenFunction r (T n b)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n b -> CodeGenFunction r (T n b)
phi BasicBlock
bb T n b
a1)
   addPhi :: forall n r.
Positive n =>
BasicBlock -> T n (a, b) -> T n (a, b) -> CodeGenFunction r ()
addPhi BasicBlock
bb T n (a, b)
a T n (a, b)
b =
      case (T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
a, T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
b) of
         ((T n a
a0,T n b
a1), (T n a
b0,T n b
b1)) ->
            BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhi BasicBlock
bb T n a
a0 T n a
b0 CodeGenFunction r ()
-> CodeGenFunction r () -> CodeGenFunction r ()
forall a b.
CodeGenFunction r a -> CodeGenFunction r b -> CodeGenFunction r b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
            BasicBlock -> T n b -> T n b -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n b -> T n b -> CodeGenFunction r ()
addPhi BasicBlock
bb T n b
a1 T n b
b1

   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n (a, b) -> T n (a, b) -> CodeGenFunction r (T m (a, b))
shuffle ConstValue (Vector m Word32)
is T n (a, b)
u T n (a, b)
v =
      case (T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
u, T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
v) of
         ((T n a
u0,T n b
u1), (T n a
v0,T n b
v1)) ->
            (T m a -> T m b -> T m (a, b))
-> CodeGenFunction r (T m a)
-> CodeGenFunction r (T m b)
-> CodeGenFunction r (T m (a, b))
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 T m a -> T m b -> T m (a, b)
forall n a b. T n a -> T n b -> T n (a, b)
zip
               (ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle ConstValue (Vector m Word32)
is T n a
u0 T n a
v0)
               (ConstValue (Vector m Word32)
-> T n b -> T n b -> CodeGenFunction r (T m b)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n b -> T n b -> CodeGenFunction r (T m b)
shuffle ConstValue (Vector m Word32)
is T n b
u1 T n b
v1)

   extract :: forall n r.
Positive n =>
Value Word32 -> T n (a, b) -> CodeGenFunction r (T (a, b))
extract Value Word32
k T n (a, b)
v =
      case T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
v of
         (T n a
v0,T n b
v1) ->
            (T a -> T b -> T (a, b))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T b)
-> CodeGenFunction r (T (a, b))
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 T a -> T b -> T (a, b)
forall a b. T a -> T b -> T (a, b)
MultiValue.zip
               (Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract Value Word32
k T n a
v0)
               (Value Word32 -> T n b -> CodeGenFunction r (T b)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n b -> CodeGenFunction r (T b)
extract Value Word32
k T n b
v1)

   insert :: forall n r.
Positive n =>
Value Word32
-> T (a, b) -> T n (a, b) -> CodeGenFunction r (T n (a, b))
insert Value Word32
k T (a, b)
a T n (a, b)
v =
      case (T (a, b) -> (T a, T b)
forall a b. T (a, b) -> (T a, T b)
MultiValue.unzip T (a, b)
a, T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
v) of
         ((T a
a0,T b
a1), (T n a
v0,T n b
v1)) ->
            (T n a -> T n b -> T n (a, b))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n b)
-> CodeGenFunction r (T n (a, b))
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 T n a -> T n b -> T n (a, b)
forall n a b. T n a -> T n b -> T n (a, b)
zip
               (Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert Value Word32
k T a
a0 T n a
v0)
               (Value Word32 -> T b -> T n b -> CodeGenFunction r (T n b)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T b -> T n b -> CodeGenFunction r (T n b)
insert Value Word32
k T b
a1 T n b
v1)


instance (C a, C b, C c) => C (a,b,c) where
   type Repr n (a,b,c) = (Repr n a, Repr n b, Repr n c)
   cons :: forall n. Positive n => Vector n (a, b, c) -> T n (a, b, c)
cons Vector n (a, b, c)
v = case Vector n (a, b, c) -> (Vector n a, Vector n b, Vector n c)
forall (f :: * -> *) a b c.
Functor f =>
f (a, b, c) -> (f a, f b, f c)
FuncHT.unzip3 Vector n (a, b, c)
v of (Vector n a
a,Vector n b
b,Vector n c
c) -> T n a -> T n b -> T n c -> T n (a, b, c)
forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3 (Vector n a -> T n a
forall n. Positive n => Vector n a -> T n a
forall a n. (C a, Positive n) => Vector n a -> T n a
cons Vector n a
a) (Vector n b -> T n b
forall n. Positive n => Vector n b -> T n b
forall a n. (C a, Positive n) => Vector n a -> T n a
cons Vector n b
b) (Vector n c -> T n c
forall n. Positive n => Vector n c -> T n c
forall a n. (C a, Positive n) => Vector n a -> T n a
cons Vector n c
c)
   undef :: forall n. Positive n => T n (a, b, c)
undef = T n a -> T n b -> T n c -> T n (a, b, c)
forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3 T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef T n b
forall n. Positive n => T n b
forall a n. (C a, Positive n) => T n a
undef T n c
forall n. Positive n => T n c
forall a n. (C a, Positive n) => T n a
undef
   zero :: forall n. Positive n => T n (a, b, c)
zero = T n a -> T n b -> T n c -> T n (a, b, c)
forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3 T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
zero T n b
forall n. Positive n => T n b
forall a n. (C a, Positive n) => T n a
zero T n c
forall n. Positive n => T n c
forall a n. (C a, Positive n) => T n a
zero

   phi :: forall n r.
Positive n =>
BasicBlock -> T n (a, b, c) -> CodeGenFunction r (T n (a, b, c))
phi BasicBlock
bb T n (a, b, c)
a =
      case T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
a of
         (T n a
a0,T n b
a1,T n c
a2) ->
            (T n a -> T n b -> T n c -> T n (a, b, c))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n b)
-> CodeGenFunction r (T n c)
-> CodeGenFunction r (T n (a, b, c))
forall (m :: * -> *) a b c r.
Monad m =>
(a -> b -> c -> r) -> m a -> m b -> m c -> m r
Monad.lift3 T n a -> T n b -> T n c -> T n (a, b, c)
forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3 (BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
phi BasicBlock
bb T n a
a0) (BasicBlock -> T n b -> CodeGenFunction r (T n b)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n b -> CodeGenFunction r (T n b)
phi BasicBlock
bb T n b
a1) (BasicBlock -> T n c -> CodeGenFunction r (T n c)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n c -> CodeGenFunction r (T n c)
phi BasicBlock
bb T n c
a2)
   addPhi :: forall n r.
Positive n =>
BasicBlock
-> T n (a, b, c) -> T n (a, b, c) -> CodeGenFunction r ()
addPhi BasicBlock
bb T n (a, b, c)
a T n (a, b, c)
b =
      case (T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
a, T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
b) of
         ((T n a
a0,T n b
a1,T n c
a2), (T n a
b0,T n b
b1,T n c
b2)) ->
            BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
addPhi BasicBlock
bb T n a
a0 T n a
b0 CodeGenFunction r ()
-> CodeGenFunction r () -> CodeGenFunction r ()
forall a b.
CodeGenFunction r a -> CodeGenFunction r b -> CodeGenFunction r b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
            BasicBlock -> T n b -> T n b -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n b -> T n b -> CodeGenFunction r ()
addPhi BasicBlock
bb T n b
a1 T n b
b1 CodeGenFunction r ()
-> CodeGenFunction r () -> CodeGenFunction r ()
forall a b.
CodeGenFunction r a -> CodeGenFunction r b -> CodeGenFunction r b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>>
            BasicBlock -> T n c -> T n c -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n c -> T n c -> CodeGenFunction r ()
addPhi BasicBlock
bb T n c
a2 T n c
b2

   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n (a, b, c)
-> T n (a, b, c)
-> CodeGenFunction r (T m (a, b, c))
shuffle ConstValue (Vector m Word32)
is T n (a, b, c)
u T n (a, b, c)
v =
      case (T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
u, T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
v) of
         ((T n a
u0,T n b
u1,T n c
u2), (T n a
v0,T n b
v1,T n c
v2)) ->
            (T m a -> T m b -> T m c -> T m (a, b, c))
-> CodeGenFunction r (T m a)
-> CodeGenFunction r (T m b)
-> CodeGenFunction r (T m c)
-> CodeGenFunction r (T m (a, b, c))
forall (m :: * -> *) a b c r.
Monad m =>
(a -> b -> c -> r) -> m a -> m b -> m c -> m r
Monad.lift3 T m a -> T m b -> T m c -> T m (a, b, c)
forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3
               (ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle ConstValue (Vector m Word32)
is T n a
u0 T n a
v0)
               (ConstValue (Vector m Word32)
-> T n b -> T n b -> CodeGenFunction r (T m b)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n b -> T n b -> CodeGenFunction r (T m b)
shuffle ConstValue (Vector m Word32)
is T n b
u1 T n b
v1)
               (ConstValue (Vector m Word32)
-> T n c -> T n c -> CodeGenFunction r (T m c)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n c -> T n c -> CodeGenFunction r (T m c)
shuffle ConstValue (Vector m Word32)
is T n c
u2 T n c
v2)

   extract :: forall n r.
Positive n =>
Value Word32 -> T n (a, b, c) -> CodeGenFunction r (T (a, b, c))
extract Value Word32
k T n (a, b, c)
v =
      case T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
v of
         (T n a
v0,T n b
v1,T n c
v2) ->
            (T a -> T b -> T c -> T (a, b, c))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T b)
-> CodeGenFunction r (T c)
-> CodeGenFunction r (T (a, b, c))
forall (m :: * -> *) a b c r.
Monad m =>
(a -> b -> c -> r) -> m a -> m b -> m c -> m r
Monad.lift3 T a -> T b -> T c -> T (a, b, c)
forall a b c. T a -> T b -> T c -> T (a, b, c)
MultiValue.zip3
               (Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract Value Word32
k T n a
v0)
               (Value Word32 -> T n b -> CodeGenFunction r (T b)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n b -> CodeGenFunction r (T b)
extract Value Word32
k T n b
v1)
               (Value Word32 -> T n c -> CodeGenFunction r (T c)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n c -> CodeGenFunction r (T c)
extract Value Word32
k T n c
v2)

   insert :: forall n r.
Positive n =>
Value Word32
-> T (a, b, c)
-> T n (a, b, c)
-> CodeGenFunction r (T n (a, b, c))
insert Value Word32
k T (a, b, c)
a T n (a, b, c)
v =
      case (T (a, b, c) -> (T a, T b, T c)
forall a b c. T (a, b, c) -> (T a, T b, T c)
MultiValue.unzip3 T (a, b, c)
a, T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
v) of
         ((T a
a0,T b
a1,T c
a2), (T n a
v0,T n b
v1,T n c
v2)) ->
            (T n a -> T n b -> T n c -> T n (a, b, c))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n b)
-> CodeGenFunction r (T n c)
-> CodeGenFunction r (T n (a, b, c))
forall (m :: * -> *) a b c r.
Monad m =>
(a -> b -> c -> r) -> m a -> m b -> m c -> m r
Monad.lift3 T n a -> T n b -> T n c -> T n (a, b, c)
forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3
               (Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert Value Word32
k T a
a0 T n a
v0)
               (Value Word32 -> T b -> T n b -> CodeGenFunction r (T n b)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T b -> T n b -> CodeGenFunction r (T n b)
insert Value Word32
k T b
a1 T n b
v1)
               (Value Word32 -> T c -> T n c -> CodeGenFunction r (T n c)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T c -> T n c -> CodeGenFunction r (T n c)
insert Value Word32
k T c
a2 T n c
v2)


instance (C tuple) => C (StoreTuple.Tuple tuple) where
   type Repr n (StoreTuple.Tuple tuple) = Repr n tuple
   cons :: forall n. Positive n => Vector n (Tuple tuple) -> T n (Tuple tuple)
cons = T n tuple -> T n (Tuple tuple)
forall n tuple. T n tuple -> T n (Tuple tuple)
tuple (T n tuple -> T n (Tuple tuple))
-> (Vector n (Tuple tuple) -> T n tuple)
-> Vector n (Tuple tuple)
-> T n (Tuple tuple)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vector n tuple -> T n tuple
forall n. Positive n => Vector n tuple -> T n tuple
forall a n. (C a, Positive n) => Vector n a -> T n a
cons (Vector n tuple -> T n tuple)
-> (Vector n (Tuple tuple) -> Vector n tuple)
-> Vector n (Tuple tuple)
-> T n tuple
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Tuple tuple -> tuple) -> Vector n (Tuple tuple) -> Vector n tuple
forall a b. (a -> b) -> Vector n a -> Vector n b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tuple tuple -> tuple
forall a. Tuple a -> a
StoreTuple.getTuple
   undef :: forall n. Positive n => T n (Tuple tuple)
undef = T n tuple -> T n (Tuple tuple)
forall n tuple. T n tuple -> T n (Tuple tuple)
tuple T n tuple
forall n. Positive n => T n tuple
forall a n. (C a, Positive n) => T n a
undef
   zero :: forall n. Positive n => T n (Tuple tuple)
zero = T n tuple -> T n (Tuple tuple)
forall n tuple. T n tuple -> T n (Tuple tuple)
tuple T n tuple
forall n. Positive n => T n tuple
forall a n. (C a, Positive n) => T n a
zero
   phi :: forall n r.
Positive n =>
BasicBlock
-> T n (Tuple tuple) -> CodeGenFunction r (T n (Tuple tuple))
phi BasicBlock
bb = (T n tuple -> T n (Tuple tuple))
-> CodeGenFunction r (T n tuple)
-> CodeGenFunction r (T n (Tuple tuple))
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 n tuple -> T n (Tuple tuple)
forall n tuple. T n tuple -> T n (Tuple tuple)
tuple (CodeGenFunction r (T n tuple)
 -> CodeGenFunction r (T n (Tuple tuple)))
-> (T n (Tuple tuple) -> CodeGenFunction r (T n tuple))
-> T n (Tuple tuple)
-> CodeGenFunction r (T n (Tuple tuple))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BasicBlock -> T n tuple -> CodeGenFunction r (T n tuple)
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
BasicBlock -> T n tuple -> CodeGenFunction r (T n tuple)
phi BasicBlock
bb (T n tuple -> CodeGenFunction r (T n tuple))
-> (T n (Tuple tuple) -> T n tuple)
-> T n (Tuple tuple)
-> CodeGenFunction r (T n tuple)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n (Tuple tuple) -> T n tuple
forall n tuple. T n (Tuple tuple) -> T n tuple
untuple
   addPhi :: forall n r.
Positive n =>
BasicBlock
-> T n (Tuple tuple) -> T n (Tuple tuple) -> CodeGenFunction r ()
addPhi BasicBlock
bb T n (Tuple tuple)
a T n (Tuple tuple)
b = BasicBlock -> T n tuple -> T n tuple -> CodeGenFunction r ()
forall a n r.
(C a, Positive n) =>
BasicBlock -> T n a -> T n a -> CodeGenFunction r ()
forall n r.
Positive n =>
BasicBlock -> T n tuple -> T n tuple -> CodeGenFunction r ()
addPhi BasicBlock
bb (T n (Tuple tuple) -> T n tuple
forall n tuple. T n (Tuple tuple) -> T n tuple
untuple T n (Tuple tuple)
a) (T n (Tuple tuple) -> T n tuple
forall n tuple. T n (Tuple tuple) -> T n tuple
untuple T n (Tuple tuple)
b)
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n (Tuple tuple)
-> T n (Tuple tuple)
-> CodeGenFunction r (T m (Tuple tuple))
shuffle ConstValue (Vector m Word32)
is T n (Tuple tuple)
u T n (Tuple tuple)
v = T m tuple -> T m (Tuple tuple)
forall n tuple. T n tuple -> T n (Tuple tuple)
tuple (T m tuple -> T m (Tuple tuple))
-> CodeGenFunction r (T m tuple)
-> CodeGenFunction r (T m (Tuple tuple))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ConstValue (Vector m Word32)
-> T n tuple -> T n tuple -> CodeGenFunction r (T m tuple)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n tuple -> T n tuple -> CodeGenFunction r (T m tuple)
shuffle ConstValue (Vector m Word32)
is (T n (Tuple tuple) -> T n tuple
forall n tuple. T n (Tuple tuple) -> T n tuple
untuple T n (Tuple tuple)
u) (T n (Tuple tuple) -> T n tuple
forall n tuple. T n (Tuple tuple) -> T n tuple
untuple T n (Tuple tuple)
v)
   extract :: forall n r.
Positive n =>
Value Word32
-> T n (Tuple tuple) -> CodeGenFunction r (T (Tuple tuple))
extract Value Word32
k T n (Tuple tuple)
v = T tuple -> T (Tuple tuple)
forall tuple. T tuple -> T (Tuple tuple)
MultiValue.tuple (T tuple -> T (Tuple tuple))
-> CodeGenFunction r (T tuple)
-> CodeGenFunction r (T (Tuple tuple))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value Word32 -> T n tuple -> CodeGenFunction r (T tuple)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n tuple -> CodeGenFunction r (T tuple)
extract Value Word32
k (T n (Tuple tuple) -> T n tuple
forall n tuple. T n (Tuple tuple) -> T n tuple
untuple T n (Tuple tuple)
v)
   insert :: forall n r.
Positive n =>
Value Word32
-> T (Tuple tuple)
-> T n (Tuple tuple)
-> CodeGenFunction r (T n (Tuple tuple))
insert Value Word32
k T (Tuple tuple)
a T n (Tuple tuple)
v = T n tuple -> T n (Tuple tuple)
forall n tuple. T n tuple -> T n (Tuple tuple)
tuple (T n tuple -> T n (Tuple tuple))
-> CodeGenFunction r (T n tuple)
-> CodeGenFunction r (T n (Tuple tuple))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value Word32
-> T tuple -> T n tuple -> CodeGenFunction r (T n tuple)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32
-> T tuple -> T n tuple -> CodeGenFunction r (T n tuple)
insert Value Word32
k (T (Tuple tuple) -> T tuple
forall tuple. T (Tuple tuple) -> T tuple
MultiValue.untuple T (Tuple tuple)
a) (T n (Tuple tuple) -> T n tuple
forall n tuple. T n (Tuple tuple) -> T n tuple
untuple T n (Tuple tuple)
v)

tuple :: T n tuple -> T n (StoreTuple.Tuple tuple)
tuple :: forall n tuple. T n tuple -> T n (Tuple tuple)
tuple (Cons Repr n tuple
a) = Repr n (Tuple tuple) -> T n (Tuple tuple)
forall n a. Repr n a -> T n a
Cons Repr n tuple
Repr n (Tuple tuple)
a

untuple :: T n (StoreTuple.Tuple tuple) -> T n tuple
untuple :: forall n tuple. T n (Tuple tuple) -> T n tuple
untuple (Cons Repr n (Tuple tuple)
a) = Repr n tuple -> T n tuple
forall n a. Repr n a -> T n a
Cons Repr n tuple
Repr n (Tuple tuple)
a


class (MultiValue.IntegerConstant a, C a) => IntegerConstant a where
   fromInteger' :: (TypeNum.Positive n) => Integer -> T n a

class
   (MultiValue.RationalConstant a, IntegerConstant a) =>
      RationalConstant a where
   fromRational' :: (TypeNum.Positive n) => Rational -> T n a

instance IntegerConstant Float  where fromInteger' :: forall n. Positive n => Integer -> T n Float
fromInteger' = Integer -> T n Float
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Double where fromInteger' :: forall n. Positive n => Integer -> T n Double
fromInteger' = Integer -> T n Double
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Word   where fromInteger' :: forall n. Positive n => Integer -> T n Word
fromInteger' = Integer -> T n Word
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Word8  where fromInteger' :: forall n. Positive n => Integer -> T n Word8
fromInteger' = Integer -> T n Word8
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Word16 where fromInteger' :: forall n. Positive n => Integer -> T n Word16
fromInteger' = Integer -> T n Word16
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Word32 where fromInteger' :: forall n. Positive n => Integer -> T n Word32
fromInteger' = Integer -> T n Word32
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Word64 where fromInteger' :: forall n. Positive n => Integer -> T n Word64
fromInteger' = Integer -> T n Word64
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Int   where fromInteger' :: forall n. Positive n => Integer -> T n Int
fromInteger' = Integer -> T n Int
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Int8  where fromInteger' :: forall n. Positive n => Integer -> T n Int8
fromInteger' = Integer -> T n Int8
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Int16 where fromInteger' :: forall n. Positive n => Integer -> T n Int16
fromInteger' = Integer -> T n Int16
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Int32 where fromInteger' :: forall n. Positive n => Integer -> T n Int32
fromInteger' = Integer -> T n Int32
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive
instance IntegerConstant Int64 where fromInteger' :: forall n. Positive n => Integer -> T n Int64
fromInteger' = Integer -> T n Int64
forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive

fromIntegerPrimitive ::
   (TypeNum.Positive n, IsPrimitive a, SoV.IntegerConstant a,
    Repr n a ~ Value n a) =>
   Integer -> T n a
fromIntegerPrimitive :: forall n a.
(Positive n, IsPrimitive a, IntegerConstant a,
 Repr n a ~ Value n a) =>
Integer -> T n a
fromIntegerPrimitive = Value n a -> T n a
Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons (Value n a -> T n a) -> (Integer -> Value n a) -> Integer -> T n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstValue (Vector n a) -> Value n a
forall a. ConstValue a -> Value a
LLVM.value (ConstValue (Vector n a) -> Value n a)
-> (Integer -> ConstValue (Vector n a)) -> Integer -> Value n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> ConstValue (Vector n a)
forall a. IntegerConstant a => Integer -> ConstValue a
SoV.constFromInteger

instance RationalConstant Float  where fromRational' :: forall n. Positive n => Rational -> T n Float
fromRational' = Rational -> T n Float
forall n a.
(Positive n, IsPrimitive a, RationalConstant a,
 Repr n a ~ Value n a) =>
Rational -> T n a
fromRationalPrimitive
instance RationalConstant Double where fromRational' :: forall n. Positive n => Rational -> T n Double
fromRational' = Rational -> T n Double
forall n a.
(Positive n, IsPrimitive a, RationalConstant a,
 Repr n a ~ Value n a) =>
Rational -> T n a
fromRationalPrimitive

fromRationalPrimitive ::
   (TypeNum.Positive n, IsPrimitive a, SoV.RationalConstant a,
    Repr n a ~ Value n a) =>
   Rational -> T n a
fromRationalPrimitive :: forall n a.
(Positive n, IsPrimitive a, RationalConstant a,
 Repr n a ~ Value n a) =>
Rational -> T n a
fromRationalPrimitive = Value n a -> T n a
Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons (Value n a -> T n a)
-> (Rational -> Value n a) -> Rational -> T n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ConstValue (Vector n a) -> Value n a
forall a. ConstValue a -> Value a
LLVM.value (ConstValue (Vector n a) -> Value n a)
-> (Rational -> ConstValue (Vector n a)) -> Rational -> Value n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> ConstValue (Vector n a)
forall a. RationalConstant a => Rational -> ConstValue a
SoV.constFromRational

instance
   (TypeNum.Positive n, IntegerConstant a) =>
      A.IntegerConstant (T n a) where
   fromInteger' :: Integer -> T n a
fromInteger' = Integer -> T n a
forall n. Positive n => Integer -> T n a
forall a n. (IntegerConstant a, Positive n) => Integer -> T n a
fromInteger'

instance
   (TypeNum.Positive n, RationalConstant a) =>
      A.RationalConstant (T n a) where
   fromRational' :: Rational -> T n a
fromRational' = Rational -> T n a
forall n. Positive n => Rational -> T n a
forall a n. (RationalConstant a, Positive n) => Rational -> T n a
fromRational'


modify ::
   (TypeNum.Positive n, C a) =>
   LLVM.Value Word32 ->
   (MultiValue.T a -> CodeGenFunction r (MultiValue.T a)) ->
   (T n a -> CodeGenFunction r (T n a))
modify :: forall n a r.
(Positive n, C a) =>
Value Word32
-> (T a -> CodeGenFunction r (T a))
-> T n a
-> CodeGenFunction r (T n a)
modify Value Word32
k T a -> CodeGenFunction r (T a)
f T n a
v =
   (T a -> T n a -> CodeGenFunction r (T n a))
-> T n a -> T a -> CodeGenFunction r (T n a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip (Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert Value Word32
k) T n a
v (T a -> CodeGenFunction r (T n a))
-> CodeGenFunction r (T a) -> CodeGenFunction r (T n a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< T a -> CodeGenFunction r (T a)
f (T a -> CodeGenFunction r (T a))
-> CodeGenFunction r (T a) -> CodeGenFunction r (T a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract Value Word32
k T n a
v


assemble ::
   (TypeNum.Positive n, C a) =>
   [MultiValue.T a] -> CodeGenFunction r (T n a)
assemble :: forall n a r.
(Positive n, C a) =>
[T a] -> CodeGenFunction r (T n a)
assemble =
   (T n a -> (Word32, T a) -> CodeGenFunction r (T n a))
-> T n a -> [(Word32, T a)] -> CodeGenFunction r (T n a)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldlM (\T n a
v (Word32
k,T a
x) -> Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert (Word32 -> Value Word32
forall a. IsConst a => a -> Value a
valueOf Word32
k) T a
x T n a
v) T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef ([(Word32, T a)] -> CodeGenFunction r (T n a))
-> ([T a] -> [(Word32, T a)]) -> [T a] -> CodeGenFunction r (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   [Word32] -> [T a] -> [(Word32, T a)]
forall a b. [a] -> [b] -> [(a, b)]
List.zip [Word32
0..]

dissect ::
   (TypeNum.Positive n, C a) =>
   T n a -> LLVM.CodeGenFunction r [MultiValue.T a]
dissect :: forall n a r. (Positive n, C a) => T n a -> CodeGenFunction r [T a]
dissect = [CodeGenFunction r (T a)] -> CodeGenFunction r [T a]
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => [m a] -> m [a]
sequence ([CodeGenFunction r (T a)] -> CodeGenFunction r [T a])
-> (T n a -> [CodeGenFunction r (T a)])
-> T n a
-> CodeGenFunction r [T a]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n a -> [CodeGenFunction r (T a)]
forall n a r.
(Positive n, C a) =>
T n a -> [CodeGenFunction r (T a)]
dissectList

dissectList ::
   (TypeNum.Positive n, C a) =>
   T n a -> [LLVM.CodeGenFunction r (MultiValue.T a)]
dissectList :: forall n a r.
(Positive n, C a) =>
T n a -> [CodeGenFunction r (T a)]
dissectList T n a
x =
   (Word32 -> CodeGenFunction r (T a))
-> [Word32] -> [CodeGenFunction r (T a)]
forall a b. (a -> b) -> [a] -> [b]
List.map
      ((Value Word32 -> T n a -> CodeGenFunction r (T a))
-> T n a -> Value Word32 -> CodeGenFunction r (T a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract T n a
x (Value Word32 -> CodeGenFunction r (T a))
-> (Word32 -> Value Word32) -> Word32 -> CodeGenFunction r (T a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Value Word32
forall a. IsConst a => a -> Value a
LLVM.valueOf)
      (Int -> [Word32] -> [Word32]
forall a. Int -> [a] -> [a]
List.take (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x) [Word32
0..])


assemble1 ::
   (TypeNum.Positive n, C a) =>
   NonEmpty.T [] (MultiValue.T a) -> CodeGenFunction r (T n a)
assemble1 :: forall n a r.
(Positive n, C a) =>
T [] (T a) -> CodeGenFunction r (T n a)
assemble1 = [T a] -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
[T a] -> CodeGenFunction r (T n a)
assemble ([T a] -> CodeGenFunction r (T n a))
-> (T [] (T a) -> [T a]) -> T [] (T a) -> CodeGenFunction r (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T [] (T a) -> [T a]
forall (f :: * -> *) a. Cons f => T f a -> f a
NonEmpty.flatten

dissect1 ::
   (TypeNum.Positive n, C a) =>
   T n a -> LLVM.CodeGenFunction r (NonEmpty.T [] (MultiValue.T a))
dissect1 :: forall n a r.
(Positive n, C a) =>
T n a -> CodeGenFunction r (T [] (T a))
dissect1 = T [] (CodeGenFunction r (T a)) -> CodeGenFunction r (T [] (T a))
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => T [] (m a) -> m (T [] a)
sequence (T [] (CodeGenFunction r (T a)) -> CodeGenFunction r (T [] (T a)))
-> (T n a -> T [] (CodeGenFunction r (T a)))
-> T n a
-> CodeGenFunction r (T [] (T a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n a -> T [] (CodeGenFunction r (T a))
forall n a r.
(Positive n, C a) =>
T n a -> T [] (CodeGenFunction r (T a))
dissectList1

dissectList1 ::
   (TypeNum.Positive n, C a) =>
   T n a -> NonEmpty.T [] (LLVM.CodeGenFunction r (MultiValue.T a))
dissectList1 :: forall n a r.
(Positive n, C a) =>
T n a -> T [] (CodeGenFunction r (T a))
dissectList1 T n a
x =
   (Word32 -> CodeGenFunction r (T a))
-> T [] Word32 -> T [] (CodeGenFunction r (T a))
forall a b. (a -> b) -> T [] a -> T [] b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap
      ((Value Word32 -> T n a -> CodeGenFunction r (T a))
-> T n a -> Value Word32 -> CodeGenFunction r (T a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract T n a
x (Value Word32 -> CodeGenFunction r (T a))
-> (Word32 -> Value Word32) -> Word32 -> CodeGenFunction r (T a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word32 -> Value Word32
forall a. IsConst a => a -> Value a
LLVM.valueOf)
      (Word32
0 Word32 -> [Word32] -> T [] Word32
forall a (f :: * -> *). a -> f a -> T f a
!: Int -> [Word32] -> [Word32]
forall a. Int -> [a] -> [a]
List.take (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [Word32
1 ..])


assembleFromVector ::
   (TypeNum.Positive n, C a) =>
   LLVM.Vector n (MultiValue.T a) -> CodeGenFunction r (T n a)
assembleFromVector :: forall n a r.
(Positive n, C a) =>
Vector n (T a) -> CodeGenFunction r (T n a)
assembleFromVector =
   ((Word32, T n a) -> T n a)
-> CodeGenFunction r (Word32, T n a) -> CodeGenFunction r (T 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 (Word32, T n a) -> T n a
forall a b. (a, b) -> b
snd (CodeGenFunction r (Word32, T n a) -> CodeGenFunction r (T n a))
-> (Vector n (T a) -> CodeGenFunction r (Word32, T n a))
-> Vector n (T a)
-> CodeGenFunction r (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   ((Word32, T n a) -> T a -> CodeGenFunction r (Word32, T n a))
-> (Word32, T n a)
-> Vector n (T a)
-> CodeGenFunction r (Word32, T n a)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldlM (\(Word32
k,T n a
v) T a
x -> (,) (Word32
kWord32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+Word32
1) (T n a -> (Word32, T n a))
-> CodeGenFunction r (T n a) -> CodeGenFunction r (Word32, T n a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert (Word32 -> Value Word32
forall a. IsConst a => a -> Value a
valueOf Word32
k) T a
x T n a
v) (Word32
0,T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef)


map ::
   (TypeNum.Positive n, C a, C b) =>
   (MultiValue.T a -> CodeGenFunction r (MultiValue.T b)) ->
   (T n a -> CodeGenFunction r (T n b))
map :: forall n a b r.
(Positive n, C a, C b) =>
(T a -> CodeGenFunction r (T b))
-> T n a -> CodeGenFunction r (T n b)
map T a -> CodeGenFunction r (T b)
f  =  [T b] -> CodeGenFunction r (T n b)
forall n a r.
(Positive n, C a) =>
[T a] -> CodeGenFunction r (T n a)
assemble ([T b] -> CodeGenFunction r (T n b))
-> (T n a -> CodeGenFunction r [T b])
-> T n a
-> CodeGenFunction r (T n b)
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< (T a -> CodeGenFunction r (T b))
-> [T a] -> CodeGenFunction r [T b]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> [a] -> m [b]
mapM T a -> CodeGenFunction r (T b)
f ([T a] -> CodeGenFunction r [T b])
-> (T n a -> CodeGenFunction r [T a])
-> T n a
-> CodeGenFunction r [T b]
forall (m :: * -> *) b c a.
Monad m =>
(b -> m c) -> (a -> m b) -> a -> m c
<=< T n a -> CodeGenFunction r [T a]
forall n a r. (Positive n, C a) => T n a -> CodeGenFunction r [T a]
dissect


singleton :: (C a) => MultiValue.T a -> CodeGenFunction r (T TypeNum.D1 a)
singleton :: forall a r. C a => T a -> CodeGenFunction r (T D1 a)
singleton T a
x = Value Word32 -> T a -> T D1 a -> CodeGenFunction r (T D1 a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert (ConstValue Word32 -> Value Word32
forall a. ConstValue a -> Value a
LLVM.value ConstValue Word32
forall a. IsType a => ConstValue a
LLVM.zero) T a
x T D1 a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef

replicate ::
   (TypeNum.Positive n, C a) =>
   MultiValue.T a -> CodeGenFunction r (T n a)
replicate :: forall n a r. (Positive n, C a) => T a -> CodeGenFunction r (T n a)
replicate T a
x = do
   T D1 a
single <- T a -> CodeGenFunction r (T D1 a)
forall a r. C a => T a -> CodeGenFunction r (T D1 a)
singleton T a
x
   ConstValue (Vector n Word32)
-> T D1 a -> T D1 a -> CodeGenFunction r (T n a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle (T [] Word32 -> ConstValue (Vector n Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector n Word32))
-> T [] Word32 -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$ Word32 -> T [] Word32
forall (f :: * -> *) a. Empty f => a -> T f a
NonEmpty.singleton Word32
0) T D1 a
single T D1 a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef

iterate ::
   (TypeNum.Positive n, C a) =>
   (MultiValue.T a -> CodeGenFunction r (MultiValue.T a)) ->
   MultiValue.T a -> CodeGenFunction r (T n a)
iterate :: forall n a r.
(Positive n, C a) =>
(T a -> CodeGenFunction r (T a))
-> T a -> CodeGenFunction r (T n a)
iterate T a -> CodeGenFunction r (T a)
f T a
x = ((T a, T n a) -> T n a)
-> CodeGenFunction r (T a, T n a) -> CodeGenFunction r (T 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, T n a) -> T n a
forall a b. (a, b) -> b
snd (CodeGenFunction r (T a, T n a) -> CodeGenFunction r (T n a))
-> CodeGenFunction r (T a, T n a) -> CodeGenFunction r (T n a)
forall a b. (a -> b) -> a -> b
$ (T a -> CodeGenFunction r (T a))
-> T a -> T n a -> CodeGenFunction r (T a, T n a)
forall n a r.
(Positive n, C a) =>
(T a -> CodeGenFunction r (T a))
-> T a -> T n a -> CodeGenFunction r (T a, T n a)
iterateCore T a -> CodeGenFunction r (T a)
f T a
x T n a
forall a. Undefined a => a
Tuple.undef

iterateCore ::
   (TypeNum.Positive n, C a) =>
   (MultiValue.T a -> CodeGenFunction r (MultiValue.T a)) ->
   MultiValue.T a -> T n a ->
   CodeGenFunction r (MultiValue.T a, T n a)
iterateCore :: forall n a r.
(Positive n, C a) =>
(T a -> CodeGenFunction r (T a))
-> T a -> T n a -> CodeGenFunction r (T a, T n a)
iterateCore T a -> CodeGenFunction r (T a)
f T a
x0 T n a
v0 =
   ((T a, T n a) -> Word32 -> CodeGenFunction r (T a, T n a))
-> (T a, T n a) -> [Word32] -> CodeGenFunction r (T a, T n a)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldlM
      (\(T a
x,T n a
v) Word32
k -> (T a -> T n a -> (T a, T n a))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T a, T n a)
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 (,) (T a -> CodeGenFunction r (T a)
f T a
x) (Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert (Word32 -> Value Word32
forall a. IsConst a => a -> Value a
valueOf Word32
k) T a
x T n a
v))
      (T a
x0,T n a
v0)
      (Int -> [Word32] -> [Word32]
forall a. Int -> [a] -> [a]
List.take (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
v0) [Word32
0..])


sum ::
   (TypeNum.Positive n, Additive a) =>
   T n a -> CodeGenFunction r (MultiValue.T a)
sum :: forall n a r.
(Positive n, Additive a) =>
T n a -> CodeGenFunction r (T a)
sum =
   (CodeGenFunction r (T a)
 -> CodeGenFunction r (T a) -> CodeGenFunction r (T a))
-> T [] (CodeGenFunction r (T a)) -> CodeGenFunction r (T a)
forall a. (a -> a -> a) -> T [] a -> a
NonEmpty.foldBalanced (\CodeGenFunction r (T a)
x CodeGenFunction r (T a)
y -> CodeGenFunction r (CodeGenFunction r (T a))
-> CodeGenFunction r (T a)
forall (m :: * -> *) a. Monad m => m (m a) -> m a
join (CodeGenFunction r (CodeGenFunction r (T a))
 -> CodeGenFunction r (T a))
-> CodeGenFunction r (CodeGenFunction r (T a))
-> CodeGenFunction r (T a)
forall a b. (a -> b) -> a -> b
$ (T a -> T a -> CodeGenFunction r (T a))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T a)
-> CodeGenFunction r (CodeGenFunction r (T a))
forall a b c.
(a -> b -> c)
-> CodeGenFunction r a
-> CodeGenFunction r b
-> CodeGenFunction r c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Additive a => T a -> T a -> CodeGenFunction r (T a)
forall r. T a -> T a -> CodeGenFunction r (T a)
MultiValue.add CodeGenFunction r (T a)
x CodeGenFunction r (T a)
y) (T [] (CodeGenFunction r (T a)) -> CodeGenFunction r (T a))
-> (T n a -> T [] (CodeGenFunction r (T a)))
-> T n a
-> CodeGenFunction r (T a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
.
   T n a -> T [] (CodeGenFunction r (T a))
forall n a r.
(Positive n, C a) =>
T n a -> T [] (CodeGenFunction r (T a))
dissectList1

dotProduct ::
   (TypeNum.Positive n, PseudoRing a) =>
   T n a -> T n a -> CodeGenFunction r (MultiValue.T a)
dotProduct :: forall n a r.
(Positive n, PseudoRing a) =>
T n a -> T n a -> CodeGenFunction r (T a)
dotProduct T n a
x T n a
y = T n a -> CodeGenFunction r (T a)
forall n a r.
(Positive n, Additive a) =>
T n a -> CodeGenFunction r (T a)
sum (T n a -> CodeGenFunction r (T a))
-> CodeGenFunction r (T n a) -> CodeGenFunction r (T a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(PseudoRing a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
mul T n a
x T n a
y


cumulate ::
   (TypeNum.Positive n, Additive a) =>
   MultiValue.T a -> T n a ->
   CodeGenFunction r (MultiValue.T a, T n a)
cumulate :: forall n a r.
(Positive n, Additive a) =>
T a -> T n a -> CodeGenFunction r (T a, T n a)
cumulate T a
a T n a
x0 = do
   (T a
b,T n a
x1) <- T a -> T n a -> CodeGenFunction r (T a, T n a)
forall n a r.
(Positive n, C a) =>
T a -> T n a -> CodeGenFunction r (T a, T n a)
shiftUp T a
a T n a
x0
   T n a
y <- T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, Additive a) =>
T n a -> CodeGenFunction r (T n a)
cumulate1 T n a
x1
   T a
z <- T a -> T a -> CodeGenFunction r (T a)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r. T a -> T a -> CodeGenFunction r (T a)
A.add T a
b (T a -> CodeGenFunction r (T a))
-> CodeGenFunction r (T a) -> CodeGenFunction r (T a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< T n a -> CodeGenFunction r (T a)
forall n a r. (Positive n, C a) => T n a -> CodeGenFunction r (T a)
last T n a
y
   (T a, T n a) -> CodeGenFunction r (T a, T n a)
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return (T a
z,T n a
y)

{- |
Needs (log n) vector additions
-}
cumulate1 ::
   (TypeNum.Positive n, Additive a) =>
   T n a -> CodeGenFunction r (T n a)
cumulate1 :: forall n a r.
(Positive n, Additive a) =>
T n a -> CodeGenFunction r (T n a)
cumulate1 T n a
x =
   (T n a -> Int -> CodeGenFunction r (T n a))
-> T n a -> [Int] -> CodeGenFunction r (T n a)
forall (t :: * -> *) (m :: * -> *) b a.
(Foldable t, Monad m) =>
(b -> a -> m b) -> b -> t a -> m b
foldlM
      (\T n a
y Int
k -> T n a -> T n a -> CodeGenFunction r (T n a)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r. T n a -> T n a -> CodeGenFunction r (T n a)
A.add T n a
y (T n a -> CodeGenFunction r (T n a))
-> CodeGenFunction r (T n a) -> CodeGenFunction r (T n a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< Int -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
Int -> T n a -> CodeGenFunction r (T n a)
shiftUpMultiZero Int
k T n a
y)
      T n a
x
      ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
List.takeWhile (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x) ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Int -> Int) -> Int -> [Int]
forall a. (a -> a) -> a -> [a]
List.iterate (Int
2Int -> Int -> Int
forall a. Num a => a -> a -> a
*) Int
1)


-- * re-ordering of elements

constCyclicVector ::
   (LLVM.IsConst a, TypeNum.Positive n) =>
   NonEmpty.T [] a -> LLVM.ConstValue (LLVM.Vector n a)
constCyclicVector :: forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector =
   T [] (ConstValue a) -> ConstValue (Vector n a)
forall a n.
Positive n =>
T [] (ConstValue a) -> ConstValue (Vector n a)
LLVM.constCyclicVector (T [] (ConstValue a) -> ConstValue (Vector n a))
-> (T [] a -> T [] (ConstValue a))
-> T [] a
-> ConstValue (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> ConstValue a) -> T [] a -> T [] (ConstValue a)
forall a b. (a -> b) -> T [] a -> T [] b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> ConstValue a
forall a. IsConst a => a -> ConstValue a
LLVM.constOf

shuffleMatch ::
   (TypeNum.Positive n, C a) =>
   LLVM.ConstValue (LLVM.Vector n Word32) -> T n a ->
   CodeGenFunction r (T n a)
shuffleMatch :: forall n a r.
(Positive n, C a) =>
ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
shuffleMatch ConstValue (Vector n Word32)
k T n a
v = ConstValue (Vector n Word32)
-> T n a -> T n a -> CodeGenFunction r (T n a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle ConstValue (Vector n Word32)
k T n a
v T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef

{- |
Rotate one element towards the higher elements.

I don't want to call it rotateLeft or rotateRight,
because there is no prefered layout for the vector elements.
In Intel's instruction manual vector
elements are indexed like the bits,
that is from right to left.
However, when working with Haskell list and enumeration syntax,
the start index is left.
-}
rotateUp ::
   (TypeNum.Positive n, C a) =>
   T n a -> CodeGenFunction r (T n a)
rotateUp :: forall n a r.
(Positive n, C a) =>
T n a -> CodeGenFunction r (T n a)
rotateUp T n a
x =
   ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
shuffleMatch (T [] Word32 -> ConstValue (Vector n Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector n Word32))
-> T [] Word32 -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$ (T n a -> Word32
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1) Word32 -> [Word32] -> T [] Word32
forall a (f :: * -> *). a -> f a -> T f a
!: [Word32
0..]) T n a
x

rotateDown ::
   (TypeNum.Positive n, C a) =>
   T n a -> CodeGenFunction r (T n a)
rotateDown :: forall n a r.
(Positive n, C a) =>
T n a -> CodeGenFunction r (T n a)
rotateDown T n a
x =
   ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
shuffleMatch
      (T [] Word32 -> ConstValue (Vector n Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector n Word32))
-> T [] Word32 -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$
       [Word32] -> Word32 -> T [] Word32
forall (f :: * -> *) a. Traversable f => f a -> a -> T f a
NonEmpty.snoc (Int -> [Word32] -> [Word32]
forall a. Int -> [a] -> [a]
List.take (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [Word32
1..]) Word32
0) T n a
x

reverse ::
   (TypeNum.Positive n, C a) =>
   T n a -> CodeGenFunction r (T n a)
reverse :: forall n a r.
(Positive n, C a) =>
T n a -> CodeGenFunction r (T n a)
reverse T n a
x =
   ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
shuffleMatch
      (T [] Word32 -> ConstValue (Vector n Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector n Word32))
-> T [] Word32 -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$
       T [] Word32
-> (T [] Word32 -> T [] Word32)
-> Maybe (T [] Word32)
-> T [] Word32
forall b a. b -> (a -> b) -> Maybe a -> b
maybe ([Char] -> T [] Word32
forall a. HasCallStack => [Char] -> a
error [Char]
"vector size must be positive") T [] Word32 -> T [] Word32
forall (f :: * -> *) a.
(Traversable f, Reverse f) =>
T f a -> T f a
NonEmpty.reverse (Maybe (T [] Word32) -> T [] Word32)
-> Maybe (T [] Word32) -> T [] Word32
forall a b. (a -> b) -> a -> b
$
       [Word32] -> Maybe (T [] Word32)
forall (f :: * -> *) a. ViewL f => f a -> Maybe (T f a)
NonEmpty.fetch ([Word32] -> Maybe (T [] Word32))
-> [Word32] -> Maybe (T [] Word32)
forall a b. (a -> b) -> a -> b
$
       Int -> [Word32] -> [Word32]
forall a. Int -> [a] -> [a]
List.take (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x) [Word32
0..])
      T n a
x

take ::
   (TypeNum.Positive n, TypeNum.Positive m, C a) =>
   T n a -> CodeGenFunction r (T m a)
take :: forall n m a r.
(Positive n, Positive m, C a) =>
T n a -> CodeGenFunction r (T m a)
take T n a
u = ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle (T [] Word32 -> ConstValue (Vector m Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector m Word32))
-> T [] Word32 -> ConstValue (Vector m Word32)
forall a b. (a -> b) -> a -> b
$ (Word32 -> Word32) -> Word32 -> T [] Word32
forall a. (a -> a) -> a -> T [] a
forall (f :: * -> *) a. Iterate f => (a -> a) -> a -> f a
NonEmptyC.iterate (Word32
1Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+) Word32
0) T n a
u T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef

takeRev ::
   (TypeNum.Positive n, TypeNum.Positive m, C a) =>
   T n a -> CodeGenFunction r (T m a)
takeRev :: forall n m a r.
(Positive n, Positive m, C a) =>
T n a -> CodeGenFunction r (T m a)
takeRev T n a
u = do
   let v0 :: T m a
v0 = T m a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
zero
   T m a
v <-
      ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle
         (T [] Word32 -> ConstValue (Vector m Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector m Word32))
-> T [] Word32 -> ConstValue (Vector m Word32)
forall a b. (a -> b) -> a -> b
$ (Word32 -> Word32) -> Word32 -> T [] Word32
forall a. (a -> a) -> a -> T [] a
forall (f :: * -> *) a. Iterate f => (a -> a) -> a -> f a
NonEmptyC.iterate (Word32
1Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
+) (T n a -> Word32
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
u Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- T m a -> Word32
forall n i a. (Positive n, Integral i) => T n a -> i
size T m a
v0))
         T n a
u T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef
   T m a -> CodeGenFunction r (T m a)
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return (T m a -> CodeGenFunction r (T m a))
-> T m a -> CodeGenFunction r (T m a)
forall a b. (a -> b) -> a -> b
$ T m a
v T m a -> T m a -> T m a
forall a. a -> a -> a
`asTypeOf` T m a
v0

shiftUp ::
   (TypeNum.Positive n, C a) =>
   MultiValue.T a -> T n a -> CodeGenFunction r (MultiValue.T a, T n a)
shiftUp :: forall n a r.
(Positive n, C a) =>
T a -> T n a -> CodeGenFunction r (T a, T n a)
shiftUp T a
x0 T n a
x = do
   T n a
y <-
      ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
shuffleMatch
         (T [] (ConstValue Word32) -> ConstValue (Vector n Word32)
forall a n.
Positive n =>
T [] (ConstValue a) -> ConstValue (Vector n a)
LLVM.constCyclicVector (T [] (ConstValue Word32) -> ConstValue (Vector n Word32))
-> T [] (ConstValue Word32) -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$ ConstValue Word32
forall a. IsType a => ConstValue a
LLVM.undef ConstValue Word32
-> [ConstValue Word32] -> T [] (ConstValue Word32)
forall a (f :: * -> *). a -> f a -> T f a
!: (Word32 -> ConstValue Word32) -> [Word32] -> [ConstValue Word32]
forall a b. (a -> b) -> [a] -> [b]
List.map Word32 -> ConstValue Word32
forall a. IsConst a => a -> ConstValue a
LLVM.constOf [Word32
0..]) T n a
x
   (T a -> T n a -> (T a, T n a))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T a, T n a)
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 (,) (T n a -> CodeGenFunction r (T a)
forall n a r. (Positive n, C a) => T n a -> CodeGenFunction r (T a)
last T n a
x) (Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert (ConstValue Word32 -> Value Word32
forall a. ConstValue a -> Value a
value ConstValue Word32
forall a. IsType a => ConstValue a
LLVM.zero) T a
x0 T n a
y)

shiftDown ::
   (TypeNum.Positive n, C a) =>
   MultiValue.T a -> T n a -> CodeGenFunction r (MultiValue.T a, T n a)
shiftDown :: forall n a r.
(Positive n, C a) =>
T a -> T n a -> CodeGenFunction r (T a, T n a)
shiftDown T a
x0 T n a
x = do
   T n a
y <-
      ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
shuffleMatch
         (T [] (ConstValue Word32) -> ConstValue (Vector n Word32)
forall a n.
Positive n =>
T [] (ConstValue a) -> ConstValue (Vector n a)
LLVM.constCyclicVector (T [] (ConstValue Word32) -> ConstValue (Vector n Word32))
-> T [] (ConstValue Word32) -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$
          [ConstValue Word32]
-> ConstValue Word32 -> T [] (ConstValue Word32)
forall (f :: * -> *) a. Traversable f => f a -> a -> T f a
NonEmpty.snoc
             ((Word32 -> ConstValue Word32) -> [Word32] -> [ConstValue Word32]
forall a b. (a -> b) -> [a] -> [b]
List.map Word32 -> ConstValue Word32
forall a. IsConst a => a -> ConstValue a
LLVM.constOf ([Word32] -> [ConstValue Word32])
-> [Word32] -> [ConstValue Word32]
forall a b. (a -> b) -> a -> b
$ Int -> [Word32] -> [Word32]
forall a. Int -> [a] -> [a]
List.take (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x Int -> Int -> Int
forall a. Num a => a -> a -> a
- Int
1) [Word32
1..])
             ConstValue Word32
forall a. IsType a => ConstValue a
LLVM.undef) T n a
x
   (T a -> T n a -> (T a, T n a))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T a, T n a)
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 (,)
      (Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract (ConstValue Word32 -> Value Word32
forall a. ConstValue a -> Value a
value ConstValue Word32
forall a. IsType a => ConstValue a
LLVM.zero) T n a
x)
      (Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert (Word32 -> Value Word32
forall a. IsConst a => a -> Value a
LLVM.valueOf (T n a -> Word32
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
x Word32 -> Word32 -> Word32
forall a. Num a => a -> a -> a
- Word32
1)) T a
x0 T n a
y)

shiftUpMultiIndices ::
   (TypeNum.Positive n) => Int -> Int -> LLVM.ConstValue (LLVM.Vector n Word32)
shiftUpMultiIndices :: forall n. Positive n => Int -> Int -> ConstValue (Vector n Word32)
shiftUpMultiIndices Int
n Int
sizev =
   T [] Word32 -> ConstValue (Vector n Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector n Word32))
-> T [] Word32 -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$ (Int -> Word32) -> T [] Int -> T [] Word32
forall a b. (a -> b) -> T [] a -> T [] b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Word32
forall a b. (Integral a, Num b) => a -> b
P.fromIntegral (T [] Int -> T [] Word32) -> T [] Int -> T [] Word32
forall a b. (a -> b) -> a -> b
$
   [Int] -> T [] Int -> T [] Int
forall (f :: * -> *) a.
(Append f, Traversable f) =>
f a -> T f a -> T f a
NonEmpty.appendLeft (Int -> Int -> [Int]
forall a. Int -> a -> [a]
List.replicate Int
n Int
sizev) ((Int -> Int) -> Int -> T [] Int
forall a. (a -> a) -> a -> T [] a
forall (f :: * -> *) a. Iterate f => (a -> a) -> a -> f a
NonEmptyC.iterate (Int
1Int -> Int -> Int
forall a. Num a => a -> a -> a
+) Int
0)

shiftDownMultiIndices ::
   (TypeNum.Positive n) => Int -> Int -> LLVM.ConstValue (LLVM.Vector n Word32)
shiftDownMultiIndices :: forall n. Positive n => Int -> Int -> ConstValue (Vector n Word32)
shiftDownMultiIndices Int
n Int
sizev =
   T [] Word32 -> ConstValue (Vector n Word32)
forall a n.
(IsConst a, Positive n) =>
T [] a -> ConstValue (Vector n a)
constCyclicVector (T [] Word32 -> ConstValue (Vector n Word32))
-> T [] Word32 -> ConstValue (Vector n Word32)
forall a b. (a -> b) -> a -> b
$ (Int -> Word32) -> T [] Int -> T [] Word32
forall a b. (a -> b) -> T [] a -> T [] b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Int -> Word32
forall a b. (Integral a, Num b) => a -> b
P.fromIntegral (T [] Int -> T [] Word32) -> T [] Int -> T [] Word32
forall a b. (a -> b) -> a -> b
$
   [Int] -> T [] Int -> T [] Int
forall (f :: * -> *) a.
(Append f, Traversable f) =>
f a -> T f a -> T f a
NonEmpty.appendLeft
      ((Int -> Bool) -> [Int] -> [Int]
forall a. (a -> Bool) -> [a] -> [a]
List.takeWhile (Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
sizev) ([Int] -> [Int]) -> [Int] -> [Int]
forall a b. (a -> b) -> a -> b
$ (Int -> Int) -> Int -> [Int]
forall a. (a -> a) -> a -> [a]
List.iterate (Int
1Int -> Int -> Int
forall a. Num a => a -> a -> a
+) Int
n)
      (Int -> T [] Int
forall a. a -> T [] a
forall (f :: * -> *) a. Repeat f => a -> f a
NonEmptyC.repeat Int
sizev)

shiftUpMultiZero ::
   (TypeNum.Positive n, C a) =>
   Int -> T n a -> LLVM.CodeGenFunction r (T n a)
shiftUpMultiZero :: forall n a r.
(Positive n, C a) =>
Int -> T n a -> CodeGenFunction r (T n a)
shiftUpMultiZero Int
n T n a
v =
   ConstValue (Vector n Word32)
-> T n a -> T n a -> CodeGenFunction r (T n a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle (Int -> Int -> ConstValue (Vector n Word32)
forall n. Positive n => Int -> Int -> ConstValue (Vector n Word32)
shiftUpMultiIndices Int
n (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
v)) T n a
v T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
zero

shiftDownMultiZero ::
   (TypeNum.Positive n, C a) =>
   Int -> T n a -> LLVM.CodeGenFunction r (T n a)
shiftDownMultiZero :: forall n a r.
(Positive n, C a) =>
Int -> T n a -> CodeGenFunction r (T n a)
shiftDownMultiZero Int
n T n a
v =
   ConstValue (Vector n Word32)
-> T n a -> T n a -> CodeGenFunction r (T n a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle (Int -> Int -> ConstValue (Vector n Word32)
forall n. Positive n => Int -> Int -> ConstValue (Vector n Word32)
shiftDownMultiIndices Int
n (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
v)) T n a
v T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
zero

shiftUpMultiUndef ::
   (TypeNum.Positive n, C a) =>
   Int -> T n a -> LLVM.CodeGenFunction r (T n a)
shiftUpMultiUndef :: forall n a r.
(Positive n, C a) =>
Int -> T n a -> CodeGenFunction r (T n a)
shiftUpMultiUndef Int
n T n a
v =
   ConstValue (Vector n Word32)
-> T n a -> T n a -> CodeGenFunction r (T n a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle (Int -> Int -> ConstValue (Vector n Word32)
forall n. Positive n => Int -> Int -> ConstValue (Vector n Word32)
shiftUpMultiIndices Int
n (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
v)) T n a
v T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef

shiftDownMultiUndef ::
   (TypeNum.Positive n, C a) =>
   Int -> T n a -> LLVM.CodeGenFunction r (T n a)
shiftDownMultiUndef :: forall n a r.
(Positive n, C a) =>
Int -> T n a -> CodeGenFunction r (T n a)
shiftDownMultiUndef Int
n T n a
v =
   ConstValue (Vector n Word32)
-> T n a -> T n a -> CodeGenFunction r (T n a)
forall a n m r.
(C a, Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n a -> T n a -> CodeGenFunction r (T m a)
shuffle (Int -> Int -> ConstValue (Vector n Word32)
forall n. Positive n => Int -> Int -> ConstValue (Vector n Word32)
shiftDownMultiIndices Int
n (T n a -> Int
forall n i a. (Positive n, Integral i) => T n a -> i
size T n a
v)) T n a
v T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
undef


-- * method implementations based on Traversable

shuffleMatchTraversable ::
   (TypeNum.Positive n, C a, Trav.Traversable f) =>
   LLVM.ConstValue (LLVM.Vector n Word32) ->
   f (T n a) -> CodeGenFunction r (f (T n a))
shuffleMatchTraversable :: forall n a (f :: * -> *) r.
(Positive n, C a, Traversable f) =>
ConstValue (Vector n Word32)
-> f (T n a) -> CodeGenFunction r (f (T n a))
shuffleMatchTraversable ConstValue (Vector n Word32)
is f (T n a)
v =
   (T n a -> CodeGenFunction r (T n a))
-> f (T n a) -> CodeGenFunction r (f (T n a))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> f a -> m (f b)
Trav.mapM (ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
forall n a r.
(Positive n, C a) =>
ConstValue (Vector n Word32) -> T n a -> CodeGenFunction r (T n a)
shuffleMatch ConstValue (Vector n Word32)
is) f (T n a)
v

insertTraversable ::
   (TypeNum.Positive n, C a, Trav.Traversable f, App.Applicative f) =>
   LLVM.Value Word32 -> f (MultiValue.T a) ->
   f (T n a) -> CodeGenFunction r (f (T n a))
insertTraversable :: forall n a (f :: * -> *) r.
(Positive n, C a, Traversable f, Applicative f) =>
Value Word32
-> f (T a) -> f (T n a) -> CodeGenFunction r (f (T n a))
insertTraversable Value Word32
n f (T a)
a f (T n a)
v =
   f (CodeGenFunction r (T n a)) -> CodeGenFunction r (f (T n a))
forall (t :: * -> *) (m :: * -> *) a.
(Traversable t, Monad m) =>
t (m a) -> m (t a)
forall (m :: * -> *) a. Monad m => f (m a) -> m (f a)
Trav.sequence ((T a -> T n a -> CodeGenFunction r (T n a))
-> f (T a) -> f (T n a) -> f (CodeGenFunction r (T n a))
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
Value Word32 -> T a -> T n a -> CodeGenFunction r (T n a)
insert Value Word32
n) f (T a)
a f (T n a)
v)

extractTraversable ::
   (TypeNum.Positive n, C a, Trav.Traversable f) =>
   LLVM.Value Word32 -> f (T n a) ->
   CodeGenFunction r (f (MultiValue.T a))
extractTraversable :: forall n a (f :: * -> *) r.
(Positive n, C a, Traversable f) =>
Value Word32 -> f (T n a) -> CodeGenFunction r (f (T a))
extractTraversable Value Word32
n f (T n a)
v =
   (T n a -> CodeGenFunction r (T a))
-> f (T n a) -> CodeGenFunction r (f (T a))
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> f a -> m (f b)
Trav.mapM (Value Word32 -> T n a -> CodeGenFunction r (T a)
forall a n r.
(C a, Positive n) =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
forall n r.
Positive n =>
Value Word32 -> T n a -> CodeGenFunction r (T a)
extract Value Word32
n) f (T n a)
v



lift1 :: (Repr n a -> Repr n b) -> T n a -> T n b
lift1 :: forall n a b. (Repr n a -> Repr n b) -> T n a -> T n b
lift1 Repr n a -> Repr n b
f (Cons Repr n a
a) = Repr n b -> T n b
forall n a. Repr n a -> T n a
Cons (Repr n b -> T n b) -> Repr n b -> T n b
forall a b. (a -> b) -> a -> b
$ Repr n a -> Repr n b
f Repr n a
a

_liftM0 ::
   (Monad m) =>
   m (Repr n a) ->
   m (T n a)
_liftM0 :: forall (m :: * -> *) n a. Monad m => m (Repr n a) -> m (T n a)
_liftM0 m (Repr n a)
f = (Repr n a -> T n a) -> m (Repr n a) -> m (T n a)
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift Repr n a -> T n a
forall n a. Repr n a -> T n a
Cons m (Repr n a)
f

liftM0 ::
   (Monad m,
    Repr n a ~ Value n ar) =>
   m (Value n ar) ->
   m (T n a)
liftM0 :: forall (m :: * -> *) n a ar.
(Monad m, Repr n a ~ Value n ar) =>
m (Value n ar) -> m (T n a)
liftM0 m (Value n ar)
f = (Value n ar -> T n a) -> m (Value n ar) -> m (T n a)
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift Value n ar -> T n a
forall n a ar. (Repr n a ~ Value n ar) => Value n ar -> T n a
consPrim m (Value n ar)
f

liftM ::
   (Monad m,
    Repr n a ~ Value n ar,
    Repr n b ~ Value n br) =>
   (Value n ar -> m (Value n br)) ->
   T n a -> m (T n b)
liftM :: forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n ar -> m (Value n br)
f T n a
a = (Value n br -> T n b) -> m (Value n br) -> m (T n b)
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift Value n br -> T n b
forall n a ar. (Repr n a ~ Value n ar) => Value n ar -> T n a
consPrim (m (Value n br) -> m (T n b)) -> m (Value n br) -> m (T n b)
forall a b. (a -> b) -> a -> b
$ Value n ar -> m (Value n br)
f (T n a -> Value n ar
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim T n a
a)

liftM2 ::
   (Monad m,
    Repr n a ~ Value n ar,
    Repr n b ~ Value n br,
    Repr n c ~ Value n cr) =>
   (Value n ar -> Value n br -> m (Value n cr)) ->
   T n a -> T n b -> m (T n c)
liftM2 :: forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n ar -> Value n br -> m (Value n cr)
f T n a
a T n b
b = (Value n cr -> T n c) -> m (Value n cr) -> m (T n c)
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift Value n cr -> T n c
forall n a ar. (Repr n a ~ Value n ar) => Value n ar -> T n a
consPrim (m (Value n cr) -> m (T n c)) -> m (Value n cr) -> m (T n c)
forall a b. (a -> b) -> a -> b
$ Value n ar -> Value n br -> m (Value n cr)
f (T n a -> Value n ar
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim T n a
a) (T n b -> Value n br
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim T n b
b)

liftM3 ::
   (Monad m,
    Repr n a ~ Value n ar,
    Repr n b ~ Value n br,
    Repr n c ~ Value n cr,
    Repr n d ~ Value n dr) =>
   (Value n ar -> Value n br -> Value n cr -> m (Value n dr)) ->
   T n a -> T n b -> T n c -> m (T n d)
liftM3 :: forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value n ar -> Value n br -> Value n cr -> m (Value n dr)
f T n a
a T n b
b T n c
c =
   (Value n dr -> T n d) -> m (Value n dr) -> m (T n d)
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift Value n dr -> T n d
forall n a ar. (Repr n a ~ Value n ar) => Value n ar -> T n a
consPrim (m (Value n dr) -> m (T n d)) -> m (Value n dr) -> m (T n d)
forall a b. (a -> b) -> a -> b
$ Value n ar -> Value n br -> Value n cr -> m (Value n dr)
f (T n a -> Value n ar
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim T n a
a) (T n b -> Value n br
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim T n b
b) (T n c -> Value n cr
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
deconsPrim T n c
c)



class (MultiValue.Additive a, C a) => Additive a where
   add ::
      (TypeNum.Positive n) =>
      T n a -> T n a -> LLVM.CodeGenFunction r (T n a)
   sub ::
      (TypeNum.Positive n) =>
      T n a -> T n a -> LLVM.CodeGenFunction r (T n a)
   neg ::
      (TypeNum.Positive n) =>
      T n a -> LLVM.CodeGenFunction r (T n a)

instance Additive Float where
   add :: forall n r.
Positive n =>
T n Float -> T n Float -> CodeGenFunction r (T n Float)
add = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Float -> T n Float -> CodeGenFunction r (T n Float)
sub = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
neg = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Double where
   add :: forall n r.
Positive n =>
T n Double -> T n Double -> CodeGenFunction r (T n Double)
add = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Double -> T n Double -> CodeGenFunction r (T n Double)
sub = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
neg = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Int where
   add :: forall n r.
Positive n =>
T n Int -> T n Int -> CodeGenFunction r (T n Int)
add = (Value n Int -> Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Int -> T n Int -> CodeGenFunction r (T n Int)
sub = (Value n Int -> Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r. Positive n => T n Int -> CodeGenFunction r (T n Int)
neg = (Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int -> CodeGenFunction r (Value n Int)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Int8 where
   add :: forall n r.
Positive n =>
T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
add = (Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
sub = (Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r. Positive n => T n Int8 -> CodeGenFunction r (T n Int8)
neg = (Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Int16 where
   add :: forall n r.
Positive n =>
T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
add = (Value n Int16
 -> Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
sub = (Value n Int16
 -> Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Int16 -> CodeGenFunction r (T n Int16)
neg = (Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int16 -> CodeGenFunction r (Value n Int16)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Int32 where
   add :: forall n r.
Positive n =>
T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
add = (Value n Int32
 -> Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
sub = (Value n Int32
 -> Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Int32 -> CodeGenFunction r (T n Int32)
neg = (Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int32 -> CodeGenFunction r (Value n Int32)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Int64 where
   add :: forall n r.
Positive n =>
T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
add = (Value n Int64
 -> Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
sub = (Value n Int64
 -> Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Int64 -> CodeGenFunction r (T n Int64)
neg = (Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int64 -> CodeGenFunction r (Value n Int64)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Word where
   add :: forall n r.
Positive n =>
T n Word -> T n Word -> CodeGenFunction r (T n Word)
add = (Value n Word -> Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Word -> T n Word -> CodeGenFunction r (T n Word)
sub = (Value n Word -> Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r. Positive n => T n Word -> CodeGenFunction r (T n Word)
neg = (Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word -> CodeGenFunction r (Value n Word)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Word8 where
   add :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
add = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
sub = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Word8 -> CodeGenFunction r (T n Word8)
neg = (Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word8 -> CodeGenFunction r (Value n Word8)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Word16 where
   add :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
add = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
sub = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Word16 -> CodeGenFunction r (T n Word16)
neg = (Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word16 -> CodeGenFunction r (Value n Word16)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Word32 where
   add :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
add = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
sub = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Word32 -> CodeGenFunction r (T n Word32)
neg = (Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word32 -> CodeGenFunction r (Value n Word32)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance Additive Word64 where
   add :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
add = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.add; sub :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
sub = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.sub; neg :: forall n r.
Positive n =>
T n Word64 -> CodeGenFunction r (T n Word64)
neg = (Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word64 -> CodeGenFunction r (Value n Word64)
forall a r.
IsArithmetic a =>
Value a -> CodeGenFunction r (Value a)
LLVM.neg

instance (TypeNum.Positive n, Additive a) => A.Additive (T n a) where
   zero :: T n a
zero = T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
zero
   add :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
add = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
add
   sub :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
sub = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
sub
   neg :: forall r. T n a -> CodeGenFunction r (T n a)
neg = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Additive a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
neg


class (MultiValue.PseudoRing a, Additive a) => PseudoRing a where
   mul ::
      (TypeNum.Positive n) =>
      T n a -> T n a -> LLVM.CodeGenFunction r (T n a)

instance PseudoRing Float where
   mul :: forall n r.
Positive n =>
T n Float -> T n Float -> CodeGenFunction r (T n Float)
mul = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.mul

instance PseudoRing Double where
   mul :: forall n r.
Positive n =>
T n Double -> T n Double -> CodeGenFunction r (T n Double)
mul = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r.
IsArithmetic a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.mul

instance (TypeNum.Positive n, PseudoRing a) => A.PseudoRing (T n a) where
   mul :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
mul = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(PseudoRing a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
mul


class (MultiValue.Field a, PseudoRing a) => Field a where
   fdiv ::
      (TypeNum.Positive n) =>
      T n a -> T n a -> LLVM.CodeGenFunction r (T n a)

instance Field Float where
   fdiv :: forall n r.
Positive n =>
T n Float -> T n Float -> CodeGenFunction r (T n Float)
fdiv = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r.
IsFloating a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.fdiv

instance Field Double where
   fdiv :: forall n r.
Positive n =>
T n Double -> T n Double -> CodeGenFunction r (T n Double)
fdiv = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r.
IsFloating a =>
Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.fdiv

instance (TypeNum.Positive n, Field a) => A.Field (T n a) where
   fdiv :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
fdiv = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Field a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
fdiv


scale ::
   (TypeNum.Positive n, PseudoRing a) =>
   MultiValue.T a -> T n a -> LLVM.CodeGenFunction r (T n a)
scale :: forall n a r.
(Positive n, PseudoRing a) =>
T a -> T n a -> CodeGenFunction r (T n a)
scale T a
a T n a
v = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n a -> T n a -> CodeGenFunction r (T n a)
forall a b c. (a -> b -> c) -> b -> a -> c
flip T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(PseudoRing a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
mul T n a
v (T n a -> CodeGenFunction r (T n a))
-> CodeGenFunction r (T n a) -> CodeGenFunction r (T n a)
forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< T a -> CodeGenFunction r (T n a)
forall n a r. (Positive n, C a) => T a -> CodeGenFunction r (T n a)
replicate T a
a


type instance A.Scalar (T n a) = T n (MultiValue.Scalar a)

class
   (MultiValue.PseudoModule v, PseudoRing (MultiValue.Scalar v), Additive v) =>
      PseudoModule v where
   scaleMulti ::
      (TypeNum.Positive n) =>
      T n (MultiValue.Scalar v) -> T n v -> LLVM.CodeGenFunction r (T n v)

instance PseudoModule Float where
   scaleMulti :: forall n r.
Positive n =>
T n (Scalar Float) -> T n Float -> CodeGenFunction r (T n Float)
scaleMulti = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall r.
Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r. PseudoRing a => a -> a -> CodeGenFunction r a
A.mul

instance PseudoModule Double where
   scaleMulti :: forall n r.
Positive n =>
T n (Scalar Double) -> T n Double -> CodeGenFunction r (T n Double)
scaleMulti = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall r.
Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r. PseudoRing a => a -> a -> CodeGenFunction r a
A.mul

instance (TypeNum.Positive n, PseudoModule a) => A.PseudoModule (T n a) where
   scale :: forall r. Scalar (T n a) -> T n a -> CodeGenFunction r (T n a)
scale = Scalar (T n a) -> T n a -> CodeGenFunction r (T n a)
T n (Scalar a) -> T n a -> CodeGenFunction r (T n a)
forall v n r.
(PseudoModule v, Positive n) =>
T n (Scalar v) -> T n v -> CodeGenFunction r (T n v)
forall n r.
Positive n =>
T n (Scalar a) -> T n a -> CodeGenFunction r (T n a)
scaleMulti


class (MultiValue.Real a, Additive a) => Real a where
   min :: (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a)
   max :: (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a)
   abs :: (TypeNum.Positive n) => T n a -> LLVM.CodeGenFunction r (T n a)
   signum :: (TypeNum.Positive n) => T n a -> LLVM.CodeGenFunction r (T n a)

instance Real Float where
   min :: forall n r.
Positive n =>
T n Float -> T n Float -> CodeGenFunction r (T n Float)
min = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall r.
Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Float -> T n Float -> CodeGenFunction r (T n Float)
max = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall r.
Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
abs = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
signum = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Double where
   min :: forall n r.
Positive n =>
T n Double -> T n Double -> CodeGenFunction r (T n Double)
min = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall r.
Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Double -> T n Double -> CodeGenFunction r (T n Double)
max = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall r.
Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
abs = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
signum = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Word where
   min :: forall n r.
Positive n =>
T n Word -> T n Word -> CodeGenFunction r (T n Word)
min = (Value n Word -> Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
forall r.
Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Word -> T n Word -> CodeGenFunction r (T n Word)
max = (Value n Word -> Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
forall r.
Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r. Positive n => T n Word -> CodeGenFunction r (T n Word)
abs = (Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word -> CodeGenFunction r (Value n Word)
forall r. Value n Word -> CodeGenFunction r (Value n Word)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r. Positive n => T n Word -> CodeGenFunction r (T n Word)
signum = (Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word -> CodeGenFunction r (Value n Word)
forall r. Value n Word -> CodeGenFunction r (Value n Word)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Word8 where
   min :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
min = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
forall r.
Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
max = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
forall r.
Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Word8 -> CodeGenFunction r (T n Word8)
abs = (Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word8 -> CodeGenFunction r (Value n Word8)
forall r. Value n Word8 -> CodeGenFunction r (Value n Word8)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Word8 -> CodeGenFunction r (T n Word8)
signum = (Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word8 -> CodeGenFunction r (Value n Word8)
forall r. Value n Word8 -> CodeGenFunction r (Value n Word8)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Word16 where
   min :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
min = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
forall r.
Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
max = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
forall r.
Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Word16 -> CodeGenFunction r (T n Word16)
abs = (Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word16 -> CodeGenFunction r (Value n Word16)
forall r. Value n Word16 -> CodeGenFunction r (Value n Word16)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Word16 -> CodeGenFunction r (T n Word16)
signum = (Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word16 -> CodeGenFunction r (Value n Word16)
forall r. Value n Word16 -> CodeGenFunction r (Value n Word16)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Word32 where
   min :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
min = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
forall r.
Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
max = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
forall r.
Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Word32 -> CodeGenFunction r (T n Word32)
abs = (Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word32 -> CodeGenFunction r (Value n Word32)
forall r. Value n Word32 -> CodeGenFunction r (Value n Word32)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Word32 -> CodeGenFunction r (T n Word32)
signum = (Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word32 -> CodeGenFunction r (Value n Word32)
forall r. Value n Word32 -> CodeGenFunction r (Value n Word32)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Word64 where
   min :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
min = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
forall r.
Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
max = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
forall r.
Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Word64 -> CodeGenFunction r (T n Word64)
abs = (Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word64 -> CodeGenFunction r (Value n Word64)
forall r. Value n Word64 -> CodeGenFunction r (Value n Word64)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Word64 -> CodeGenFunction r (T n Word64)
signum = (Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word64 -> CodeGenFunction r (Value n Word64)
forall r. Value n Word64 -> CodeGenFunction r (Value n Word64)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Int where
   min :: forall n r.
Positive n =>
T n Int -> T n Int -> CodeGenFunction r (T n Int)
min = (Value n Int -> Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
forall r.
Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Int -> T n Int -> CodeGenFunction r (T n Int)
max = (Value n Int -> Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
forall r.
Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r. Positive n => T n Int -> CodeGenFunction r (T n Int)
abs = (Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int -> CodeGenFunction r (Value n Int)
forall r. Value n Int -> CodeGenFunction r (Value n Int)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r. Positive n => T n Int -> CodeGenFunction r (T n Int)
signum = (Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int -> CodeGenFunction r (Value n Int)
forall r. Value n Int -> CodeGenFunction r (Value n Int)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Int8 where
   min :: forall n r.
Positive n =>
T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
min = (Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
forall r.
Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
max = (Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
forall r.
Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r. Positive n => T n Int8 -> CodeGenFunction r (T n Int8)
abs = (Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int8 -> CodeGenFunction r (Value n Int8)
forall r. Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r. Positive n => T n Int8 -> CodeGenFunction r (T n Int8)
signum = (Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int8 -> CodeGenFunction r (Value n Int8)
forall r. Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Int16 where
   min :: forall n r.
Positive n =>
T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
min = (Value n Int16
 -> Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
forall r.
Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
max = (Value n Int16
 -> Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
forall r.
Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Int16 -> CodeGenFunction r (T n Int16)
abs = (Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int16 -> CodeGenFunction r (Value n Int16)
forall r. Value n Int16 -> CodeGenFunction r (Value n Int16)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Int16 -> CodeGenFunction r (T n Int16)
signum = (Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int16 -> CodeGenFunction r (Value n Int16)
forall r. Value n Int16 -> CodeGenFunction r (Value n Int16)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Int32 where
   min :: forall n r.
Positive n =>
T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
min = (Value n Int32
 -> Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
forall r.
Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
max = (Value n Int32
 -> Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
forall r.
Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Int32 -> CodeGenFunction r (T n Int32)
abs = (Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int32 -> CodeGenFunction r (Value n Int32)
forall r. Value n Int32 -> CodeGenFunction r (Value n Int32)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Int32 -> CodeGenFunction r (T n Int32)
signum = (Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int32 -> CodeGenFunction r (Value n Int32)
forall r. Value n Int32 -> CodeGenFunction r (Value n Int32)
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance Real Int64 where
   min :: forall n r.
Positive n =>
T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
min = (Value n Int64
 -> Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
forall r.
Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall n r.
Positive n =>
T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
max = (Value n Int64
 -> Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
forall r.
Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall n r.
Positive n =>
T n Int64 -> CodeGenFunction r (T n Int64)
abs = (Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int64 -> CodeGenFunction r (Value n Int64)
forall r. Value n Int64 -> CodeGenFunction r (Value n Int64)
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall n r.
Positive n =>
T n Int64 -> CodeGenFunction r (T n Int64)
signum = (Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Int64 -> CodeGenFunction r (Value n Int64)
forall r. Value n Int64 -> CodeGenFunction r (Value n Int64)
forall a r. Real a => a -> CodeGenFunction r a
A.signum


instance (TypeNum.Positive n, Real a) => A.Real (T n a) where
   min :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
min = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
min
   max :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
max = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
max
   abs :: forall r. T n a -> CodeGenFunction r (T n a)
abs = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
abs
   signum :: forall r. T n a -> CodeGenFunction r (T n a)
signum = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Real a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
signum


class (MultiValue.Fraction a, Real a) => Fraction a where
   truncate :: (TypeNum.Positive n) => T n a -> LLVM.CodeGenFunction r (T n a)
   fraction :: (TypeNum.Positive n) => T n a -> LLVM.CodeGenFunction r (T n a)

instance Fraction Float where
   truncate :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
truncate = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Fraction a => a -> CodeGenFunction r a
A.truncate
   fraction :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
fraction = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Fraction a => a -> CodeGenFunction r a
A.fraction

instance Fraction Double where
   truncate :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
truncate = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Fraction a => a -> CodeGenFunction r a
A.truncate
   fraction :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
fraction = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Fraction a => a -> CodeGenFunction r a
A.fraction

instance (TypeNum.Positive n, Fraction a) => A.Fraction (T n a) where
   truncate :: forall r. T n a -> CodeGenFunction r (T n a)
truncate = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Fraction a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
truncate
   fraction :: forall r. T n a -> CodeGenFunction r (T n a)
fraction = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Fraction a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
fraction


class
   (TypeNum.Positive n, Repr n i ~ Value n ir,
    MultiValue.NativeInteger i ir, IsPrimitive ir, LLVM.IsInteger ir) =>
      NativeInteger n i ir where

instance (TypeNum.Positive n) => NativeInteger n Word   Word   where
instance (TypeNum.Positive n) => NativeInteger n Word8  Word8  where
instance (TypeNum.Positive n) => NativeInteger n Word16 Word16 where
instance (TypeNum.Positive n) => NativeInteger n Word32 Word32 where
instance (TypeNum.Positive n) => NativeInteger n Word64 Word64 where

instance (TypeNum.Positive n) => NativeInteger n Int   Int   where
instance (TypeNum.Positive n) => NativeInteger n Int8  Int8  where
instance (TypeNum.Positive n) => NativeInteger n Int16 Int16 where
instance (TypeNum.Positive n) => NativeInteger n Int32 Int32 where
instance (TypeNum.Positive n) => NativeInteger n Int64 Int64 where

class
   (TypeNum.Positive n, Repr n a ~ Value n ar,
    MultiValue.NativeFloating a ar, IsPrimitive ar, LLVM.IsFloating ar) =>
      NativeFloating n a ar where

instance (TypeNum.Positive n) => NativeFloating n Float  Float where
instance (TypeNum.Positive n) => NativeFloating n Double Double where

fromIntegral ::
   (NativeInteger n i ir, NativeFloating n a ar) =>
   T n i -> LLVM.CodeGenFunction r (T n a)
fromIntegral :: forall n i ir a ar r.
(NativeInteger n i ir, NativeFloating n a ar) =>
T n i -> CodeGenFunction r (T n a)
fromIntegral = (Value n ir -> CodeGenFunction r (Value n ar))
-> T n i -> CodeGenFunction r (T n a)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n ir -> CodeGenFunction r (Value n ar)
forall (value :: * -> *) a b r.
(ValueCons value, IsInteger a, IsFloating b,
 ShapeOf a ~ ShapeOf b) =>
value a -> CodeGenFunction r (value b)
LLVM.inttofp


class (MultiValue.Algebraic a, Field a) => Algebraic a where
   sqrt :: (TypeNum.Positive n) => T n a -> LLVM.CodeGenFunction r (T n a)

instance Algebraic Float where
   sqrt :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
sqrt = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Algebraic a => a -> CodeGenFunction r a
A.sqrt

instance Algebraic Double where
   sqrt :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
sqrt = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Algebraic a => a -> CodeGenFunction r a
A.sqrt

instance (TypeNum.Positive n, Algebraic a) => A.Algebraic (T n a) where
   sqrt :: forall r. T n a -> CodeGenFunction r (T n a)
sqrt = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Algebraic a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
sqrt


class (MultiValue.Transcendental a, Algebraic a) => Transcendental a where
   pi :: (TypeNum.Positive n) => LLVM.CodeGenFunction r (T n a)
   sin, cos, exp, log ::
      (TypeNum.Positive n) => T n a -> LLVM.CodeGenFunction r (T n a)
   pow ::
      (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a)

instance Transcendental Float where
   pi :: forall n r. Positive n => CodeGenFunction r (T n Float)
pi = CodeGenFunction r (Value n Float) -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar.
(Monad m, Repr n a ~ Value n ar) =>
m (Value n ar) -> m (T n a)
liftM0 CodeGenFunction r (Value n Float)
forall r. CodeGenFunction r (Value n Float)
forall a r. Transcendental a => CodeGenFunction r a
A.pi
   sin :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
sin = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.sin
   cos :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
cos = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.cos
   exp :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
exp = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.exp
   log :: forall n r.
Positive n =>
T n Float -> CodeGenFunction r (T n Float)
log = (Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Float -> CodeGenFunction r (Value n Float)
forall r. Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.log
   pow :: forall n r.
Positive n =>
T n Float -> T n Float -> CodeGenFunction r (T n Float)
pow = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Float))
-> T n Float -> T n Float -> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall r.
Value n Float -> Value n Float -> CodeGenFunction r (Value n Float)
forall a r. Transcendental a => a -> a -> CodeGenFunction r a
A.pow

instance Transcendental Double where
   pi :: forall n r. Positive n => CodeGenFunction r (T n Double)
pi = CodeGenFunction r (Value n Double)
-> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar.
(Monad m, Repr n a ~ Value n ar) =>
m (Value n ar) -> m (T n a)
liftM0 CodeGenFunction r (Value n Double)
forall r. CodeGenFunction r (Value n Double)
forall a r. Transcendental a => CodeGenFunction r a
A.pi
   sin :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
sin = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.sin
   cos :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
cos = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.cos
   exp :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
exp = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.exp
   log :: forall n r.
Positive n =>
T n Double -> CodeGenFunction r (T n Double)
log = (Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Double -> CodeGenFunction r (Value n Double)
forall r. Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Transcendental a => a -> CodeGenFunction r a
A.log
   pow :: forall n r.
Positive n =>
T n Double -> T n Double -> CodeGenFunction r (T n Double)
pow = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Double))
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall r.
Value n Double
-> Value n Double -> CodeGenFunction r (Value n Double)
forall a r. Transcendental a => a -> a -> CodeGenFunction r a
A.pow

instance (TypeNum.Positive n, Transcendental a) => A.Transcendental (T n a) where
   pi :: forall r. CodeGenFunction r (T n a)
pi = CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
CodeGenFunction r (T n a)
forall n r. Positive n => CodeGenFunction r (T n a)
pi
   sin :: forall r. T n a -> CodeGenFunction r (T n a)
sin = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
sin
   cos :: forall r. T n a -> CodeGenFunction r (T n a)
cos = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
cos
   exp :: forall r. T n a -> CodeGenFunction r (T n a)
exp = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
exp
   log :: forall r. T n a -> CodeGenFunction r (T n a)
log = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
log
   pow :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
pow = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Transcendental a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
pow



class (MultiValue.Select a, C a) => Select a where
   select ::
      (TypeNum.Positive n) =>
      T n Bool -> T n a -> T n a ->
      LLVM.CodeGenFunction r (T n a)

instance Select Float where select :: forall n r.
Positive n =>
T n Bool -> T n Float -> T n Float -> CodeGenFunction r (T n Float)
select = (Value n Bool
 -> Value n Float
 -> Value n Float
 -> CodeGenFunction r (Value n Float))
-> T n Bool
-> T n Float
-> T n Float
-> CodeGenFunction r (T n Float)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Float))
-> Value n Float
-> Value n Float
-> CodeGenFunction r (Value n Float)
Value n Bool
-> Value n Float
-> Value n Float
-> CodeGenFunction r (Value n Float)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Double where select :: forall n r.
Positive n =>
T n Bool
-> T n Double -> T n Double -> CodeGenFunction r (T n Double)
select = (Value n Bool
 -> Value n Double
 -> Value n Double
 -> CodeGenFunction r (Value n Double))
-> T n Bool
-> T n Double
-> T n Double
-> CodeGenFunction r (T n Double)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Double))
-> Value n Double
-> Value n Double
-> CodeGenFunction r (Value n Double)
Value n Bool
-> Value n Double
-> Value n Double
-> CodeGenFunction r (Value n Double)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Bool where select :: forall n r.
Positive n =>
T n Bool -> T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
select = (Value n Bool
 -> Value n Bool
 -> Value n Bool
 -> CodeGenFunction r (Value n Bool))
-> T n Bool -> T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Bool))
-> Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool)
Value n Bool
-> Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Word where select :: forall n r.
Positive n =>
T n Bool -> T n Word -> T n Word -> CodeGenFunction r (T n Word)
select = (Value n Bool
 -> Value n Word
 -> Value n Word
 -> CodeGenFunction r (Value n Word))
-> T n Bool -> T n Word -> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Word))
-> Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
Value n Bool
-> Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Word8 where select :: forall n r.
Positive n =>
T n Bool -> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
select = (Value n Bool
 -> Value n Word8
 -> Value n Word8
 -> CodeGenFunction r (Value n Word8))
-> T n Bool
-> T n Word8
-> T n Word8
-> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Word8))
-> Value n Word8
-> Value n Word8
-> CodeGenFunction r (Value n Word8)
Value n Bool
-> Value n Word8
-> Value n Word8
-> CodeGenFunction r (Value n Word8)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Word16 where select :: forall n r.
Positive n =>
T n Bool
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
select = (Value n Bool
 -> Value n Word16
 -> Value n Word16
 -> CodeGenFunction r (Value n Word16))
-> T n Bool
-> T n Word16
-> T n Word16
-> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Word16))
-> Value n Word16
-> Value n Word16
-> CodeGenFunction r (Value n Word16)
Value n Bool
-> Value n Word16
-> Value n Word16
-> CodeGenFunction r (Value n Word16)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Word32 where select :: forall n r.
Positive n =>
T n Bool
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
select = (Value n Bool
 -> Value n Word32
 -> Value n Word32
 -> CodeGenFunction r (Value n Word32))
-> T n Bool
-> T n Word32
-> T n Word32
-> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Word32))
-> Value n Word32
-> Value n Word32
-> CodeGenFunction r (Value n Word32)
Value n Bool
-> Value n Word32
-> Value n Word32
-> CodeGenFunction r (Value n Word32)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Word64 where select :: forall n r.
Positive n =>
T n Bool
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
select = (Value n Bool
 -> Value n Word64
 -> Value n Word64
 -> CodeGenFunction r (Value n Word64))
-> T n Bool
-> T n Word64
-> T n Word64
-> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Word64))
-> Value n Word64
-> Value n Word64
-> CodeGenFunction r (Value n Word64)
Value n Bool
-> Value n Word64
-> Value n Word64
-> CodeGenFunction r (Value n Word64)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Int where select :: forall n r.
Positive n =>
T n Bool -> T n Int -> T n Int -> CodeGenFunction r (T n Int)
select = (Value n Bool
 -> Value n Int -> Value n Int -> CodeGenFunction r (Value n Int))
-> T n Bool -> T n Int -> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Int))
-> Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
Value n Bool
-> Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Int8 where select :: forall n r.
Positive n =>
T n Bool -> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
select = (Value n Bool
 -> Value n Int8
 -> Value n Int8
 -> CodeGenFunction r (Value n Int8))
-> T n Bool -> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Int8))
-> Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
Value n Bool
-> Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Int16 where select :: forall n r.
Positive n =>
T n Bool -> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
select = (Value n Bool
 -> Value n Int16
 -> Value n Int16
 -> CodeGenFunction r (Value n Int16))
-> T n Bool
-> T n Int16
-> T n Int16
-> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Int16))
-> Value n Int16
-> Value n Int16
-> CodeGenFunction r (Value n Int16)
Value n Bool
-> Value n Int16
-> Value n Int16
-> CodeGenFunction r (Value n Int16)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Int32 where select :: forall n r.
Positive n =>
T n Bool -> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
select = (Value n Bool
 -> Value n Int32
 -> Value n Int32
 -> CodeGenFunction r (Value n Int32))
-> T n Bool
-> T n Int32
-> T n Int32
-> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Int32))
-> Value n Int32
-> Value n Int32
-> CodeGenFunction r (Value n Int32)
Value n Bool
-> Value n Int32
-> Value n Int32
-> CodeGenFunction r (Value n Int32)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select
instance Select Int64 where select :: forall n r.
Positive n =>
T n Bool -> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
select = (Value n Bool
 -> Value n Int64
 -> Value n Int64
 -> CodeGenFunction r (Value n Int64))
-> T n Bool
-> T n Int64
-> T n Int64
-> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br c cr d dr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr, Repr n d ~ Value n dr) =>
(Value n ar -> Value n br -> Value n cr -> m (Value n dr))
-> T n a -> T n b -> T n c -> m (T n d)
liftM3 Value (CmpResult (Vector n Int64))
-> Value n Int64
-> Value n Int64
-> CodeGenFunction r (Value n Int64)
Value n Bool
-> Value n Int64
-> Value n Int64
-> CodeGenFunction r (Value n Int64)
forall a r.
CmpRet a =>
Value (CmpResult a)
-> Value a -> Value a -> CodeGenFunction r (Value a)
LLVM.select

instance (Select a, Select b) => Select (a,b) where
   select :: forall n r.
Positive n =>
T n Bool
-> T n (a, b) -> T n (a, b) -> CodeGenFunction r (T n (a, b))
select T n Bool
x T n (a, b)
y0 T n (a, b)
y1 =
      case (T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
y0, T n (a, b) -> (T n a, T n b)
forall n a b. T n (a, b) -> (T n a, T n b)
unzip T n (a, b)
y1) of
         ((T n a
a0,T n b
b0), (T n a
a1,T n b
b1)) ->
            (T n a -> T n b -> T n (a, b))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n b)
-> CodeGenFunction r (T n (a, b))
forall (m :: * -> *) a b r.
Monad m =>
(a -> b -> r) -> m a -> m b -> m r
Monad.lift2 T n a -> T n b -> T n (a, b)
forall n a b. T n a -> T n b -> T n (a, b)
zip
               (T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Select a, Positive n) =>
T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
select T n Bool
x T n a
a0 T n a
a1)
               (T n Bool -> T n b -> T n b -> CodeGenFunction r (T n b)
forall a n r.
(Select a, Positive n) =>
T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n Bool -> T n b -> T n b -> CodeGenFunction r (T n b)
select T n Bool
x T n b
b0 T n b
b1)

instance (Select a, Select b, Select c) => Select (a,b,c) where
   select :: forall n r.
Positive n =>
T n Bool
-> T n (a, b, c)
-> T n (a, b, c)
-> CodeGenFunction r (T n (a, b, c))
select T n Bool
x T n (a, b, c)
y0 T n (a, b, c)
y1 =
      case (T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
y0, T n (a, b, c) -> (T n a, T n b, T n c)
forall n a b c. T n (a, b, c) -> (T n a, T n b, T n c)
unzip3 T n (a, b, c)
y1) of
         ((T n a
a0,T n b
b0,T n c
c0), (T n a
a1,T n b
b1,T n c
c1)) ->
            (T n a -> T n b -> T n c -> T n (a, b, c))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n b)
-> CodeGenFunction r (T n c)
-> CodeGenFunction r (T n (a, b, c))
forall (m :: * -> *) a b c r.
Monad m =>
(a -> b -> c -> r) -> m a -> m b -> m c -> m r
Monad.lift3 T n a -> T n b -> T n c -> T n (a, b, c)
forall n a b c. T n a -> T n b -> T n c -> T n (a, b, c)
zip3
               (T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Select a, Positive n) =>
T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
select T n Bool
x T n a
a0 T n a
a1)
               (T n Bool -> T n b -> T n b -> CodeGenFunction r (T n b)
forall a n r.
(Select a, Positive n) =>
T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n Bool -> T n b -> T n b -> CodeGenFunction r (T n b)
select T n Bool
x T n b
b0 T n b
b1)
               (T n Bool -> T n c -> T n c -> CodeGenFunction r (T n c)
forall a n r.
(Select a, Positive n) =>
T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n Bool -> T n c -> T n c -> CodeGenFunction r (T n c)
select T n Bool
x T n c
c0 T n c
c1)



class (MultiValue.Comparison a, Real a) => Comparison a where
   cmp ::
      (TypeNum.Positive n) =>
      LLVM.CmpPredicate -> T n a -> T n a ->
      LLVM.CodeGenFunction r (T n Bool)

instance Comparison Float where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Float -> T n Float -> CodeGenFunction r (T n Bool)
cmp = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Bool))
-> T n Float -> T n Float -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Float
  -> Value n Float -> CodeGenFunction r (Value n Bool))
 -> T n Float -> T n Float -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Float
    -> Value n Float
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Float
-> T n Float
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Float
-> Value n Float
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Float
-> Value n Float
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Float))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Double where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Double -> T n Double -> CodeGenFunction r (T n Bool)
cmp = (Value n Double
 -> Value n Double -> CodeGenFunction r (Value n Bool))
-> T n Double -> T n Double -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Double
  -> Value n Double -> CodeGenFunction r (Value n Bool))
 -> T n Double -> T n Double -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Double
    -> Value n Double
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Double
-> T n Double
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Double
-> Value n Double
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Double
-> Value n Double
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Double))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Word where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Word -> T n Word -> CodeGenFunction r (T n Bool)
cmp = (Value n Word -> Value n Word -> CodeGenFunction r (Value n Bool))
-> T n Word -> T n Word -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Word -> Value n Word -> CodeGenFunction r (Value n Bool))
 -> T n Word -> T n Word -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Word
    -> Value n Word
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Word
-> T n Word
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Word -> Value n Word -> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Word
-> Value n Word
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Word))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Word8 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Bool)
cmp = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Bool))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Word8
  -> Value n Word8 -> CodeGenFunction r (Value n Bool))
 -> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Word8
    -> Value n Word8
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Word8
-> T n Word8
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Word8
-> Value n Word8
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Word8
-> Value n Word8
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Word8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Word16 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Bool)
cmp = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Bool))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Word16
  -> Value n Word16 -> CodeGenFunction r (Value n Bool))
 -> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Word16
    -> Value n Word16
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Word16
-> T n Word16
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Word16
-> Value n Word16
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Word16
-> Value n Word16
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Word16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Word32 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Bool)
cmp = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Bool))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Word32
  -> Value n Word32 -> CodeGenFunction r (Value n Bool))
 -> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Word32
    -> Value n Word32
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Word32
-> T n Word32
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Word32
-> Value n Word32
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Word32
-> Value n Word32
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Word32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Word64 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Bool)
cmp = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Bool))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Word64
  -> Value n Word64 -> CodeGenFunction r (Value n Bool))
 -> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Word64
    -> Value n Word64
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Word64
-> T n Word64
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Word64
-> Value n Word64
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Word64
-> Value n Word64
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Word64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Int where cmp :: forall n r.
Positive n =>
CmpPredicate -> T n Int -> T n Int -> CodeGenFunction r (T n Bool)
cmp = (Value n Int -> Value n Int -> CodeGenFunction r (Value n Bool))
-> T n Int -> T n Int -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Int -> Value n Int -> CodeGenFunction r (Value n Bool))
 -> T n Int -> T n Int -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Int -> Value n Int -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Int
-> T n Int
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Int -> Value n Int -> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Int
-> Value n Int
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Int))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Int8 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Bool)
cmp = (Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Bool))
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Bool))
 -> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Int8
    -> Value n Int8
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Int8
-> T n Int8
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Int8
-> Value n Int8
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Int8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Int16 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Bool)
cmp = (Value n Int16
 -> Value n Int16 -> CodeGenFunction r (Value n Bool))
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Int16
  -> Value n Int16 -> CodeGenFunction r (Value n Bool))
 -> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Int16
    -> Value n Int16
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Int16
-> T n Int16
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Int16
-> Value n Int16
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Int16
-> Value n Int16
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Int16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Int32 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Bool)
cmp = (Value n Int32
 -> Value n Int32 -> CodeGenFunction r (Value n Bool))
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Int32
  -> Value n Int32 -> CodeGenFunction r (Value n Bool))
 -> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Int32
    -> Value n Int32
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Int32
-> T n Int32
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Int32
-> Value n Int32
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Int32
-> Value n Int32
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Int32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp
instance Comparison Int64 where cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Bool)
cmp = (Value n Int64
 -> Value n Int64 -> CodeGenFunction r (Value n Bool))
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Int64
  -> Value n Int64 -> CodeGenFunction r (Value n Bool))
 -> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Bool))
-> (CmpPredicate
    -> Value n Int64
    -> Value n Int64
    -> CodeGenFunction r (Value n Bool))
-> CmpPredicate
-> T n Int64
-> T n Int64
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CmpPredicate
-> Value n Int64
-> Value n Int64
-> CodeGenFunction r (Value n Bool)
CmpPredicate
-> Value n Int64
-> Value n Int64
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Int64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a) =>
CmpPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.cmp

instance (TypeNum.Positive n, Comparison a) => A.Comparison (T n a) where
   type CmpResult (T n a) = T n Bool
   cmp :: forall r.
CmpPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
cmp = CmpPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
CmpPredicate -> T n a -> T n a -> CodeGenFunction r (T n Bool)
forall a n r.
(Comparison a, Positive n) =>
CmpPredicate -> T n a -> T n a -> CodeGenFunction r (T n Bool)
forall n r.
Positive n =>
CmpPredicate -> T n a -> T n a -> CodeGenFunction r (T n Bool)
cmp



class
   (MultiValue.FloatingComparison a, Comparison a) =>
      FloatingComparison a where
   fcmp ::
      (TypeNum.Positive n) =>
      LLVM.FPPredicate -> T n a -> T n a ->
      LLVM.CodeGenFunction r (T n Bool)

instance FloatingComparison Float where
   fcmp :: forall n r.
Positive n =>
FPPredicate
-> T n Float -> T n Float -> CodeGenFunction r (T n Bool)
fcmp = (Value n Float
 -> Value n Float -> CodeGenFunction r (Value n Bool))
-> T n Float -> T n Float -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 ((Value n Float
  -> Value n Float -> CodeGenFunction r (Value n Bool))
 -> T n Float -> T n Float -> CodeGenFunction r (T n Bool))
-> (FPPredicate
    -> Value n Float
    -> Value n Float
    -> CodeGenFunction r (Value n Bool))
-> FPPredicate
-> T n Float
-> T n Float
-> CodeGenFunction r (T n Bool)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. FPPredicate
-> Value n Float
-> Value n Float
-> CodeGenFunction r (Value n Bool)
FPPredicate
-> Value n Float
-> Value n Float
-> CodeGenFunction r (CmpValueResult Value Value (Vector n Float))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, CmpRet a, IsFloating a) =>
FPPredicate
-> value0 a
-> value1 a
-> CodeGenFunction r (CmpValueResult value0 value1 a)
LLVM.fcmp

instance
   (TypeNum.Positive n, FloatingComparison a) =>
      A.FloatingComparison (T n a) where
   fcmp :: forall r.
FPPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
fcmp = FPPredicate
-> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a))
FPPredicate -> T n a -> T n a -> CodeGenFunction r (T n Bool)
forall a n r.
(FloatingComparison a, Positive n) =>
FPPredicate -> T n a -> T n a -> CodeGenFunction r (T n Bool)
forall n r.
Positive n =>
FPPredicate -> T n a -> T n a -> CodeGenFunction r (T n Bool)
fcmp



class (MultiValue.Logic a, C a) => Logic a where
   and, or, xor ::
      (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a)
   inv :: (TypeNum.Positive n) => T n a -> LLVM.CodeGenFunction r (T n a)

instance Logic Bool where
   and :: forall n r.
Positive n =>
T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
and = (Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool))
-> T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool)
Value n Bool
-> Value n Bool
-> CodeGenFunction r (BinOpValue Value Value (Vector n Bool))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.and; or :: forall n r.
Positive n =>
T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
or = (Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool))
-> T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool)
Value n Bool
-> Value n Bool
-> CodeGenFunction r (BinOpValue Value Value (Vector n Bool))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.or
   xor :: forall n r.
Positive n =>
T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
xor = (Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool))
-> T n Bool -> T n Bool -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Bool -> Value n Bool -> CodeGenFunction r (Value n Bool)
Value n Bool
-> Value n Bool
-> CodeGenFunction r (BinOpValue Value Value (Vector n Bool))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.xor; inv :: forall n r. Positive n => T n Bool -> CodeGenFunction r (T n Bool)
inv = (Value n Bool -> CodeGenFunction r (Value n Bool))
-> T n Bool -> CodeGenFunction r (T n Bool)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Bool -> CodeGenFunction r (Value n Bool)
forall (value :: * -> *) a r.
(ValueCons value, IsInteger a) =>
value a -> CodeGenFunction r (value a)
LLVM.inv

instance Logic Word8 where
   and :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
and = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
Value n Word8
-> Value n Word8
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.and; or :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
or = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
Value n Word8
-> Value n Word8
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.or
   xor :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
xor = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
Value n Word8
-> Value n Word8
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.xor; inv :: forall n r.
Positive n =>
T n Word8 -> CodeGenFunction r (T n Word8)
inv = (Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word8 -> CodeGenFunction r (Value n Word8)
forall (value :: * -> *) a r.
(ValueCons value, IsInteger a) =>
value a -> CodeGenFunction r (value a)
LLVM.inv

instance Logic Word16 where
   and :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
and = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
Value n Word16
-> Value n Word16
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.and; or :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
or = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
Value n Word16
-> Value n Word16
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.or
   xor :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
xor = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
Value n Word16
-> Value n Word16
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.xor; inv :: forall n r.
Positive n =>
T n Word16 -> CodeGenFunction r (T n Word16)
inv = (Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word16 -> CodeGenFunction r (Value n Word16)
forall (value :: * -> *) a r.
(ValueCons value, IsInteger a) =>
value a -> CodeGenFunction r (value a)
LLVM.inv

instance Logic Word32 where
   and :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
and = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
Value n Word32
-> Value n Word32
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.and; or :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
or = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
Value n Word32
-> Value n Word32
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.or
   xor :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
xor = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
Value n Word32
-> Value n Word32
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.xor; inv :: forall n r.
Positive n =>
T n Word32 -> CodeGenFunction r (T n Word32)
inv = (Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word32 -> CodeGenFunction r (Value n Word32)
forall (value :: * -> *) a r.
(ValueCons value, IsInteger a) =>
value a -> CodeGenFunction r (value a)
LLVM.inv

instance Logic Word64 where
   and :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
and = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
Value n Word64
-> Value n Word64
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.and; or :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
or = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
Value n Word64
-> Value n Word64
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.or
   xor :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
xor = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
Value n Word64
-> Value n Word64
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.xor; inv :: forall n r.
Positive n =>
T n Word64 -> CodeGenFunction r (T n Word64)
inv = (Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br) =>
(Value n ar -> m (Value n br)) -> T n a -> m (T n b)
liftM Value n Word64 -> CodeGenFunction r (Value n Word64)
forall (value :: * -> *) a r.
(ValueCons value, IsInteger a) =>
value a -> CodeGenFunction r (value a)
LLVM.inv


instance (TypeNum.Positive n, Logic a) => A.Logic (T n a) where
   and :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
and = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
and
   or :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
or = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
or
   xor :: forall r. T n a -> T n a -> CodeGenFunction r (T n a)
xor = T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> T n a -> CodeGenFunction r (T n a)
forall n r.
Positive n =>
T n a -> T n a -> CodeGenFunction r (T n a)
xor
   inv :: forall r. T n a -> CodeGenFunction r (T n a)
inv = T n a -> CodeGenFunction r (T n a)
forall a n r.
(Logic a, Positive n) =>
T n a -> CodeGenFunction r (T n a)
forall n r. Positive n => T n a -> CodeGenFunction r (T n a)
inv



class (MultiValue.BitShift a, C a) => BitShift a where
   shl :: (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a)
   shr :: (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a)

instance BitShift Word where
   shl :: forall n r.
Positive n =>
T n Word -> T n Word -> CodeGenFunction r (T n Word)
shl = (Value n Word -> Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
Value n Word
-> Value n Word
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Word -> T n Word -> CodeGenFunction r (T n Word)
shr = (Value n Word -> Value n Word -> CodeGenFunction r (Value n Word))
-> T n Word -> T n Word -> CodeGenFunction r (T n Word)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word -> Value n Word -> CodeGenFunction r (Value n Word)
Value n Word
-> Value n Word
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.lshr

instance BitShift Word8 where
   shl :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
shl = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
Value n Word8
-> Value n Word8
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
shr = (Value n Word8
 -> Value n Word8 -> CodeGenFunction r (Value n Word8))
-> T n Word8 -> T n Word8 -> CodeGenFunction r (T n Word8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word8 -> Value n Word8 -> CodeGenFunction r (Value n Word8)
Value n Word8
-> Value n Word8
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.lshr

instance BitShift Word16 where
   shl :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
shl = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
Value n Word16
-> Value n Word16
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
shr = (Value n Word16
 -> Value n Word16 -> CodeGenFunction r (Value n Word16))
-> T n Word16 -> T n Word16 -> CodeGenFunction r (T n Word16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word16
-> Value n Word16 -> CodeGenFunction r (Value n Word16)
Value n Word16
-> Value n Word16
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.lshr

instance BitShift Word32 where
   shl :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
shl = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
Value n Word32
-> Value n Word32
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
shr = (Value n Word32
 -> Value n Word32 -> CodeGenFunction r (Value n Word32))
-> T n Word32 -> T n Word32 -> CodeGenFunction r (T n Word32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word32
-> Value n Word32 -> CodeGenFunction r (Value n Word32)
Value n Word32
-> Value n Word32
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.lshr

instance BitShift Word64 where
   shl :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
shl = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
Value n Word64
-> Value n Word64
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
shr = (Value n Word64
 -> Value n Word64 -> CodeGenFunction r (Value n Word64))
-> T n Word64 -> T n Word64 -> CodeGenFunction r (T n Word64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Word64
-> Value n Word64 -> CodeGenFunction r (Value n Word64)
Value n Word64
-> Value n Word64
-> CodeGenFunction r (BinOpValue Value Value (Vector n Word64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.lshr

instance BitShift Int where
   shl :: forall n r.
Positive n =>
T n Int -> T n Int -> CodeGenFunction r (T n Int)
shl = (Value n Int -> Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
Value n Int
-> Value n Int
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Int -> T n Int -> CodeGenFunction r (T n Int)
shr = (Value n Int -> Value n Int -> CodeGenFunction r (Value n Int))
-> T n Int -> T n Int -> CodeGenFunction r (T n Int)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int -> Value n Int -> CodeGenFunction r (Value n Int)
Value n Int
-> Value n Int
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.ashr

instance BitShift Int8 where
   shl :: forall n r.
Positive n =>
T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
shl = (Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
Value n Int8
-> Value n Int8
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
shr = (Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8))
-> T n Int8 -> T n Int8 -> CodeGenFunction r (T n Int8)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int8 -> Value n Int8 -> CodeGenFunction r (Value n Int8)
Value n Int8
-> Value n Int8
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int8))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.ashr

instance BitShift Int16 where
   shl :: forall n r.
Positive n =>
T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
shl = (Value n Int16
 -> Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
Value n Int16
-> Value n Int16
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
shr = (Value n Int16
 -> Value n Int16 -> CodeGenFunction r (Value n Int16))
-> T n Int16 -> T n Int16 -> CodeGenFunction r (T n Int16)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int16 -> Value n Int16 -> CodeGenFunction r (Value n Int16)
Value n Int16
-> Value n Int16
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int16))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.ashr

instance BitShift Int32 where
   shl :: forall n r.
Positive n =>
T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
shl = (Value n Int32
 -> Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
Value n Int32
-> Value n Int32
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
shr = (Value n Int32
 -> Value n Int32 -> CodeGenFunction r (Value n Int32))
-> T n Int32 -> T n Int32 -> CodeGenFunction r (T n Int32)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int32 -> Value n Int32 -> CodeGenFunction r (Value n Int32)
Value n Int32
-> Value n Int32
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int32))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.ashr

instance BitShift Int64 where
   shl :: forall n r.
Positive n =>
T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
shl = (Value n Int64
 -> Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
Value n Int64
-> Value n Int64
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.shl; shr :: forall n r.
Positive n =>
T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
shr = (Value n Int64
 -> Value n Int64 -> CodeGenFunction r (Value n Int64))
-> T n Int64 -> T n Int64 -> CodeGenFunction r (T n Int64)
forall (m :: * -> *) n a ar b br c cr.
(Monad m, Repr n a ~ Value n ar, Repr n b ~ Value n br,
 Repr n c ~ Value n cr) =>
(Value n ar -> Value n br -> m (Value n cr))
-> T n a -> T n b -> m (T n c)
liftM2 Value n Int64 -> Value n Int64 -> CodeGenFunction r (Value n Int64)
Value n Int64
-> Value n Int64
-> CodeGenFunction r (BinOpValue Value Value (Vector n Int64))
forall (value0 :: * -> *) (value1 :: * -> *) a r.
(ValueCons2 value0 value1, IsInteger a) =>
value0 a
-> value1 a -> CodeGenFunction r (BinOpValue value0 value1 a)
LLVM.ashr