{-# LANGUAGE TypeFamilies #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module LLVM.Extra.Multi.Vector.Instance where

import qualified LLVM.Extra.Multi.Vector as Vector
import qualified LLVM.Extra.Multi.Value.Private as MultiValue
import LLVM.Extra.Multi.Value.Private (Repr, )

import qualified LLVM.Core as LLVM

import qualified Type.Data.Num.Decimal as TypeNum

import Data.Functor ((<$>), )

import Prelude2010
import Prelude ()


type MVVector n a = MultiValue.T (LLVM.Vector n a)

toMultiValue :: Vector.T n a -> MVVector n a
toMultiValue :: forall n a. T n a -> MVVector n a
toMultiValue (Vector.Cons Repr n a
x) = Repr (Vector n a) -> T (Vector n a)
forall a. Repr a -> T a
MultiValue.Cons Repr (Vector n a)
Repr n a
x

fromMultiValue :: MVVector n a -> Vector.T n a
fromMultiValue :: forall n a. MVVector n a -> T n a
fromMultiValue (MultiValue.Cons Repr (Vector n a)
x) = Repr n a -> T n a
forall n a. Repr n a -> T n a
Vector.Cons Repr (Vector n a)
Repr n a
x

liftMultiValueM ::
   (Functor f) =>
   (Vector.T n a -> f (Vector.T m b)) ->
   (MVVector n a -> f (MVVector m b))
liftMultiValueM :: forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM T n a -> f (T m b)
f MVVector n a
a =
   T m b -> MVVector m b
forall n a. T n a -> MVVector n a
toMultiValue (T m b -> MVVector m b) -> f (T m b) -> f (MVVector m b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> f (T m b)
f (MVVector n a -> T n a
forall n a. MVVector n a -> T n a
fromMultiValue MVVector n a
a)

liftMultiValueM2 ::
   (Functor f) =>
   (Vector.T n a -> Vector.T m b -> f (Vector.T k c)) ->
   (MVVector n a -> MVVector m b -> f (MVVector k c))
liftMultiValueM2 :: forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 T n a -> T m b -> f (T k c)
f MVVector n a
a MVVector m b
b =
   T k c -> MVVector k c
forall n a. T n a -> MVVector n a
toMultiValue (T k c -> MVVector k c) -> f (T k c) -> f (MVVector k c)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> T m b -> f (T k c)
f (MVVector n a -> T n a
forall n a. MVVector n a -> T n a
fromMultiValue MVVector n a
a) (MVVector m b -> T m b
forall n a. MVVector n a -> T n a
fromMultiValue MVVector m b
b)

liftMultiValueM3 ::
   (Functor f) =>
   (Vector.T n a -> Vector.T m b -> Vector.T m c -> f (Vector.T k d)) ->
   (MVVector n a -> MVVector m b -> MVVector m c -> f (MVVector k d))
liftMultiValueM3 :: forall (f :: * -> *) n a m b c k d.
Functor f =>
(T n a -> T m b -> T m c -> f (T k d))
-> MVVector n a -> MVVector m b -> MVVector m c -> f (MVVector k d)
liftMultiValueM3 T n a -> T m b -> T m c -> f (T k d)
f MVVector n a
a MVVector m b
b MVVector m c
c =
   T k d -> MVVector k d
forall n a. T n a -> MVVector n a
toMultiValue (T k d -> MVVector k d) -> f (T k d) -> f (MVVector k d)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> T n a -> T m b -> T m c -> f (T k d)
f (MVVector n a -> T n a
forall n a. MVVector n a -> T n a
fromMultiValue MVVector n a
a) (MVVector m b -> T m b
forall n a. MVVector n a -> T n a
fromMultiValue MVVector m b
b) (MVVector m c -> T m c
forall n a. MVVector n a -> T n a
fromMultiValue MVVector m c
c)

instance
   (TypeNum.Positive n, Vector.C a) =>
      MultiValue.C (LLVM.Vector n a) where
   type Repr (LLVM.Vector n a) = Vector.Repr n a
   cons :: Vector n a -> T (Vector n a)
cons = T n a -> T (Vector n a)
forall n a. T n a -> MVVector n a
toMultiValue (T n a -> T (Vector n a))
-> (Vector n a -> T n a) -> Vector n a -> T (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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
Vector.cons
   undef :: T (Vector n a)
undef = T n a -> T (Vector n a)
forall n a. T n a -> MVVector n a
toMultiValue T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
Vector.undef
   zero :: T (Vector n a)
zero = T n a -> T (Vector n a)
forall n a. T n a -> MVVector n a
toMultiValue T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
Vector.zero
   phi :: forall r.
BasicBlock -> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
phi = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM ((T n a -> CodeGenFunction r (T n a))
 -> T (Vector n a) -> CodeGenFunction r (T (Vector n a)))
-> (BasicBlock -> T n a -> CodeGenFunction r (T n a))
-> BasicBlock
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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)
Vector.phi
   addPhi :: forall r.
BasicBlock
-> T (Vector n a) -> T (Vector n a) -> CodeGenFunction r ()
addPhi BasicBlock
bb T (Vector n a)
x T (Vector n a)
y = 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 ()
Vector.addPhi BasicBlock
bb (T (Vector n a) -> T n a
forall n a. MVVector n a -> T n a
fromMultiValue T (Vector n a)
x) (T (Vector n a) -> T n a
forall n a. MVVector n a -> T n a
fromMultiValue T (Vector n a)
y)

instance
   (TypeNum.Positive n, Vector.IntegerConstant a) =>
      MultiValue.IntegerConstant (LLVM.Vector n a) where
   fromInteger' :: Integer -> T (Vector n a)
fromInteger' = T n a -> T (Vector n a)
forall n a. T n a -> MVVector n a
toMultiValue (T n a -> T (Vector n a))
-> (Integer -> T n a) -> Integer -> T (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> T n a
forall n. Positive n => Integer -> T n a
forall a n. (IntegerConstant a, Positive n) => Integer -> T n a
Vector.fromInteger'

instance
   (TypeNum.Positive n, Vector.RationalConstant a) =>
      MultiValue.RationalConstant (LLVM.Vector n a) where
   fromRational' :: Rational -> T (Vector n a)
fromRational' = T n a -> T (Vector n a)
forall n a. T n a -> MVVector n a
toMultiValue (T n a -> T (Vector n a))
-> (Rational -> T n a) -> Rational -> T (Vector n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> T n a
forall n. Positive n => Rational -> T n a
forall a n. (RationalConstant a, Positive n) => Rational -> T n a
Vector.fromRational'

instance
   (TypeNum.Positive n, Vector.Additive a) =>
      MultiValue.Additive (LLVM.Vector n a) where
   add :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
add = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.add
   sub :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
sub = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.sub
   neg :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
neg = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM 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)
Vector.neg

instance
   (TypeNum.Positive n, Vector.PseudoRing a) =>
      MultiValue.PseudoRing (LLVM.Vector n a) where
   mul :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
mul = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.mul

instance
   (TypeNum.Positive n, Vector.Real a) =>
      MultiValue.Real (LLVM.Vector n a) where
   min :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
min = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.min
   max :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
max = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.max
   abs :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
abs = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM 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)
Vector.abs
   signum :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
signum = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM 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)
Vector.signum

instance
   (TypeNum.Positive n, Vector.Fraction a) =>
      MultiValue.Fraction (LLVM.Vector n a) where
   truncate :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
truncate = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM 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)
Vector.truncate
   fraction :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
