llvm-extra-0.6.0.1: Utility functions for the llvm interface

Safe HaskellNone
LanguageHaskell98

LLVM.Extra.Multi.Value

Synopsis

Documentation

newtype T a Source

Constructors

Cons (Repr Value a) 

Instances

C T 
C a => Phi (T a) 
Select a => Select (T a) 
C a => Zero (T a) 
C a => Undefined (T a) 
Transcendental a => Transcendental (T a) 
Algebraic a => Algebraic (T a) 
Logic a => Logic (T a) 
FloatingComparison a => FloatingComparison (T a) 
Comparison a => Comparison (T a) 
Fraction a => Fraction (T a) 
Real a => Real (T a) 
RationalConstant a => RationalConstant (T a) 
Field a => Field (T a) 
IntegerConstant a => IntegerConstant (T a) 
PseudoModule a => PseudoModule (T a) 
PseudoRing a => PseudoRing (T a) 
Additive a => Additive (T a) 
Compose (T a) 
C a => C (T a) 
type Size T = D1 
type CmpResult (T a) = T Bool 
type Scalar (T a) = T (Scalar a) 
type Composed (T a) = a 
type Struct (T a) = Struct a 

class C a where Source

Associated Types

type Repr f a :: * Source

Methods

cons :: a -> T a Source

undef :: T a Source

zero :: T a Source

phis :: BasicBlock -> T a -> CodeGenFunction r (T a) Source

addPhis :: BasicBlock -> T a -> T a -> CodeGenFunction r () Source

Instances

C Bool 
C Double 
C Float 
C Int8 
C Int16 
C Int32 
C Int64 
C Word8 
C Word16 
C Word32 
C Word64 
C () 
C (StablePtr a) 
IsType a => C (Ptr a) 
IsFunction a => C (FunPtr a) 
(C a, C b) => C (a, b) 
(C a, C b, C c) => C (a, b, c) 
(C a, C b, C c, C d) => C (a, b, c, d) 

consPrimitive :: (IsConst al, Value al ~ Repr Value a) => al -> T a Source

zeroPrimitive :: (IsType al, Value al ~ Repr Value a) => T a Source

consUnit :: (Repr Value a ~ ()) => a -> T a Source

undefUnit :: (Repr Value a ~ ()) => T a Source

zeroUnit :: (Repr Value a ~ ()) => T a Source

phisUnit :: (Repr Value a ~ ()) => BasicBlock -> T a -> CodeGenFunction r (T a) Source

addPhisUnit :: (Repr Value a ~ ()) => BasicBlock -> T a -> T a -> CodeGenFunction r () Source

fst :: T (a, b) -> T a Source

snd :: T (a, b) -> T b Source

curry :: (T (a, b) -> c) -> T a -> T b -> c Source

uncurry :: (T a -> T b -> c) -> T (a, b) -> c Source

mapFst :: (T a0 -> T a1) -> T (a0, b) -> T (a1, b) Source

mapSnd :: (T b0 -> T b1) -> T (a, b0) -> T (a, b1) Source

swap :: T (a, b) -> T (b, a) Source

fst3 :: T (a, b, c) -> T a Source

snd3 :: T (a, b, c) -> T b Source

thd3 :: T (a, b, c) -> T c Source

mapFst3 :: (T a0 -> T a1) -> T (a0, b, c) -> T (a1, b, c) Source

mapSnd3 :: (T b0 -> T b1) -> T (a, b0, c) -> T (a, b1, c) Source

mapThd3 :: (T c0 -> T c1) -> T (a, b, c0) -> T (a, b, c1) Source

zip :: T a -> T b -> T (a, b) Source

zip3 :: T a -> T b -> T c -> T (a, b, c) Source

zip4 :: T a -> T b -> T c -> T d -> T (a, b, c, d) Source

unzip :: T (a, b) -> (T a, T b) Source

unzip3 :: T (a, b, c) -> (T a, T b, T c) Source

unzip4 :: T (a, b, c, d) -> (T a, T b, T c, T d) Source

class Compose multituple where Source

Associated Types

type Composed multituple Source

Methods

compose :: multituple -> T (Composed multituple) Source

A nested zip.

Instances

Compose (T a) 
(Compose a, Compose b) => Compose (a, b) 
(Compose a, Compose b, Compose c) => Compose (a, b, c) 
(Compose a, Compose b, Compose c, Compose d) => Compose (a, b, c, d) 

class (Composed (Decomposed T pattern) ~ PatternTuple pattern) => Decompose pattern where Source

Methods

decompose :: pattern -> T (PatternTuple pattern) -> Decomposed T pattern Source

A nested unzip. Since it is not obvious how deep to decompose nested tuples, you must provide a pattern of the decomposed tuple. E.g.

f :: MultiValue ((a,b),(c,d)) ->
     ((MultiValue a, MultiValue b), MultiValue (c,d))
f = decompose ((atom,atom),atom)

Instances

Decompose (Atom a) 
(Decompose pa, Decompose pb) => Decompose (pa, pb) 
(Decompose pa, Decompose pb, Decompose pc) => Decompose (pa, pb, pc) 
(Decompose pa, Decompose pb, Decompose pc, Decompose pd) => Decompose (pa, pb, pc, pd) 

