module Data.Array.Knead.Shape.Cubic.Int (
Single(..),
Int(Int), cons, decons,
) where
import qualified Data.Array.Knead.Expression as Expr
import qualified LLVM.Extra.Multi.Value as MultiValue
import qualified LLVM.Extra.Marshal as Marshal
import qualified LLVM.Extra.Tuple as Tuple
import qualified LLVM.Extra.Arithmetic as A
import qualified LLVM.Core as LLVM
import Data.Word (Word)
import Prelude hiding (Int, head, tail, )
newtype Int = Int Word
cons :: (Expr.Value val) => val Word -> val Int
cons = Expr.lift1 $ \(MultiValue.Cons x) -> MultiValue.Cons x
decons :: (Expr.Value val) => val Int -> val Word
decons = Expr.lift1 $ \(MultiValue.Cons x) -> MultiValue.Cons x
class Single ix where
switchSingle :: f Int -> f ix
instance Single Int where
switchSingle x = x
instance Tuple.Value Int where
type ValueOf Int = LLVM.Value Word
valueOf (Int x) = LLVM.valueOf x
instance MultiValue.C Int where
cons (Int x) = MultiValue.consPrimitive x
undef = MultiValue.undefPrimitive
zero = MultiValue.zeroPrimitive
phi = MultiValue.phiPrimitive
addPhi = MultiValue.addPhiPrimitive
instance MultiValue.Additive Int where
add = MultiValue.liftM2 A.add
sub = MultiValue.liftM2 A.sub
neg = MultiValue.liftM A.neg
instance MultiValue.PseudoRing Int where
mul = MultiValue.liftM2 A.mul
instance MultiValue.Real Int where
min = MultiValue.liftM2 A.min
max = MultiValue.liftM2 A.max
abs = MultiValue.liftM A.abs
signum = MultiValue.liftM A.signum
instance MultiValue.IntegerConstant Int where
fromInteger' = cons . A.fromInteger'
instance MultiValue.Comparison Int where
cmp mode = MultiValue.liftM2 $ A.cmp mode
instance Marshal.C Int where
pack (Int i) = i
unpack = Int
instance Marshal.MV Int where