{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module LLVM.Extra.FastMath ( 
   NoNaNs(NoNaNs),
   NoInfs(NoInfs),
   NoSignedZeros(NoSignedZeros),
   AllowReciprocal(AllowReciprocal),
   Fast(Fast),
   Flags(setFlags),

   Number(Number, deconsNumber),
   getNumber,
   mvNumber,
   mvDenumber,

   MultiValue(setMultiValueFlags),
   attachMultiValueFlags,
   liftNumberM,
   liftNumberM2,
   mvecNumber,
   mvecDenumber,

   MultiVector(setMultiVectorFlags),
   attachMultiVectorFlags,
   liftMultiVectorM,
   liftMultiVectorM2,

   Tuple(setTupleFlags),
   Context(Context),
   attachTupleFlags,
   liftContext,
   liftContext2,
   ) where

import qualified LLVM.Extra.Multi.Vector as MultiVector
import qualified LLVM.Extra.Multi.Value.Private as MV
import qualified LLVM.Extra.Arithmetic as A
import qualified LLVM.Extra.Tuple as Tuple
import qualified LLVM.Core as LLVM
import LLVM.Util.Proxy (Proxy(Proxy))

import Foreign.Storable (Storable)

import qualified Control.Monad.HT as Monad
import Control.Applicative ((<$>))


data NoNaNs          = NoNaNs          deriving (Int -> NoNaNs -> ShowS
[NoNaNs] -> ShowS
NoNaNs -> String
(Int -> NoNaNs -> ShowS)
-> (NoNaNs -> String) -> ([NoNaNs] -> ShowS) -> Show NoNaNs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NoNaNs -> ShowS
showsPrec :: Int -> NoNaNs -> ShowS
$cshow :: NoNaNs -> String
show :: NoNaNs -> String
$cshowList :: [NoNaNs] -> ShowS
showList :: [NoNaNs] -> ShowS
Show, NoNaNs -> NoNaNs -> Bool
(NoNaNs -> NoNaNs -> Bool)
-> (NoNaNs -> NoNaNs -> Bool) -> Eq NoNaNs
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NoNaNs -> NoNaNs -> Bool
== :: NoNaNs -> NoNaNs -> Bool
$c/= :: NoNaNs -> NoNaNs -> Bool
/= :: NoNaNs -> NoNaNs -> Bool
Eq)
data NoInfs          = NoInfs          deriving (Int -> NoInfs -> ShowS
[NoInfs] -> ShowS
NoInfs -> String
(Int -> NoInfs -> ShowS)
-> (NoInfs -> String) -> ([NoInfs] -> ShowS) -> Show NoInfs
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NoInfs -> ShowS
showsPrec :: Int -> NoInfs -> ShowS
$cshow :: NoInfs -> String
show :: NoInfs -> String
$cshowList :: [NoInfs] -> ShowS
showList :: [NoInfs] -> ShowS
Show, NoInfs -> NoInfs -> Bool
(NoInfs -> NoInfs -> Bool)
-> (NoInfs -> NoInfs -> Bool) -> Eq NoInfs
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NoInfs -> NoInfs -> Bool
== :: NoInfs -> NoInfs -> Bool
$c/= :: NoInfs -> NoInfs -> Bool
/= :: NoInfs -> NoInfs -> Bool
Eq)
data NoSignedZeros   = NoSignedZeros   deriving (Int -> NoSignedZeros -> ShowS
[NoSignedZeros] -> ShowS
NoSignedZeros -> String
(Int -> NoSignedZeros -> ShowS)
-> (NoSignedZeros -> String)
-> ([NoSignedZeros] -> ShowS)
-> Show NoSignedZeros
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NoSignedZeros -> ShowS
showsPrec :: Int -> NoSignedZeros -> ShowS
$cshow :: NoSignedZeros -> String
show :: NoSignedZeros -> String
$cshowList :: [NoSignedZeros] -> ShowS
showList :: [NoSignedZeros] -> ShowS
Show, NoSignedZeros -> NoSignedZeros -> Bool
(NoSignedZeros -> NoSignedZeros -> Bool)
-> (NoSignedZeros -> NoSignedZeros -> Bool) -> Eq NoSignedZeros
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NoSignedZeros -> NoSignedZeros -> Bool
== :: NoSignedZeros -> NoSignedZeros -> Bool
$c/= :: NoSignedZeros -> NoSignedZeros -> Bool
/= :: NoSignedZeros -> NoSignedZeros -> Bool
Eq)
data AllowReciprocal = AllowReciprocal deriving (Int -> AllowReciprocal -> ShowS
[AllowReciprocal] -> ShowS
AllowReciprocal -> String
(Int -> AllowReciprocal -> ShowS)
-> (AllowReciprocal -> String)
-> ([AllowReciprocal] -> ShowS)
-> Show AllowReciprocal
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AllowReciprocal -> ShowS
showsPrec :: Int -> AllowReciprocal -> ShowS
$cshow :: AllowReciprocal -> String
show :: AllowReciprocal -> String
$cshowList :: [AllowReciprocal] -> ShowS
showList :: [AllowReciprocal] -> ShowS
Show, AllowReciprocal -> AllowReciprocal -> Bool
(AllowReciprocal -> AllowReciprocal -> Bool)
-> (AllowReciprocal -> AllowReciprocal -> Bool)
-> Eq AllowReciprocal
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AllowReciprocal -> AllowReciprocal -> Bool
== :: AllowReciprocal -> AllowReciprocal -> Bool
$c/= :: AllowReciprocal -> AllowReciprocal -> Bool
/= :: AllowReciprocal -> AllowReciprocal -> Bool
Eq)
data Fast            = Fast            deriving (Int -> Fast -> ShowS
[Fast] -> ShowS
Fast -> String
(Int -> Fast -> ShowS)
-> (Fast -> String) -> ([Fast] -> ShowS) -> Show Fast
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Fast -> ShowS
showsPrec :: Int -> Fast -> ShowS
$cshow :: Fast -> String
show :: Fast -> String
$cshowList :: [Fast] -> ShowS
showList :: [Fast] -> ShowS
Show, Fast -> Fast -> Bool
(Fast -> Fast -> Bool) -> (Fast -> Fast -> Bool) -> Eq Fast
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Fast -> Fast -> Bool
== :: Fast -> Fast -> Bool
$c/= :: Fast -> Fast -> Bool
/= :: Fast -> Fast -> Bool
Eq)


class Flags flags where
   setFlags ::
      (LLVM.IsFloating a) =>
      Proxy flags -> Bool -> LLVM.Value a -> LLVM.CodeGenFunction r ()

instance Flags NoNaNs          where setFlags :: forall a r.
IsFloating a =>
Proxy NoNaNs -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy NoNaNs
Proxy = Bool -> Value a -> CodeGenFunction r ()
forall a r. IsFloating a => Bool -> Value a -> CodeGenFunction r ()
LLVM.setHasNoNaNs
instance Flags NoInfs          where setFlags :: forall a r.
IsFloating a =>
Proxy NoInfs -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy NoInfs
Proxy = Bool -> Value a -> CodeGenFunction r ()
forall a r. IsFloating a => Bool -> Value a -> CodeGenFunction r ()
LLVM.setHasNoInfs
instance Flags NoSignedZeros   where setFlags :: forall a r.
IsFloating a =>
Proxy NoSignedZeros -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy NoSignedZeros
Proxy = Bool -> Value a -> CodeGenFunction r ()
forall a r. IsFloating a => Bool -> Value a -> CodeGenFunction r ()
LLVM.setHasNoSignedZeros
instance Flags AllowReciprocal where setFlags :: forall a r.
IsFloating a =>
Proxy AllowReciprocal -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy AllowReciprocal
Proxy = Bool -> Value a -> CodeGenFunction r ()
forall a r. IsFloating a => Bool -> Value a -> CodeGenFunction r ()
LLVM.setHasAllowReciprocal
instance Flags Fast            where setFlags :: forall a r.
IsFloating a =>
Proxy Fast -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy Fast
Proxy = Bool -> Value a -> CodeGenFunction r ()
forall a r. IsFloating a => Bool -> Value a -> CodeGenFunction r ()
LLVM.setFastMath

instance (Flags f0, Flags f1) => Flags (f0,f1) where
   setFlags :: forall a r.
IsFloating a =>
Proxy (f0, f1) -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy (f0, f1)
p Bool
b Value a
v = Proxy f0 -> Bool -> Value a -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy f0 -> Bool -> Value a -> CodeGenFunction r ()
setFlags ((f0, f1) -> f0
forall a b. (a, b) -> a
fst((f0, f1) -> f0) -> Proxy (f0, f1) -> Proxy f0
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Proxy (f0, f1)
p) Bool
b Value a
v 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
>> Proxy f1 -> Bool -> Value a -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy f1 -> Bool -> Value a -> CodeGenFunction r ()
setFlags ((f0, f1) -> f1
forall a b. (a, b) -> b
snd((f0, f1) -> f1) -> Proxy (f0, f1) -> Proxy f1
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Proxy (f0, f1)
p) Bool
b Value a
v

instance (Flags f0, Flags f1, Flags f2) => Flags (f0,f1,f2) where
   setFlags :: forall a r.
IsFloating a =>
Proxy (f0, f1, f2) -> Bool -> Value a -> CodeGenFunction r ()
setFlags = ((f0, f1, f2) -> (f0, (f1, f2)))
-> Proxy (f0, f1, f2) -> Bool -> Value a -> CodeGenFunction r ()
forall split a flags r.
(Flags split, IsFloating a) =>
(flags -> split)
-> Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setSplitFlags (((f0, f1, f2) -> (f0, (f1, f2)))
 -> Proxy (f0, f1, f2) -> Bool -> Value a -> CodeGenFunction r ())
-> ((f0, f1, f2) -> (f0, (f1, f2)))
-> Proxy (f0, f1, f2)
-> Bool
-> Value a
-> CodeGenFunction r ()
forall a b. (a -> b) -> a -> b
$ \(f0
f0,f1
f1,f2
f2) -> (f0
f0,(f1
f1,f2
f2))

instance (Flags f0, Flags f1, Flags f2, Flags f3) => Flags (f0,f1,f2,f3) where
   setFlags :: forall a r.
IsFloating a =>
Proxy (f0, f1, f2, f3) -> Bool -> Value a -> CodeGenFunction r ()
setFlags = ((f0, f1, f2, f3) -> (f0, (f1, f2, f3)))
-> Proxy (f0, f1, f2, f3)
-> Bool
-> Value a
-> CodeGenFunction r ()
forall split a flags r.
(Flags split, IsFloating a) =>
(flags -> split)
-> Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setSplitFlags (((f0, f1, f2, f3) -> (f0, (f1, f2, f3)))
 -> Proxy (f0, f1, f2, f3)
 -> Bool
 -> Value a
 -> CodeGenFunction r ())
-> ((f0, f1, f2, f3) -> (f0, (f1, f2, f3)))
-> Proxy (f0, f1, f2, f3)
-> Bool
-> Value a
-> CodeGenFunction r ()
forall a b. (a -> b) -> a -> b
$ \(f0
f0,f1
f1,f2
f2,f3
f3) -> (f0
f0,(f1
f1,f2
f2,f3
f3))

instance
   (Flags f0, Flags f1, Flags f2, Flags f3, Flags f4) =>
      Flags (f0,f1,f2,f3,f4) where
   setFlags :: forall a r.
IsFloating a =>
Proxy (f0, f1, f2, f3, f4)
-> Bool -> Value a -> CodeGenFunction r ()
setFlags = ((f0, f1, f2, f3, f4) -> (f0, (f1, f2, f3, f4)))
-> Proxy (f0, f1, f2, f3, f4)
-> Bool
-> Value a
-> CodeGenFunction r ()
forall split a flags r.
(Flags split, IsFloating a) =>
(flags -> split)
-> Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setSplitFlags (((f0, f1, f2, f3, f4) -> (f0, (f1, f2, f3, f4)))
 -> Proxy (f0, f1, f2, f3, f4)
 -> Bool
 -> Value a
 -> CodeGenFunction r ())
-> ((f0, f1, f2, f3, f4) -> (f0, (f1, f2, f3, f4)))
-> Proxy (f0, f1, f2, f3, f4)
-> Bool
-> Value a
-> CodeGenFunction r ()
forall a b. (a -> b) -> a -> b
$ \(f0
f0,f1
f1,f2
f2,f3
f3,f4
f4) -> (f0
f0,(f1
f1,f2
f2,f3
f3,f4
f4))

setSplitFlags ::
   (Flags split, LLVM.IsFloating a) =>
   (flags -> split) ->
   Proxy flags -> Bool -> LLVM.Value a -> LLVM.CodeGenFunction r ()
setSplitFlags :: forall split a flags r.
(Flags split, IsFloating a) =>
(flags -> split)
-> Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setSplitFlags flags -> split
split Proxy flags
p = Proxy split -> Bool -> Value a -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy split -> Bool -> Value a -> CodeGenFunction r ()
setFlags ((flags -> split) -> Proxy flags -> Proxy split
forall a b. (a -> b) -> Proxy a -> Proxy b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap flags -> split
split Proxy flags
p)


newtype Number flags a = Number {forall flags a. Number flags a -> a
deconsNumber :: a}
   deriving (Number flags a -> Number flags a -> Bool
(Number flags a -> Number flags a -> Bool)
-> (Number flags a -> Number flags a -> Bool)
-> Eq (Number flags a)
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
forall flags a. Eq a => Number flags a -> Number flags a -> Bool
$c== :: forall flags a. Eq a => Number flags a -> Number flags a -> Bool
== :: Number flags a -> Number flags a -> Bool
$c/= :: forall flags a. Eq a => Number flags a -> Number flags a -> Bool
/= :: Number flags a -> Number flags a -> Bool
Eq, Eq (Number flags a)
Eq (Number flags a)
-> (Number flags a -> Number flags a -> Ordering)
-> (Number flags a -> Number flags a -> Bool)
-> (Number flags a -> Number flags a -> Bool)
-> (Number flags a -> Number flags a -> Bool)
-> (Number flags a -> Number flags a -> Bool)
-> (Number flags a -> Number flags a -> Number flags a)
-> (Number flags a -> Number flags a -> Number flags a)
-> Ord (Number flags a)
Number flags a -> Number flags a -> Bool
Number flags a -> Number flags a -> Ordering
Number flags a -> Number flags a -> Number flags a
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {flags} {a}. Ord a => Eq (Number flags a)
forall flags a. Ord a => Number flags a -> Number flags a -> Bool
forall flags a.
Ord a =>
Number flags a -> Number flags a -> Ordering
forall flags a.
Ord a =>
Number flags a -> Number flags a -> Number flags a
$ccompare :: forall flags a.
Ord a =>
Number flags a -> Number flags a -> Ordering
compare :: Number flags a -> Number flags a -> Ordering
$c< :: forall flags a. Ord a => Number flags a -> Number flags a -> Bool
< :: Number flags a -> Number flags a -> Bool
$c<= :: forall flags a. Ord a => Number flags a -> Number flags a -> Bool
<= :: Number flags a -> Number flags a -> Bool
$c> :: forall flags a. Ord a => Number flags a -> Number flags a -> Bool
> :: Number flags a -> Number flags a -> Bool
$c>= :: forall flags a. Ord a => Number flags a -> Number flags a -> Bool
>= :: Number flags a -> Number flags a -> Bool
$cmax :: forall flags a.
Ord a =>
Number flags a -> Number flags a -> Number flags a
max :: Number flags a -> Number flags a -> Number flags a
$cmin :: forall flags a.
Ord a =>
Number flags a -> Number flags a -> Number flags a
min :: Number flags a -> Number flags a -> Number flags a
Ord, Int -> Number flags a -> ShowS
[Number flags a] -> ShowS
Number flags a -> String
(Int -> Number flags a -> ShowS)
-> (Number flags a -> String)
-> ([Number flags a] -> ShowS)
-> Show (Number flags a)
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
forall flags a. Show a => Int -> Number flags a -> ShowS
forall flags a. Show a => [Number flags a] -> ShowS
forall flags a. Show a => Number flags a -> String
$cshowsPrec :: forall flags a. Show a => Int -> Number flags a -> ShowS
showsPrec :: Int -> Number flags a -> ShowS
$cshow :: forall flags a. Show a => Number flags a -> String
show :: Number flags a -> String
$cshowList :: forall flags a. Show a => [Number flags a] -> ShowS
showList :: [Number flags a] -> ShowS
Show, Integer -> Number flags a
Number flags a -> Number flags a
Number flags a -> Number flags a -> Number flags a
(Number flags a -> Number flags a -> Number flags a)
-> (Number flags a -> Number flags a -> Number flags a)
-> (Number flags a -> Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Integer -> Number flags a)
-> Num (Number flags a)
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
forall flags a. Num a => Integer -> Number flags a
forall flags a. Num a => Number flags a -> Number flags a
forall flags a.
Num a =>
Number flags a -> Number flags a -> Number flags a
$c+ :: forall flags a.
Num a =>
Number flags a -> Number flags a -> Number flags a
+ :: Number flags a -> Number flags a -> Number flags a
$c- :: forall flags a.
Num a =>
Number flags a -> Number flags a -> Number flags a
- :: Number flags a -> Number flags a -> Number flags a
$c* :: forall flags a.
Num a =>
Number flags a -> Number flags a -> Number flags a
* :: Number flags a -> Number flags a -> Number flags a
$cnegate :: forall flags a. Num a => Number flags a -> Number flags a
negate :: Number flags a -> Number flags a
$cabs :: forall flags a. Num a => Number flags a -> Number flags a
abs :: Number flags a -> Number flags a
$csignum :: forall flags a. Num a => Number flags a -> Number flags a
signum :: Number flags a -> Number flags a
$cfromInteger :: forall flags a. Num a => Integer -> Number flags a
fromInteger :: Integer -> Number flags a
Num, Num (Number flags a)
Num (Number flags a)
-> (Number flags a -> Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Rational -> Number flags a)
-> Fractional (Number flags a)
Rational -> Number flags a
Number flags a -> Number flags a
Number flags a -> Number flags a -> Number flags a
forall a.
Num a
-> (a -> a -> a) -> (a -> a) -> (Rational -> a) -> Fractional a
forall {flags} {a}. Fractional a => Num (Number flags a)
forall flags a. Fractional a => Rational -> Number flags a
forall flags a. Fractional a => Number flags a -> Number flags a
forall flags a.
Fractional a =>
Number flags a -> Number flags a -> Number flags a
$c/ :: forall flags a.
Fractional a =>
Number flags a -> Number flags a -> Number flags a
/ :: Number flags a -> Number flags a -> Number flags a
$crecip :: forall flags a. Fractional a => Number flags a -> Number flags a
recip :: Number flags a -> Number flags a
$cfromRational :: forall flags a. Fractional a => Rational -> Number flags a
fromRational :: Rational -> Number flags a
Fractional, Fractional (Number flags a)
Number flags a
Fractional (Number flags a)
-> Number flags a
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a -> Number flags a)
-> (Number flags a -> Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> (Number flags a -> Number flags a)
-> Floating (Number flags a)
Number flags a -> Number flags a
Number flags a -> Number flags a -> Number flags a
forall a.
Fractional a
-> a
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> Floating a
forall {flags} {a}. Floating a => Fractional (Number flags a)
forall flags a. Floating a => Number flags a
forall flags a. Floating a => Number flags a -> Number flags a
forall flags a.
Floating a =>
Number flags a -> Number flags a -> Number flags a
$cpi :: forall flags a. Floating a => Number flags a
pi :: Number flags a
$cexp :: forall flags a. Floating a => Number flags a -> Number flags a
exp :: Number flags a -> Number flags a
$clog :: forall flags a. Floating a => Number flags a -> Number flags a
log :: Number flags a -> Number flags a
$csqrt :: forall flags a. Floating a => Number flags a -> Number flags a
sqrt :: Number flags a -> Number flags a
$c** :: forall flags a.
Floating a =>
Number flags a -> Number flags a -> Number flags a
** :: Number flags a -> Number flags a -> Number flags a
$clogBase :: forall flags a.
Floating a =>
Number flags a -> Number flags a -> Number flags a
logBase :: Number flags a -> Number flags a -> Number flags a
$csin :: forall flags a. Floating a => Number flags a -> Number flags a
sin :: Number flags a -> Number flags a
$ccos :: forall flags a. Floating a => Number flags a -> Number flags a
cos :: Number flags a -> Number flags a
$ctan :: forall flags a. Floating a => Number flags a -> Number flags a
tan :: Number flags a -> Number flags a
$casin :: forall flags a. Floating a => Number flags a -> Number flags a
asin :: Number flags a -> Number flags a
$cacos :: forall flags a. Floating a => Number flags a -> Number flags a
acos :: Number flags a -> Number flags a
$catan :: forall flags a. Floating a => Number flags a -> Number flags a
atan :: Number flags a -> Number flags a
$csinh :: forall flags a. Floating a => Number flags a -> Number flags a
sinh :: Number flags a -> Number flags a
$ccosh :: forall flags a. Floating a => Number flags a -> Number flags a
cosh :: Number flags a -> Number flags a
$ctanh :: forall flags a. Floating a => Number flags a -> Number flags a
tanh :: Number flags a -> Number flags a
$casinh :: forall flags a. Floating a => Number flags a -> Number flags a
asinh :: Number flags a -> Number flags a
$cacosh :: forall flags a. Floating a => Number flags a -> Number flags a
acosh :: Number flags a -> Number flags a
$catanh :: forall flags a. Floating a => Number flags a -> Number flags a
atanh :: Number flags a -> Number flags a
$clog1p :: forall flags a. Floating a => Number flags a -> Number flags a
log1p :: Number flags a -> Number flags a
$cexpm1 :: forall flags a. Floating a => Number flags a -> Number flags a
expm1 :: Number flags a -> Number flags a
$clog1pexp :: forall flags a. Floating a => Number flags a -> Number flags a
log1pexp :: Number flags a -> Number flags a
$clog1mexp :: forall flags a. Floating a => Number flags a -> Number flags a
log1mexp :: Number flags a -> Number flags a
Floating, Ptr (Number flags a) -> IO (Number flags a)
Ptr (Number flags a) -> Int -> IO (Number flags a)
Ptr (Number flags a) -> Int -> Number flags a -> IO ()
Ptr (Number flags a) -> Number flags a -> IO ()
Number flags a -> Int
(Number flags a -> Int)
-> (Number flags a -> Int)
-> (Ptr (Number flags a) -> Int -> IO (Number flags a))
-> (Ptr (Number flags a) -> Int -> Number flags a -> IO ())
-> (forall b. Ptr b -> Int -> IO (Number flags a))
-> (forall b. Ptr b -> Int -> Number flags a -> IO ())
-> (Ptr (Number flags a) -> IO (Number flags a))
-> (Ptr (Number flags a) -> Number flags a -> IO ())
-> Storable (Number flags a)
forall b. Ptr b -> Int -> IO (Number flags a)
forall b. Ptr b -> Int -> Number flags a -> IO ()
forall a.
(a -> Int)
-> (a -> Int)
-> (Ptr a -> Int -> IO a)
-> (Ptr a -> Int -> a -> IO ())
-> (forall b. Ptr b -> Int -> IO a)
-> (forall b. Ptr b -> Int -> a -> IO ())
-> (Ptr a -> IO a)
-> (Ptr a -> a -> IO ())
-> Storable a
forall flags a.
Storable a =>
Ptr (Number flags a) -> IO (Number flags a)
forall flags a.
Storable a =>
Ptr (Number flags a) -> Int -> IO (Number flags a)
forall flags a.
Storable a =>
Ptr (Number flags a) -> Int -> Number flags a -> IO ()
forall flags a.
Storable a =>
Ptr (Number flags a) -> Number flags a -> IO ()
forall flags a. Storable a => Number flags a -> Int
forall flags a b. Storable a => Ptr b -> Int -> IO (Number flags a)
forall flags a b.
Storable a =>
Ptr b -> Int -> Number flags a -> IO ()
$csizeOf :: forall flags a. Storable a => Number flags a -> Int
sizeOf :: Number flags a -> Int
$calignment :: forall flags a. Storable a => Number flags a -> Int
alignment :: Number flags a -> Int
$cpeekElemOff :: forall flags a.
Storable a =>
Ptr (Number flags a) -> Int -> IO (Number flags a)
peekElemOff :: Ptr (Number flags a) -> Int -> IO (Number flags a)
$cpokeElemOff :: forall flags a.
Storable a =>
Ptr (Number flags a) -> Int -> Number flags a -> IO ()
pokeElemOff :: Ptr (Number flags a) -> Int -> Number flags a -> IO ()
$cpeekByteOff :: forall flags a b. Storable a => Ptr b -> Int -> IO (Number flags a)
peekByteOff :: forall b. Ptr b -> Int -> IO (Number flags a)
$cpokeByteOff :: forall flags a b.
Storable a =>
Ptr b -> Int -> Number flags a -> IO ()
pokeByteOff :: forall b. Ptr b -> Int -> Number flags a -> IO ()
$cpeek :: forall flags a.
Storable a =>
Ptr (Number flags a) -> IO (Number flags a)
peek :: Ptr (Number flags a) -> IO (Number flags a)
$cpoke :: forall flags a.
Storable a =>
Ptr (Number flags a) -> Number flags a -> IO ()
poke :: Ptr (Number flags a) -> Number flags a -> IO ()
Storable)

getNumber :: flags -> Number flags a -> a
getNumber :: forall flags a. flags -> Number flags a -> a
getNumber flags
_ (Number a
a) = a
a

instance MultiValue a => MV.C (Number flags a) where
   type Repr (Number flags a) = MV.Repr a
   cons :: Number flags a -> T (Number flags a)
cons = T a -> T (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber (T a -> T (Number flags a))
-> (Number flags a -> T a) -> Number flags a -> T (Number flags a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> T a
forall a. C a => a -> T a
MV.cons (a -> T a) -> (Number flags a -> a) -> Number flags a -> T a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Number flags a -> a
forall flags a. Number flags a -> a
deconsNumber
   undef :: T (Number flags a)
undef = T a -> T (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber T a
forall a. C a => T a
MV.undef
   zero :: T (Number flags a)
zero = T a -> T (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber T a
forall a. C a => T a
MV.zero
   phi :: forall r.
BasicBlock
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
phi BasicBlock
bb = (T a -> T (Number flags a))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T (Number flags 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 (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber (CodeGenFunction r (T a) -> CodeGenFunction r (T (Number flags a)))
-> (T (Number flags a) -> CodeGenFunction r (T a))
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BasicBlock -> T a -> CodeGenFunction r (T a)
forall r. BasicBlock -> T a -> CodeGenFunction r (T a)
forall a r. C a => BasicBlock -> T a -> CodeGenFunction r (T a)
MV.phi BasicBlock
bb (T a -> CodeGenFunction r (T a))
-> (T (Number flags a) -> T a)
-> T (Number flags a)
-> CodeGenFunction r (T a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber
   addPhi :: forall r.
BasicBlock
-> T (Number flags a) -> T (Number flags a) -> CodeGenFunction r ()
addPhi BasicBlock
bb T (Number flags a)
a T (Number flags a)
b = BasicBlock -> T a -> T a -> CodeGenFunction r ()
forall r. BasicBlock -> T a -> T a -> CodeGenFunction r ()
forall a r. C a => BasicBlock -> T a -> T a -> CodeGenFunction r ()
MV.addPhi BasicBlock
bb (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
a) (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
b)

mvNumber :: MV.T a -> MV.T (Number flags a)
mvNumber :: forall a flags. T a -> T (Number flags a)
mvNumber (MV.Cons Repr a
a) = Repr (Number flags a) -> T (Number flags a)
forall a. Repr a -> T a
MV.Cons Repr a
Repr (Number flags a)
a

mvDenumber :: MV.T (Number flags a) -> MV.T a
mvDenumber :: forall flags a. T (Number flags a) -> T a
mvDenumber (MV.Cons Repr (Number flags a)
a) = Repr a -> T a
forall a. Repr a -> T a
MV.Cons Repr a
Repr (Number flags a)
a


class MV.C a => MultiValue a where
   setMultiValueFlags ::
      (Flags flags) =>
      Proxy flags -> Bool -> MV.T (Number flags a) -> LLVM.CodeGenFunction r ()

instance MultiValue Float where
   setMultiValueFlags :: forall flags r.
Flags flags =>
Proxy flags
-> Bool -> T (Number flags Float) -> CodeGenFunction r ()
setMultiValueFlags Proxy flags
p Bool
b (MV.Cons Repr (Number flags Float)
a) = Proxy flags -> Bool -> Value Float -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy flags
p Bool
b Value Float
Repr (Number flags Float)
a

instance MultiValue Double where
   setMultiValueFlags :: forall flags r.
Flags flags =>
Proxy flags
-> Bool -> T (Number flags Double) -> CodeGenFunction r ()
setMultiValueFlags Proxy flags
p Bool
b (MV.Cons Repr (Number flags Double)
a) = Proxy flags -> Bool -> Value Double -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy flags
p Bool
b Value Double
Repr (Number flags Double)
a


type Id a = a -> a

attachMultiValueFlags ::
   (Flags flags, MultiValue a) =>
   Id (LLVM.CodeGenFunction r (MV.T (Number flags a)))
attachMultiValueFlags :: forall flags a r.
(Flags flags, MultiValue a) =>
Id (CodeGenFunction r (T (Number flags a)))
attachMultiValueFlags CodeGenFunction r (T (Number flags a))
act = do
   T (Number flags a)
mv <- CodeGenFunction r (T (Number flags a))
act
   Proxy flags -> Bool -> T (Number flags a) -> CodeGenFunction r ()
forall a flags r.
(MultiValue a, Flags flags) =>
Proxy flags -> Bool -> T (Number flags a) -> CodeGenFunction r ()
forall flags r.
Flags flags =>
Proxy flags -> Bool -> T (Number flags a) -> CodeGenFunction r ()
setMultiValueFlags Proxy flags
forall a. Proxy a
Proxy Bool
True T (Number flags a)
mv
   T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return T (Number flags a)
mv

liftNumberM ::
   (m ~ LLVM.CodeGenFunction r, Flags flags, MultiValue b) =>
   (MV.T a -> m (MV.T b)) ->
   MV.T (Number flags a) -> m (MV.T (Number flags b))
liftNumberM :: forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> m (T b)
f =
   CodeGenFunction r (T (Number flags b)) -> m (T (Number flags b))
Id (CodeGenFunction r (T (Number flags b)))
forall flags a r.
(Flags flags, MultiValue a) =>
Id (CodeGenFunction r (T (Number flags a)))
attachMultiValueFlags (CodeGenFunction r (T (Number flags b)) -> m (T (Number flags b)))
-> (T (Number flags a) -> CodeGenFunction r (T (Number flags b)))
-> T (Number flags a)
-> m (T (Number flags b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (T b -> T (Number flags b))
-> CodeGenFunction r (T b)
-> CodeGenFunction r (T (Number flags b))
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift T b -> T (Number flags b)
forall a flags. T a -> T (Number flags a)
mvNumber (CodeGenFunction r (T b) -> CodeGenFunction r (T (Number flags b)))
-> (T (Number flags a) -> CodeGenFunction r (T b))
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T a -> m (T b)
T a -> CodeGenFunction r (T b)
f (T a -> CodeGenFunction r (T b))
-> (T (Number flags a) -> T a)
-> T (Number flags a)
-> CodeGenFunction r (T b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber

liftNumberM2 ::
   (m ~ LLVM.CodeGenFunction r, Flags flags, MultiValue c) =>
   (MV.T a -> MV.T b -> m (MV.T c)) ->
   MV.T (Number flags a) -> MV.T (Number flags b) -> m (MV.T (Number flags c))
liftNumberM2 :: forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 T a -> T b -> m (T c)
f T (Number flags a)
a T (Number flags b)
b =
   Id (CodeGenFunction r (T (Number flags c)))
forall flags a r.
(Flags flags, MultiValue a) =>
Id (CodeGenFunction r (T (Number flags a)))
attachMultiValueFlags Id (CodeGenFunction r (T (Number flags c)))
-> Id (CodeGenFunction r (T (Number flags c)))
forall a b. (a -> b) -> a -> b
$ (T c -> T (Number flags c)) -> m (T c) -> m (T (Number flags c))
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift T c -> T (Number flags c)
forall a flags. T a -> T (Number flags a)
mvNumber (m (T c) -> m (T (Number flags c)))
-> m (T c) -> m (T (Number flags c))
forall a b. (a -> b) -> a -> b
$ T a -> T b -> m (T c)
f (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
a) (T (Number flags b) -> T b
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags b)
b)


instance (Flags flags, MV.Compose a) => MV.Compose (Number flags a) where
   type Composed (Number flags a) = Number flags (MV.Composed a)
   compose :: Number flags a -> T (Composed (Number flags a))
compose = T (Composed a) -> T (Number flags (Composed a))
forall a flags. T a -> T (Number flags a)
mvNumber (T (Composed a) -> T (Number flags (Composed a)))
-> (Number flags a -> T (Composed a))
-> Number flags a
-> T (Number flags (Composed a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> T (Composed a)
forall multituple.
Compose multituple =>
multituple -> T (Composed multituple)
MV.compose (a -> T (Composed a))
-> (Number flags a -> a) -> Number flags a -> T (Composed a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Number flags a -> a
forall flags a. Number flags a -> a
deconsNumber

instance (Flags flags, MV.Decompose pa) => MV.Decompose (Number flags pa) where
   decompose :: Number flags pa
-> T (PatternTuple (Number flags pa))
-> Decomposed T (Number flags pa)
decompose (Number pa
p) = Decomposed T pa -> Number flags (Decomposed T pa)
forall flags a. a -> Number flags a
Number (Decomposed T pa -> Number flags (Decomposed T pa))
-> (T (Number flags (PatternTuple pa)) -> Decomposed T pa)
-> T (Number flags (PatternTuple pa))
-> Number flags (Decomposed T pa)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. pa -> T (PatternTuple pa) -> Decomposed T pa
forall pattern.
Decompose pattern =>
pattern -> T (PatternTuple pattern) -> Decomposed T pattern
MV.decompose pa
p (T (PatternTuple pa) -> Decomposed T pa)
-> (T (Number flags (PatternTuple pa)) -> T (PatternTuple pa))
-> T (Number flags (PatternTuple pa))
-> Decomposed T pa
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T (Number flags (PatternTuple pa)) -> T (PatternTuple pa)
forall flags a. T (Number flags a) -> T a
mvDenumber

type instance
   MV.Decomposed f (Number flags pa) = Number flags (MV.Decomposed f pa)
type instance
   MV.PatternTuple (Number flags pa) = Number flags (MV.PatternTuple pa)


instance
   (Flags flags, MultiValue a, MV.IntegerConstant a) =>
      MV.IntegerConstant (Number flags a) where
   fromInteger' :: Integer -> T (Number flags a)
fromInteger' = T a -> T (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber (T a -> T (Number flags a))
-> (Integer -> T a) -> Integer -> T (Number flags a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> T a
forall a. IntegerConstant a => Integer -> T a
MV.fromInteger'

instance
   (Flags flags, MultiValue a, MV.RationalConstant a) =>
      MV.RationalConstant (Number flags a) where
   fromRational' :: Rational -> T (Number flags a)
fromRational' = T a -> T (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber (T a -> T (Number flags a))
-> (Rational -> T a) -> Rational -> T (Number flags a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> T a
forall a. RationalConstant a => Rational -> T a
MV.fromRational'

instance
   (Flags flags, MultiValue a, MV.Additive a) =>
      MV.Additive (Number flags a) where
   add :: forall r.
T (Number flags a)
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
add = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 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)
MV.add
   sub :: forall r.
T (Number flags a)
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
sub = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 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)
MV.sub
   neg :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
neg = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Additive a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.neg

instance
   (Flags flags, MultiValue a, MV.PseudoRing a) =>
      MV.PseudoRing (Number flags a) where
   mul :: forall r.
T (Number flags a)
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
mul = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 T a -> T a -> CodeGenFunction r (T a)
forall a r. PseudoRing a => T a -> T a -> CodeGenFunction r (T a)
forall r. T a -> T a -> CodeGenFunction r (T a)
MV.mul

instance
   (Flags flags, MultiValue a, MV.Field a) =>
      MV.Field (Number flags a) where
   fdiv :: forall r.
T (Number flags a)
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
fdiv = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Field a => T a -> T a -> CodeGenFunction r (T a)
forall r. T a -> T a -> CodeGenFunction r (T a)
MV.fdiv

type instance MV.Scalar (Number flags a) = Number flags (MV.Scalar a)

instance
   (Flags flags, MultiValue a, a ~ MV.Scalar v,
    MultiValue v, MV.PseudoModule v) =>
      MV.PseudoModule (Number flags v) where
   scale :: forall r.
T (Scalar (Number flags v))
-> T (Number flags v) -> CodeGenFunction r (T (Number flags v))
scale = (T a -> T v -> CodeGenFunction r (T v))
-> T (Number flags a)
-> T (Number flags v)
-> CodeGenFunction r (T (Number flags v))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 T a -> T v -> CodeGenFunction r (T v)
T (Scalar v) -> T v -> CodeGenFunction r (T v)
forall v r.
PseudoModule v =>
T (Scalar v) -> T v -> CodeGenFunction r (T v)
forall r. T (Scalar v) -> T v -> CodeGenFunction r (T v)
MV.scale

instance
   (Flags flags, MultiValue a, MV.Real a) =>
      MV.Real (Number flags a) where
   min :: forall r.
T (Number flags a)
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
min = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Real a => T a -> T a -> CodeGenFunction r (T a)
forall r. T a -> T a -> CodeGenFunction r (T a)
MV.min
   max :: forall r.
T (Number flags a)
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
max = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 T a -> T a -> CodeGenFunction r (T a)
forall a r. Real a => T a -> T a -> CodeGenFunction r (T a)
forall r. T a -> T a -> CodeGenFunction r (T a)
MV.max
   abs :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
abs = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Real a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.abs
   signum :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
signum = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Real a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.signum

instance
   (Flags flags, MultiValue a, MV.Fraction a) =>
      MV.Fraction (Number flags a) where
   truncate :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
truncate = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Fraction a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.truncate
   fraction :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
fraction = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Fraction a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.fraction

instance
   (Flags flags, MultiValue a, MV.Algebraic a) =>
      MV.Algebraic (Number flags a) where
   sqrt :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
sqrt = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Algebraic a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.sqrt

instance
   (Flags flags, MultiValue a, MV.Transcendental a) =>
      MV.Transcendental (Number flags a) where
   pi :: forall r. CodeGenFunction r (T (Number flags a))
pi = (T a -> T (Number flags a))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T (Number flags 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 (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber CodeGenFunction r (T a)
forall r. CodeGenFunction r (T a)
forall a r. Transcendental a => CodeGenFunction r (T a)
MV.pi
   sin :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
sin = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.sin
   cos :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
cos = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.cos
   exp :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
exp = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.exp
   log :: forall r.
T (Number flags a) -> CodeGenFunction r (T (Number flags a))
log = (T a -> CodeGenFunction r (T a))
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags b a.
(m ~ CodeGenFunction r, Flags flags, MultiValue b) =>
(T a -> m (T b)) -> T (Number flags a) -> m (T (Number flags b))
liftNumberM T a -> CodeGenFunction r (T a)
forall a r. Transcendental a => T a -> CodeGenFunction r (T a)
forall r. T a -> CodeGenFunction r (T a)
MV.log
   pow :: forall r.
T (Number flags a)
-> T (Number flags a) -> CodeGenFunction r (T (Number flags a))
pow = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 T a -> T a -> CodeGenFunction r (T a)
forall a r.
Transcendental a =>
T a -> T a -> CodeGenFunction r (T a)
forall r. T a -> T a -> CodeGenFunction r (T a)
MV.pow

instance
   (Flags flags, MultiValue a, MV.Select a) =>
      MV.Select (Number flags a) where
   select :: forall r.
T Bool
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
select = (T a -> T a -> CodeGenFunction r (T a))
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall (m :: * -> *) r flags c a b.
(m ~ CodeGenFunction r, Flags flags, MultiValue c) =>
(T a -> T b -> m (T c))
-> T (Number flags a)
-> T (Number flags b)
-> m (T (Number flags c))
liftNumberM2 ((T a -> T a -> CodeGenFunction r (T a))
 -> T (Number flags a)
 -> T (Number flags a)
 -> CodeGenFunction r (T (Number flags a)))
-> (T Bool -> T a -> T a -> CodeGenFunction r (T a))
-> T Bool
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T Bool -> T a -> T a -> CodeGenFunction r (T a)
forall a r.
Select a =>
T Bool -> T a -> T a -> CodeGenFunction r (T a)
forall r. T Bool -> T a -> T a -> CodeGenFunction r (T a)
MV.select

instance
   (Flags flags, MultiValue a, MV.Comparison a) =>
      MV.Comparison (Number flags a) where
   cmp :: forall r.
CmpPredicate
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T Bool)
cmp CmpPredicate
p T (Number flags a)
a T (Number flags a)
b = CmpPredicate -> T a -> T a -> CodeGenFunction r (T Bool)
forall r. CmpPredicate -> T a -> T a -> CodeGenFunction r (T Bool)
forall a r.
Comparison a =>
CmpPredicate -> T a -> T a -> CodeGenFunction r (T Bool)
MV.cmp CmpPredicate
p (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
a) (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
b)

instance
   (Flags flags, MultiValue a, MV.FloatingComparison a) =>
      MV.FloatingComparison (Number flags a) where
   fcmp :: forall r.
FPPredicate
-> T (Number flags a)
-> T (Number flags a)
-> CodeGenFunction r (T Bool)
fcmp FPPredicate
p T (Number flags a)
a T (Number flags a)
b = FPPredicate -> T a -> T a -> CodeGenFunction r (T Bool)
forall r. FPPredicate -> T a -> T a -> CodeGenFunction r (T Bool)
forall a r.
FloatingComparison a =>
FPPredicate -> T a -> T a -> CodeGenFunction r (T Bool)
MV.fcmp FPPredicate
p (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
a) (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
b)



mvecNumber :: MultiVector.T n a -> MultiVector.T n (Number flags a)
mvecNumber :: forall n a flags. T n a -> T n (Number flags a)
mvecNumber (MultiVector.Cons Repr n a
v) = Repr n (Number flags a) -> T n (Number flags a)
forall n a. Repr n a -> T n a
MultiVector.Cons Repr n a
Repr n (Number flags a)
v

mvecDenumber :: MultiVector.T n (Number flags a) -> MultiVector.T n a
mvecDenumber :: forall n flags a. T n (Number flags a) -> T n a
mvecDenumber (MultiVector.Cons Repr n (Number flags a)
v) = Repr n a -> T n a
forall n a. Repr n a -> T n a
MultiVector.Cons Repr n a
Repr n (Number flags a)
v

class (MultiValue a, MultiVector.C a) => MultiVector a where
   setMultiVectorFlags ::
      (Flags flags, LLVM.Positive n) =>
      Proxy flags -> Bool ->
      MultiVector.T n (Number flags a) -> LLVM.CodeGenFunction r ()

instance MultiVector Float where
   setMultiVectorFlags :: forall flags n r.
(Flags flags, Positive n) =>
Proxy flags
-> Bool -> T n (Number flags Float) -> CodeGenFunction r ()
setMultiVectorFlags Proxy flags
p Bool
b =
      Proxy flags -> Bool -> Value n Float -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy flags
p Bool
b (Value n Float -> CodeGenFunction r ())
-> (T n (Number flags Float) -> Value n Float)
-> T n (Number flags Float)
-> CodeGenFunction r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n Float -> Value n Float
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
MultiVector.deconsPrim (T n Float -> Value n Float)
-> (T n (Number flags Float) -> T n Float)
-> T n (Number flags Float)
-> Value n Float
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n (Number flags Float) -> T n Float
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber

instance MultiVector Double where
   setMultiVectorFlags :: forall flags n r.
(Flags flags, Positive n) =>
Proxy flags
-> Bool -> T n (Number flags Double) -> CodeGenFunction r ()
setMultiVectorFlags Proxy flags
p Bool
b =
      Proxy flags -> Bool -> Value n Double -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setFlags Proxy flags
p Bool
b (Value n Double -> CodeGenFunction r ())
-> (T n (Number flags Double) -> Value n Double)
-> T n (Number flags Double)
-> CodeGenFunction r ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n Double -> Value n Double
forall n a ar. (Repr n a ~ Value n ar) => T n a -> Value n ar
MultiVector.deconsPrim (T n Double -> Value n Double)
-> (T n (Number flags Double) -> T n Double)
-> T n (Number flags Double)
-> Value n Double
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n (Number flags Double) -> T n Double
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber

attachMultiVectorFlags ::
   (LLVM.Positive n, Flags flags, MultiVector a) =>
   Id (LLVM.CodeGenFunction r (MultiVector.T n (Number flags a)))
attachMultiVectorFlags :: forall n flags a r.
(Positive n, Flags flags, MultiVector a) =>
Id (CodeGenFunction r (T n (Number flags a)))
attachMultiVectorFlags CodeGenFunction r (T n (Number flags a))
act = do
   T n (Number flags a)
mv <- CodeGenFunction r (T n (Number flags a))
act
   Proxy flags -> Bool -> T n (Number flags a) -> CodeGenFunction r ()
forall a flags n r.
(MultiVector a, Flags flags, Positive n) =>
Proxy flags -> Bool -> T n (Number flags a) -> CodeGenFunction r ()
forall flags n r.
(Flags flags, Positive n) =>
Proxy flags -> Bool -> T n (Number flags a) -> CodeGenFunction r ()
setMultiVectorFlags Proxy flags
forall a. Proxy a
Proxy Bool
True T n (Number flags a)
mv
   T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return T n (Number flags a)
mv

liftMultiVectorM ::
   (m ~ LLVM.CodeGenFunction r, LLVM.Positive n, Flags flags, MultiVector b) =>
   (MultiVector.T n a -> m (MultiVector.T n b)) ->
   MultiVector.T n (Number flags a) -> m (MultiVector.T n (Number flags b))
liftMultiVectorM :: forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM T n a -> m (T n b)
f =
   CodeGenFunction r (T n (Number flags b))
-> m (T n (Number flags b))
Id (CodeGenFunction r (T n (Number flags b)))
forall n flags a r.
(Positive n, Flags flags, MultiVector a) =>
Id (CodeGenFunction r (T n (Number flags a)))
attachMultiVectorFlags (CodeGenFunction r (T n (Number flags b))
 -> m (T n (Number flags b)))
-> (T n (Number flags a)
    -> CodeGenFunction r (T n (Number flags b)))
-> T n (Number flags a)
-> m (T n (Number flags b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (T n b -> T n (Number flags b))
-> CodeGenFunction r (T n b)
-> CodeGenFunction r (T n (Number flags b))
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift T n b -> T n (Number flags b)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (CodeGenFunction r (T n b)
 -> CodeGenFunction r (T n (Number flags b)))
-> (T n (Number flags a) -> CodeGenFunction r (T n b))
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags b))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n a -> m (T n b)
T n a -> CodeGenFunction r (T n b)
f (T n a -> CodeGenFunction r (T n b))
-> (T n (Number flags a) -> T n a)
-> T n (Number flags a)
-> CodeGenFunction r (T n b)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber

liftMultiVectorM2 ::
   (m ~ LLVM.CodeGenFunction r, LLVM.Positive n, Flags flags, MultiVector c) =>
   (MultiVector.T n a -> MultiVector.T n b -> m (MultiVector.T n c)) ->
   MultiVector.T n (Number flags a) -> MultiVector.T n (Number flags b) ->
   m (MultiVector.T n (Number flags c))
liftMultiVectorM2 :: forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 T n a -> T n b -> m (T n c)
f T n (Number flags a)
a T n (Number flags b)
b =
   Id (CodeGenFunction r (T n (Number flags c)))
forall n flags a r.
(Positive n, Flags flags, MultiVector a) =>
Id (CodeGenFunction r (T n (Number flags a)))
attachMultiVectorFlags Id (CodeGenFunction r (T n (Number flags c)))
-> Id (CodeGenFunction r (T n (Number flags c)))
forall a b. (a -> b) -> a -> b
$
      (T n c -> T n (Number flags c))
-> m (T n c) -> m (T n (Number flags c))
forall (m :: * -> *) a r. Monad m => (a -> r) -> m a -> m r
Monad.lift T n c -> T n (Number flags c)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (m (T n c) -> m (T n (Number flags c)))
-> m (T n c) -> m (T n (Number flags c))
forall a b. (a -> b) -> a -> b
$ T n a -> T n b -> m (T n c)
f (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
a) (T n (Number flags b) -> T n b
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags b)
b)

instance (Flags flags, MultiVector a) => MultiVector.C (Number flags a) where
   type Repr n (Number flags a) = MultiVector.Repr n a
   cons :: forall n.
Positive n =>
Vector n (Number flags a) -> T n (Number flags a)
cons = T n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (T n a -> T n (Number flags a))
-> (Vector n (Number flags a) -> T n a)
-> Vector n (Number flags a)
-> T n (Number flags 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
MultiVector.cons (Vector n a -> T n a)
-> (Vector n (Number flags a) -> Vector n a)
-> Vector n (Number flags a)
-> T n a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Number flags a -> a) -> Vector n (Number flags a) -> Vector n a
forall a b. (a -> b) -> Vector n a -> Vector n b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Number flags a -> a
forall flags a. Number flags a -> a
deconsNumber
   undef :: forall n. Positive n => T n (Number flags a)
undef = T n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
MultiVector.undef
   zero :: forall n. Positive n => T n (Number flags a)
zero = T n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber T n a
forall n. Positive n => T n a
forall a n. (C a, Positive n) => T n a
MultiVector.zero
   phi :: forall n r.
Positive n =>
BasicBlock
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
phi BasicBlock
bb = (T n a -> T n (Number flags a))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n (Number flags 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 n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (CodeGenFunction r (T n a)
 -> CodeGenFunction r (T n (Number flags a)))
-> (T n (Number flags a) -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags 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)
MultiVector.phi BasicBlock
bb (T n a -> CodeGenFunction r (T n a))
-> (T n (Number flags a) -> T n a)
-> T n (Number flags a)
-> CodeGenFunction r (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber
   addPhi :: forall n r.
Positive n =>
BasicBlock
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r ()
addPhi BasicBlock
bb T n (Number flags a)
a T n (Number flags a)
b = 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 ()
MultiVector.addPhi BasicBlock
bb (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
a) (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
b)
   shuffle :: forall n m r.
(Positive n, Positive m) =>
ConstValue (Vector m Word32)
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T m (Number flags a))
shuffle ConstValue (Vector m Word32)
ks T n (Number flags a)
a T n (Number flags a)
b =
      (T m a -> T m (Number flags a))
-> CodeGenFunction r (T m a)
-> CodeGenFunction r (T m (Number flags 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 m a -> T m (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (CodeGenFunction r (T m a)
 -> CodeGenFunction r (T m (Number flags a)))
-> CodeGenFunction r (T m a)
-> CodeGenFunction r (T m (Number flags a))
forall a b. (a -> b) -> a -> b
$ 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)
MultiVector.shuffle ConstValue (Vector m Word32)
ks (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
a) (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
b)
   extract :: forall n r.
Positive n =>
Value Word32
-> T n (Number flags a) -> CodeGenFunction r (T (Number flags a))
extract Value Word32
k = (T a -> T (Number flags a))
-> CodeGenFunction r (T a)
-> CodeGenFunction r (T (Number flags 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 (Number flags a)
forall a flags. T a -> T (Number flags a)
mvNumber (CodeGenFunction r (T a) -> CodeGenFunction r (T (Number flags a)))
-> (T n (Number flags a) -> CodeGenFunction r (T a))
-> T n (Number flags a)
-> CodeGenFunction r (T (Number flags a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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)
MultiVector.extract Value Word32
k (T n a -> CodeGenFunction r (T a))
-> (T n (Number flags a) -> T n a)
-> T n (Number flags a)
-> CodeGenFunction r (T a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber
   insert :: forall n r.
Positive n =>
Value Word32
-> T (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
insert Value Word32
k T (Number flags a)
x =
      (T n a -> T n (Number flags a))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n (Number flags 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 n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (CodeGenFunction r (T n a)
 -> CodeGenFunction r (T n (Number flags a)))
-> (T n (Number flags a) -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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)
MultiVector.insert Value Word32
k (T (Number flags a) -> T a
forall flags a. T (Number flags a) -> T a
mvDenumber T (Number flags a)
x) (T n a -> CodeGenFunction r (T n a))
-> (T n (Number flags a) -> T n a)
-> T n (Number flags a)
-> CodeGenFunction r (T n a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber

instance
   (Flags flags, MultiVector a, MultiVector.IntegerConstant a) =>
      MultiVector.IntegerConstant (Number flags a) where
   fromInteger' :: forall n. Positive n => Integer -> T n (Number flags a)
fromInteger' = T n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (T n a -> T n (Number flags a))
-> (Integer -> T n a) -> Integer -> T n (Number flags 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
MultiVector.fromInteger'

instance
   (Flags flags, MultiVector a, MultiVector.RationalConstant a) =>
      MultiVector.RationalConstant (Number flags a) where
   fromRational' :: forall n. Positive n => Rational -> T n (Number flags a)
fromRational' = T n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber (T n a -> T n (Number flags a))
-> (Rational -> T n a) -> Rational -> T n (Number flags 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
MultiVector.fromRational'

instance
   (Flags flags, MultiVector a, MultiVector.Additive a) =>
      MultiVector.Additive (Number flags a) where
   add :: forall n r.
Positive n =>
T n (Number flags a)
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
add = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 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)
MultiVector.add
   sub :: forall n r.
Positive n =>
T n (Number flags a)
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
sub = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 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)
MultiVector.sub
   neg :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
neg = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.neg

instance
   (Flags flags, MultiVector a, MultiVector.PseudoRing a) =>
      MultiVector.PseudoRing (Number flags a) where
   mul :: forall n r.
Positive n =>
T n (Number flags a)
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
mul = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 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)
MultiVector.mul

instance
   (Flags flags, MultiVector a, MultiVector.Field a) =>
      MultiVector.Field (Number flags a) where
   fdiv :: forall n r.
Positive n =>
T n (Number flags a)
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
fdiv = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 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)
MultiVector.fdiv


{-
type instance MultiValue.Scalar (Number flags a) =
      Number flags (MultiValue.Scalar a)
instance
   (Flags flags, MultiVector a, MultiVector.PseudoModule a) =>
      MultiVector.PseudoModule (Number flags a) where
   scale = liftMultiVectorM2 MultiVector.mul
-}

instance
   (Flags flags, MultiVector a, MultiVector.Real a) =>
      MultiVector.Real (Number flags a) where
   min :: forall n r.
Positive n =>
T n (Number flags a)
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
min = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 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)
MultiVector.min
   max :: forall n r.
Positive n =>
T n (Number flags a)
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
max = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 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)
MultiVector.max
   abs :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
abs = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.abs
   signum :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
signum = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.signum

instance
   (Flags flags, MultiVector a, MultiVector.Fraction a) =>
      MultiVector.Fraction (Number flags a) where
   truncate :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
truncate = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.truncate
   fraction :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
fraction = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.fraction

instance
   (Flags flags, MultiVector a, MultiVector.Algebraic a) =>
      MultiVector.Algebraic (Number flags a) where
   sqrt :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
sqrt = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.sqrt

instance
   (Flags flags, MultiVector a, MultiVector.Transcendental a) =>
      MultiVector.Transcendental (Number flags a) where
   pi :: forall n r. Positive n => CodeGenFunction r (T n (Number flags a))
pi = (T n a -> T n (Number flags a))
-> CodeGenFunction r (T n a)
-> CodeGenFunction r (T n (Number flags 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 n a -> T n (Number flags a)
forall n a flags. T n a -> T n (Number flags a)
mvecNumber 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)
MultiVector.pi
   sin :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
sin = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.sin
   cos :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
cos = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.cos
   exp :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
exp = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.exp
   log :: forall n r.
Positive n =>
T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
log = (T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags b a.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector b) =>
(T n a -> m (T n b))
-> T n (Number flags a) -> m (T n (Number flags b))
liftMultiVectorM 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)
MultiVector.log
   pow :: forall n r.
Positive n =>
T n (Number flags a)
-> T n (Number flags a) -> CodeGenFunction r (T n (Number flags a))
pow = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 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)
MultiVector.pow

instance
   (Flags flags, MultiVector a, MultiVector.Select a) =>
      MultiVector.Select (Number flags a) where
   select :: forall n r.
Positive n =>
T n Bool
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
select = (T n a -> T n a -> CodeGenFunction r (T n a))
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall (m :: * -> *) r n flags c a b.
(m ~ CodeGenFunction r, Positive n, Flags flags, MultiVector c) =>
(T n a -> T n b -> m (T n c))
-> T n (Number flags a)
-> T n (Number flags b)
-> m (T n (Number flags c))
liftMultiVectorM2 ((T n a -> T n a -> CodeGenFunction r (T n a))
 -> T n (Number flags a)
 -> T n (Number flags a)
 -> CodeGenFunction r (T n (Number flags a)))
-> (T n Bool -> T n a -> T n a -> CodeGenFunction r (T n a))
-> T n Bool
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n (Number flags a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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)
MultiVector.select

instance
   (Flags flags, MultiVector a, MultiVector.Comparison a) =>
      MultiVector.Comparison (Number flags a) where
   cmp :: forall n r.
Positive n =>
CmpPredicate
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n Bool)
cmp CmpPredicate
p T n (Number flags a)
a T n (Number flags a)
b = 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)
MultiVector.cmp CmpPredicate
p (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
a) (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
b)

instance
   (Flags flags, MultiVector a, MultiVector.FloatingComparison a) =>
      MultiVector.FloatingComparison (Number flags a) where
   fcmp :: forall n r.
Positive n =>
FPPredicate
-> T n (Number flags a)
-> T n (Number flags a)
-> CodeGenFunction r (T n Bool)
fcmp FPPredicate
p T n (Number flags a)
a T n (Number flags a)
b = 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)
MultiVector.fcmp FPPredicate
p (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
a) (T n (Number flags a) -> T n a
forall n flags a. T n (Number flags a) -> T n a
mvecDenumber T n (Number flags a)
b)



class Tuple a where
   setTupleFlags ::
      (Flags flags) => Proxy flags -> Bool -> a -> LLVM.CodeGenFunction r ()

instance (LLVM.IsFloating a) => Tuple (LLVM.Value a) where
   setTupleFlags :: forall flags r.
Flags flags =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setTupleFlags = Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall flags a r.
(Flags flags, IsFloating a) =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
forall a r.
IsFloating a =>
Proxy flags -> Bool -> Value a -> CodeGenFunction r ()
setFlags


newtype Context flags a = Context a

proxyFromContext :: Context flags a -> Proxy flags
proxyFromContext :: forall flags a. Context flags a -> Proxy flags
proxyFromContext (Context a
_) = Proxy flags
forall a. Proxy a
Proxy

instance
   (Flags flags, Tuple.Zero a, Tuple a) =>
      Tuple.Zero (Context flags a) where
   zero :: Context flags a
zero = a -> Context flags a
forall flags a. a -> Context flags a
Context a
forall a. Zero a => a
Tuple.zero

instance
   (Flags flags, Tuple a, A.Additive a) =>
      A.Additive (Context flags a) where
   zero :: Context flags a
zero = a -> Context flags a
forall flags a. a -> Context flags a
Context a
forall a. Additive a => a
A.zero
   add :: forall r.
Context flags a
-> Context flags a -> CodeGenFunction r (Context flags a)
add = (a -> a -> CodeGenFunction r a)
-> Context flags a
-> Context flags a
-> CodeGenFunction r (Context flags a)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> a -> CodeGenFunction r a
forall r. a -> a -> CodeGenFunction r a
forall a r. Additive a => a -> a -> CodeGenFunction r a
A.add
   sub :: forall r.
Context flags a
-> Context flags a -> CodeGenFunction r (Context flags a)
sub = (a -> a -> CodeGenFunction r a)
-> Context flags a
-> Context flags a
-> CodeGenFunction r (Context flags a)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> a -> CodeGenFunction r a
forall r. a -> a -> CodeGenFunction r a
forall a r. Additive a => a -> a -> CodeGenFunction r a
A.sub
   neg :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
neg = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Additive a => a -> CodeGenFunction r a
A.neg

instance
   (Flags flags, A.PseudoRing a, Tuple a) =>
      A.PseudoRing (Context flags a) where
   mul :: forall r.
Context flags a
-> Context flags a -> CodeGenFunction r (Context flags a)
mul = (a -> a -> CodeGenFunction r a)
-> Context flags a
-> Context flags a
-> CodeGenFunction r (Context flags a)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> a -> CodeGenFunction r a
forall r. a -> a -> CodeGenFunction r a
forall a r. PseudoRing a => a -> a -> CodeGenFunction r a
A.mul

type instance A.Scalar (Context flags a) = Context flags (A.Scalar a)

instance
   (Flags flags, A.PseudoModule v, Tuple v, A.Scalar v ~ a, Tuple a) =>
      A.PseudoModule (Context flags v) where
   scale :: forall r.
Scalar (Context flags v)
-> Context flags v -> CodeGenFunction r (Context flags v)
scale = (a -> v -> CodeGenFunction r v)
-> Context flags a
-> Context flags v
-> CodeGenFunction r (Context flags v)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> v -> CodeGenFunction r v
Scalar v -> v -> CodeGenFunction r v
forall v r. PseudoModule v => Scalar v -> v -> CodeGenFunction r v
forall r. Scalar v -> v -> CodeGenFunction r v
A.scale

instance
   (Flags flags, Tuple a, A.IntegerConstant a) =>
      A.IntegerConstant (Context flags a) where
   fromInteger' :: Integer -> Context flags a
fromInteger' = a -> Context flags a
forall flags a. a -> Context flags a
Context (a -> Context flags a)
-> (Integer -> a) -> Integer -> Context flags a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> a
forall a. IntegerConstant a => Integer -> a
A.fromInteger'

instance
   (Flags flags, Tuple v, A.Field v) =>
      A.Field (Context flags v) where
   fdiv :: forall r.
Context flags v
-> Context flags v -> CodeGenFunction r (Context flags v)
fdiv = (v -> v -> CodeGenFunction r v)
-> Context flags v
-> Context flags v
-> CodeGenFunction r (Context flags v)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 v -> v -> CodeGenFunction r v
forall r. v -> v -> CodeGenFunction r v
forall a r. Field a => a -> a -> CodeGenFunction r a
A.fdiv

instance
   (Flags flags, Tuple a, A.RationalConstant a) =>
      A.RationalConstant (Context flags a) where
   fromRational' :: Rational -> Context flags a
fromRational' = a -> Context flags a
forall flags a. a -> Context flags a
Context (a -> Context flags a)
-> (Rational -> a) -> Rational -> Context flags a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Rational -> a
forall a. RationalConstant a => Rational -> a
A.fromRational'

instance (Flags flags, Tuple a, A.Real a) => A.Real (Context flags a) where
   min :: forall r.
Context flags a
-> Context flags a -> CodeGenFunction r (Context flags a)
min = (a -> a -> CodeGenFunction r a)
-> Context flags a
-> Context flags a
-> CodeGenFunction r (Context flags a)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> a -> CodeGenFunction r a
forall r. a -> a -> CodeGenFunction r a
forall a r. Real a => a -> a -> CodeGenFunction r a
A.min
   max :: forall r.
Context flags a
-> Context flags a -> CodeGenFunction r (Context flags a)
max = (a -> a -> CodeGenFunction r a)
-> Context flags a
-> Context flags a
-> CodeGenFunction r (Context flags a)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> a -> CodeGenFunction r a
forall r. a -> a -> CodeGenFunction r a
forall a r. Real a => a -> a -> CodeGenFunction r a
A.max
   abs :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
abs = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Real a => a -> CodeGenFunction r a
A.abs
   signum :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
signum = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Real a => a -> CodeGenFunction r a
A.signum

instance
   (Flags flags, Tuple a, A.Fraction a) =>
      A.Fraction (Context flags a) where
   truncate :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
truncate = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Fraction a => a -> CodeGenFunction r a
A.truncate
   fraction :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
fraction = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Fraction a => a -> CodeGenFunction r a
A.fraction

instance
   (Flags flags, Tuple a, A.Comparison a) =>
      A.Comparison (Context flags a) where
   type CmpResult (Context flags a) = A.CmpResult a
   cmp :: forall r.
CmpPredicate
-> Context flags a
-> Context flags a
-> CodeGenFunction r (CmpResult (Context flags a))
cmp CmpPredicate
p (Context a
x) (Context a
y) = CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
forall r. CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
forall a r.
Comparison a =>
CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
A.cmp CmpPredicate
p a
x a
y

instance
   (Flags flags, Tuple a, A.FloatingComparison a) =>
      A.FloatingComparison (Context flags a) where
   fcmp :: forall r.
FPPredicate
-> Context flags a
-> Context flags a
-> CodeGenFunction r (CmpResult (Context flags a))
fcmp FPPredicate
p (Context a
x) (Context a
y) = FPPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
forall r. FPPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
forall a r.
FloatingComparison a =>
FPPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
A.fcmp FPPredicate
p a
x a
y

instance
   (Flags flags, Tuple a, A.Algebraic a) =>
      A.Algebraic (Context flags a) where
   sqrt :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
sqrt = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Algebraic a => a -> CodeGenFunction r a
A.sqrt

instance
   (Flags flags, Tuple a, A.Transcendental a) =>
      A.Transcendental (Context flags a) where
   pi :: forall r. CodeGenFunction r (Context flags a)
pi = Id (CodeGenFunction r (Context flags a))
forall flags a r.
(Flags flags, Tuple a) =>
Id (CodeGenFunction r (Context flags a))
attachTupleFlags CodeGenFunction r (Context flags a)
forall r. CodeGenFunction r (Context flags a)
forall a r. Transcendental a => CodeGenFunction r a
A.pi
   sin :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
sin = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Transcendental a => a -> CodeGenFunction r a
A.sin
   cos :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
cos = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Transcendental a => a -> CodeGenFunction r a
A.cos
   exp :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
exp = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Transcendental a => a -> CodeGenFunction r a
A.exp
   log :: forall r. Context flags a -> CodeGenFunction r (Context flags a)
log = (a -> CodeGenFunction r a)
-> Context flags a -> CodeGenFunction r (Context flags a)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r a
forall r. a -> CodeGenFunction r a
forall a r. Transcendental a => a -> CodeGenFunction r a
A.log
   pow :: forall r.
Context flags a
-> Context flags a -> CodeGenFunction r (Context flags a)
pow = (a -> a -> CodeGenFunction r a)
-> Context flags a
-> Context flags a
-> CodeGenFunction r (Context flags a)
forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> a -> CodeGenFunction r a
forall r. a -> a -> CodeGenFunction r a
forall a r. Transcendental a => a -> a -> CodeGenFunction r a
A.pow


attachTupleFlags ::
   (Flags flags, Tuple a) =>
   Id (LLVM.CodeGenFunction r (Context flags a))
attachTupleFlags :: forall flags a r.
(Flags flags, Tuple a) =>
Id (CodeGenFunction r (Context flags a))
attachTupleFlags CodeGenFunction r (Context flags a)
act = do
   c :: Context flags a
c@(Context a
x) <- CodeGenFunction r (Context flags a)
act
   Proxy flags -> Bool -> a -> CodeGenFunction r ()
forall a flags r.
(Tuple a, Flags flags) =>
Proxy flags -> Bool -> a -> CodeGenFunction r ()
forall flags r.
Flags flags =>
Proxy flags -> Bool -> a -> CodeGenFunction r ()
setTupleFlags (Context flags a -> Proxy flags
forall flags a. Context flags a -> Proxy flags
proxyFromContext Context flags a
c) Bool
True a
x
   Context flags a -> CodeGenFunction r (Context flags a)
forall a. a -> CodeGenFunction r a
forall (m :: * -> *) a. Monad m => a -> m a
return Context flags a
c

liftContext :: (Flags flags, Tuple b) =>
   (a -> LLVM.CodeGenFunction r b) ->
   Context flags a -> LLVM.CodeGenFunction r (Context flags b)
liftContext :: forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext a -> CodeGenFunction r b
f (Context a
x) = Id (CodeGenFunction r (Context flags b))
forall flags a r.
(Flags flags, Tuple a) =>
Id (CodeGenFunction r (Context flags a))
attachTupleFlags (b -> Context flags b
forall flags a. a -> Context flags a
Context (b -> Context flags b)
-> CodeGenFunction r b -> CodeGenFunction r (Context flags b)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> CodeGenFunction r b
f a
x)

liftContext2 :: (Flags flags, Tuple c) =>
   (a -> b -> LLVM.CodeGenFunction r c) ->
   Context flags a -> Context flags b ->
   LLVM.CodeGenFunction r (Context flags c)
liftContext2 :: forall flags c a b r.
(Flags flags, Tuple c) =>
(a -> b -> CodeGenFunction r c)
-> Context flags a
-> Context flags b
-> CodeGenFunction r (Context flags c)
liftContext2 a -> b -> CodeGenFunction r c
f (Context a
x) = (b -> CodeGenFunction r c)
-> Context flags b -> CodeGenFunction r (Context flags c)
forall flags b a r.
(Flags flags, Tuple b) =>
(a -> CodeGenFunction r b)
-> Context flags a -> CodeGenFunction r (Context flags b)
liftContext ((b -> CodeGenFunction r c)
 -> Context flags b -> CodeGenFunction r (Context flags c))
-> (b -> CodeGenFunction r c)
-> Context flags b
-> CodeGenFunction r (Context flags c)
forall a b. (a -> b) -> a -> b
$ a -> b -> CodeGenFunction r c
f a
x