type family Decomposed f pattern Source

Instances

type Decomposed f (Atom a) = f a 
type Decomposed f (pa, pb) = (Decomposed f pa, Decomposed f pb) 
type Decomposed f (pa, pb, pc) = (Decomposed f pa, Decomposed f pb, Decomposed f pc) 
type Decomposed f (pa, pb, pc, pd) = (Decomposed f pa, Decomposed f pb, Decomposed f pc, Decomposed f pd) 

type family PatternTuple pattern Source

Instances

type PatternTuple (Atom a) = a 
type PatternTuple (pa, pb) = (PatternTuple pa, PatternTuple pb) 
type PatternTuple (pa, pb, pc) = (PatternTuple pa, PatternTuple pb, PatternTuple pc) 
type PatternTuple (pa, pb, pc, pd) = (PatternTuple pa, PatternTuple pb, PatternTuple pc, PatternTuple pd) 

modify :: (Compose a, Decompose pattern) => pattern -> (Decomposed T pattern -> a) -> T (PatternTuple pattern) -> T (Composed a) Source

A combination of compose and decompose that let you operate on tuple multivalues as Haskell tuples.

modify2 :: (Compose a, Decompose patternA, Decompose patternB) => patternA -> patternB -> (Decomposed T patternA -> Decomposed T patternB -> a) -> T (PatternTuple patternA) -> T (PatternTuple patternB) -> T (Composed a) Source

modifyF :: (Compose a, Decompose pattern, Functor f) => pattern -> (Decomposed T pattern -> f a) -> T (PatternTuple pattern) -> f (T (Composed a)) Source

modifyF2 :: (Compose a, Decompose patternA, Decompose patternB, Functor f) => patternA -> patternB -> (Decomposed T patternA -> Decomposed T patternB -> f a) -> T (PatternTuple patternA) -> T (PatternTuple patternB) -> f (T (Composed a)) Source

data Atom a Source

Constructors

Atom 

Instances

Decompose (Atom a) 
type Decomposed f (Atom a) = f a 
type PatternTuple (Atom a) = a 

lift1 :: (Repr Value a -> Repr Value b) -> T a -> T b Source

liftM0 :: Monad m => m (Repr Value a) -> m (T a) Source

liftM :: Monad m => (Repr Value a -> m (Repr Value b)) -> T a -> m (T b) Source

liftM2 :: Monad m => (Repr Value a -> Repr Value b -> m (Repr Value c)) -> T a -> T b -> m (T c) Source

liftM3 :: Monad m => (Repr Value a -> Repr Value b -> Repr Value c -> m (Repr Value d)) -> T a -> T b -> T c -> m (T d) Source

class C a => Additive a where Source

Methods

add :: T a -> T a -> CodeGenFunction r (T a) Source

sub :: T a -> T a -> CodeGenFunction r (T a) Source

neg :: T a -> CodeGenFunction r (T a) Source

class PseudoRing a => Field a where Source

Methods

fdiv :: T a -> T a -> CodeGenFunction r (T a) Source

Instances

type family Scalar vector :: * Source

Instances

class (PseudoRing (Scalar v), Additive v) => PseudoModule v where Source

Methods

scale :: T (Scalar v) -> T v -> CodeGenFunction r (T v) Source

class Additive a => Real a where Source

Methods

min :: T a -> T a -> CodeGenFunction r (T a) Source

max :: T a -> T a -> CodeGenFunction r (T a) Source

abs :: T a -> CodeGenFunction r (T a) Source

signum :: T a -> CodeGenFunction r (T a) Source

class Real a => Fraction a where Source

Methods

truncate :: T a -> CodeGenFunction r (T a) Source

fraction :: T a -> CodeGenFunction r (T a) Source

class Field a => Algebraic a where Source

Methods

sqrt :: T a -> CodeGenFunction r (T a) Source

class Algebraic a => Transcendental a where Source

Methods

pi :: CodeGenFunction r (T a) Source

sin, log, exp, cos :: T a -> CodeGenFunction r (T a) Source

pow :: T a -> T a -> CodeGenFunction r (T a) Source

class C a => Select a where Source

Methods

select :: T Bool -> T a -> T a -> CodeGenFunction r (T a) Source

Instances

class Real a => Comparison a where Source

Methods

cmp :: CmpPredicate -> T a -> T a -> CodeGenFunction r (T Bool) Source

It must hold

max x y  ==  do gt <- cmp CmpGT x y; select gt x y

class Comparison a => FloatingComparison a where Source

Methods

fcmp :: FPPredicate -> T a -> T a -> CodeGenFunction r (T Bool) Source

class Logic a where Source

Methods

and :: T a -> T a -> CodeGenFunction r (T a) Source

or :: T a -> T a -> CodeGenFunction r (T a) Source

xor :: T a -> T a -> CodeGenFunction r (T a) Source

inv :: T a -> CodeGenFunction r (T a) Source

Instances

class PseudoRing a => Integral a where Source

Methods

idiv :: T a -> T a -> CodeGenFunction r (T a) Source

irem :: T a -> T a -> CodeGenFunction r (T a) Source