{-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TypeOperators #-} module LLVM.Extra.Multi.Class where import qualified LLVM.Extra.Multi.Value as MultiValue import qualified LLVM.Extra.Multi.Vector as MultiVector import qualified LLVM.Extra.Arithmetic as A import qualified LLVM.Core as LLVM import qualified Type.Data.Num.Decimal as TypeNum class C value where type Size value switch :: f MultiValue.T -> f (MultiVector.T (Size value)) -> f value instance C MultiValue.T where type Size MultiValue.T = TypeNum.D1 switch :: forall (f :: (* -> *) -> *). f T -> f (T (Size T)) -> f T switch f T x f (T (Size T)) _ = f T x instance (TypeNum.Positive n) => C (MultiVector.T n) where type Size (MultiVector.T n) = n switch :: forall (f :: (* -> *) -> *). f T -> f (T (Size (T n))) -> f (T n) switch f T _ f (T (Size (T n))) x = f (T n) f (T (Size (T n))) x newtype Const a value = Const {forall a (value :: * -> *). Const a value -> value a getConst :: value a} undef :: (C value, Size value ~ n, TypeNum.Positive n, MultiVector.C a) => value a undef :: forall (value :: * -> *) n a. (C value, Size value ~ n, Positive n, C a) => value a undef = Const a value -> value a forall a (value :: * -> *). Const a value -> value a getConst (Const a value -> value a) -> Const a value -> value a forall a b. (a -> b) -> a -> b $ Const a T -> Const a (T (Size value)) -> Const a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch (T a -> Const a T forall a (value :: * -> *). value a -> Const a value Const T a forall a. C a => T a MultiValue.undef) (T n a -> Const a (T n) forall a (value :: * -> *). value a -> Const a value Const T n a forall n. Positive n => T n a forall a n. (C a, Positive n) => T n a MultiVector.undef) zero :: (C value, Size value ~ n, TypeNum.Positive n, MultiVector.C a) => value a zero :: forall (value :: * -> *) n a. (C value, Size value ~ n, Positive n, C a) => value a zero = Const a value -> value a forall a (value :: * -> *). Const a value -> value a getConst (Const a value -> value a) -> Const a value -> value a forall a b. (a -> b) -> a -> b $ Const a T -> Const a (T (Size value)) -> Const a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch (T a -> Const a T forall a (value :: * -> *). value a -> Const a value Const T a forall a. C a => T a MultiValue.zero) (T n a -> Const a (T n) forall a (value :: * -> *). value a -> Const a value Const T n a forall n. Positive n => T n a forall a n. (C a, Positive n) => T n a MultiVector.zero) newtype Op0 r a value = Op0 {forall r a (value :: * -> *). Op0 r a value -> CodeGenFunction r (value a) runOp0 :: LLVM.CodeGenFunction r (value a)} newtype Op1 r a b value = Op1 {forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 :: value a -> LLVM.CodeGenFunction r (value b)} newtype Op2 r a b c value = Op2 {forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 :: value a -> value b -> LLVM.CodeGenFunction r (value c)} add, sub :: (TypeNum.Positive n, MultiVector.Additive a, n ~ Size value, C value) => value a -> value a -> LLVM.CodeGenFunction r (value a) add :: forall n a (value :: * -> *) r. (Positive n, Additive a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) add = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 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 n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 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) sub :: forall n a (value :: * -> *) r. (Positive n, Additive a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) sub = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 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.sub) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 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.sub) neg :: (TypeNum.Positive n, MultiVector.Additive a, n ~ Size value, C value) => value a -> LLVM.CodeGenFunction r (value a) neg :: forall n a (value :: * -> *) r. (Positive n, Additive a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) neg = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Additive a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.neg) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Additive a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.neg) mul :: (TypeNum.Positive n, MultiVector.PseudoRing a, n ~ Size value, C value) => value a -> value a -> LLVM.CodeGenFunction r (value a) mul :: forall n a (value :: * -> *) r. (Positive n, PseudoRing a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) mul = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. PseudoRing a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.mul) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. PseudoRing a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.mul) fdiv :: (TypeNum.Positive n, MultiVector.Field a, n ~ Size value, C value) => value a -> value a -> LLVM.CodeGenFunction r (value a) fdiv :: forall n a (value :: * -> *) r. (Positive n, Field a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) fdiv = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. Field a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.fdiv) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. Field a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.fdiv) scale :: (TypeNum.Positive n, MultiVector.PseudoModule v, n ~ Size value, C value) => value (MultiValue.Scalar v) -> value v -> LLVM.CodeGenFunction r (value v) scale :: forall n v (value :: * -> *) r. (Positive n, PseudoModule v, n ~ Size value, C value) => value (Scalar v) -> value v -> CodeGenFunction r (value v) scale = Op2 r (Scalar v) v v value -> value (Scalar v) -> value v -> CodeGenFunction r (value v) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r (Scalar v) v v value -> value (Scalar v) -> value v -> CodeGenFunction r (value v)) -> Op2 r (Scalar v) v v value -> value (Scalar v) -> value v -> CodeGenFunction r (value v) forall a b. (a -> b) -> a -> b $ Op2 r (Scalar v) v v T -> Op2 r (Scalar v) v v (T (Size value)) -> Op2 r (Scalar v) v v value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T (Scalar v) -> T v -> CodeGenFunction r (T v)) -> Op2 r (Scalar v) v v T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 Scalar (T v) -> T v -> CodeGenFunction r (T v) T (Scalar v) -> T v -> CodeGenFunction r (T v) forall v r. PseudoModule v => Scalar v -> v -> CodeGenFunction r v forall r. Scalar (T v) -> T v -> CodeGenFunction r (T v) A.scale) ((T n (Scalar v) -> T n v -> CodeGenFunction r (T n v)) -> Op2 r (Scalar v) v v (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 Scalar (T n v) -> T n v -> CodeGenFunction r (T n v) T n (Scalar v) -> T n v -> CodeGenFunction r (T n v) forall v r. PseudoModule v => Scalar v -> v -> CodeGenFunction r v forall r. Scalar (T n v) -> T n v -> CodeGenFunction r (T n v) A.scale) min, max :: (TypeNum.Positive n, MultiVector.Real a, n ~ Size value, C value) => value a -> value a -> LLVM.CodeGenFunction r (value a) min :: forall n a (value :: * -> *) r. (Positive n, Real a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) min = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. Real a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.min) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. Real a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.min) max :: forall n a (value :: * -> *) r. (Positive n, Real a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) max = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. Real a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.max) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. Real a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.max) abs, signum :: (TypeNum.Positive n, MultiVector.Real a, n ~ Size value, C value) => value a -> LLVM.CodeGenFunction r (value a) abs :: forall n a (value :: * -> *) r. (Positive n, Real a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) abs = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Real a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.abs) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Real a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.abs) signum :: forall n a (value :: * -> *) r. (Positive n, Real a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) signum = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Real a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.signum) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Real a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.signum) truncate, fraction :: (TypeNum.Positive n, MultiVector.Fraction a, n ~ Size value, C value) => value a -> LLVM.CodeGenFunction r (value a) truncate :: forall n a (value :: * -> *) r. (Positive n, Fraction a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) truncate = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Fraction a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.truncate) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Fraction a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.truncate) fraction :: forall n a (value :: * -> *) r. (Positive n, Fraction a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) fraction = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Fraction a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.fraction) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Fraction a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.fraction) sqrt :: (TypeNum.Positive n, MultiVector.Algebraic a, n ~ Size value, C value) => value a -> LLVM.CodeGenFunction r (value a) sqrt :: forall n a (value :: * -> *) r. (Positive n, Algebraic a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) sqrt = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Algebraic a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.sqrt) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Algebraic a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.sqrt) pi :: (TypeNum.Positive n, MultiVector.Transcendental a, n ~ Size value, C value) => LLVM.CodeGenFunction r (value a) pi :: forall n a (value :: * -> *) r. (Positive n, Transcendental a, n ~ Size value, C value) => CodeGenFunction r (value a) pi = Op0 r a value -> CodeGenFunction r (value a) forall r a (value :: * -> *). Op0 r a value -> CodeGenFunction r (value a) runOp0 (Op0 r a value -> CodeGenFunction r (value a)) -> Op0 r a value -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op0 r a T -> Op0 r a (T (Size value)) -> Op0 r a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch (CodeGenFunction r (T a) -> Op0 r a T forall r a (value :: * -> *). CodeGenFunction r (value a) -> Op0 r a value Op0 CodeGenFunction r (T a) forall r. CodeGenFunction r (T a) forall a r. Transcendental a => CodeGenFunction r a A.pi) (CodeGenFunction r (T n a) -> Op0 r a (T n) forall r a (value :: * -> *). CodeGenFunction r (value a) -> Op0 r a value Op0 CodeGenFunction r (T n a) forall r. CodeGenFunction r (T n a) forall a r. Transcendental a => CodeGenFunction r a A.pi) sin, cos, exp, log :: (TypeNum.Positive n, MultiVector.Transcendental a, n ~ Size value, C value) => value a -> LLVM.CodeGenFunction r (value a) sin :: forall n a (value :: * -> *) r. (Positive n, Transcendental a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) sin = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.sin) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.sin) cos :: forall n a (value :: * -> *) r. (Positive n, Transcendental a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) cos = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.cos) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.cos) exp :: forall n a (value :: * -> *) r. (Positive n, Transcendental a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) exp = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.exp) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.exp) log :: forall n a (value :: * -> *) r. (Positive n, Transcendental a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) log = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.log) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Transcendental a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.log) pow :: (TypeNum.Positive n, MultiVector.Transcendental a, n ~ Size value, C value) => value a -> value a -> LLVM.CodeGenFunction r (value a) pow :: forall n a (value :: * -> *) r. (Positive n, Transcendental a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) pow = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. Transcendental a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.pow) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. Transcendental a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.pow) cmp :: (TypeNum.Positive n, MultiVector.Comparison a, n ~ Size value, C value) => LLVM.CmpPredicate -> value a -> value a -> LLVM.CodeGenFunction r (value Bool) cmp :: forall n a (value :: * -> *) r. (Positive n, Comparison a, n ~ Size value, C value) => CmpPredicate -> value a -> value a -> CodeGenFunction r (value Bool) cmp CmpPredicate p = Op2 r a a Bool value -> value a -> value a -> CodeGenFunction r (value Bool) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a Bool value -> value a -> value a -> CodeGenFunction r (value Bool)) -> Op2 r a a Bool value -> value a -> value a -> CodeGenFunction r (value Bool) forall a b. (a -> b) -> a -> b $ Op2 r a a Bool T -> Op2 r a a Bool (T (Size value)) -> Op2 r a a Bool value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T) -> (T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T forall a b. (a -> b) -> a -> b $ CmpPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a)) forall r. CmpPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a)) forall a r. Comparison a => CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a) A.cmp CmpPredicate p) ((T (Size value) a -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool)) -> Op2 r a a Bool (T (Size value)) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 ((T (Size value) a -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool)) -> Op2 r a a Bool (T (Size value))) -> (T (Size value) a -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool)) -> Op2 r a a Bool (T (Size value)) forall a b. (a -> b) -> a -> b $ CmpPredicate -> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a)) forall r. CmpPredicate -> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a)) forall a r. Comparison a => CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a) A.cmp CmpPredicate p) fcmp :: (TypeNum.Positive n, MultiVector.FloatingComparison a, n ~ Size value, C value) => LLVM.FPPredicate -> value a -> value a -> LLVM.CodeGenFunction r (value Bool) fcmp :: forall n a (value :: * -> *) r. (Positive n, FloatingComparison a, n ~ Size value, C value) => FPPredicate -> value a -> value a -> CodeGenFunction r (value Bool) fcmp FPPredicate p = Op2 r a a Bool value -> value a -> value a -> CodeGenFunction r (value Bool) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a Bool value -> value a -> value a -> CodeGenFunction r (value Bool)) -> Op2 r a a Bool value -> value a -> value a -> CodeGenFunction r (value Bool) forall a b. (a -> b) -> a -> b $ Op2 r a a Bool T -> Op2 r a a Bool (T (Size value)) -> Op2 r a a Bool value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 ((T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T) -> (T a -> T a -> CodeGenFunction r (T Bool)) -> Op2 r a a Bool T forall a b. (a -> b) -> a -> b $ FPPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a)) forall r. FPPredicate -> T a -> T a -> CodeGenFunction r (CmpResult (T a)) forall a r. FloatingComparison a => FPPredicate -> a -> a -> CodeGenFunction r (CmpResult a) A.fcmp FPPredicate p) ((T (Size value) a -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool)) -> Op2 r a a Bool (T (Size value)) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 ((T (Size value) a -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool)) -> Op2 r a a Bool (T (Size value))) -> (T (Size value) a -> T (Size value) a -> CodeGenFunction r (T (Size value) Bool)) -> Op2 r a a Bool (T (Size value)) forall a b. (a -> b) -> a -> b $ FPPredicate -> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a)) forall r. FPPredicate -> T n a -> T n a -> CodeGenFunction r (CmpResult (T n a)) forall a r. FloatingComparison a => FPPredicate -> a -> a -> CodeGenFunction r (CmpResult a) A.fcmp FPPredicate p) and, or, xor :: (TypeNum.Positive n, MultiVector.Logic a, n ~ Size value, C value) => value a -> value a -> LLVM.CodeGenFunction r (value a) and :: forall n a (value :: * -> *) r. (Positive n, Logic a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) and = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. Logic a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.and) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. Logic a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.and) or :: forall n a (value :: * -> *) r. (Positive n, Logic a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) or = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. Logic a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.or) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. Logic a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.or) xor :: forall n a (value :: * -> *) r. (Positive n, Logic a, n ~ Size value, C value) => value a -> value a -> CodeGenFunction r (value a) xor = Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall r a b c (value :: * -> *). Op2 r a b c value -> value a -> value b -> CodeGenFunction r (value c) runOp2 (Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a)) -> Op2 r a a a value -> value a -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op2 r a a a T -> Op2 r a a a (T (Size value)) -> Op2 r a a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> T a -> CodeGenFunction r (T a)) -> Op2 r a a a T forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T a -> T a -> CodeGenFunction r (T a) forall a r. Logic a => a -> a -> CodeGenFunction r a forall r. T a -> T a -> CodeGenFunction r (T a) A.xor) ((T n a -> T n a -> CodeGenFunction r (T n a)) -> Op2 r a a a (T n) forall r a b c (value :: * -> *). (value a -> value b -> CodeGenFunction r (value c)) -> Op2 r a b c value Op2 T n a -> T n a -> CodeGenFunction r (T n a) forall a r. Logic a => a -> a -> CodeGenFunction r a forall r. T n a -> T n a -> CodeGenFunction r (T n a) A.xor) inv :: (TypeNum.Positive n, MultiVector.Logic a, n ~ Size value, C value) => value a -> LLVM.CodeGenFunction r (value a) inv :: forall n a (value :: * -> *) r. (Positive n, Logic a, n ~ Size value, C value) => value a -> CodeGenFunction r (value a) inv = Op1 r a a value -> value a -> CodeGenFunction r (value a) forall r a b (value :: * -> *). Op1 r a b value -> value a -> CodeGenFunction r (value b) runOp1 (Op1 r a a value -> value a -> CodeGenFunction r (value a)) -> Op1 r a a value -> value a -> CodeGenFunction r (value a) forall a b. (a -> b) -> a -> b $ Op1 r a a T -> Op1 r a a (T (Size value)) -> Op1 r a a value forall (value :: * -> *) (f :: (* -> *) -> *). C value => f T -> f (T (Size value)) -> f value forall (f :: (* -> *) -> *). f T -> f (T (Size value)) -> f value switch ((T a -> CodeGenFunction r (T a)) -> Op1 r a a T forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T a -> CodeGenFunction r (T a) forall a r. Logic a => a -> CodeGenFunction r a forall r. T a -> CodeGenFunction r (T a) A.inv) ((T n a -> CodeGenFunction r (T n a)) -> Op1 r a a (T n) forall r a b (value :: * -> *). (value a -> CodeGenFunction r (value b)) -> Op1 r a b value Op1 T n a -> CodeGenFunction r (T n a) forall a r. Logic a => a -> CodeGenFunction r a forall r. T n a -> CodeGenFunction r (T n a) A.inv)