{-# LANGUAGE TypeFamilies #-}
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.Marshal as Marshal
import qualified LLVM.Extra.Multi.Value as MultiValue
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 :: forall (val :: * -> *). Value val => val Word -> val Int
cons = (T Word -> T Int) -> val Word -> val Int
forall a b. (T a -> T b) -> val a -> val b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 ((T Word -> T Int) -> val Word -> val Int)
-> (T Word -> T Int) -> val Word -> val Int
forall a b. (a -> b) -> a -> b
$ \(MultiValue.Cons Repr Word
x) -> Repr Int -> T Int
forall a. Repr a -> T a
MultiValue.Cons Repr Word
Repr Int
x

decons :: (Expr.Value val) => val Int -> val Word
decons :: forall (val :: * -> *). Value val => val Int -> val Word
decons = (T Int -> T Word) -> val Int -> val Word
forall a b. (T a -> T b) -> val a -> val b
forall (val :: * -> *) a b.
Value val =>
(T a -> T b) -> val a -> val b
Expr.lift1 ((T Int -> T Word) -> val Int -> val Word)
-> (T Int -> T Word) -> val Int -> val Word
forall a b. (a -> b) -> a -> b
$ \(MultiValue.Cons Repr Int
x) -> Repr Word -> T Word
forall a. Repr a -> T a
MultiValue.Cons Repr Word
Repr Int
x


class Single ix where
   switchSingle :: f Int -> f ix

instance Single Int where
   switchSingle :: forall (f :: * -> *). f Int -> f Int
switchSingle f Int
x = f Int
x


instance MultiValue.C Int where
   type Repr Int = LLVM.Value Word
   cons :: Int -> T Int
cons (Int Word
x) = Word -> T Int
forall al a. (IsConst al, Value al ~ Repr a) => al -> T a
MultiValue.consPrimitive Word
x
   undef :: T Int
undef = T Int
forall al a. (IsType al, Value al ~ Repr a) => T a
MultiValue.undefPrimitive
   zero :: T Int
zero = T Int
forall al a. (IsType al, Value al ~ Repr a) => T a
MultiValue.zeroPrimitive
   phi :: forall r. BasicBlock -> T Int -> CodeGenFunction r (T Int)
phi = BasicBlock -> T Int -> CodeGenFunction r (T Int)
forall al a r.
(IsFirstClass al, Value al ~ Repr a) =>
BasicBlock -> T a -> CodeGenFunction r (T a)
MultiValue.phiPrimitive
   addPhi :: forall r. BasicBlock -> T Int -> T Int -> CodeGenFunction r ()
addPhi = BasicBlock -> T Int -> T Int -> CodeGenFunction r ()
forall al a r.
(IsFirstClass al, Value al ~ Repr a) =>
BasicBlock -> T a -> T a -> CodeGenFunction r ()
MultiValue.addPhiPrimitive

instance MultiValue.Additive Int where
   add :: forall r. T Int -> T Int -> CodeGenFunction r (T Int)
add = (Repr Int -> Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b c.
Monad m =>
(Repr a -> Repr b -> m (Repr c)) -> T a -> T b -> m (T c)
MultiValue.liftM2 Repr Int -> Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> Value Word -> CodeGenFunction r (Value Word)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r.
Value Word -> Value Word -> CodeGenFunction r (Value Word)
A.add
   sub :: forall r. T Int -> T Int -> CodeGenFunction r (T Int)
sub = (Repr Int -> Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b c.
Monad m =>
(Repr a -> Repr b -> m (Repr c)) -> T a -> T b -> m (T c)
MultiValue.liftM2 Repr Int -> Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> Value Word -> CodeGenFunction r (Value Word)
forall a r. Additive a => a -> a -> CodeGenFunction r a
forall r.
Value Word -> Value Word -> CodeGenFunction r (Value Word)
A.sub
   neg :: forall r. T Int -> CodeGenFunction r (T Int)
neg = (Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b.
Monad m =>
(Repr a -> m (Repr b)) -> T a -> m (T b)
MultiValue.liftM Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> CodeGenFunction r (Value Word)
forall a r. Additive a => a -> CodeGenFunction r a
forall r. Value Word -> CodeGenFunction r (Value Word)
A.neg

instance MultiValue.PseudoRing Int where
   mul :: forall r. T Int -> T Int -> CodeGenFunction r (T Int)
mul = (Repr Int -> Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b c.
Monad m =>
(Repr a -> Repr b -> m (Repr c)) -> T a -> T b -> m (T c)
MultiValue.liftM2 Repr Int -> Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> Value Word -> CodeGenFunction r (Value Word)
forall a r. PseudoRing a => a -> a -> CodeGenFunction r a
forall r.
Value Word -> Value Word -> CodeGenFunction r (Value Word)
A.mul

instance MultiValue.Real Int where
   min :: forall r. T Int -> T Int -> CodeGenFunction r (T Int)
min = (Repr Int -> Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b c.
Monad m =>
(Repr a -> Repr b -> m (Repr c)) -> T a -> T b -> m (T c)
MultiValue.liftM2 Repr Int -> Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> Value Word -> CodeGenFunction r (Value Word)
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r.
Value Word -> Value Word -> CodeGenFunction r (Value Word)
A.min
   max :: forall r. T Int -> T Int -> CodeGenFunction r (T Int)
max = (Repr Int -> Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b c.
Monad m =>
(Repr a -> Repr b -> m (Repr c)) -> T a -> T b -> m (T c)
MultiValue.liftM2 Repr Int -> Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> Value Word -> CodeGenFunction r (Value Word)
forall a r. Real a => a -> a -> CodeGenFunction r a
forall r.
Value Word -> Value Word -> CodeGenFunction r (Value Word)
A.max
   abs :: forall r. T Int -> CodeGenFunction r (T Int)
abs = (Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b.
Monad m =>
(Repr a -> m (Repr b)) -> T a -> m (T b)
MultiValue.liftM Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> CodeGenFunction r (Value Word)
forall a r. Real a => a -> CodeGenFunction r a
forall r. Value Word -> CodeGenFunction r (Value Word)
A.abs
   signum :: forall r. T Int -> CodeGenFunction r (T Int)
signum = (Repr Int -> CodeGenFunction r (Repr Int))
-> T Int -> CodeGenFunction r (T Int)
forall (m :: * -> *) a b.
Monad m =>
(Repr a -> m (Repr b)) -> T a -> m (T b)
MultiValue.liftM Repr Int -> CodeGenFunction r (Repr Int)
Value Word -> CodeGenFunction r (Value Word)
forall a r. Real a => a -> CodeGenFunction r a
forall r. Value Word -> CodeGenFunction r (Value Word)
A.signum

instance MultiValue.IntegerConstant Int where
   fromInteger' :: Integer -> T Int
fromInteger' = T Word -> T Int
forall (val :: * -> *). Value val => val Word -> val Int
cons (T Word -> T Int) -> (Integer -> T Word) -> Integer -> T Int
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Integer -> T Word
forall a. IntegerConstant a => Integer -> a
A.fromInteger'

instance MultiValue.Comparison Int where
   cmp :: forall r.
CmpPredicate -> T Int -> T Int -> CodeGenFunction r (T Bool)
cmp CmpPredicate
mode = (Repr Int -> Repr Int -> CodeGenFunction r (Repr Bool))
-> T Int -> T Int -> CodeGenFunction r (T Bool)
forall (m :: * -> *) a b c.
Monad m =>
(Repr a -> Repr b -> m (Repr c)) -> T a -> T b -> m (T c)
MultiValue.liftM2 ((Repr Int -> Repr Int -> CodeGenFunction r (Repr Bool))
 -> T Int -> T Int -> CodeGenFunction r (T Bool))
-> (Repr Int -> Repr Int -> CodeGenFunction r (Repr Bool))
-> T Int
-> T Int
-> CodeGenFunction r (T Bool)
forall a b. (a -> b) -> a -> b
$ CmpPredicate
-> Value Word
-> Value Word
-> CodeGenFunction r (CmpResult (Value Word))
forall r.
CmpPredicate
-> Value Word
-> Value Word
-> CodeGenFunction r (CmpResult (Value Word))
forall a r.
Comparison a =>
CmpPredicate -> a -> a -> CodeGenFunction r (CmpResult a)
A.cmp CmpPredicate
mode


instance Marshal.C Int where
   pack :: Int -> Struct Int
pack (Int Word
i) = Word
Struct Int
i
   unpack :: Struct Int -> Int
unpack = Word -> Int
Struct Int -> Int
Int