packages feed

llvm-extra 0.8.1 → 0.8.2

raw patch · 2 files changed

+144/−2 lines, 2 files

Files

llvm-extra.cabal view
@@ -1,5 +1,5 @@ Name:           llvm-extra-Version:        0.8.1+Version:        0.8.2 License:        BSD3 License-File:   LICENSE Author:         Henning Thielemann <haskell@henning-thielemann.de>@@ -76,7 +76,7 @@   default:     True  Source-Repository this-  Tag:         0.8.1+  Tag:         0.8.2   Type:        darcs   Location:    http://code.haskell.org/~thielema/llvm-extra/ 
src/LLVM/Extra/FastMath.hs view
@@ -3,6 +3,7 @@ {-# LANGUAGE GeneralizedNewtypeDeriving #-} module LLVM.Extra.FastMath 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.Class as Class@@ -203,6 +204,147 @@    (Flags flags, MultiValue a, MV.FloatingComparison a) =>       MV.FloatingComparison (Number flags a) where    fcmp p a b = MV.fcmp p (mvDenumber a) (mvDenumber b)++++mvecNumber :: MultiVector.T n a -> MultiVector.T n (Number flags a)+mvecNumber (MultiVector.Cons v) = MultiVector.Cons v++mvecDenumber :: MultiVector.T n (Number flags a) -> MultiVector.T n a+mvecDenumber (MultiVector.Cons v) = MultiVector.Cons 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 p b =+      setFlags p b . MultiVector.deconsPrim . mvecDenumber++instance MultiVector Double where+   setMultiVectorFlags p b =+      setFlags p b . MultiVector.deconsPrim . mvecDenumber++attachMultiVectorFlags ::+   (LLVM.Positive n, Flags flags, MultiVector a) =>+   Id (LLVM.CodeGenFunction r (MultiVector.T n (Number flags a)))+attachMultiVectorFlags act = do+   mv <- act+   setMultiVectorFlags Proxy True mv+   return 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 f =+   attachMultiVectorFlags . Monad.lift mvecNumber . f . 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 f a b =+   attachMultiVectorFlags $+      Monad.lift mvecNumber $ f (mvecDenumber a) (mvecDenumber b)++instance (Flags flags, MultiVector a) => MultiVector.C (Number flags a) where+   cons = mvecNumber . MultiVector.cons . fmap deconsNumber+   undef = mvecNumber MultiVector.undef+   zero = mvecNumber MultiVector.zero+   phis bb = fmap mvecNumber . MultiVector.phis bb . mvecDenumber+   addPhis bb a b = MultiVector.addPhis bb (mvecDenumber a) (mvecDenumber b)+   shuffle ks a b =+      fmap mvecNumber $ MultiVector.shuffle ks (mvecDenumber a) (mvecDenumber b)+   extract k = fmap mvNumber . MultiVector.extract k . mvecDenumber+   insert k x =+      fmap mvecNumber . MultiVector.insert k (mvDenumber x) . mvecDenumber++instance+   (Flags flags,+    MultiVector a, MV.IntegerConstant a, MultiVector.IntegerConstant a) =>+      MultiVector.IntegerConstant (Number flags a) where+   fromInteger' = mvecNumber . MultiVector.fromInteger'++instance+   (Flags flags,+    MultiVector a, MV.RationalConstant a, MultiVector.RationalConstant a) =>+      MultiVector.RationalConstant (Number flags a) where+   fromRational' = mvecNumber . MultiVector.fromRational'++instance+   (Flags flags, MultiVector a, MultiVector.Additive a) =>+      MultiVector.Additive (Number flags a) where+   add = liftMultiVectorM2 MultiVector.add+   sub = liftMultiVectorM2 MultiVector.sub+   neg = liftMultiVectorM MultiVector.neg++instance+   (Flags flags, MultiVector a, MultiVector.PseudoRing a) =>+      MultiVector.PseudoRing (Number flags a) where+   mul = liftMultiVectorM2 MultiVector.mul++instance+   (Flags flags, MultiVector a, MultiVector.Field a) =>+      MultiVector.Field (Number flags a) where+   fdiv = liftMultiVectorM2 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 = liftMultiVectorM2 MultiVector.min+   max = liftMultiVectorM2 MultiVector.max+   abs = liftMultiVectorM MultiVector.abs+   signum = liftMultiVectorM MultiVector.signum++instance+   (Flags flags, MultiVector a, MultiVector.Fraction a) =>+      MultiVector.Fraction (Number flags a) where+   truncate = liftMultiVectorM MultiVector.truncate+   fraction = liftMultiVectorM MultiVector.fraction++instance+   (Flags flags, MultiVector a, MultiVector.Algebraic a) =>+      MultiVector.Algebraic (Number flags a) where+   sqrt = liftMultiVectorM MultiVector.sqrt++instance+   (Flags flags, MultiVector a, MultiVector.Transcendental a) =>+      MultiVector.Transcendental (Number flags a) where+   pi = fmap mvecNumber MultiVector.pi+   sin = liftMultiVectorM MultiVector.sin+   cos = liftMultiVectorM MultiVector.cos+   exp = liftMultiVectorM MultiVector.exp+   log = liftMultiVectorM MultiVector.log+   pow = liftMultiVectorM2 MultiVector.pow++instance+   (Flags flags, MultiVector a, MultiVector.Select a) =>+      MultiVector.Select (Number flags a) where+   select = liftMultiVectorM2 . MultiVector.select++instance+   (Flags flags, MultiVector a, MultiVector.Comparison a) =>+      MultiVector.Comparison (Number flags a) where+   cmp p a b = MultiVector.cmp p (mvecDenumber a) (mvecDenumber b)++instance+   (Flags flags, MultiVector a, MultiVector.FloatingComparison a) =>+      MultiVector.FloatingComparison (Number flags a) where+   fcmp p a b = MultiVector.fcmp p (mvecDenumber a) (mvecDenumber b)