llvm-extra 0.8.1 → 0.8.2
raw patch · 2 files changed
+144/−2 lines, 2 files
Files
- llvm-extra.cabal +2/−2
- src/LLVM/Extra/FastMath.hs +142/−0
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)