fraction = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM 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)
Vector.fraction

instance
   (TypeNum.Positive n, Vector.Logic a) =>
      MultiValue.Logic (LLVM.Vector n a) where
   and :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
and = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.and
   or :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
or = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.or
   xor :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
xor = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 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)
Vector.xor
   inv :: forall r. T (Vector n a) -> CodeGenFunction r (T (Vector n a))
inv = (T n a -> CodeGenFunction r (T n a))
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b.
Functor f =>
(T n a -> f (T m b)) -> MVVector n a -> f (MVVector m b)
liftMultiValueM 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)
Vector.inv

instance
   (TypeNum.Positive n, Vector.BitShift a) =>
      MultiValue.BitShift (LLVM.Vector n a) where
   shl :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
shl = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(BitShift 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)
Vector.shl
   shr :: forall r.
T (Vector n a)
-> T (Vector n a) -> CodeGenFunction r (T (Vector n a))
shr = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T (Vector n a)
-> T (Vector n a)
-> CodeGenFunction r (T (Vector n a))
forall (f :: * -> *) n a m b k c.
Functor f =>
(T n a -> T m b -> f (T k c))
-> MVVector n a -> MVVector m b -> f (MVVector k c)
liftMultiValueM2 T n a -> T n a -> CodeGenFunction r (T n a)
forall a n r.
(BitShift 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)
Vector.shr