{-# 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