llvm-extra 0.8.3 → 0.9
raw patch · 28 files changed
+1146/−4856 lines, 28 filesdep +QuickCheckdep +storable-tupledep −cpuiddep −parsecdep −unsafedep ~basedep ~llvm-tfdep ~non-empty
Dependencies added: QuickCheck, storable-tuple
Dependencies removed: cpuid, parsec, unsafe
Dependency ranges changed: base, llvm-tf, non-empty, tfp, transformers, utility-ht
Files
- Changes.md +5/−0
- Makefile +3/−11
- Problems.txt +0/−91
- llvm-extra.cabal +40/−61
- private/LLVM/Extra/ArithmeticPrivate.hs +127/−0
- private/LLVM/Extra/ScalarOrVectorPrivate.hs +141/−0
- src/Array.hs +27/−29
- src/LLVM/Extra/Arithmetic.hs +9/−51
- src/LLVM/Extra/ArithmeticPrivate.hs +0/−124
- src/LLVM/Extra/Control.hs +9/−9
- src/LLVM/Extra/Extension.hs +0/−178
- src/LLVM/Extra/Extension/X86.hs +0/−367
- src/LLVM/Extra/Extension/X86Auto.hs +0/−2699
- src/LLVM/Extra/FastMath.hs +33/−5
- src/LLVM/Extra/Iterator.hs +37/−16
- src/LLVM/Extra/MaybeContinuation.hs +5/−7
- src/LLVM/Extra/MaybePrivate.hs +1/−2
- src/LLVM/Extra/Multi/Iterator.hs +4/−4
- src/LLVM/Extra/Multi/Value/Private.hs +8/−6
- src/LLVM/Extra/Multi/Vector.hs +6/−4
- src/LLVM/Extra/ScalarOrVector.hs +79/−166
- src/LLVM/Extra/Vector.hs +44/−574
- src/PrepareIntrinsics.hs +0/−326
- test/LLVM/Extra/VectorAlt.hs +224/−0
- test/Main.hs +17/−0
- test/Test/Vector.hs +327/−0
- x86/cpuid/LLVM/Extra/ExtensionCheck/X86.hs +0/−71
- x86/none/LLVM/Extra/ExtensionCheck/X86.hs +0/−55
Changes.md view
@@ -1,5 +1,10 @@ # Change log for the `llvm-extra` package +## 0.9++* `Extension`: Move to new package `llvm-extension`.+ We now implement advanced instructions using generic LLVM intrinsics.+ ## 0.8.1 * `FastMath`: support for simplified arithmetic primitives
Makefile view
@@ -1,18 +1,10 @@ .PHONY: sharedobj -ghci:- ghci -Wall -i:src:x86/none src/Run.hs--ghci-cpuid:- ghci -Wall -i:src:x86/cpuid src/Run.hs- testbuild:- runhaskell Setup.lhs configure --user -fbuildExamples -fbuildTools -fcpuid- runhaskell Setup.lhs build- runhaskell Setup.lhs haddock-- runhaskell Setup.lhs configure --user -f-cpuid+ runhaskell Setup.lhs configure --user -fbuildExamples --enable-tests runhaskell Setup.lhs build+# runhaskell Setup.lhs haddock+ ./dist/build/llvm-extra-test/llvm-extra-test llvmversion = 2.6
− Problems.txt
@@ -1,91 +0,0 @@-LLVM-2.5 running GHCi--First I can load, say, Array.hs in ghci.-When running 'main' I get the error that LLVMSystem.so cannot be found.-No LLVM*.so file on my machine, cannot be found in a Suse package.-Building .so file manually using gcc as in ./make-so.sh.--Then I get a problem with pthread.so not being a shared object file-but a script.-However, we do not need pthread anyway,-thus removing it from ~/.ghc/i386-linux-6.10.4/package.conf solves that problem.-This is a known issue:- http://hackage.haskell.org/trac/ghc/ticket/2615#comment:16--In GHC-6.12.3 you must also run- ghc-pkg recache --user- after removing pthread from ~/.ghc/i386-linux-6.12.3/package.conf.d/llvm-*.conf--Now when running 'main' I get the error,-that something about CurrentEngine cannot be found.-It means, we must also include /usr/lib/llvm/LLVM*.o files.-But in what order?-Seems there is no working order,-but the one given by- llvm-config --libs-is close to what we need.-Problem: GHCi cannot cope with weak symbol _ZTIN4llvm12X86SubtargetE ("V" in nm)--This is a known issue due to- http://hackage.haskell.org/trac/ghc/ticket/3333#comment:3--I have used gcc to build a monolithic libLLVM.so-containing all libLLVM*.a and libLLVM*.o files of /usr/lib/llvm/.-Then I reduced the occurrences of LLVM in package.conf-in the extraLibraries field to "LLVM"-and the ldOptions to -lLLVM.---Now I can call LLVM in GHCi - but only until I do :reload.-After reload the next attempt to play something will let GHCi quit with:--ghci: JITEmitter.cpp:110: <unnamed>::JITResolver::JITResolver(llvm::JIT&): Assertion `TheJITResolver == 0 && "Multiple JIT resolvers?"' failed.--Maybe this can be handled in LLVM-2.6-where the JIT must be initialized explicitly.---LLVM-2.6:--If I do as described above,-then when linking the Array example-I get errors for undefined symbols like-/usr/local/lib/libLLVM.so: undefined reference to `AutoGeneratedSwitch_emit_dash_llvm'-/usr/local/lib/libLLVM.so: undefined reference to `AutoGeneratedList_Wl_comma_'-...--These can be avoided by excluding libplugin_llvmc_Base.a-and libplugin_llvmc_Clang.a from the libLLVM.so conglomerate.-Then the example can be compiled but it aborts with PassRegistrar error as below.--I GHCi I get «unknown symbol `LLVMGetBitcodeModuleProviderInContext'»-when running 'main' in GHCi.-Additionally to -lLLVM for our custom libLLVM.so-I have to add -lLTO to ldOptions.-Then all symbols can be found.-However, when running LLVM.initializeNativeTarget-GHCi quits with-ghci: Pass.cpp:152: void<unnamed>::PassRegistrar::RegisterPass(const llvm::PassInfo&): Assertion `Inserted && "Pass registered multiple times!"' failed.-Also running LLVM.Target.X86.initializeTarget or Array.renderRamp-leads to this error.---LLVM-2.8--If I remove 'pthread' from Extra-Libraries and add 'LLVM-2.8rc' to Extra-GHCi-Libraries in- $HOME/.ghc/i386-linux-6.12.3/package.conf.d/llvm-0.9.*-*.conf- and run- ghc-pkg recache --user- I am even able to run 'llvm' example programs from within GHCi!--Sometimes it happends that llvm.buildinfo contains-ld-options: /usr/local/lib/libLLVM-2.8rc.so-and then llvm-0.9.*-*.conf contains this as well.-This leads to a failure of a LLVM runtime assertion:--llvm/examples$ DotProd.exe-Two passes with the same argument (-preverify) attempted to be registered!-UNREACHABLE executed!-Aborted--ld-options field must be empty!
llvm-extra.cabal view
@@ -1,6 +1,7 @@+Cabal-Version: 2.2 Name: llvm-extra-Version: 0.8.3-License: BSD3+Version: 0.9+License: BSD-3-Clause License-File: LICENSE Author: Henning Thielemann <haskell@henning-thielemann.de> Maintainer: Henning Thielemann <haskell@henning-thielemann.de>@@ -33,13 +34,6 @@ . * complex Haskell values mapped to LLVM values in "LLVM.Extra.Multi.Value" .- * automatic adaption to target specific extensions,- currently used for access of vector operations- that are specific to an SSE level on x86 processors- in "LLVM.Extra.Extension"- (On x86 architectures we depend on the cpuid package- that is needed for automatic detection of available features.)- . * advanced vector operations such as sum of all vector elements, cumulative sum, floor, non-negative fraction, absolute value@@ -48,35 +42,20 @@ * type classes for handling scalar and vector operations in a uniform way in "LLVM.Extra.ScalarOrVector"- .- * a Makefile and a description- of how to run LLVM code from within GHCi. Stability: Experimental-Tested-With: GHC==7.0.4, GHC==7.4.2, GHC==7.8.2-Tested-With: GHC==8.4.3, GHC==8.6.1-Cabal-Version: 1.14+Tested-With: GHC==7.0.4, GHC==7.4.2, GHC==7.8.4+Tested-With: GHC==8.4.4, GHC==8.6.5, GHC==8.8.1 Build-Type: Simple Extra-Source-Files: Makefile Changes.md- Problems.txt- x86/cpuid/LLVM/Extra/ExtensionCheck/X86.hs- x86/none/LLVM/Extra/ExtensionCheck/X86.hs Flag buildExamples description: Build example executables default: False -Flag buildTools- description: Build intrinsic translator- default: False--Flag cpuid- description: Use CPUID for host feature detection if available on the architecture- default: True- Source-Repository this- Tag: 0.8.3+ Tag: 0.9 Type: darcs Location: http://code.haskell.org/~thielema/llvm-extra/ @@ -86,9 +65,8 @@ Library Build-Depends:- -- llvm must be imported with restrictive version bounds,- -- because we import implicitly and unqualified- llvm-tf >=3.1.2 && <3.2,+ private,+ llvm-tf >=9.0 && <9.1, tfp >=1.0 && <1.1, non-empty >=0.2.1 && <0.4, containers >=0.1 && <0.7,@@ -98,23 +76,9 @@ transformers >=0.1.1 && <0.6, tagged >=0.7 && <0.9, utility-ht >=0.0.11 && <0.1,- prelude-compat >=0.0 && <0.0.1-- Build-Depends:+ prelude-compat >=0.0 && <0.0.1, base >=3 && <5 - If (arch(i386) || arch(x86_64)) && flag(cpuid)- Build-Depends:- unsafe >=0.0 && <0.1,- cpuid >=0.2.3 && <0.3- Hs-Source-Dirs: x86/cpuid- Else- -- Instead of calling the cpuid instruction directly- -- we may ask LLVM's Subtarget detection.- -- This would also enable cross compilation.- -- However in LLVM-2.6 this is only available in the C++ interface.- Hs-Source-Dirs: x86/none- Default-Language: Haskell98 GHC-Options: -Wall Hs-source-dirs: src@@ -127,9 +91,6 @@ LLVM.Extra.Either LLVM.Extra.Class LLVM.Extra.Control- LLVM.Extra.Extension- LLVM.Extra.Extension.X86- LLVM.Extra.ExtensionCheck.X86 LLVM.Extra.Array LLVM.Extra.Scalar LLVM.Extra.Vector@@ -145,13 +106,26 @@ LLVM.Extra.Multi.Vector.Instance LLVM.Extra.Multi.Class Other-Modules:- LLVM.Extra.ArithmeticPrivate LLVM.Extra.MaybePrivate LLVM.Extra.EitherPrivate LLVM.Extra.MemoryPrivate- LLVM.Extra.Extension.X86Auto LLVM.Extra.Multi.Value.Private +Library private+ Build-Depends:+ llvm-tf,+ tfp,+ non-empty,+ utility-ht,+ base++ Default-Language: Haskell98+ GHC-Options: -Wall+ Hs-source-dirs: private+ Exposed-Modules:+ LLVM.Extra.ScalarOrVectorPrivate+ LLVM.Extra.ArithmeticPrivate+ Executable tone-llvm If flag(buildExamples) Build-Depends:@@ -169,16 +143,21 @@ GHC-Options: -Wall Main-Is: src/Array.hs -Executable prepare-intrinsics- If flag(buildTools)- Build-Depends:- parsec >=2.1 && <3.2,- containers >=0.1 && <0.7,- transformers,- utility-ht >=0.0.1 && <0.1,- base >=3 && <5- Else- Buildable: False+Test-Suite llvm-extra-test+ Type: exitcode-stdio-1.0+ Build-Depends:+ QuickCheck >=2.11 && <3,+ private,+ llvm-extra,+ llvm-tf,+ tfp,+ storable-tuple >=0.0.3 && <0.1,+ utility-ht >=0.0.1 && <0.1,+ base >=3 && <5 Default-Language: Haskell98 GHC-Options: -Wall- Main-Is: src/PrepareIntrinsics.hs+ Hs-Source-Dirs: test+ Main-Is: Main.hs+ Other-Modules:+ Test.Vector+ LLVM.Extra.VectorAlt
+ private/LLVM/Extra/ArithmeticPrivate.hs view
@@ -0,0 +1,127 @@+{-# LANGUAGE TypeFamilies #-}+module LLVM.Extra.ArithmeticPrivate where++import qualified LLVM.Util.Intrinsic as Intrinsic++import qualified LLVM.Core as LLVM+import LLVM.Core+ (CodeGenFunction, valueOf, Value,+ CmpPredicate(CmpLE, CmpGE), FPPredicate, CmpRet, CmpResult,+ IsConst, IsPrimitive, IsArithmetic, IsInteger, IsFloating,+ getElementPtr, )++import Foreign.Ptr (Ptr, )+import Data.Word (Word32, )+import Data.Int (Int32, )++import Prelude hiding (and, or, sqrt, sin, cos, exp, log, abs, min, max, )+++add ::+ (IsArithmetic a) =>+ Value a -> Value a -> CodeGenFunction r (Value a)+add = LLVM.add++sub ::+ (IsArithmetic a) =>+ Value a -> Value a -> CodeGenFunction r (Value a)+sub = LLVM.sub+++inc ::+ (IsArithmetic a, IsConst a, Num a) =>+ Value a -> CodeGenFunction r (Value a)+inc x = add x (valueOf 1)++dec ::+ (IsArithmetic a, IsConst a, Num a) =>+ Value a -> CodeGenFunction r (Value a)+dec x = sub x (valueOf 1)++advanceArrayElementPtr ::+ Value (Ptr a) ->+ CodeGenFunction r (Value (Ptr a))+advanceArrayElementPtr p =+ getElementPtr p (valueOf 1 :: Value Word32, ())++decreaseArrayElementPtr ::+ Value (Ptr a) ->+ CodeGenFunction r (Value (Ptr a))+decreaseArrayElementPtr p =+ getElementPtr p (valueOf (-1) :: Value Int32, ())++++mul ::+ (IsArithmetic a) =>+ Value a -> Value a -> CodeGenFunction r (Value a)+mul = LLVM.mul+++{- |+This would also work for vectors,+but LLVM-3.1 crashes when actually doing this.+-}+min :: (CmpRet a) => Value a -> Value a -> CodeGenFunction r (Value a)+min = cmpSelect (cmp CmpLE)++max :: (CmpRet a) => Value a -> Value a -> CodeGenFunction r (Value a)+max = cmpSelect (cmp CmpGE)++abs :: (IsArithmetic a, CmpRet a) =>+ Value a -> CodeGenFunction r (Value a)+abs x = do+ b <- cmp LLVM.CmpGE x (LLVM.value LLVM.zero)+ LLVM.select b x =<< LLVM.neg x+++signumGen ::+ (CmpRet a, IsPrimitive a) =>+ Value a -> Value a ->+ Value a -> CodeGenFunction r (Value a)+signumGen minusOne one x = do+ let zero = LLVM.value LLVM.zero+ negative <- cmp LLVM.CmpLT x zero+ positive <- cmp LLVM.CmpGT x zero+ LLVM.select negative minusOne+ =<< LLVM.select positive one zero++signum ::+ (Num a, CmpRet a, IsConst a, IsPrimitive a) =>+ Value a -> CodeGenFunction r (Value a)+signum = signumGen (LLVM.valueOf (-1)) (LLVM.valueOf 1)+++cmpSelect ::+ (CmpRet a) =>+ (Value a -> Value a -> CodeGenFunction r (Value (CmpResult a))) ->+ (Value a -> Value a -> CodeGenFunction r (Value a))+cmpSelect f x y =+ f x y >>= \b -> LLVM.select b x y+++fcmp ::+ (IsFloating a, CmpRet a, CmpResult a ~ b) =>+ FPPredicate -> Value a -> Value a -> CodeGenFunction r (Value b)+fcmp = LLVM.fcmp++cmp ::+ (CmpRet a, CmpResult a ~ b) =>+ CmpPredicate -> Value a -> Value a -> CodeGenFunction r (Value b)+cmp = LLVM.cmp++++and ::+ (IsInteger a) =>+ Value a -> Value a -> CodeGenFunction r (Value a)+and = LLVM.and++or ::+ (IsInteger a) =>+ Value a -> Value a -> CodeGenFunction r (Value a)+or = LLVM.or+++fraction :: (IsFloating a) => Value a -> CodeGenFunction r (Value a)+fraction x = sub x =<< Intrinsic.floor x
+ private/LLVM/Extra/ScalarOrVectorPrivate.hs view
@@ -0,0 +1,141 @@+{-# LANGUAGE TypeFamilies #-}+module LLVM.Extra.ScalarOrVectorPrivate where++import qualified LLVM.Extra.ArithmeticPrivate as A++import qualified Type.Data.Num.Decimal as TypeNum+import Type.Data.Num.Decimal (D1)++import qualified LLVM.Core as LLVM+import LLVM.Core+ (Value, ConstValue, valueOf,+ CmpRet, ShapeOf,+ Vector, WordN, IntN, FP128,+ IsConst, IsInteger, CodeGenFunction)++import qualified Data.NonEmpty as NonEmpty+import Data.Word (Word8, Word16, Word32, Word64)+import Data.Int (Int8, Int16, Int32, Int64)++import Prelude hiding (replicate)+++type family Scalar vector :: *++type instance Scalar Float = Float+type instance Scalar Double = Double+type instance Scalar FP128 = FP128+type instance Scalar Bool = Bool+type instance Scalar Int8 = Int8+type instance Scalar Int16 = Int16+type instance Scalar Int32 = Int32+type instance Scalar Int64 = Int64+type instance Scalar Word8 = Word8+type instance Scalar Word16 = Word16+type instance Scalar Word32 = Word32+type instance Scalar Word64 = Word64+type instance Scalar (IntN d) = IntN d+type instance Scalar (WordN d) = WordN d+type instance Scalar (Vector n a) = a+++class Replicate vector where+ -- | an alternative is using the 'Vector.Constant' vector type+ replicate :: Value (Scalar vector) -> CodeGenFunction r (Value vector)+ replicateConst :: ConstValue (Scalar vector) -> ConstValue vector++instance Replicate Float where replicate = return; replicateConst = id;+instance Replicate Double where replicate = return; replicateConst = id;+instance Replicate FP128 where replicate = return; replicateConst = id;+instance Replicate Bool where replicate = return; replicateConst = id;+instance Replicate Int8 where replicate = return; replicateConst = id;+instance Replicate Int16 where replicate = return; replicateConst = id;+instance Replicate Int32 where replicate = return; replicateConst = id;+instance Replicate Int64 where replicate = return; replicateConst = id;+instance Replicate Word8 where replicate = return; replicateConst = id;+instance Replicate Word16 where replicate = return; replicateConst = id;+instance Replicate Word32 where replicate = return; replicateConst = id;+instance Replicate Word64 where replicate = return; replicateConst = id;+instance Replicate (IntN d) where replicate = return; replicateConst = id;+instance Replicate (WordN d) where replicate = return; replicateConst = id;+instance+ (TypeNum.Positive n, LLVM.IsPrimitive a) =>+ Replicate (Vector n a) where+ replicate x = do+ v <- singleton x+ LLVM.shufflevector v (LLVM.value LLVM.undef) LLVM.zero+ replicateConst x = LLVM.constCyclicVector $ NonEmpty.Cons x []++singleton ::+ (LLVM.IsPrimitive a) =>+ Value a -> CodeGenFunction r (Value (Vector D1 a))+singleton x =+ LLVM.insertelement (LLVM.value LLVM.undef) x (valueOf 0)+++uaddSat, usubSat ::+ (IsInteger v, CmpRet v, Replicate v, Scalar v ~ a, IsConst a, Bounded a) =>+ Value v -> Value v -> CodeGenFunction r (Value v)+uaddSat x y = do+ z <- A.add x y+ wrong <- A.cmp LLVM.CmpLT z x+ maxBnd <- replicate $ valueOf maxBound+ LLVM.select wrong maxBnd z+usubSat x y = do+ z <- A.sub x y+ wrong <- A.cmp LLVM.CmpGT z x+ LLVM.select wrong (LLVM.value LLVM.zero) z++saddSat, ssubSat ::+ (IsInteger v, CmpRet v, Replicate v, ShapeOf v ~ shape,+ LLVM.ShapedType shape Bool ~ bv, ShapeOf bv ~ shape, CmpRet bv,+ Scalar v ~ a, IsConst a, Bounded a) =>+ Value v -> Value v -> CodeGenFunction r (Value v)++saddSat x y = do+ z <- A.add x y+ nonNegX <- A.cmp LLVM.CmpGE x $ LLVM.value LLVM.zero+ nonNegY <- A.cmp LLVM.CmpGE y $ LLVM.value LLVM.zero+ distinctSign <- A.cmp LLVM.CmpNE nonNegX nonNegY+ overflow <- A.cmp LLVM.CmpLT z x+ underflow <- A.cmp LLVM.CmpGT z x+ maxBnd <- replicate $ valueOf maxBound+ minBnd <- replicate $ valueOf minBound+ maxSat <- LLVM.select overflow maxBnd z+ minSat <- LLVM.select underflow minBnd z+ saturated <- LLVM.select nonNegX maxSat minSat+ LLVM.select distinctSign z saturated++ssubSat x y = do+ z <- A.sub x y+ nonNegX <- A.cmp LLVM.CmpGE x $ LLVM.value LLVM.zero+ nonNegY <- A.cmp LLVM.CmpGE y $ LLVM.value LLVM.zero+ sameSign <- A.cmp LLVM.CmpEQ nonNegX nonNegY+ overflow <- A.cmp LLVM.CmpLT z x+ underflow <- A.cmp LLVM.CmpGT z x+ maxBnd <- replicate $ valueOf maxBound+ minBnd <- replicate $ valueOf minBound+ maxSat <- LLVM.select overflow maxBnd z+ minSat <- LLVM.select underflow minBnd z+ saturated <- LLVM.select nonNegX maxSat minSat+ LLVM.select sameSign z saturated++saddSatLogical ::+ (IsInteger v, CmpRet v, Replicate v, ShapeOf v ~ shape,+ LLVM.ShapedType shape Bool ~ bv, ShapeOf bv ~ shape, CmpRet bv,+ IsInteger bv,+ Scalar v ~ a, IsConst a, Bounded a) =>+ Value v -> Value v -> CodeGenFunction r (Value v)+saddSatLogical x y = do+ z <- A.add x y+ nonNegX <- A.cmp LLVM.CmpGE x $ LLVM.value LLVM.zero+ nonNegY <- A.cmp LLVM.CmpGE y $ LLVM.value LLVM.zero+ distinctSign <- A.cmp LLVM.CmpNE nonNegX nonNegY+ minBnd <- replicate $ valueOf minBound+ maxBnd <- replicate $ valueOf maxBound+ bounds <- LLVM.select nonNegX maxBnd minBnd+ overflow <- A.cmp LLVM.CmpLT z y+ underflow <- A.cmp LLVM.CmpGT z y+ xflow <- LLVM.select nonNegX overflow underflow+ correctSum <- A.or distinctSign xflow+ LLVM.select correctSum z bounds
src/Array.hs view
@@ -3,15 +3,13 @@ {-# LANGUAGE ForeignFunctionInterface #-} module Main where -import LLVM.Extra.Control (arrayLoop, ) import qualified LLVM.Extra.ScalarOrVector as SoV import qualified LLVM.Extra.Vector as Vector -import qualified LLVM.Extra.Extension.X86 as X86-import qualified LLVM.Extra.Extension as Ext-+import qualified LLVM.Extra.Iterator as Iter import qualified LLVM.Extra.Class as Class import qualified LLVM.Extra.Arithmetic as A+import LLVM.Extra.Control (arrayLoop, ) import qualified LLVM.ExecutionEngine as EE import qualified LLVM.Core as LLVM@@ -32,8 +30,10 @@ import qualified Data.Empty as Empty import Data.NonEmpty ((!:), ) -import Control.Monad.Trans.State (StateT(StateT), runStateT, )-import Control.Monad (liftM2, )+import Control.Monad.Trans.State (StateT(StateT), runStateT)+import Control.Monad.HT ((<=<))+import Control.Monad (liftM2)+import Control.Applicative (liftA2) @@ -59,9 +59,7 @@ because 'frem' is only available in the FPU. -} fractionVector0 ::- (LLVM.IsFloating c, LLVM.ABinOp a (Value (Vector D4 Float)),- LLVM.ABinOpResult a (Value (Vector D4 Float)) ~ (v c)) =>- a -> CodeGenFunction r (v c)+ Value (Vector D4 Float) -> CodeGenFunction r (Value (Vector D4 Float)) fractionVector0 x = frem x =<< constVec 1 @@ -138,24 +136,6 @@ A.mul (valueOf 0.25) =<< A.add s0 s1 -{--Needs the horizontal add instruction from the SSSE3 extension in ix86 CPUs.--}-mixHorizontal :: Value (Vector D4 Float) -> CodeGenFunction r (Value Float)-mixHorizontal y = do- z <- Ext.runUnsafe X86.haddps y (value undef)- s <- Ext.runUnsafe X86.haddps z (value undef)- A.mul (valueOf 0.25) =<< extractelement s (valueOf 0)--{--Needs the dot product instruction from the SSE4 extension in ix86 CPUs.--}-mixDotProduct :: Value (Vector D4 Float) -> CodeGenFunction r (Value Float)-mixDotProduct y = do- x <- SoV.replicate (valueOf 0.25)- z <- Ext.runUnsafe X86.dpps x y (valueOf 0xF1)- extractelement z (valueOf 0)- mChorusVector :: CodeGenModule (Function@@ -166,11 +146,29 @@ const1 <- constVec 1 const2 <- constVec (-2) s <- arrayLoop size ptr (value (zero :: Vec)) $ \ ptri phase -> do- flip store ptri =<< mixHorizontal =<< add const1 =<< mul const2 phase+ flip store ptri =<< mixGeneric =<< add const1 =<< mul const2 phase Vector.fraction =<< A.add phase freq ss <- extractelement s (valueOf 0) ret ss +mChorusVectorIterator ::+ CodeGenModule+ (Function+ (Word32 -> Ptr Float -> Float -> Float -> Float -> Float -> IO Float))+mChorusVectorIterator =+ createFunction ExternalLinkage $ \ size ptr f0 f1 f2 f3 -> do+ freq <- Vector.assemble [f0,f1,f2,f3]+ const1 <- constVec 1+ const2 <- constVec (-2)+ Iter.mapM_ id $ Iter.take size $+ liftA2+ (\ptri phase ->+ flip store ptri =<< mixGeneric =<< add const1 =<< mul const2 phase)+ (Iter.arrayPtrs ptr)+ (Iter.iterate (Vector.fraction <=< A.add freq) (value (zero :: Vec)))+ ret (value zero :: Value Float)++ waveSaw :: Value Float -> CodeGenFunction r (Value Float) waveSaw t = A.sub (valueOf 1) =<<@@ -263,7 +261,7 @@ renderChorus :: IO () renderChorus = do- fill <- generateFunction derefChorusPtr mChorusVector+ fill <- generateFunction derefChorusPtr mChorusVectorIterator IO.withFile "speedtest.f32" IO.WriteMode $ \h -> let len = 10000000 in allocaArray len $ \ ptr ->
src/LLVM/Extra/Arithmetic.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE FlexibleContexts #-} module LLVM.Extra.Arithmetic ( -- * arithmetic: generalized and improved type inference@@ -24,16 +25,16 @@ Transcendental (pi, sin, cos, exp, log, pow), ) where +import qualified LLVM.Util.Intrinsic as Intrinsic import LLVM.Extra.ArithmeticPrivate (inc, dec, advanceArrayElementPtr, decreaseArrayElementPtr, ) import qualified LLVM.Extra.Class as Class import qualified LLVM.Extra.ScalarOrVector as SoV-import qualified LLVM.Util.Proxy as LP import qualified LLVM.Core as LLVM import LLVM.Core (CodeGenFunction, value, Value, ConstValue,- IsType, IsInteger, IsFloating, IsArithmetic, IsFirstClass, )+ IsInteger, IsFloating, IsArithmetic) import Control.Monad (liftM2, liftM3, ) @@ -275,55 +276,12 @@ inv = LLVM.inv -valueTypeName ::- (IsType a) =>- Value a -> String-valueTypeName =- LLVM.intrinsicTypeName . ((\_ -> LP.Proxy) :: Value a -> LP.Proxy a) --callIntrinsic1 ::- (IsFirstClass a) =>- String -> Value a -> CodeGenFunction r (Value a)-callIntrinsic1 fn x = do- op <- LLVM.externFunction ("llvm." ++ fn ++ "." ++ valueTypeName x)- LLVM.call op x >>= addReadNone--callIntrinsic2 ::- (IsFirstClass a) =>- String -> Value a -> Value a -> CodeGenFunction r (Value a)-callIntrinsic2 fn x y = do- op <- LLVM.externFunction ("llvm." ++ fn ++ "." ++ valueTypeName x)- LLVM.call op x y >>= addReadNone---{--If we add the attribute, then LLVM-2.8 complains:--$ ./dist/build/synthi-llvm-test/synthi-llvm-test-Attribute readnone only applies to the function!- %97 = call readnone float @llvm.sin.f32(float %96)-Attribute readnone only applies to the function!- %99 = call readnone float @llvm.exp.f32(float %98)-Attribute readnone only applies to the function!- %102 = call readnone float @llvm.cos.f32(float %101)-Broken module found, compilation aborted!-Stack dump:-0. Running pass 'Function Pass Manager' on module '_module'.-1. Running pass 'Module Verifier' on function '@fillsignal'-make: *** [test] Abgebrochen--}-addReadNone :: Value a -> CodeGenFunction r (Value a)-addReadNone x = do--- LLVM.addAttributes x 0 [LLVM.ReadNoneAttribute]- return x-- class Field a => Algebraic a where sqrt :: a -> CodeGenFunction r a instance (IsFloating a) => Algebraic (Value a) where- sqrt = callIntrinsic1 "sqrt"+ sqrt = Intrinsic.call1 "sqrt" class Algebraic a => Transcendental a where@@ -333,8 +291,8 @@ instance (IsFloating a, SoV.TranscendentalConstant a) => Transcendental (Value a) where pi = return $ value SoV.constPi- sin = callIntrinsic1 "sin"- cos = callIntrinsic1 "cos"- exp = callIntrinsic1 "exp"- log = callIntrinsic1 "log"- pow = callIntrinsic2 "pow"+ sin = Intrinsic.call1 "sin"+ cos = Intrinsic.call1 "cos"+ exp = Intrinsic.call1 "exp"+ log = Intrinsic.call1 "log"+ pow = Intrinsic.call2 "pow"
− src/LLVM/Extra/ArithmeticPrivate.hs
@@ -1,124 +0,0 @@-{-# LANGUAGE TypeFamilies #-}-module LLVM.Extra.ArithmeticPrivate where--import qualified LLVM.Core as LLVM-import LLVM.Core- (CodeGenFunction, valueOf, Value,- CmpPredicate(CmpLE, CmpGE), FPPredicate, CmpRet, CmpResult,- IsConst, IsFirstClass, IsArithmetic, IsInteger, IsFloating,- getElementPtr, )--import Foreign.Ptr (Ptr, )-import Data.Word (Word32, )-import Data.Int (Int32, )--import Prelude hiding (and, or, sqrt, sin, cos, exp, log, abs, min, max, )---add ::- (IsArithmetic a) =>- Value a -> Value a -> CodeGenFunction r (Value a)-add = LLVM.add--sub ::- (IsArithmetic a) =>- Value a -> Value a -> CodeGenFunction r (Value a)-sub = LLVM.sub---inc ::- (IsArithmetic a, IsConst a, Num a) =>- Value a -> CodeGenFunction r (Value a)-inc x = add x (valueOf 1)--dec ::- (IsArithmetic a, IsConst a, Num a) =>- Value a -> CodeGenFunction r (Value a)-dec x = sub x (valueOf 1)--advanceArrayElementPtr ::- Value (Ptr a) ->- CodeGenFunction r (Value (Ptr a))-advanceArrayElementPtr p =- getElementPtr p (valueOf 1 :: Value Word32, ())--decreaseArrayElementPtr ::- Value (Ptr a) ->- CodeGenFunction r (Value (Ptr a))-decreaseArrayElementPtr p =- getElementPtr p (valueOf (-1) :: Value Int32, ())----mul ::- (IsArithmetic a) =>- Value a -> Value a -> CodeGenFunction r (Value a)-mul = LLVM.mul---{- |-This would also work for vectors,-but LLVM-3.1 crashes when actually doing this.--}-min :: (IsFirstClass a, CmpRet a) =>- Value a -> Value a -> CodeGenFunction r (Value a)-min = cmpSelect (cmp CmpLE)--max :: (IsFirstClass a, CmpRet a) =>- Value a -> Value a -> CodeGenFunction r (Value a)-max = cmpSelect (cmp CmpGE)--abs :: (IsArithmetic a, CmpRet a) =>- Value a -> CodeGenFunction r (Value a)-abs x = max x =<< LLVM.neg x---signumGen ::- (LLVM.IsFirstClass a,- LLVM.CmpRet a, LLVM.CmpResult a ~ Bool) =>- LLVM.Value a -> LLVM.Value a ->- Value a -> CodeGenFunction r (Value a)-signumGen minusOne one x = do- let zero = LLVM.value LLVM.zero- negative <- cmp LLVM.CmpLT x zero- positive <- cmp LLVM.CmpGT x zero- LLVM.select negative minusOne- =<< LLVM.select positive one zero--signum ::- (Num a,- LLVM.IsConst a, LLVM.IsFirstClass a,- LLVM.CmpRet a, LLVM.CmpResult a ~ Bool) =>- Value a -> CodeGenFunction r (Value a)-signum = signumGen (LLVM.valueOf (-1)) (LLVM.valueOf 1)---cmpSelect ::- (IsFirstClass a, CmpRet a) =>- (Value a -> Value a -> CodeGenFunction r (Value (CmpResult a))) ->- (Value a -> Value a -> CodeGenFunction r (Value a))-cmpSelect f x y =- f x y >>= \b -> LLVM.select b x y---fcmp ::- (IsFloating a, CmpRet a, CmpResult a ~ b) =>- FPPredicate -> Value a -> Value a -> CodeGenFunction r (Value b)-fcmp = LLVM.fcmp--cmp ::- (CmpRet a, CmpResult a ~ b) =>- CmpPredicate -> Value a -> Value a -> CodeGenFunction r (Value b)-cmp = LLVM.cmp----and ::- (IsInteger a) =>- Value a -> Value a -> CodeGenFunction r (Value a)-and = LLVM.and--or ::- (IsInteger a) =>- Value a -> Value a -> CodeGenFunction r (Value a)-or = LLVM.or
src/LLVM/Extra/Control.hs view
@@ -28,8 +28,8 @@ br, condBr, Value, value, valueOf, phi, addPhiInputs,- CmpPredicate(CmpGT), CmpRet, CmpResult,- IsInteger, IsType, IsConst, IsFirstClass,+ CmpPredicate(CmpGT), CmpRet,+ IsInteger, IsType, IsConst, IsPrimitive, CodeGenFunction, CodeGenModule, newModule, defineModule, writeBitcodeToFile, ) @@ -51,7 +51,7 @@ -} arrayLoop :: (Phi a, IsType b,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr b) -> a -> (Value (Ptr b) -> a -> CodeGenFunction r a) -> CodeGenFunction r a@@ -64,7 +64,7 @@ arrayLoop2 :: (Phi s, IsType a, IsType b,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr a) -> Value (Ptr b) -> s -> (Value (Ptr a) -> Value (Ptr b) -> s -> CodeGenFunction r s) -> CodeGenFunction r s@@ -79,7 +79,7 @@ arrayLoopWithExit :: (Phi s, IsType a,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr a) -> s -> (Value (Ptr a) -> s -> CodeGenFunction r (Value Bool, s)) -> CodeGenFunction r (Value i, s)@@ -107,7 +107,7 @@ -} _arrayLoopWithExitDecLoop :: (Phi a, IsType b,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr b) -> a -> (Value (Ptr b) -> a -> CodeGenFunction r (Value Bool, a)) -> CodeGenFunction r (Value i, a)@@ -153,7 +153,7 @@ arrayLoop2WithExit :: (Phi s, IsType a, IsType b,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr a) -> Value (Ptr b) -> s -> (Value (Ptr a) -> Value (Ptr b) -> s -> CodeGenFunction r (Value Bool, s)) -> CodeGenFunction r (Value i, s)@@ -168,7 +168,7 @@ fixedLengthLoop :: (Phi s,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> s -> (s -> CodeGenFunction r s) -> CodeGenFunction r s@@ -317,7 +317,7 @@ class Phi a => Select a where select :: Value Bool -> a -> a -> CodeGenFunction r a -instance (IsFirstClass a, CmpRet a, CmpResult a ~ Bool) => Select (Value a) where+instance (CmpRet a, IsPrimitive a) => Select (Value a) where select = LLVM.select instance Select () where
− src/LLVM/Extra/Extension.hs
@@ -1,178 +0,0 @@-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE FlexibleInstances #-}-{-# LANGUAGE FlexibleContexts #-}-{-# LANGUAGE GeneralizedNewtypeDeriving #-}-{-# LANGUAGE Rank2Types #-}-module LLVM.Extra.Extension (- T, Result, CallArgs,- Subtarget(Subtarget), wrap,- intrinsic, intrinsicAttr,- run, runWhen, runUnsafe,- with, with2, with3,- ) where--import qualified LLVM.Core as LLVM-import LLVM.Core- (Value, CodeGenFunction, externFunction, call,- addAttributes, Attribute {- (ReadNoneAttribute) -}, )--import Data.Map (Map, )-import qualified Data.Map as Map--import Control.Monad.Trans.Writer (Writer, writer, runWriter, )-import Control.Monad (join, )-import Control.Applicative (Applicative, pure, (<*>), )--import Prelude2010 hiding (replicate, sum, map, zipWith, )-import Prelude ()---data Subtarget =- Subtarget {- targetName, name :: String,- check :: forall r. CodeGenFunction r Bool- }---{- |-This is an Applicative functor that registers,-what extensions are needed in order to run the contained instructions.-You can escape from the functor by calling 'run'-and providing a generic implementation.--We use an applicative functor-since with a monadic interface-we had to create the specialised code in every case,-in order to see which extensions where used-in the course of creating the instructions.--We use only one (unparameterized) type for all extensions,-since this is the most simple solution.-Alternatively we could use a type parameter-where class constraints show what extensions are needed.-This would be just like exceptions that are explicit in the type signature-as in the control-monad-exception package.-However we would still need to lift all basic LLVM instructions to the new monad.--}-newtype T a =- Cons (Writer (Map String Subtarget) a)- deriving (Functor, Applicative)--{- |-Declare that a certain plain LLVM instruction-depends on a particular extension.-This can be useful if you rely on the data layout-of a certain architecture when doing a bitcast,-or if you know that LLVM translates a certain generic operation-to something especially optimal for the declared extension.--}-wrap :: Subtarget -> a -> T a-wrap tar cgf =- Cons $- writer (cgf, Map.singleton (name tar) tar)---type family Result g :: *-type instance Result (a -> g) = Result g-type instance Result (CodeGenFunction r a) = r---{- | Analogous to 'LLVM.FunctionArgs'--The type parameter @r@ and its functional dependency are necessary-since @g@ must be a function of the form @a -> ... -> c -> CodeGenFunction r d@-and we must ensure that the explicit @r@ and the implicit @r@ in the @g@ do match.--}-class CallArgs g where- buildIntrinsic :: [Attribute] -> CodeGenFunction (Result g) g -> g--instance (CallArgs g) =>- CallArgs (Value a -> g) where- buildIntrinsic attrs g x =- buildIntrinsic attrs (fmap ($x) g)--instance CallArgs (CodeGenFunction r (Value a)) where- buildIntrinsic attrs g = do- z <- join g- addAttributes z 0 attrs- return z--{- |-Create an intrinsic and register the needed extension.-We cannot immediately check whether the signature matches-or whether the right extension is given.-However, when resolving intrinsics-LLVM will not find the intrinsic if the extension is wrong,-and it also checks the signature.--}-intrinsic ::- (LLVM.IsFunction f, LLVM.CallArgs f g (Result g), CallArgs g) =>- Subtarget -> String -> T g-intrinsic =- intrinsicAttr [{- ReadNoneAttribute -}]--intrinsicAttr ::- (LLVM.IsFunction f, LLVM.CallArgs f g (Result g), CallArgs g) =>- [Attribute] -> Subtarget -> String -> T g-intrinsicAttr attrs tar intr =- wrap tar $- buildIntrinsic attrs $- fmap call $- externFunction $- "llvm." ++ targetName tar ++ "." ++ name tar ++ "." ++ intr---infixl 1 `run`--{- |-@run generic specific@ generates the @specific@ code-if the required extensions are available on the host processor-and @generic@ otherwise.--}-run ::- CodeGenFunction r a ->- T (CodeGenFunction r a) ->- CodeGenFunction r a-run alt (Cons m) = do- let (a,s) = runWriter m- b <- mapM check (Map.elems s)- if and b- then a- else alt--{- |-Convenient variant of 'run':-Only run the code with extended instructions-if an additional condition is satisfied.--}-runWhen ::- Bool ->- CodeGenFunction r a ->- T (CodeGenFunction r a) ->- CodeGenFunction r a-runWhen c alt (Cons m) = do- let (a,s) = runWriter m- b <- mapM check (Map.elems s)- if c && and b- then a- else alt--{- |-Only for debugging purposes.--}-runUnsafe ::- T a -> a-runUnsafe (Cons m) =- fst $ runWriter m---with :: (Functor f) => f a -> (a -> b) -> f b-with = flip fmap--with2 :: (Applicative f) => f a -> f b -> (a -> b -> c) -> f c-with2 a b f =- pure f <*> a <*> b--with3 :: (Applicative f) => f a -> f b -> f c -> (a -> b -> c -> d) -> f d-with3 a b c f =- pure f <*> a <*> b <*> c
− src/LLVM/Extra/Extension/X86.hs
@@ -1,367 +0,0 @@-{-# LANGUAGE TypeFamilies #-}-{-# LANGUAGE FlexibleContexts #-}-{- |-Some special operations on X86 processors.-If you want to use them in algorithms-you will always have to prepare an alternative implementation-in terms of plain LLVM instructions.-You will then run them with 'Ext.run'-and this driver function then selects the most advanced of both implementations.-Functions that are written this way can be found in "LLVM.Extra.Vector".-Availability of extensions is checked with the @CPUID@ instruction.-However this does only work if you compile code for the host machine,-that is cross compilation will fail!-For cross compilation we would need access to the SubTarget detection of LLVM-that is only available in the C++ interface in version 2.6.--}-module LLVM.Extra.Extension.X86 (- X86.maxss, X86.minss, X86.maxps, X86.minps,- X86.maxsd, X86.minsd, X86.maxpd, X86.minpd,- cmpss, cmpps, cmpsd, cmppd, cmpps256, cmppd256,- pcmpgtb, pcmpgtw, pcmpgtd, pcmpgtq,- pcmpugtb, pcmpugtw, pcmpugtd, pcmpugtq,- pminsb, pminsw, pminsd,- pmaxsb, pmaxsw, pmaxsd,- pminub, pminuw, pminud,- pmaxub, pmaxuw, pmaxud,- pabsb, pabsw, pabsd,- pmuludq, pmuldq,- pmulld,- cvtps2dq, cvtpd2dq,- cvtdq2ps, cvtdq2pd,- ldmxcsr, stmxcsr, withMXCSR,- X86.haddps, X86.haddpd, X86.dpps, X86.dppd,- roundss, X86.roundps, roundsd, X86.roundpd,- absss, abssd, absps, abspd,- X86.psllw128, X86.pslld128, X86.psllq128,- X86.psrlw128, X86.psrld128, X86.psrlq128,- X86.psraw128, X86.psrad128,- X86.paddsb128, X86.paddsw128, X86.paddusb128, X86.paddusw128,- X86.psubsb128, X86.psubsw128, X86.psubusb128, X86.psubusw128,- ) where--import qualified LLVM.Extra.Extension.X86Auto as X86-import qualified LLVM.Extra.Extension as Ext-import LLVM.Extra.Extension.X86Auto (- V2Double, V4Float,- V2Int64, V2Word64,- V4Int32, V4Word32,- V8Int16, V8Word16,- V16Int8, V16Word8,- )-import LLVM.Extra.ExtensionCheck.X86- (sse1, sse2, sse41, sse42, )--import qualified LLVM.Extra.ArithmeticPrivate as A-import qualified LLVM.Core as LLVM-import LLVM.Core- (Value, Vector, valueOf, constOf, vector,- CodeGenFunction, FPPredicate, )--import qualified Type.Data.Num.Decimal as TypeNum--import qualified Data.NonEmpty.Class as NonEmptyC-import qualified Data.Empty as Empty-import Data.NonEmpty ((!:), )--import Data.Bits (clearBit, complement, )-import Data.Word (Word8, Word32, Word64, )--import qualified Control.Monad.HT as M-import Control.Monad.HT ((<=<), )-import Control.Applicative (pure, )--import Foreign.Ptr (Ptr, )--import Prelude2010-import Prelude ()---switchFPPred ::- (Num i, LLVM.IsConst i, LLVM.IsInteger i, LLVM.IsPrimitive i,- LLVM.IsFirstClass v,- TypeNum.Positive n,- LLVM.IsSized v, LLVM.IsSized (Vector n i),- LLVM.SizeOf v ~ LLVM.SizeOf (Vector n i)) =>- (Value v -> Value v -> Value Word8 -> CodeGenFunction r (Value v)) ->- FPPredicate -> Value v -> Value v -> CodeGenFunction r (Value (Vector n i))-switchFPPred g p x y =- let f i x0 y0 = LLVM.bitcast =<< g x0 y0 (valueOf i)- in case p of- LLVM.FPFalse -> return (LLVM.value LLVM.zero)- LLVM.FPOEQ -> f 0 x y- LLVM.FPOGT -> f 1 y x- LLVM.FPOGE -> f 2 y x- LLVM.FPOLT -> f 1 x y- LLVM.FPOLE -> f 2 x y- LLVM.FPONE -> M.liftJoin2 A.and (f 7 x y) (f 4 x y)- LLVM.FPORD -> f 7 x y- LLVM.FPUNO -> f 3 x y- LLVM.FPUEQ -> M.liftJoin2 A.or (f 3 x y) (f 0 x y)- LLVM.FPUGT -> f 6 x y- LLVM.FPUGE -> f 5 x y- LLVM.FPULT -> f 6 y x- LLVM.FPULE -> f 5 y x- LLVM.FPUNE -> f 4 x y- LLVM.FPT -> return (valueOf $ pure (-1))--cmpss :: Ext.T (FPPredicate -> V4Float -> V4Float -> CodeGenFunction r V4Int32)-cmpss = fmap switchFPPred X86.cmpss--cmpps :: Ext.T (FPPredicate -> V4Float -> V4Float -> CodeGenFunction r V4Int32)-cmpps = fmap switchFPPred X86.cmpps--cmpsd :: Ext.T (FPPredicate -> V2Double -> V2Double -> CodeGenFunction r V2Int64)-cmpsd = fmap switchFPPred X86.cmpsd--cmppd :: Ext.T (FPPredicate -> V2Double -> V2Double -> CodeGenFunction r V2Int64)-cmppd = fmap switchFPPred X86.cmppd--cmpps256 :: Ext.T (FPPredicate -> X86.V8Float -> X86.V8Float -> CodeGenFunction r X86.V8Int32)-cmpps256 = fmap switchFPPred X86.cmpps256--cmppd256 :: Ext.T (FPPredicate -> X86.V4Double -> X86.V4Double -> CodeGenFunction r X86.V4Int64)-cmppd256 = fmap switchFPPred X86.cmppd256---pcmpgtb :: Ext.T (V16Int8 -> V16Int8 -> CodeGenFunction r V16Int8)-pcmpgtb = Ext.intrinsic sse2 "pcmpgt.b"--pcmpgtw :: Ext.T (V8Int16 -> V8Int16 -> CodeGenFunction r V8Int16)-pcmpgtw = Ext.intrinsic sse2 "pcmpgt.w"--pcmpgtd :: Ext.T (V4Int32 -> V4Int32 -> CodeGenFunction r V4Int32)-pcmpgtd = Ext.intrinsic sse2 "pcmpgt.d"--pcmpgtq :: Ext.T (V2Int64 -> V2Int64 -> CodeGenFunction r V2Int64)-pcmpgtq = Ext.intrinsic sse42 "pcmpgtq"---pcmpuFromPcmp ::- (TypeNum.Positive n,- LLVM.IsPrimitive s,- LLVM.IsPrimitive u, LLVM.IsArithmetic u, LLVM.IsConst u,- Bounded u, Integral u,- LLVM.IsSized (Vector n s), LLVM.IsSized (Vector n u),- LLVM.SizeOf (Vector n s) ~ LLVM.SizeOf (Vector n u)) =>- Ext.T (Value (Vector n s) -> Value (Vector n s) -> CodeGenFunction r (Value (Vector n s))) ->- Ext.T (Value (Vector n u) -> Value (Vector n u) -> CodeGenFunction r (Value (Vector n u)))-pcmpuFromPcmp pcmp =- Ext.with pcmp $ \cmp x y -> do- let offset = valueOf $ pure (1 + div maxBound 2)- xa <- LLVM.bitcast =<< A.sub x offset- ya <- LLVM.bitcast =<< A.sub y offset- LLVM.bitcast =<< cmp xa ya--pcmpugtb :: Ext.T (V16Word8 -> V16Word8 -> CodeGenFunction r V16Word8)-pcmpugtb = pcmpuFromPcmp pcmpgtb--pcmpugtw :: Ext.T (V8Word16 -> V8Word16 -> CodeGenFunction r V8Word16)-pcmpugtw = pcmpuFromPcmp pcmpgtw--pcmpugtd :: Ext.T (V4Word32 -> V4Word32 -> CodeGenFunction r V4Word32)-pcmpugtd = pcmpuFromPcmp pcmpgtd--pcmpugtq :: Ext.T (V2Word64 -> V2Word64 -> CodeGenFunction r V2Word64)-pcmpugtq = pcmpuFromPcmp pcmpgtq---pminsb, pmaxsb :: Ext.T (V16Int8 -> V16Int8 -> CodeGenFunction r V16Int8)-pminsb = X86.pminsb128-pmaxsb = X86.pmaxsb128--pminsw, pmaxsw :: Ext.T (V8Int16 -> V8Int16 -> CodeGenFunction r V8Int16)-pminsw = X86.pminsw128-pmaxsw = X86.pmaxsw128--pminsd, pmaxsd :: Ext.T (V4Int32 -> V4Int32 -> CodeGenFunction r V4Int32)-pminsd = X86.pminsd128-pmaxsd = X86.pmaxsd128---pminub, pmaxub :: Ext.T (V16Word8 -> V16Word8 -> CodeGenFunction r V16Word8)-pminub = X86.pminub128-pmaxub = X86.pmaxub128--pminuw, pmaxuw :: Ext.T (V8Word16 -> V8Word16 -> CodeGenFunction r V8Word16)-pminuw = X86.pminuw128-pmaxuw = X86.pmaxuw128--pminud, pmaxud :: Ext.T (V4Word32 -> V4Word32 -> CodeGenFunction r V4Word32)-pminud = X86.pminud128-pmaxud = X86.pmaxud128---pabsb :: Ext.T (V16Int8 -> CodeGenFunction r V16Int8)-pabsb = X86.pabsb128--pabsw :: Ext.T (V8Int16 -> CodeGenFunction r V8Int16)-pabsw = X86.pabsw128--pabsd :: Ext.T (V4Int32 -> CodeGenFunction r V4Int32)-pabsd = X86.pabsd128---pmuludq :: Ext.T (V4Word32 -> V4Word32 -> CodeGenFunction r V2Word64)-pmuludq = X86.pmuludq128--pmuldq :: Ext.T (V4Int32 -> V4Int32 -> CodeGenFunction r V2Int64)-pmuldq = X86.pmuldq128--pmulld :: Ext.T (V4Word32 -> V4Word32 -> CodeGenFunction r V4Word32)-pmulld = Ext.wrap sse41 LLVM.mul--- pmulld = Ext.intrinsic sse41 "pmulld"---cvtps2dq :: Ext.T (V4Float -> CodeGenFunction r V4Int32)-cvtps2dq = X86.cvtps2dq---- | the upper two integers are set to zero, there is no instruction that converts to Int64-cvtpd2dq :: Ext.T (V2Double -> CodeGenFunction r V4Int32)-cvtpd2dq = X86.cvtpd2dq---cvtdq2ps :: Ext.T (V4Int32 -> CodeGenFunction r V4Float)-cvtdq2ps = X86.cvtdq2ps---- | the upper two integers are ignored, there is no instruction that converts from Int64-cvtdq2pd :: Ext.T (V4Int32 -> CodeGenFunction r V2Double)-cvtdq2pd = X86.cvtdq2pd---valueUnit :: Value () -> ()-valueUnit _ = ()--{- |-MXCSR is not really supported by LLVM-2.6.-LLVM does not know about the dependency of all floating point operations-on this status register.--}-ldmxcsr :: Ext.T (Value (Ptr Word32) -> CodeGenFunction r ())-ldmxcsr =- fmap (fmap valueUnit .) $ Ext.intrinsicAttr [] sse1 "ldmxcsr"--stmxcsr :: Ext.T (Value (Ptr Word32) -> CodeGenFunction r ())-stmxcsr =- fmap (fmap valueUnit .) $ Ext.intrinsicAttr [] sse1 "stmxcsr"--withMXCSR :: Word32 -> Ext.T (CodeGenFunction r a -> CodeGenFunction r a)-withMXCSR mxcsr =- Ext.with2 ldmxcsr stmxcsr $ \ ld st f -> do- mxcsrOld <- LLVM.alloca- st mxcsrOld- mxcsrFloor <- LLVM.alloca- LLVM.store (valueOf $ mxcsr) mxcsrFloor-{- unfortunately, createGlobal is a function CodeGenModule monad- mxcsrFloor <-- LLVM.createGlobal True LLVM.InternalLinkage mxcsr--}- ld mxcsrFloor- r <- f- ld mxcsrOld- return r--{--[maxsd, minsd, maxpd, minpd] =- map (Ext.intrinsic sse2)- ["max.ss", "min.ss", "max.ps", "min.ps"]--}--roundss :: Ext.T (V4Float -> Value Word32 -> CodeGenFunction r V4Float)-roundss =- fmap (\f -> f (LLVM.value LLVM.undef)) X86.roundss--roundsd :: Ext.T (V2Double -> Value Word32 -> CodeGenFunction r V2Double)-roundsd =- fmap (\f -> f (LLVM.value LLVM.undef)) X86.roundsd----{--Not an LLVM intrinsic but implementation specific:-We expect that floating point values are in IEEE format-and thus the most significant bit is the sign.-The absolute value can be computed very efficiently by clearing the sign bit.-Actually, LLVM's codegen implements neg by an XOR on the sign bit.--}-absss :: Ext.T (V4Float -> CodeGenFunction r V4Float)-absss =- Ext.wrap sse1 $- LLVM.bitcast- <=< A.and (LLVM.valueOf $ vector $- (flip clearBit 31 $ complement 0) !: NonEmptyC.repeat (complement 0)- :: V4Word32)- <=< LLVM.bitcast--{--This function works on a single Float,-but I like to do the masking in an XMM register-because usually the value is there anyway.--absss =- flip LLVM.extractelement (valueOf 0)- . flip asTypeOf (undefined :: V4Float)- <=< LLVM.bitcast--- <=< A.and (LLVM.value $ constVector [constOf 0x7FFFFFFF] :: V4Word32)--- <=< A.and (LLVM.value $ constVector [constOf 0x7FFFFFFF, LLVM.undef, LLVM.undef, LLVM.undef] :: V4Word32)- <=< A.and (LLVM.value $ constVector [constOf 0x7FFFFFFF, LLVM.zero, LLVM.zero, LLVM.zero] :: V4Word32)- <=< LLVM.bitcast- . flip asTypeOf (undefined :: V4Float)- <=< flip (LLVM.insertelement (LLVM.value LLVM.undef)) (valueOf 0)--}-{- This moves the value to a general purpose register and performs the bit masking there-absss =- LLVM.bitcast- <=< A.and (valueOf 0x7FFFFFFF :: Value Word32)- <=< LLVM.bitcast--}--abssd :: Ext.T (V2Double -> CodeGenFunction r V2Double)-abssd =- Ext.wrap sse2 $- LLVM.bitcast- <=< A.and (LLVM.valueOf $ vector $- (flip clearBit 63 $ complement 0) !: complement 0 !: Empty.Cons- :: V2Word64)- <=< LLVM.bitcast---mask ::- (TypeNum.Positive n, LLVM.IsConst w, LLVM.IsPrimitive w, LLVM.IsInteger w) =>- w -> Value (Vector n w) -> CodeGenFunction r (Value (Vector n w))-mask x =- A.and (LLVM.valueOf $ pure x)--absps ::- (TypeNum.Positive n) =>- Ext.T (Value (Vector n Float) -> CodeGenFunction r (Value (Vector n Float)))-absps =- Ext.wrap sse1 $- LLVM.bitcastElements- <=< mask (flip clearBit 31 $ complement 0 :: Word32)- <=< LLVM.bitcastElements--abspd ::- (TypeNum.Positive n) =>- Ext.T (Value (Vector n Double) -> CodeGenFunction r (Value (Vector n Double)))-abspd =- Ext.wrap sse2 $- LLVM.bitcastElements- <=< mask (flip clearBit 63 $ complement 0 :: Word64)- <=< LLVM.bitcastElements--{- |-cumulative sum:-@(a,b,c,d) -> (a,a+b,a+b+c,a+b+c+d)@--I try to cleverly use horizontal add,-but the generic version in the Vector module is better.--}-_cumulate1s :: Ext.T (V4Float -> CodeGenFunction r V4Float)-_cumulate1s = Ext.with X86.haddps $ \haddp x -> do- y <- haddp x (LLVM.value LLVM.undef)- z <- LLVM.shufflevector x y $- constOf $ vector $ 0!:4!:2!:5!:Empty.Cons- offset <- LLVM.shufflevector y (LLVM.value LLVM.zero) $- constOf $ vector $ 4!:5!:0!:0!:Empty.Cons- A.add z offset
− src/LLVM/Extra/Extension/X86Auto.hs
@@ -1,2699 +0,0 @@-{- Do not edit! This file was created with the PrepareIntrinsics tool. -}-module LLVM.Extra.Extension.X86Auto where--import qualified LLVM.Extra.Extension as Ext-import qualified LLVM.Extra.ExtensionCheck.X86 as ExtX86-import qualified LLVM.Core as LLVM-import qualified Type.Data.Num.Decimal as TypeNum-import qualified Data.Int as I-import qualified Data.Word as W-import Foreign.Ptr (Ptr, )--type MMX = LLVM.Value (LLVM.Vector TypeNum.D8 W.Word8)-type V16Float = LLVM.Value (LLVM.Vector TypeNum.D16 Float)-type V16Int16 = LLVM.Value (LLVM.Vector TypeNum.D16 I.Int16)-type V16Int32 = LLVM.Value (LLVM.Vector TypeNum.D16 I.Int32)-type V16Int8 = LLVM.Value (LLVM.Vector TypeNum.D16 I.Int8)-type V16Word16 = LLVM.Value (LLVM.Vector TypeNum.D16 W.Word16)-type V16Word8 = LLVM.Value (LLVM.Vector TypeNum.D16 W.Word8)-type V2Double = LLVM.Value (LLVM.Vector TypeNum.D2 Double)-type V2Int64 = LLVM.Value (LLVM.Vector TypeNum.D2 I.Int64)-type V2Word64 = LLVM.Value (LLVM.Vector TypeNum.D2 W.Word64)-type V32Int16 = LLVM.Value (LLVM.Vector TypeNum.D32 I.Int16)-type V32Int8 = LLVM.Value (LLVM.Vector TypeNum.D32 I.Int8)-type V32Word8 = LLVM.Value (LLVM.Vector TypeNum.D32 W.Word8)-type V4Double = LLVM.Value (LLVM.Vector TypeNum.D4 Double)-type V4Float = LLVM.Value (LLVM.Vector TypeNum.D4 Float)-type V4Int32 = LLVM.Value (LLVM.Vector TypeNum.D4 I.Int32)-type V4Int64 = LLVM.Value (LLVM.Vector TypeNum.D4 I.Int64)-type V4Word32 = LLVM.Value (LLVM.Vector TypeNum.D4 W.Word32)-type V4Word64 = LLVM.Value (LLVM.Vector TypeNum.D4 W.Word64)-type V64Int8 = LLVM.Value (LLVM.Vector TypeNum.D64 I.Int8)-type V8Double = LLVM.Value (LLVM.Vector TypeNum.D8 Double)-type V8Float = LLVM.Value (LLVM.Vector TypeNum.D8 Float)-type V8Int16 = LLVM.Value (LLVM.Vector TypeNum.D8 I.Int16)-type V8Int32 = LLVM.Value (LLVM.Vector TypeNum.D8 I.Int32)-type V8Int64 = LLVM.Value (LLVM.Vector TypeNum.D8 I.Int64)-type V8Word16 = LLVM.Value (LLVM.Vector TypeNum.D8 W.Word16)-type V8Word32 = LLVM.Value (LLVM.Vector TypeNum.D8 W.Word32)--{--readeflags_u32 :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value I.Int32))-readeflags_u32 = Ext.intrinsic ExtX86.flags "read.u32"--readeflags_u64 :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value I.Int64))-readeflags_u64 = Ext.intrinsic ExtX86.flags "read.u64"--writeeflags_u32 :: Ext.T (LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (LLVM.Value ()))-writeeflags_u32 = Ext.intrinsic ExtX86.flags "write.u32"--writeeflags_u64 :: Ext.T (LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (LLVM.Value ()))-writeeflags_u64 = Ext.intrinsic ExtX86.flags "write.u64"--rdtsc :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value I.Int64))-rdtsc = Ext.intrinsic ExtX86. "int.x86.rdtsc"--rdtscp :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (LLVM.Value I.Int64))-rdtscp = Ext.intrinsic ExtX86. "int.x86.rdtscp"--rdpmc :: Ext.T (LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (LLVM.Value I.Int64))-rdpmc = Ext.intrinsic ExtX86. "int.x86.rdpmc"--}--pavgusb :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pavgusb = Ext.intrinsic ExtX86.amd3dnow "pavgusb"--pf2id :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pf2id = Ext.intrinsic ExtX86.amd3dnow "pf2id"--pfacc :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfacc = Ext.intrinsic ExtX86.amd3dnow "pfacc"--pfadd :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfadd = Ext.intrinsic ExtX86.amd3dnow "pfadd"--pfcmpeq :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfcmpeq = Ext.intrinsic ExtX86.amd3dnow "pfcmpeq"--pfcmpge :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfcmpge = Ext.intrinsic ExtX86.amd3dnow "pfcmpge"--pfcmpgt :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfcmpgt = Ext.intrinsic ExtX86.amd3dnow "pfcmpgt"--pfmax :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfmax = Ext.intrinsic ExtX86.amd3dnow "pfmax"--pfmin :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfmin = Ext.intrinsic ExtX86.amd3dnow "pfmin"--pfmul :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfmul = Ext.intrinsic ExtX86.amd3dnow "pfmul"--pfrcp :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pfrcp = Ext.intrinsic ExtX86.amd3dnow "pfrcp"--pfrcpit1 :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfrcpit1 = Ext.intrinsic ExtX86.amd3dnow "pfrcpit1"--pfrcpit2 :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfrcpit2 = Ext.intrinsic ExtX86.amd3dnow "pfrcpit2"--pfrsqrt :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pfrsqrt = Ext.intrinsic ExtX86.amd3dnow "pfrsqrt"--pfrsqit1 :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfrsqit1 = Ext.intrinsic ExtX86.amd3dnow "pfrsqit1"--pfsub :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfsub = Ext.intrinsic ExtX86.amd3dnow "pfsub"--pfsubr :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfsubr = Ext.intrinsic ExtX86.amd3dnow "pfsubr"--pi2fd :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pi2fd = Ext.intrinsic ExtX86.amd3dnow "pi2fd"--pmulhrw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pmulhrw = Ext.intrinsic ExtX86.amd3dnow "pmulhrw"--pf2iw :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pf2iw = Ext.intrinsic ExtX86.amd3dnowa "pf2iw"--pfnacc :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfnacc = Ext.intrinsic ExtX86.amd3dnowa "pfnacc"--pfpnacc :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pfpnacc = Ext.intrinsic ExtX86.amd3dnowa "pfpnacc"--pi2fw :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pi2fw = Ext.intrinsic ExtX86.amd3dnowa "pi2fw"--addss :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-addss = Ext.intrinsic ExtX86.sse1 "add.ss"--subss :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-subss = Ext.intrinsic ExtX86.sse1 "sub.ss"--mulss :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-mulss = Ext.intrinsic ExtX86.sse1 "mul.ss"--divss :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-divss = Ext.intrinsic ExtX86.sse1 "div.ss"--sqrtss :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Float))-sqrtss = Ext.intrinsic ExtX86.sse1 "sqrt.ss"--sqrtps :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Float))-sqrtps = Ext.intrinsic ExtX86.sse1 "sqrt.ps"--rcpss :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Float))-rcpss = Ext.intrinsic ExtX86.sse1 "rcp.ss"--rcpps :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Float))-rcpps = Ext.intrinsic ExtX86.sse1 "rcp.ps"--rsqrtss :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Float))-rsqrtss = Ext.intrinsic ExtX86.sse1 "rsqrt.ss"--rsqrtps :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Float))-rsqrtps = Ext.intrinsic ExtX86.sse1 "rsqrt.ps"--minss :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-minss = Ext.intrinsic ExtX86.sse1 "min.ss"--minps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-minps = Ext.intrinsic ExtX86.sse1 "min.ps"--maxss :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-maxss = Ext.intrinsic ExtX86.sse1 "max.ss"--maxps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-maxps = Ext.intrinsic ExtX86.sse1 "max.ps"--cmpss :: Ext.T (V4Float -> V4Float -> LLVM.Value W.Word8 -> LLVM.CodeGenFunction r (V4Float))-cmpss = Ext.intrinsic ExtX86.sse1 "cmp.ss"--cmpps :: Ext.T (V4Float -> V4Float -> LLVM.Value W.Word8 -> LLVM.CodeGenFunction r (V4Float))-cmpps = Ext.intrinsic ExtX86.sse1 "cmp.ps"--comieq :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comieq = Ext.intrinsic ExtX86.sse1 "comieq.ss"--comilt :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comilt = Ext.intrinsic ExtX86.sse1 "comilt.ss"--comile :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comile = Ext.intrinsic ExtX86.sse1 "comile.ss"--comigt :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comigt = Ext.intrinsic ExtX86.sse1 "comigt.ss"--comige :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comige = Ext.intrinsic ExtX86.sse1 "comige.ss"--comineq :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comineq = Ext.intrinsic ExtX86.sse1 "comineq.ss"--ucomieq :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomieq = Ext.intrinsic ExtX86.sse1 "ucomieq.ss"--ucomilt :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomilt = Ext.intrinsic ExtX86.sse1 "ucomilt.ss"--ucomile :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomile = Ext.intrinsic ExtX86.sse1 "ucomile.ss"--ucomigt :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomigt = Ext.intrinsic ExtX86.sse1 "ucomigt.ss"--ucomige :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomige = Ext.intrinsic ExtX86.sse1 "ucomige.ss"--ucomineq :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomineq = Ext.intrinsic ExtX86.sse1 "ucomineq.ss"--cvtss2si :: Ext.T (V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-cvtss2si = Ext.intrinsic ExtX86.sse1 "cvtss2si"--cvtss2si64 :: Ext.T (V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int64))-cvtss2si64 = Ext.intrinsic ExtX86.sse1 "cvtss2si64"--cvttss2si :: Ext.T (V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-cvttss2si = Ext.intrinsic ExtX86.sse1 "cvttss2si"--cvttss2si64 :: Ext.T (V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int64))-cvttss2si64 = Ext.intrinsic ExtX86.sse1 "cvttss2si64"--cvtsi2ss :: Ext.T (V4Float -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V4Float))-cvtsi2ss = Ext.intrinsic ExtX86.sse1 "cvtsi2ss"--cvtsi642ss :: Ext.T (V4Float -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V4Float))-cvtsi642ss = Ext.intrinsic ExtX86.sse1 "cvtsi642ss"--cvtps2pi :: Ext.T (V4Float -> LLVM.CodeGenFunction r (MMX))-cvtps2pi = Ext.intrinsic ExtX86.sse1 "cvtps2pi"--cvttps2pi :: Ext.T (V4Float -> LLVM.CodeGenFunction r (MMX))-cvttps2pi = Ext.intrinsic ExtX86.sse1 "cvttps2pi"--cvtpi2ps :: Ext.T (V4Float -> MMX -> LLVM.CodeGenFunction r (V4Float))-cvtpi2ps = Ext.intrinsic ExtX86.sse1 "cvtpi2ps"--storeups :: Ext.T (LLVM.Value (Ptr ()) -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeups = Ext.intrinsic ExtX86.sse1 "storeu.ps"--sfence :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value ()))-sfence = Ext.intrinsic ExtX86.sse1 "sfence"--movmskps :: Ext.T (V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-movmskps = Ext.intrinsic ExtX86.sse1 "movmsk.ps"--addsd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-addsd = Ext.intrinsic ExtX86.sse2 "add.sd"--subsd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-subsd = Ext.intrinsic ExtX86.sse2 "sub.sd"--mulsd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-mulsd = Ext.intrinsic ExtX86.sse2 "mul.sd"--divsd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-divsd = Ext.intrinsic ExtX86.sse2 "div.sd"--sqrtsd :: Ext.T (V2Double -> LLVM.CodeGenFunction r (V2Double))-sqrtsd = Ext.intrinsic ExtX86.sse2 "sqrt.sd"--sqrtpd :: Ext.T (V2Double -> LLVM.CodeGenFunction r (V2Double))-sqrtpd = Ext.intrinsic ExtX86.sse2 "sqrt.pd"--minsd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-minsd = Ext.intrinsic ExtX86.sse2 "min.sd"--minpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-minpd = Ext.intrinsic ExtX86.sse2 "min.pd"--maxsd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-maxsd = Ext.intrinsic ExtX86.sse2 "max.sd"--maxpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-maxpd = Ext.intrinsic ExtX86.sse2 "max.pd"--cmpsd :: Ext.T (V2Double -> V2Double -> LLVM.Value W.Word8 -> LLVM.CodeGenFunction r (V2Double))-cmpsd = Ext.intrinsic ExtX86.sse2 "cmp.sd"--cmppd :: Ext.T (V2Double -> V2Double -> LLVM.Value W.Word8 -> LLVM.CodeGenFunction r (V2Double))-cmppd = Ext.intrinsic ExtX86.sse2 "cmp.pd"--comisdeq :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comisdeq = Ext.intrinsic ExtX86.sse2 "comieq.sd"--comisdlt :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comisdlt = Ext.intrinsic ExtX86.sse2 "comilt.sd"--comisdle :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comisdle = Ext.intrinsic ExtX86.sse2 "comile.sd"--comisdgt :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comisdgt = Ext.intrinsic ExtX86.sse2 "comigt.sd"--comisdge :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comisdge = Ext.intrinsic ExtX86.sse2 "comige.sd"--comisdneq :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-comisdneq = Ext.intrinsic ExtX86.sse2 "comineq.sd"--ucomisdeq :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomisdeq = Ext.intrinsic ExtX86.sse2 "ucomieq.sd"--ucomisdlt :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomisdlt = Ext.intrinsic ExtX86.sse2 "ucomilt.sd"--ucomisdle :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomisdle = Ext.intrinsic ExtX86.sse2 "ucomile.sd"--ucomisdgt :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomisdgt = Ext.intrinsic ExtX86.sse2 "ucomigt.sd"--ucomisdge :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomisdge = Ext.intrinsic ExtX86.sse2 "ucomige.sd"--ucomisdneq :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ucomisdneq = Ext.intrinsic ExtX86.sse2 "ucomineq.sd"--paddsb128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-paddsb128 = Ext.intrinsic ExtX86.sse2 "padds.b"--paddsw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-paddsw128 = Ext.intrinsic ExtX86.sse2 "padds.w"--paddusb128 :: Ext.T (V16Word8 -> V16Word8 -> LLVM.CodeGenFunction r (V16Word8))-paddusb128 = Ext.intrinsic ExtX86.sse2 "paddus.b"--paddusw128 :: Ext.T (V8Word16 -> V8Word16 -> LLVM.CodeGenFunction r (V8Word16))-paddusw128 = Ext.intrinsic ExtX86.sse2 "paddus.w"--psubsb128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-psubsb128 = Ext.intrinsic ExtX86.sse2 "psubs.b"--psubsw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-psubsw128 = Ext.intrinsic ExtX86.sse2 "psubs.w"--psubusb128 :: Ext.T (V16Word8 -> V16Word8 -> LLVM.CodeGenFunction r (V16Word8))-psubusb128 = Ext.intrinsic ExtX86.sse2 "psubus.b"--psubusw128 :: Ext.T (V8Word16 -> V8Word16 -> LLVM.CodeGenFunction r (V8Word16))-psubusw128 = Ext.intrinsic ExtX86.sse2 "psubus.w"--pmulhuw128 :: Ext.T (V8Word16 -> V8Word16 -> LLVM.CodeGenFunction r (V8Word16))-pmulhuw128 = Ext.intrinsic ExtX86.sse2 "pmulhu.w"--pmulhw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-pmulhw128 = Ext.intrinsic ExtX86.sse2 "pmulh.w"--pmuludq128 :: Ext.T (V4Word32 -> V4Word32 -> LLVM.CodeGenFunction r (V2Word64))-pmuludq128 = Ext.intrinsic ExtX86.sse2 "pmulu.dq"--pmaddwd128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V4Int32))-pmaddwd128 = Ext.intrinsic ExtX86.sse2 "pmadd.wd"--pavgb128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-pavgb128 = Ext.intrinsic ExtX86.sse2 "pavg.b"--pavgw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-pavgw128 = Ext.intrinsic ExtX86.sse2 "pavg.w"--pmaxub128 :: Ext.T (V16Word8 -> V16Word8 -> LLVM.CodeGenFunction r (V16Word8))-pmaxub128 = Ext.intrinsic ExtX86.sse2 "pmaxu.b"--pmaxsw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-pmaxsw128 = Ext.intrinsic ExtX86.sse2 "pmaxs.w"--pminub128 :: Ext.T (V16Word8 -> V16Word8 -> LLVM.CodeGenFunction r (V16Word8))-pminub128 = Ext.intrinsic ExtX86.sse2 "pminu.b"--pminsw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-pminsw128 = Ext.intrinsic ExtX86.sse2 "pmins.w"--psadbw128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V2Int64))-psadbw128 = Ext.intrinsic ExtX86.sse2 "psad.bw"--psllw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-psllw128 = Ext.intrinsic ExtX86.sse2 "psll.w"--pslld128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-pslld128 = Ext.intrinsic ExtX86.sse2 "psll.d"--psllq128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-psllq128 = Ext.intrinsic ExtX86.sse2 "psll.q"--psrlw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-psrlw128 = Ext.intrinsic ExtX86.sse2 "psrl.w"--psrld128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-psrld128 = Ext.intrinsic ExtX86.sse2 "psrl.d"--psrlq128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-psrlq128 = Ext.intrinsic ExtX86.sse2 "psrl.q"--psraw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-psraw128 = Ext.intrinsic ExtX86.sse2 "psra.w"--psrad128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-psrad128 = Ext.intrinsic ExtX86.sse2 "psra.d"--psllwi128 :: Ext.T (V8Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int16))-psllwi128 = Ext.intrinsic ExtX86.sse2 "pslli.w"--pslldi128 :: Ext.T (V4Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V4Int32))-pslldi128 = Ext.intrinsic ExtX86.sse2 "pslli.d"--psllqi128 :: Ext.T (V2Int64 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V2Int64))-psllqi128 = Ext.intrinsic ExtX86.sse2 "pslli.q"--psrlwi128 :: Ext.T (V8Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int16))-psrlwi128 = Ext.intrinsic ExtX86.sse2 "psrli.w"--psrldi128 :: Ext.T (V4Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V4Int32))-psrldi128 = Ext.intrinsic ExtX86.sse2 "psrli.d"--psrlqi128 :: Ext.T (V2Int64 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V2Int64))-psrlqi128 = Ext.intrinsic ExtX86.sse2 "psrli.q"--psrawi128 :: Ext.T (V8Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int16))-psrawi128 = Ext.intrinsic ExtX86.sse2 "psrai.w"--psradi128 :: Ext.T (V4Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V4Int32))-psradi128 = Ext.intrinsic ExtX86.sse2 "psrai.d"--cvtdq2pd :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V2Double))-cvtdq2pd = Ext.intrinsic ExtX86.sse2 "cvtdq2pd"--cvtdq2ps :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V4Float))-cvtdq2ps = Ext.intrinsic ExtX86.sse2 "cvtdq2ps"--cvtpd2dq :: Ext.T (V2Double -> LLVM.CodeGenFunction r (V4Int32))-cvtpd2dq = Ext.intrinsic ExtX86.sse2 "cvtpd2dq"--cvttpd2dq :: Ext.T (V2Double -> LLVM.CodeGenFunction r (V4Int32))-cvttpd2dq = Ext.intrinsic ExtX86.sse2 "cvttpd2dq"--cvtpd2ps :: Ext.T (V2Double -> LLVM.CodeGenFunction r (V4Float))-cvtpd2ps = Ext.intrinsic ExtX86.sse2 "cvtpd2ps"--cvtps2dq :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Int32))-cvtps2dq = Ext.intrinsic ExtX86.sse2 "cvtps2dq"--cvttps2dq :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Int32))-cvttps2dq = Ext.intrinsic ExtX86.sse2 "cvttps2dq"--cvtps2pd :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V2Double))-cvtps2pd = Ext.intrinsic ExtX86.sse2 "cvtps2pd"--cvtsd2si :: Ext.T (V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-cvtsd2si = Ext.intrinsic ExtX86.sse2 "cvtsd2si"--cvtsd2si64 :: Ext.T (V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int64))-cvtsd2si64 = Ext.intrinsic ExtX86.sse2 "cvtsd2si64"--cvttsd2si :: Ext.T (V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-cvttsd2si = Ext.intrinsic ExtX86.sse2 "cvttsd2si"--cvttsd2si64 :: Ext.T (V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int64))-cvttsd2si64 = Ext.intrinsic ExtX86.sse2 "cvttsd2si64"--cvtsi2sd :: Ext.T (V2Double -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V2Double))-cvtsi2sd = Ext.intrinsic ExtX86.sse2 "cvtsi2sd"--cvtsi642sd :: Ext.T (V2Double -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V2Double))-cvtsi642sd = Ext.intrinsic ExtX86.sse2 "cvtsi642sd"--cvtsd2ss :: Ext.T (V4Float -> V2Double -> LLVM.CodeGenFunction r (V4Float))-cvtsd2ss = Ext.intrinsic ExtX86.sse2 "cvtsd2ss"--cvtss2sd :: Ext.T (V2Double -> V4Float -> LLVM.CodeGenFunction r (V2Double))-cvtss2sd = Ext.intrinsic ExtX86.sse2 "cvtss2sd"--cvtpd2pi :: Ext.T (V2Double -> LLVM.CodeGenFunction r (MMX))-cvtpd2pi = Ext.intrinsic ExtX86.sse1 "cvtpd2pi"--cvttpd2pi :: Ext.T (V2Double -> LLVM.CodeGenFunction r (MMX))-cvttpd2pi = Ext.intrinsic ExtX86.sse1 "cvttpd2pi"--cvtpi2pd :: Ext.T (MMX -> LLVM.CodeGenFunction r (V2Double))-cvtpi2pd = Ext.intrinsic ExtX86.sse1 "cvtpi2pd"--storeupd :: Ext.T (LLVM.Value (Ptr ()) -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeupd = Ext.intrinsic ExtX86.sse2 "storeu.pd"--storedqu :: Ext.T (LLVM.Value (Ptr ()) -> V16Int8 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storedqu = Ext.intrinsic ExtX86.sse2 "storeu.dq"--storelv4si :: Ext.T (LLVM.Value (Ptr ()) -> V4Int32 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storelv4si = Ext.intrinsic ExtX86.sse2 "storel.dq"--packsswb128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V16Int8))-packsswb128 = Ext.intrinsic ExtX86.sse2 "packsswb.128"--packssdw128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V8Int16))-packssdw128 = Ext.intrinsic ExtX86.sse2 "packssdw.128"--packuswb128 :: Ext.T (V8Word16 -> V8Word16 -> LLVM.CodeGenFunction r (V16Word8))-packuswb128 = Ext.intrinsic ExtX86.sse2 "packuswb.128"--movmskpd :: Ext.T (V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-movmskpd = Ext.intrinsic ExtX86.sse2 "movmsk.pd"--pmovmskb128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pmovmskb128 = Ext.intrinsic ExtX86.sse2 "pmovmskb.128"--maskmovdqu :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskmovdqu = Ext.intrinsic ExtX86.sse2 "maskmov.dqu"--clflush :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (LLVM.Value ()))-clflush = Ext.intrinsic ExtX86.sse2 "clflush"--lfence :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value ()))-lfence = Ext.intrinsic ExtX86.sse2 "lfence"--mfence :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value ()))-mfence = Ext.intrinsic ExtX86.sse2 "mfence"--pause :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value ()))-pause = Ext.intrinsic ExtX86.sse2 "pause"--addsubps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-addsubps = Ext.intrinsic ExtX86.sse3 "addsub.ps"--addsubpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-addsubpd = Ext.intrinsic ExtX86.sse3 "addsub.pd"--haddps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-haddps = Ext.intrinsic ExtX86.sse3 "hadd.ps"--haddpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-haddpd = Ext.intrinsic ExtX86.sse3 "hadd.pd"--hsubps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-hsubps = Ext.intrinsic ExtX86.sse3 "hsub.ps"--hsubpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-hsubpd = Ext.intrinsic ExtX86.sse3 "hsub.pd"--lddqu :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (V16Int8))-lddqu = Ext.intrinsic ExtX86.sse3 "ldu.dq"--monitor :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.Value I.Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (LLVM.Value ()))-monitor = Ext.intrinsic ExtX86.sse3 "monitor"--mwait :: Ext.T (LLVM.Value I.Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (LLVM.Value ()))-mwait = Ext.intrinsic ExtX86.sse3 "mwait"--phaddw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-phaddw = Ext.intrinsic ExtX86.ssse3 "phadd.w"--phaddw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-phaddw128 = Ext.intrinsic ExtX86.ssse3 "phadd.w.128"--phaddd :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-phaddd = Ext.intrinsic ExtX86.ssse3 "phadd.d"--phaddd128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-phaddd128 = Ext.intrinsic ExtX86.ssse3 "phadd.d.128"--phaddsw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-phaddsw = Ext.intrinsic ExtX86.ssse3 "phadd.sw"--phaddsw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-phaddsw128 = Ext.intrinsic ExtX86.ssse3 "phadd.sw.128"--phsubw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-phsubw = Ext.intrinsic ExtX86.ssse3 "phsub.w"--phsubw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-phsubw128 = Ext.intrinsic ExtX86.ssse3 "phsub.w.128"--phsubd :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-phsubd = Ext.intrinsic ExtX86.ssse3 "phsub.d"--phsubd128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-phsubd128 = Ext.intrinsic ExtX86.ssse3 "phsub.d.128"--phsubsw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-phsubsw = Ext.intrinsic ExtX86.ssse3 "phsub.sw"--phsubsw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-phsubsw128 = Ext.intrinsic ExtX86.ssse3 "phsub.sw.128"--pmaddubsw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pmaddubsw = Ext.intrinsic ExtX86.ssse3 "pmadd.ub.sw"--pmaddubsw128 :: Ext.T (V16Word8 -> V16Word8 -> LLVM.CodeGenFunction r (V8Word16))-pmaddubsw128 = Ext.intrinsic ExtX86.ssse3 "pmadd.ub.sw.128"--pmulhrsw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pmulhrsw = Ext.intrinsic ExtX86.ssse3 "pmul.hr.sw"--pmulhrsw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-pmulhrsw128 = Ext.intrinsic ExtX86.ssse3 "pmul.hr.sw.128"--pshufb :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-pshufb = Ext.intrinsic ExtX86.ssse3 "pshuf.b"--pshufb128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-pshufb128 = Ext.intrinsic ExtX86.ssse3 "pshuf.b.128"--pshufd :: Ext.T (V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pshufd = Ext.intrinsic ExtX86.sse2 "pshuf.d"--pshuflw :: Ext.T (V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pshuflw = Ext.intrinsic ExtX86.sse2 "pshufl.w"--pshufhw :: Ext.T (V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pshufhw = Ext.intrinsic ExtX86.sse2 "pshufh.w"--pshufw :: Ext.T (MMX -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (MMX))-pshufw = Ext.intrinsic ExtX86.sse1 "pshuf.w"--psignb :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-psignb = Ext.intrinsic ExtX86.ssse3 "psign.b"--psignb128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-psignb128 = Ext.intrinsic ExtX86.ssse3 "psign.b.128"--psignw :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-psignw = Ext.intrinsic ExtX86.ssse3 "psign.w"--psignw128 :: Ext.T (V8Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-psignw128 = Ext.intrinsic ExtX86.ssse3 "psign.w.128"--psignd :: Ext.T (MMX -> MMX -> LLVM.CodeGenFunction r (MMX))-psignd = Ext.intrinsic ExtX86.ssse3 "psign.d"--psignd128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-psignd128 = Ext.intrinsic ExtX86.ssse3 "psign.d.128"--pabsb :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pabsb = Ext.intrinsic ExtX86.ssse3 "pabs.b"--pabsb128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-pabsb128 = Ext.intrinsic ExtX86.ssse3 "pabs.b.128"--pabsw :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pabsw = Ext.intrinsic ExtX86.ssse3 "pabs.w"--pabsw128 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V8Int16))-pabsw128 = Ext.intrinsic ExtX86.ssse3 "pabs.w.128"--pabsd :: Ext.T (MMX -> LLVM.CodeGenFunction r (MMX))-pabsd = Ext.intrinsic ExtX86.ssse3 "pabs.d"--pabsd128 :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-pabsd128 = Ext.intrinsic ExtX86.ssse3 "pabs.d.128"--roundss :: Ext.T (V4Float -> V4Float -> LLVM.Value W.Word32 -> LLVM.CodeGenFunction r (V4Float))-roundss = Ext.intrinsic ExtX86.sse41 "round.ss"--roundps :: Ext.T (V4Float -> LLVM.Value W.Word32 -> LLVM.CodeGenFunction r (V4Float))-roundps = Ext.intrinsic ExtX86.sse41 "round.ps"--roundsd :: Ext.T (V2Double -> V2Double -> LLVM.Value W.Word32 -> LLVM.CodeGenFunction r (V2Double))-roundsd = Ext.intrinsic ExtX86.sse41 "round.sd"--roundpd :: Ext.T (V2Double -> LLVM.Value W.Word32 -> LLVM.CodeGenFunction r (V2Double))-roundpd = Ext.intrinsic ExtX86.sse41 "round.pd"--pmovsxbd128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V4Int32))-pmovsxbd128 = Ext.intrinsic ExtX86.sse41 "pmovsxbd"--pmovsxbq128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V2Int64))-pmovsxbq128 = Ext.intrinsic ExtX86.sse41 "pmovsxbq"--pmovsxbw128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V8Int16))-pmovsxbw128 = Ext.intrinsic ExtX86.sse41 "pmovsxbw"--pmovsxdq128 :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V2Int64))-pmovsxdq128 = Ext.intrinsic ExtX86.sse41 "pmovsxdq"--pmovsxwd128 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V4Int32))-pmovsxwd128 = Ext.intrinsic ExtX86.sse41 "pmovsxwd"--pmovsxwq128 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V2Int64))-pmovsxwq128 = Ext.intrinsic ExtX86.sse41 "pmovsxwq"--pmovzxbd128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V4Int32))-pmovzxbd128 = Ext.intrinsic ExtX86.sse41 "pmovzxbd"--pmovzxbq128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V2Int64))-pmovzxbq128 = Ext.intrinsic ExtX86.sse41 "pmovzxbq"--pmovzxbw128 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V8Int16))-pmovzxbw128 = Ext.intrinsic ExtX86.sse41 "pmovzxbw"--pmovzxdq128 :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V2Int64))-pmovzxdq128 = Ext.intrinsic ExtX86.sse41 "pmovzxdq"--pmovzxwd128 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V4Int32))-pmovzxwd128 = Ext.intrinsic ExtX86.sse41 "pmovzxwd"--pmovzxwq128 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V2Int64))-pmovzxwq128 = Ext.intrinsic ExtX86.sse41 "pmovzxwq"--phminposuw128 :: Ext.T (V8Word16 -> LLVM.CodeGenFunction r (V8Word16))-phminposuw128 = Ext.intrinsic ExtX86.sse41 "phminposuw"--pmaxsb128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-pmaxsb128 = Ext.intrinsic ExtX86.sse41 "pmaxsb"--pmaxsd128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-pmaxsd128 = Ext.intrinsic ExtX86.sse41 "pmaxsd"--pmaxud128 :: Ext.T (V4Word32 -> V4Word32 -> LLVM.CodeGenFunction r (V4Word32))-pmaxud128 = Ext.intrinsic ExtX86.sse41 "pmaxud"--pmaxuw128 :: Ext.T (V8Word16 -> V8Word16 -> LLVM.CodeGenFunction r (V8Word16))-pmaxuw128 = Ext.intrinsic ExtX86.sse41 "pmaxuw"--pminsb128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-pminsb128 = Ext.intrinsic ExtX86.sse41 "pminsb"--pminsd128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-pminsd128 = Ext.intrinsic ExtX86.sse41 "pminsd"--pminud128 :: Ext.T (V4Word32 -> V4Word32 -> LLVM.CodeGenFunction r (V4Word32))-pminud128 = Ext.intrinsic ExtX86.sse41 "pminud"--pminuw128 :: Ext.T (V8Word16 -> V8Word16 -> LLVM.CodeGenFunction r (V8Word16))-pminuw128 = Ext.intrinsic ExtX86.sse41 "pminuw"--aesimc128 :: Ext.T (V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-aesimc128 = Ext.intrinsic ExtX86.aes "aesimc"--aesenc128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-aesenc128 = Ext.intrinsic ExtX86.aes "aesenc"--aesenclast128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-aesenclast128 = Ext.intrinsic ExtX86.aes "aesenclast"--aesdec128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-aesdec128 = Ext.intrinsic ExtX86.aes "aesdec"--aesdeclast128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-aesdeclast128 = Ext.intrinsic ExtX86.aes "aesdeclast"--aeskeygenassist128 :: Ext.T (V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-aeskeygenassist128 = Ext.intrinsic ExtX86.aes "aeskeygenassist"--{--pclmulqdq128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-pclmulqdq128 = Ext.intrinsic ExtX86. "int.x86.pclmulqdq"--}--packusdw128 :: Ext.T (V4Word32 -> V4Word32 -> LLVM.CodeGenFunction r (V8Word16))-packusdw128 = Ext.intrinsic ExtX86.sse41 "packusdw"--pmuldq128 :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V2Int64))-pmuldq128 = Ext.intrinsic ExtX86.sse41 "pmuldq"--extractps128 :: Ext.T (V4Float -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-extractps128 = Ext.intrinsic ExtX86.sse41 "extractps"--insertps128 :: Ext.T (V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-insertps128 = Ext.intrinsic ExtX86.sse41 "insertps"--pblendvb128 :: Ext.T (V16Int8 -> V16Int8 -> V16Int8 -> LLVM.CodeGenFunction r (V16Int8))-pblendvb128 = Ext.intrinsic ExtX86.sse41 "pblendvb"--blendvpd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-blendvpd = Ext.intrinsic ExtX86.sse41 "blendvpd"--blendvps :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-blendvps = Ext.intrinsic ExtX86.sse41 "blendvps"--dppd :: Ext.T (V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-dppd = Ext.intrinsic ExtX86.sse41 "dppd"--dpps :: Ext.T (V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-dpps = Ext.intrinsic ExtX86.sse41 "dpps"--mpsadbw128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-mpsadbw128 = Ext.intrinsic ExtX86.sse41 "mpsadbw"--movntdqa :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (V2Int64))-movntdqa = Ext.intrinsic ExtX86.sse41 "movntdqa"--ptestz128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ptestz128 = Ext.intrinsic ExtX86.sse41 "ptestz"--ptestc128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ptestc128 = Ext.intrinsic ExtX86.sse41 "ptestc"--ptestnzc128 :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ptestnzc128 = Ext.intrinsic ExtX86.sse41 "ptestnzc"--crc32qi :: Ext.T (LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-crc32qi = Ext.intrinsic ExtX86.sse42 "crc32.32.8"--crc32hi :: Ext.T (LLVM.Value I.Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-crc32hi = Ext.intrinsic ExtX86.sse42 "crc32.32.16"--crc32si :: Ext.T (LLVM.Value I.Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-crc32si = Ext.intrinsic ExtX86.sse42 "crc32.32.32"--crc32di :: Ext.T (LLVM.Value I.Int64 -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (LLVM.Value I.Int64))-crc32di = Ext.intrinsic ExtX86.sse42 "crc32.64.64"--pcmpistrm128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V16Int8))-pcmpistrm128 = Ext.intrinsic ExtX86.sse42 "pcmpistrm128"--pcmpistri128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpistri128 = Ext.intrinsic ExtX86.sse42 "pcmpistri128"--pcmpistria128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpistria128 = Ext.intrinsic ExtX86.sse42 "pcmpistria128"--pcmpistric128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpistric128 = Ext.intrinsic ExtX86.sse42 "pcmpistric128"--pcmpistrio128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpistrio128 = Ext.intrinsic ExtX86.sse42 "pcmpistrio128"--pcmpistris128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpistris128 = Ext.intrinsic ExtX86.sse42 "pcmpistris128"--pcmpistriz128 :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpistriz128 = Ext.intrinsic ExtX86.sse42 "pcmpistriz128"--pcmpestrm128 :: Ext.T (V16Int8 -> LLVM.Value I.Int32 -> V16Int8 -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V16Int8))-pcmpestrm128 = Ext.intrinsic ExtX86.sse42 "pcmpestrm128"--pcmpestri128 :: Ext.T (V16Int8 -> LLVM.Value I.Int32 -> V16Int8 -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpestri128 = Ext.intrinsic ExtX86.sse42 "pcmpestri128"--pcmpestria128 :: Ext.T (V16Int8 -> LLVM.Value I.Int32 -> V16Int8 -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpestria128 = Ext.intrinsic ExtX86.sse42 "pcmpestria128"--pcmpestric128 :: Ext.T (V16Int8 -> LLVM.Value I.Int32 -> V16Int8 -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpestric128 = Ext.intrinsic ExtX86.sse42 "pcmpestric128"--pcmpestrio128 :: Ext.T (V16Int8 -> LLVM.Value I.Int32 -> V16Int8 -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpestrio128 = Ext.intrinsic ExtX86.sse42 "pcmpestrio128"--pcmpestris128 :: Ext.T (V16Int8 -> LLVM.Value I.Int32 -> V16Int8 -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpestris128 = Ext.intrinsic ExtX86.sse42 "pcmpestris128"--pcmpestriz128 :: Ext.T (V16Int8 -> LLVM.Value I.Int32 -> V16Int8 -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pcmpestriz128 = Ext.intrinsic ExtX86.sse42 "pcmpestriz128"--extrqi :: Ext.T (V2Int64 -> LLVM.Value I.Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-extrqi = Ext.intrinsic ExtX86.sse4a "extrqi"--extrq :: Ext.T (V2Int64 -> V16Int8 -> LLVM.CodeGenFunction r (V2Int64))-extrq = Ext.intrinsic ExtX86.sse4a "extrq"--insertqi :: Ext.T (V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-insertqi = Ext.intrinsic ExtX86.sse4a "insertqi"--insertq :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-insertq = Ext.intrinsic ExtX86.sse4a "insertq"--movntss :: Ext.T (LLVM.Value (Ptr ()) -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value ()))-movntss = Ext.intrinsic ExtX86.sse4a "movnt.ss"--movntsd :: Ext.T (LLVM.Value (Ptr ()) -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value ()))-movntsd = Ext.intrinsic ExtX86.sse4a "movnt.sd"--addsubpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-addsubpd256 = Ext.intrinsic ExtX86.avx "addsub.pd.256"--addsubps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-addsubps256 = Ext.intrinsic ExtX86.avx "addsub.ps.256"--maxpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-maxpd256 = Ext.intrinsic ExtX86.avx "max.pd.256"--maxps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-maxps256 = Ext.intrinsic ExtX86.avx "max.ps.256"--minpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-minpd256 = Ext.intrinsic ExtX86.avx "min.pd.256"--minps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-minps256 = Ext.intrinsic ExtX86.avx "min.ps.256"--sqrtpd256 :: Ext.T (V4Double -> LLVM.CodeGenFunction r (V4Double))-sqrtpd256 = Ext.intrinsic ExtX86.avx "sqrt.pd.256"--sqrtps256 :: Ext.T (V8Float -> LLVM.CodeGenFunction r (V8Float))-sqrtps256 = Ext.intrinsic ExtX86.avx "sqrt.ps.256"--rsqrtps256 :: Ext.T (V8Float -> LLVM.CodeGenFunction r (V8Float))-rsqrtps256 = Ext.intrinsic ExtX86.avx "rsqrt.ps.256"--rcpps256 :: Ext.T (V8Float -> LLVM.CodeGenFunction r (V8Float))-rcpps256 = Ext.intrinsic ExtX86.avx "rcp.ps.256"--roundpd256 :: Ext.T (V4Double -> LLVM.Value W.Word32 -> LLVM.CodeGenFunction r (V4Double))-roundpd256 = Ext.intrinsic ExtX86.avx "round.pd.256"--roundps256 :: Ext.T (V8Float -> LLVM.Value W.Word32 -> LLVM.CodeGenFunction r (V8Float))-roundps256 = Ext.intrinsic ExtX86.avx "round.ps.256"--haddpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-haddpd256 = Ext.intrinsic ExtX86.avx "hadd.pd.256"--hsubps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-hsubps256 = Ext.intrinsic ExtX86.avx "hsub.ps.256"--hsubpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-hsubpd256 = Ext.intrinsic ExtX86.avx "hsub.pd.256"--haddps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-haddps256 = Ext.intrinsic ExtX86.avx "hadd.ps.256"--vpermilvarpd :: Ext.T (V2Double -> V2Int64 -> LLVM.CodeGenFunction r (V2Double))-vpermilvarpd = Ext.intrinsic ExtX86.avx "vpermilvar.pd"--vpermilvarps :: Ext.T (V4Float -> V4Int32 -> LLVM.CodeGenFunction r (V4Float))-vpermilvarps = Ext.intrinsic ExtX86.avx "vpermilvar.ps"--vpermilvarpd256 :: Ext.T (V4Double -> V4Int64 -> LLVM.CodeGenFunction r (V4Double))-vpermilvarpd256 = Ext.intrinsic ExtX86.avx "vpermilvar.pd.256"--vpermilvarps256 :: Ext.T (V8Float -> V8Int32 -> LLVM.CodeGenFunction r (V8Float))-vpermilvarps256 = Ext.intrinsic ExtX86.avx "vpermilvar.ps.256"--vperm2f128_pd256 :: Ext.T (V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vperm2f128_pd256 = Ext.intrinsic ExtX86.avx "vperm2f128.pd.256"--vperm2f128_ps256 :: Ext.T (V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vperm2f128_ps256 = Ext.intrinsic ExtX86.avx "vperm2f128.ps.256"--vperm2f128_si256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-vperm2f128_si256 = Ext.intrinsic ExtX86.avx "vperm2f128.si.256"--vpermi2vard128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-vpermi2vard128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.d.128"--vpermi2vard256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-vpermi2vard256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.d.256"--vpermi2vard512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-vpermi2vard512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.d.512"--vpermi2varhi128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-vpermi2varhi128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.hi.128"--vpermi2varhi256_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-vpermi2varhi256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.hi.256"--vpermi2varhi512_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-vpermi2varhi512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.hi.512"--vpermi2varpd128_mask :: Ext.T (V2Double -> V2Int64 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vpermi2varpd128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.pd.128"--vpermi2varpd256_mask :: Ext.T (V4Double -> V4Int64 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vpermi2varpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.pd.256"--vpermi2varpd512_mask :: Ext.T (V8Double -> V8Int64 -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-vpermi2varpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.pd.512"--vpermi2varps128_mask :: Ext.T (V4Float -> V4Int32 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vpermi2varps128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.ps.128"--vpermi2varps256_mask :: Ext.T (V8Float -> V8Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vpermi2varps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.ps.256"--vpermi2varps512_mask :: Ext.T (V16Float -> V16Int32 -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-vpermi2varps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.ps.512"--vpermi2varq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-vpermi2varq128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.q.128"--vpermi2varq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-vpermi2varq256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.q.256"--vpermi2varq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-vpermi2varq512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermi2var.q.512"--vpermt2vard512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-vpermt2vard512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.d.512"--vpermt2varq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-vpermt2varq512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.q.512"--vpermt2varps512_mask :: Ext.T (V16Int32 -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-vpermt2varps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.ps.512"--vpermt2varpd512_mask :: Ext.T (V8Int64 -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-vpermt2varpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.pd.512"--vpermt2vard128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-vpermt2vard128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.d.128"--vpermt2vard128_maskz :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-vpermt2vard128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.d.128"--vpermt2vard256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-vpermt2vard256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.d.256"--vpermt2vard256_maskz :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-vpermt2vard256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.d.256"--vpermt2vard512_maskz :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-vpermt2vard512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.d.512"--vpermt2varhi128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-vpermt2varhi128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.hi.128"--vpermt2varhi128_maskz :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-vpermt2varhi128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.hi.128"--vpermt2varhi256_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-vpermt2varhi256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.hi.256"--vpermt2varhi256_maskz :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-vpermt2varhi256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.hi.256"--vpermt2varhi512_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-vpermt2varhi512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.hi.512"--vpermt2varhi512_maskz :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-vpermt2varhi512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.hi.512"--vpermt2varpd128_mask :: Ext.T (V2Int64 -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vpermt2varpd128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.pd.128"--vpermt2varpd128_maskz :: Ext.T (V2Int64 -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vpermt2varpd128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.pd.128"--vpermt2varpd256_mask :: Ext.T (V4Int64 -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vpermt2varpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.pd.256"--vpermt2varpd256_maskz :: Ext.T (V4Int64 -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vpermt2varpd256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.pd.256"--vpermt2varpd512_maskz :: Ext.T (V8Int64 -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-vpermt2varpd512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.pd.512"--vpermt2varps128_mask :: Ext.T (V4Int32 -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vpermt2varps128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.ps.128"--vpermt2varps128_maskz :: Ext.T (V4Int32 -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vpermt2varps128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.ps.128"--vpermt2varps256_mask :: Ext.T (V8Int32 -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vpermt2varps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.ps.256"--vpermt2varps256_maskz :: Ext.T (V8Int32 -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vpermt2varps256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.ps.256"--vpermt2varps512_maskz :: Ext.T (V16Int32 -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-vpermt2varps512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.ps.512"--vpermt2varq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-vpermt2varq128_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.q.128"--vpermt2varq128_maskz :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-vpermt2varq128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.q.128"--vpermt2varq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-vpermt2varq256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermt2var.q.256"--vpermt2varq256_maskz :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-vpermt2varq256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.q.256"--vpermt2varq512_maskz :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-vpermt2varq512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vpermt2var.q.512"--vpermilpd_mask :: Ext.T (V2Double -> LLVM.Value I.Int32 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vpermilpd_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermil.pd.128"--vpermilpd256_mask :: Ext.T (V4Double -> LLVM.Value I.Int32 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vpermilpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermil.pd.256"--vpermilpd512_mask :: Ext.T (V8Double -> LLVM.Value I.Int32 -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-vpermilpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermil.pd.512"--vpermilps_mask :: Ext.T (V4Float -> LLVM.Value I.Int32 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vpermilps_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermil.ps.128"--vpermilps256_mask :: Ext.T (V8Float -> LLVM.Value I.Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vpermilps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermil.ps.256"--vpermilps512_mask :: Ext.T (V16Float -> LLVM.Value I.Int32 -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-vpermilps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermil.ps.512"--vpermilvarpd256_mask :: Ext.T (V4Double -> V4Int64 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vpermilvarpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermilvar.pd.256"--vpermilvarpd512_mask :: Ext.T (V8Double -> V8Int64 -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-vpermilvarpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermilvar.pd.512"--vpermilvarpd_mask :: Ext.T (V2Double -> V2Int64 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vpermilvarpd_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermilvar.pd.128"--vpermilvarps256_mask :: Ext.T (V8Float -> V8Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vpermilvarps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermilvar.ps.256"--vpermilvarps512_mask :: Ext.T (V16Float -> V16Int32 -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-vpermilvarps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermilvar.ps.512"--vpermilvarps_mask :: Ext.T (V4Float -> V4Int32 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vpermilvarps_mask = Ext.intrinsic ExtX86.avx512 "mask.vpermilvar.ps.128"--pshufb128_mask :: Ext.T (V16Int8 -> V16Int8 -> V16Int8 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int8))-pshufb128_mask = Ext.intrinsic ExtX86.avx512 "mask.pshuf.b.128"--pshufb256_mask :: Ext.T (V32Int8 -> V32Int8 -> V32Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int8))-pshufb256_mask = Ext.intrinsic ExtX86.avx512 "mask.pshuf.b.256"--pshufb512_mask :: Ext.T (V64Int8 -> V64Int8 -> V64Int8 -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V64Int8))-pshufb512_mask = Ext.intrinsic ExtX86.avx512 "mask.pshuf.b.512"--pshufd128_mask :: Ext.T (V4Int32 -> LLVM.Value I.Int16 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pshufd128_mask = Ext.intrinsic ExtX86.avx512 "mask.pshuf.d.128"--pshufd256_mask :: Ext.T (V8Int32 -> LLVM.Value I.Int16 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pshufd256_mask = Ext.intrinsic ExtX86.avx512 "mask.pshuf.d.256"--pshufd512_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int16 -> V16Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V16Int32))-pshufd512_mask = Ext.intrinsic ExtX86.avx512 "mask.pshuf.d.512"--pshufhw128_mask :: Ext.T (V8Int16 -> LLVM.Value I.Int8 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pshufhw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pshufh.w.128"--pshufhw256_mask :: Ext.T (V16Int16 -> LLVM.Value I.Int8 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pshufhw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pshufh.w.256"--pshufhw512_mask :: Ext.T (V32Int16 -> LLVM.Value I.Int8 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pshufhw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pshufh.w.512"--pshuflw128_mask :: Ext.T (V8Int16 -> LLVM.Value I.Int8 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pshuflw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pshufl.w.128"--pshuflw256_mask :: Ext.T (V16Int16 -> LLVM.Value I.Int8 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pshuflw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pshufl.w.256"--pshuflw512_mask :: Ext.T (V32Int16 -> LLVM.Value I.Int8 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pshuflw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pshufl.w.512"--shuf_f32x4_256_mask :: Ext.T (V8Float -> V8Float -> LLVM.Value I.Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-shuf_f32x4_256_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.f32x4.256"--shuf_f32x4_mask :: Ext.T (V16Float -> V16Float -> LLVM.Value I.Int32 -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-shuf_f32x4_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.f32x4"--shuf_f64x2_256_mask :: Ext.T (V4Double -> V4Double -> LLVM.Value I.Int32 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-shuf_f64x2_256_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.f64x2.256"--shuf_f64x2_mask :: Ext.T (V8Double -> V8Double -> LLVM.Value I.Int32 -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-shuf_f64x2_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.f64x2"--shuf_i32x4_256_mask :: Ext.T (V8Int32 -> V8Int32 -> LLVM.Value I.Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-shuf_i32x4_256_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.i32x4.256"--shuf_i32x4_mask :: Ext.T (V16Int32 -> V16Int32 -> LLVM.Value I.Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-shuf_i32x4_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.i32x4"--shuf_i64x2_256_mask :: Ext.T (V4Int64 -> V4Int64 -> LLVM.Value I.Int32 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-shuf_i64x2_256_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.i64x2.256"--shuf_i64x2_mask :: Ext.T (V8Int64 -> V8Int64 -> LLVM.Value I.Int32 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-shuf_i64x2_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.i64x2"--shufpd128_mask :: Ext.T (V2Double -> V2Double -> LLVM.Value I.Int32 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-shufpd128_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.pd.128"--shufpd256_mask :: Ext.T (V4Double -> V4Double -> LLVM.Value I.Int32 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-shufpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.pd.256"--shufpd512_mask :: Ext.T (V8Double -> V8Double -> LLVM.Value I.Int32 -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-shufpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.pd.512"--shufps128_mask :: Ext.T (V4Float -> V4Float -> LLVM.Value I.Int32 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-shufps128_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.ps.128"--shufps256_mask :: Ext.T (V8Float -> V8Float -> LLVM.Value I.Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-shufps256_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.ps.256"--shufps512_mask :: Ext.T (V16Float -> V16Float -> LLVM.Value I.Int32 -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-shufps512_mask = Ext.intrinsic ExtX86.avx512 "mask.shuf.ps.512"--movshdup128_mask :: Ext.T (V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-movshdup128_mask = Ext.intrinsic ExtX86.avx512 "mask.movshdup.128"--movshdup256_mask :: Ext.T (V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-movshdup256_mask = Ext.intrinsic ExtX86.avx512 "mask.movshdup.256"--movshdup512_mask :: Ext.T (V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-movshdup512_mask = Ext.intrinsic ExtX86.avx512 "mask.movshdup.512"--movsldup128_mask :: Ext.T (V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-movsldup128_mask = Ext.intrinsic ExtX86.avx512 "mask.movsldup.128"--movsldup256_mask :: Ext.T (V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-movsldup256_mask = Ext.intrinsic ExtX86.avx512 "mask.movsldup.256"--movsldup512_mask :: Ext.T (V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-movsldup512_mask = Ext.intrinsic ExtX86.avx512 "mask.movsldup.512"--movddup128_mask :: Ext.T (V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-movddup128_mask = Ext.intrinsic ExtX86.avx512 "mask.movddup.128"--movddup256_mask :: Ext.T (V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-movddup256_mask = Ext.intrinsic ExtX86.avx512 "mask.movddup.256"--movddup512_mask :: Ext.T (V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-movddup512_mask = Ext.intrinsic ExtX86.avx512 "mask.movddup.512"--blendvpd256 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-blendvpd256 = Ext.intrinsic ExtX86.avx "blendv.pd.256"--blendvps256 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-blendvps256 = Ext.intrinsic ExtX86.avx "blendv.ps.256"--dpps256 :: Ext.T (V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-dpps256 = Ext.intrinsic ExtX86.avx "dp.ps.256"--cmppd256 :: Ext.T (V4Double -> V4Double -> LLVM.Value W.Word8 -> LLVM.CodeGenFunction r (V4Double))-cmppd256 = Ext.intrinsic ExtX86.avx "cmp.pd.256"--cmpps256 :: Ext.T (V8Float -> V8Float -> LLVM.Value W.Word8 -> LLVM.CodeGenFunction r (V8Float))-cmpps256 = Ext.intrinsic ExtX86.avx "cmp.ps.256"--cvtdq2pd256 :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V4Double))-cvtdq2pd256 = Ext.intrinsic ExtX86.avx "cvtdq2.pd.256"--cvtdq2ps256 :: Ext.T (V8Int32 -> LLVM.CodeGenFunction r (V8Float))-cvtdq2ps256 = Ext.intrinsic ExtX86.avx "cvtdq2.ps.256"--cvtpd2ps256 :: Ext.T (V4Double -> LLVM.CodeGenFunction r (V4Float))-cvtpd2ps256 = Ext.intrinsic ExtX86.avx "cvt.pd2.ps.256"--cvtps2dq256 :: Ext.T (V8Float -> LLVM.CodeGenFunction r (V8Int32))-cvtps2dq256 = Ext.intrinsic ExtX86.avx "cvt.ps2dq.256"--cvtps2pd256 :: Ext.T (V4Float -> LLVM.CodeGenFunction r (V4Double))-cvtps2pd256 = Ext.intrinsic ExtX86.avx "cvt.ps2.pd.256"--cvttpd2dq256 :: Ext.T (V4Double -> LLVM.CodeGenFunction r (V4Int32))-cvttpd2dq256 = Ext.intrinsic ExtX86.avx "cvtt.pd2dq.256"--cvtpd2dq256 :: Ext.T (V4Double -> LLVM.CodeGenFunction r (V4Int32))-cvtpd2dq256 = Ext.intrinsic ExtX86.avx "cvt.pd2dq.256"--cvttps2dq256 :: Ext.T (V8Float -> LLVM.CodeGenFunction r (V8Int32))-cvttps2dq256 = Ext.intrinsic ExtX86.avx "cvtt.ps2dq.256"--vtestzpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestzpd = Ext.intrinsic ExtX86.avx "vtestz.pd"--vtestcpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestcpd = Ext.intrinsic ExtX86.avx "vtestc.pd"--vtestnzcpd :: Ext.T (V2Double -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestnzcpd = Ext.intrinsic ExtX86.avx "vtestnzc.pd"--vtestzps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestzps = Ext.intrinsic ExtX86.avx "vtestz.ps"--vtestcps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestcps = Ext.intrinsic ExtX86.avx "vtestc.ps"--vtestnzcps :: Ext.T (V4Float -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestnzcps = Ext.intrinsic ExtX86.avx "vtestnzc.ps"--vtestzpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestzpd256 = Ext.intrinsic ExtX86.avx "vtestz.pd.256"--vtestcpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestcpd256 = Ext.intrinsic ExtX86.avx "vtestc.pd.256"--vtestnzcpd256 :: Ext.T (V4Double -> V4Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestnzcpd256 = Ext.intrinsic ExtX86.avx "vtestnzc.pd.256"--vtestzps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestzps256 = Ext.intrinsic ExtX86.avx "vtestz.ps.256"--vtestcps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestcps256 = Ext.intrinsic ExtX86.avx "vtestc.ps.256"--vtestnzcps256 :: Ext.T (V8Float -> V8Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-vtestnzcps256 = Ext.intrinsic ExtX86.avx "vtestnzc.ps.256"--ptestz256 :: Ext.T (V4Int64 -> V4Int64 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ptestz256 = Ext.intrinsic ExtX86.avx "ptestz.256"--ptestc256 :: Ext.T (V4Int64 -> V4Int64 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ptestc256 = Ext.intrinsic ExtX86.avx "ptestc.256"--ptestnzc256 :: Ext.T (V4Int64 -> V4Int64 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-ptestnzc256 = Ext.intrinsic ExtX86.avx "ptestnzc.256"--ptestmd512 :: Ext.T (V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (LLVM.Value I.Int16))-ptestmd512 = Ext.intrinsic ExtX86.avx512 "mask.ptestm.d.512"--ptestmq512 :: Ext.T (V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-ptestmq512 = Ext.intrinsic ExtX86.avx512 "mask.ptestm.q.512"--fpclasspd128_mask :: Ext.T (V2Double -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-fpclasspd128_mask = Ext.intrinsic ExtX86.avx512 "mask.fpclass.pd.128"--fpclasspd256_mask :: Ext.T (V4Double -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-fpclasspd256_mask = Ext.intrinsic ExtX86.avx512 "mask.fpclass.pd.256"--fpclasspd512_mask :: Ext.T (V8Double -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-fpclasspd512_mask = Ext.intrinsic ExtX86.avx512 "mask.fpclass.pd.512"--fpclassps128_mask :: Ext.T (V4Float -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-fpclassps128_mask = Ext.intrinsic ExtX86.avx512 "mask.fpclass.ps.128"--fpclassps256_mask :: Ext.T (V8Float -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-fpclassps256_mask = Ext.intrinsic ExtX86.avx512 "mask.fpclass.ps.256"--fpclassps512_mask :: Ext.T (V16Float -> LLVM.Value I.Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (LLVM.Value I.Int16))-fpclassps512_mask = Ext.intrinsic ExtX86.avx512 "mask.fpclass.ps.512"--fpclasssd :: Ext.T (V2Double -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-fpclasssd = Ext.intrinsic ExtX86.avx512 "mask.fpclass.sd"--fpclassss :: Ext.T (V4Float -> LLVM.Value I.Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int8))-fpclassss = Ext.intrinsic ExtX86.avx512 "mask.fpclass.ss"--movmskpd256 :: Ext.T (V4Double -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-movmskpd256 = Ext.intrinsic ExtX86.avx "movmsk.pd.256"--movmskps256 :: Ext.T (V8Float -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-movmskps256 = Ext.intrinsic ExtX86.avx "movmsk.ps.256"--vzeroall :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value ()))-vzeroall = Ext.intrinsic ExtX86.avx "vzeroall"--vzeroupper :: Ext.T (LLVM.CodeGenFunction r (LLVM.Value ()))-vzeroupper = Ext.intrinsic ExtX86.avx "vzeroupper"--vbroadcastf128_pd256 :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (V4Double))-vbroadcastf128_pd256 = Ext.intrinsic ExtX86.avx "vbroadcastf128.pd.256"--vbroadcastf128_ps256 :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (V8Float))-vbroadcastf128_ps256 = Ext.intrinsic ExtX86.avx "vbroadcastf128.ps.256"--lddqu256 :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (V32Int8))-lddqu256 = Ext.intrinsic ExtX86.avx "ldu.dq.256"--storeupd256 :: Ext.T (LLVM.Value (Ptr ()) -> V4Double -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeupd256 = Ext.intrinsic ExtX86.avx "storeu.pd.256"--storeups256 :: Ext.T (LLVM.Value (Ptr ()) -> V8Float -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeups256 = Ext.intrinsic ExtX86.avx "storeu.ps.256"--storedqu256 :: Ext.T (LLVM.Value (Ptr ()) -> V32Int8 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storedqu256 = Ext.intrinsic ExtX86.avx "storeu.dq.256"--maskloadpd :: Ext.T (LLVM.Value (Ptr ()) -> V2Int64 -> LLVM.CodeGenFunction r (V2Double))-maskloadpd = Ext.intrinsic ExtX86.avx "maskload.pd"--maskloadps :: Ext.T (LLVM.Value (Ptr ()) -> V4Int32 -> LLVM.CodeGenFunction r (V4Float))-maskloadps = Ext.intrinsic ExtX86.avx "maskload.ps"--maskloadpd256 :: Ext.T (LLVM.Value (Ptr ()) -> V4Int64 -> LLVM.CodeGenFunction r (V4Double))-maskloadpd256 = Ext.intrinsic ExtX86.avx "maskload.pd.256"--maskloadps256 :: Ext.T (LLVM.Value (Ptr ()) -> V8Int32 -> LLVM.CodeGenFunction r (V8Float))-maskloadps256 = Ext.intrinsic ExtX86.avx "maskload.ps.256"--loadups128_mask :: Ext.T (LLVM.Value (Ptr ()) -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-loadups128_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.ps.128"--loadups256_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-loadups256_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.ps.256"--loadups512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-loadups512_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.ps.512"--loadupd128_mask :: Ext.T (LLVM.Value (Ptr ()) -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-loadupd128_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.pd.128"--loadupd256_mask :: Ext.T (LLVM.Value (Ptr ()) -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-loadupd256_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.pd.256"--loadupd512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-loadupd512_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.pd.512"--loadaps128_mask :: Ext.T (LLVM.Value (Ptr ()) -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-loadaps128_mask = Ext.intrinsic ExtX86.avx512 "mask.load.ps.128"--loadaps256_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-loadaps256_mask = Ext.intrinsic ExtX86.avx512 "mask.load.ps.256"--loadaps512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-loadaps512_mask = Ext.intrinsic ExtX86.avx512 "mask.load.ps.512"--loadapd128_mask :: Ext.T (LLVM.Value (Ptr ()) -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-loadapd128_mask = Ext.intrinsic ExtX86.avx512 "mask.load.pd.128"--loadapd256_mask :: Ext.T (LLVM.Value (Ptr ()) -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-loadapd256_mask = Ext.intrinsic ExtX86.avx512 "mask.load.pd.256"--loadapd512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-loadapd512_mask = Ext.intrinsic ExtX86.avx512 "mask.load.pd.512"--movss_mask :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-movss_mask = Ext.intrinsic ExtX86.avx512 "mask.move.ss"--movsd_mask :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-movsd_mask = Ext.intrinsic ExtX86.avx512 "mask.move.sd"--maskstorepd :: Ext.T (LLVM.Value (Ptr ()) -> V2Int64 -> V2Double -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstorepd = Ext.intrinsic ExtX86.avx "maskstore.pd"--maskstoreps :: Ext.T (LLVM.Value (Ptr ()) -> V4Int32 -> V4Float -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstoreps = Ext.intrinsic ExtX86.avx "maskstore.ps"--maskstorepd256 :: Ext.T (LLVM.Value (Ptr ()) -> V4Int64 -> V4Double -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstorepd256 = Ext.intrinsic ExtX86.avx "maskstore.pd.256"--maskstoreps256 :: Ext.T (LLVM.Value (Ptr ()) -> V8Int32 -> V8Float -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstoreps256 = Ext.intrinsic ExtX86.avx "maskstore.ps.256"--storeups512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeups512_mask = Ext.intrinsic ExtX86.avx512 "mask.storeu.ps.512"--storeupd512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeupd512_mask = Ext.intrinsic ExtX86.avx512 "mask.storeu.pd.512"--storeaps512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeaps512_mask = Ext.intrinsic ExtX86.avx512 "mask.store.ps.512"--storeapd512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storeapd512_mask = Ext.intrinsic ExtX86.avx512 "mask.store.pd.512"--storess_mask :: Ext.T (LLVM.Value (Ptr ()) -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storess_mask = Ext.intrinsic ExtX86.avx512 "mask.store.ss"--paddsb256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-paddsb256 = Ext.intrinsic ExtX86.avx2 "padds.b"--paddsw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-paddsw256 = Ext.intrinsic ExtX86.avx2 "padds.w"--paddusb256 :: Ext.T (V32Word8 -> V32Word8 -> LLVM.CodeGenFunction r (V32Word8))-paddusb256 = Ext.intrinsic ExtX86.avx2 "paddus.b"--paddusw256 :: Ext.T (V16Word16 -> V16Word16 -> LLVM.CodeGenFunction r (V16Word16))-paddusw256 = Ext.intrinsic ExtX86.avx2 "paddus.w"--psubsb256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-psubsb256 = Ext.intrinsic ExtX86.avx2 "psubs.b"--psubsw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-psubsw256 = Ext.intrinsic ExtX86.avx2 "psubs.w"--psubusb256 :: Ext.T (V32Word8 -> V32Word8 -> LLVM.CodeGenFunction r (V32Word8))-psubusb256 = Ext.intrinsic ExtX86.avx2 "psubus.b"--psubusw256 :: Ext.T (V16Word16 -> V16Word16 -> LLVM.CodeGenFunction r (V16Word16))-psubusw256 = Ext.intrinsic ExtX86.avx2 "psubus.w"--pmulhuw256 :: Ext.T (V16Word16 -> V16Word16 -> LLVM.CodeGenFunction r (V16Word16))-pmulhuw256 = Ext.intrinsic ExtX86.avx2 "pmulhu.w"--pmulhw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-pmulhw256 = Ext.intrinsic ExtX86.avx2 "pmulh.w"--pmuludq256 :: Ext.T (V8Word32 -> V8Word32 -> LLVM.CodeGenFunction r (V4Word64))-pmuludq256 = Ext.intrinsic ExtX86.avx2 "pmulu.dq"--pmuldq256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V4Int64))-pmuldq256 = Ext.intrinsic ExtX86.avx2 "pmul.dq"--pmaddwd256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V8Int32))-pmaddwd256 = Ext.intrinsic ExtX86.avx2 "pmadd.wd"--pavgb256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-pavgb256 = Ext.intrinsic ExtX86.avx2 "pavg.b"--pavgw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-pavgw256 = Ext.intrinsic ExtX86.avx2 "pavg.w"--psadbw256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V4Int64))-psadbw256 = Ext.intrinsic ExtX86.avx2 "psad.bw"--pmaxub256 :: Ext.T (V32Word8 -> V32Word8 -> LLVM.CodeGenFunction r (V32Word8))-pmaxub256 = Ext.intrinsic ExtX86.avx2 "pmaxu.b"--pmaxuw256 :: Ext.T (V16Word16 -> V16Word16 -> LLVM.CodeGenFunction r (V16Word16))-pmaxuw256 = Ext.intrinsic ExtX86.avx2 "pmaxu.w"--pmaxud256 :: Ext.T (V8Word32 -> V8Word32 -> LLVM.CodeGenFunction r (V8Word32))-pmaxud256 = Ext.intrinsic ExtX86.avx2 "pmaxu.d"--pmaxsb256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-pmaxsb256 = Ext.intrinsic ExtX86.avx2 "pmaxs.b"--pmaxsw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-pmaxsw256 = Ext.intrinsic ExtX86.avx2 "pmaxs.w"--pmaxsd256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-pmaxsd256 = Ext.intrinsic ExtX86.avx2 "pmaxs.d"--pminub256 :: Ext.T (V32Word8 -> V32Word8 -> LLVM.CodeGenFunction r (V32Word8))-pminub256 = Ext.intrinsic ExtX86.avx2 "pminu.b"--pminuw256 :: Ext.T (V16Word16 -> V16Word16 -> LLVM.CodeGenFunction r (V16Word16))-pminuw256 = Ext.intrinsic ExtX86.avx2 "pminu.w"--pminud256 :: Ext.T (V8Word32 -> V8Word32 -> LLVM.CodeGenFunction r (V8Word32))-pminud256 = Ext.intrinsic ExtX86.avx2 "pminu.d"--pminsb256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-pminsb256 = Ext.intrinsic ExtX86.avx2 "pmins.b"--pminsw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-pminsw256 = Ext.intrinsic ExtX86.avx2 "pmins.w"--pminsd256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-pminsd256 = Ext.intrinsic ExtX86.avx2 "pmins.d"--pmaxsb128_mask :: Ext.T (V16Int8 -> V16Int8 -> V16Int8 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int8))-pmaxsb128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.b.128"--pmaxsb256_mask :: Ext.T (V32Int8 -> V32Int8 -> V32Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int8))-pmaxsb256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.b.256"--pmaxsb512_mask :: Ext.T (V64Int8 -> V64Int8 -> V64Int8 -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V64Int8))-pmaxsb512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.b.512"--pmaxub128_mask :: Ext.T (V16Int8 -> V16Int8 -> V16Int8 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int8))-pmaxub128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.b.128"--pmaxub256_mask :: Ext.T (V32Int8 -> V32Int8 -> V32Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int8))-pmaxub256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.b.256"--pmaxub512_mask :: Ext.T (V64Int8 -> V64Int8 -> V64Int8 -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V64Int8))-pmaxub512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.b.512"--pmaxsw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pmaxsw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.w.128"--pmaxsw256_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pmaxsw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.w.256"--pmaxsw512_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pmaxsw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.w.512"--pmaxuw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pmaxuw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.w.128"--pmaxuw256_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pmaxuw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.w.256"--pmaxuw512_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pmaxuw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.w.512"--pminsb128_mask :: Ext.T (V16Int8 -> V16Int8 -> V16Int8 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int8))-pminsb128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.b.128"--pminsb256_mask :: Ext.T (V32Int8 -> V32Int8 -> V32Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int8))-pminsb256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.b.256"--pminsb512_mask :: Ext.T (V64Int8 -> V64Int8 -> V64Int8 -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V64Int8))-pminsb512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.b.512"--pminub128_mask :: Ext.T (V16Int8 -> V16Int8 -> V16Int8 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int8))-pminub128_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.b.128"--pminub256_mask :: Ext.T (V32Int8 -> V32Int8 -> V32Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int8))-pminub256_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.b.256"--pminub512_mask :: Ext.T (V64Int8 -> V64Int8 -> V64Int8 -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V64Int8))-pminub512_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.b.512"--pminsw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pminsw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.w.128"--pminsw256_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pminsw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.w.256"--pminsw512_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pminsw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.w.512"--pminuw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pminuw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.w.128"--pminuw256_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pminuw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.w.256"--pminuw512_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pminuw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.w.512"--pmaxud512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pmaxud512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.d.512"--pmaxud256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pmaxud256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.d.256"--pmaxud128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pmaxud128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.d.128"--pmaxsd512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pmaxsd512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.d.512"--pmaxsd256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pmaxsd256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.d.256"--pmaxsd128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pmaxsd128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.d.128"--pmaxuq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-pmaxuq512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.q.512"--pmaxuq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-pmaxuq256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.q.256"--pmaxuq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-pmaxuq128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxu.q.128"--pmaxsq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-pmaxsq512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.q.512"--pmaxsq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-pmaxsq256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.q.256"--pmaxsq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-pmaxsq128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmaxs.q.128"--pminud512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pminud512_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.d.512"--pminud256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pminud256_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.d.256"--pminud128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pminud128_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.d.128"--pminsd512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pminsd512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.d.512"--pminsd256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pminsd256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.d.256"--pminsd128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pminsd128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.d.128"--pminuq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-pminuq512_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.q.512"--pminuq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-pminuq256_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.q.256"--pminuq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-pminuq128_mask = Ext.intrinsic ExtX86.avx512 "mask.pminu.q.128"--pminsq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-pminsq512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.q.512"--pminsq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-pminsq256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.q.256"--pminsq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-pminsq128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmins.q.128"--psllw256 :: Ext.T (V16Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V16Int16))-psllw256 = Ext.intrinsic ExtX86.avx2 "psll.w"--pslld256 :: Ext.T (V8Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V8Int32))-pslld256 = Ext.intrinsic ExtX86.avx2 "psll.d"--psllq256 :: Ext.T (V4Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V4Int64))-psllq256 = Ext.intrinsic ExtX86.avx2 "psll.q"--psrlw256 :: Ext.T (V16Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V16Int16))-psrlw256 = Ext.intrinsic ExtX86.avx2 "psrl.w"--psrld256 :: Ext.T (V8Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V8Int32))-psrld256 = Ext.intrinsic ExtX86.avx2 "psrl.d"--psrlq256 :: Ext.T (V4Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V4Int64))-psrlq256 = Ext.intrinsic ExtX86.avx2 "psrl.q"--psraw256 :: Ext.T (V16Int16 -> V8Int16 -> LLVM.CodeGenFunction r (V16Int16))-psraw256 = Ext.intrinsic ExtX86.avx2 "psra.w"--psrad256 :: Ext.T (V8Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V8Int32))-psrad256 = Ext.intrinsic ExtX86.avx2 "psra.d"--psllwi256 :: Ext.T (V16Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Int16))-psllwi256 = Ext.intrinsic ExtX86.avx2 "pslli.w"--pslldi256 :: Ext.T (V8Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int32))-pslldi256 = Ext.intrinsic ExtX86.avx2 "pslli.d"--psllqi256 :: Ext.T (V4Int64 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V4Int64))-psllqi256 = Ext.intrinsic ExtX86.avx2 "pslli.q"--psrlwi256 :: Ext.T (V16Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Int16))-psrlwi256 = Ext.intrinsic ExtX86.avx2 "psrli.w"--psrldi256 :: Ext.T (V8Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int32))-psrldi256 = Ext.intrinsic ExtX86.avx2 "psrli.d"--psrlqi256 :: Ext.T (V4Int64 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V4Int64))-psrlqi256 = Ext.intrinsic ExtX86.avx2 "psrli.q"--psrawi256 :: Ext.T (V16Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Int16))-psrawi256 = Ext.intrinsic ExtX86.avx2 "psrai.w"--psradi256 :: Ext.T (V8Int32 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int32))-psradi256 = Ext.intrinsic ExtX86.avx2 "psrai.d"--pslldi512 :: Ext.T (V16Int32 -> LLVM.Value I.Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pslldi512 = Ext.intrinsic ExtX86.avx512 "mask.pslli.d"--psllqi512 :: Ext.T (V8Int64 -> LLVM.Value I.Int32 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psllqi512 = Ext.intrinsic ExtX86.avx512 "mask.pslli.q"--psrldi512 :: Ext.T (V16Int32 -> LLVM.Value I.Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psrldi512 = Ext.intrinsic ExtX86.avx512 "mask.psrli.d"--psrlqi512 :: Ext.T (V8Int64 -> LLVM.Value I.Int32 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psrlqi512 = Ext.intrinsic ExtX86.avx512 "mask.psrli.q"--psradi512 :: Ext.T (V16Int32 -> LLVM.Value I.Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psradi512 = Ext.intrinsic ExtX86.avx512 "mask.psrai.d"--psraqi512 :: Ext.T (V8Int64 -> LLVM.Value I.Int32 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psraqi512 = Ext.intrinsic ExtX86.avx512 "mask.psrai.q"--psrlw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psrlw128_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.w.128"--psrlw256_mask :: Ext.T (V16Int16 -> V8Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psrlw256_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.w.256"--psrlw512_mask :: Ext.T (V32Int16 -> V8Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psrlw512_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.w.512"--psrlwi128_mask :: Ext.T (V8Int16 -> LLVM.Value I.Int8 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psrlwi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.wi.128"--psrlwi256_mask :: Ext.T (V16Int16 -> LLVM.Value I.Int8 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psrlwi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.wi.256"--psrlwi512_mask :: Ext.T (V32Int16 -> LLVM.Value I.Int8 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psrlwi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.wi.512"--psraw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psraw128_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.w.128"--psraw256_mask :: Ext.T (V16Int16 -> V8Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psraw256_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.w.256"--psraw512_mask :: Ext.T (V32Int16 -> V8Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psraw512_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.w.512"--psrawi128_mask :: Ext.T (V8Int16 -> LLVM.Value I.Int8 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psrawi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.wi.128"--psrawi256_mask :: Ext.T (V16Int16 -> LLVM.Value I.Int8 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psrawi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.wi.256"--psrawi512_mask :: Ext.T (V32Int16 -> LLVM.Value I.Int8 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psrawi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.wi.512"--pslld512_mask :: Ext.T (V16Int32 -> V4Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pslld512_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.d"--psllq512_mask :: Ext.T (V8Int64 -> V2Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psllq512_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.q"--psrld512_mask :: Ext.T (V16Int32 -> V4Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psrld512_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.d"--psrlq512_mask :: Ext.T (V8Int64 -> V2Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psrlq512_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.q"--psrad512_mask :: Ext.T (V16Int32 -> V4Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psrad512_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.d"--psraq512_mask :: Ext.T (V8Int64 -> V2Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psraq512_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.q"--psllw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psllw128_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.w.128"--psllw256_mask :: Ext.T (V16Int16 -> V8Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psllw256_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.w.256"--psllw512_mask :: Ext.T (V32Int16 -> V8Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psllw512_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.w.512"--psllwi128_mask :: Ext.T (V8Int16 -> LLVM.Value I.Int8 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psllwi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.wi.128"--psllwi256_mask :: Ext.T (V16Int16 -> LLVM.Value I.Int8 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psllwi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.wi.256"--psllwi512_mask :: Ext.T (V32Int16 -> LLVM.Value I.Int8 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psllwi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.wi.512"--psllv16hi_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psllv16hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv16.hi"--psllv2di_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psllv2di_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv2.di"--psllv32hi_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psllv32hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv32hi"--psllv4di_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psllv4di_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv4.di"--psllv4si_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-psllv4si_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv4.si"--psllv8hi_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psllv8hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv8.hi"--psllv8si_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-psllv8si_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv8.si"--psrad128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-psrad128_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.d.128"--psrad256_mask :: Ext.T (V8Int32 -> V4Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-psrad256_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.d.256"--psradi128_mask :: Ext.T (V4Int32 -> LLVM.Value I.Int8 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-psradi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.di.128"--psradi256_mask :: Ext.T (V8Int32 -> LLVM.Value I.Int8 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-psradi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.di.256"--psradi512_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int8 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psradi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.di.512"--psraq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psraq128_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.q.128"--psraq256_mask :: Ext.T (V4Int64 -> V2Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psraq256_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.q.256"--psraqi128_mask :: Ext.T (V2Int64 -> LLVM.Value I.Int8 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psraqi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.qi.128"--psraqi256_mask :: Ext.T (V4Int64 -> LLVM.Value I.Int8 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psraqi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.qi.256"--psraqi512_mask :: Ext.T (V8Int64 -> LLVM.Value I.Int8 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psraqi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psra.qi.512"--psrld128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-psrld128_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.d.128"--psrld256_mask :: Ext.T (V8Int32 -> V4Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-psrld256_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.d.256"--psrldi128_mask :: Ext.T (V4Int32 -> LLVM.Value I.Int8 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-psrldi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.di.128"--psrldi256_mask :: Ext.T (V8Int32 -> LLVM.Value I.Int8 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-psrldi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.di.256"--psrldi512_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int8 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psrldi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.di.512"--psrlq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psrlq128_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.q.128"--psrlq256_mask :: Ext.T (V4Int64 -> V2Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psrlq256_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.q.256"--psrlqi128_mask :: Ext.T (V2Int64 -> LLVM.Value I.Int8 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psrlqi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.qi.128"--psrlqi256_mask :: Ext.T (V4Int64 -> LLVM.Value I.Int8 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psrlqi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.qi.256"--psrlqi512_mask :: Ext.T (V8Int64 -> LLVM.Value I.Int8 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psrlqi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psrl.qi.512"--packsswb256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V32Int8))-packsswb256 = Ext.intrinsic ExtX86.avx2 "packsswb"--packssdw256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V16Int16))-packssdw256 = Ext.intrinsic ExtX86.avx2 "packssdw"--packuswb256 :: Ext.T (V16Word16 -> V16Word16 -> LLVM.CodeGenFunction r (V32Word8))-packuswb256 = Ext.intrinsic ExtX86.avx2 "packuswb"--packusdw256 :: Ext.T (V8Word32 -> V8Word32 -> LLVM.CodeGenFunction r (V16Word16))-packusdw256 = Ext.intrinsic ExtX86.avx2 "packusdw"--pabsb256 :: Ext.T (V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-pabsb256 = Ext.intrinsic ExtX86.avx2 "pabs.b"--pabsw256 :: Ext.T (V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-pabsw256 = Ext.intrinsic ExtX86.avx2 "pabs.w"--pabsd256 :: Ext.T (V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-pabsd256 = Ext.intrinsic ExtX86.avx2 "pabs.d"--pabsb128_mask :: Ext.T (V16Int8 -> V16Int8 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int8))-pabsb128_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.b.128"--pabsb256_mask :: Ext.T (V32Int8 -> V32Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int8))-pabsb256_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.b.256"--pabsb512_mask :: Ext.T (V64Int8 -> V64Int8 -> LLVM.Value I.Int64 -> LLVM.CodeGenFunction r (V64Int8))-pabsb512_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.b.512"--pabsd128_mask :: Ext.T (V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pabsd128_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.d.128"--pabsd256_mask :: Ext.T (V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pabsd256_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.d.256"--pabsd512_mask :: Ext.T (V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pabsd512_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.d.512"--pabsq128_mask :: Ext.T (V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-pabsq128_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.q.128"--pabsq256_mask :: Ext.T (V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-pabsq256_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.q.256"--pabsq512_mask :: Ext.T (V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-pabsq512_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.q.512"--pabsw128_mask :: Ext.T (V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pabsw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.w.128"--pabsw256_mask :: Ext.T (V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pabsw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.w.256"--pabsw512_mask :: Ext.T (V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pabsw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pabs.w.512"--phaddw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-phaddw256 = Ext.intrinsic ExtX86.avx2 "phadd.w"--phaddd256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-phaddd256 = Ext.intrinsic ExtX86.avx2 "phadd.d"--phaddsw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-phaddsw256 = Ext.intrinsic ExtX86.avx2 "phadd.sw"--phsubw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-phsubw256 = Ext.intrinsic ExtX86.avx2 "phsub.w"--phsubd256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-phsubd256 = Ext.intrinsic ExtX86.avx2 "phsub.d"--phsubsw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-phsubsw256 = Ext.intrinsic ExtX86.avx2 "phsub.sw"--pmaddubsw256 :: Ext.T (V32Word8 -> V32Word8 -> LLVM.CodeGenFunction r (V16Word16))-pmaddubsw256 = Ext.intrinsic ExtX86.avx2 "pmadd.ub.sw"--psignb256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-psignb256 = Ext.intrinsic ExtX86.avx2 "psign.b"--psignw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-psignw256 = Ext.intrinsic ExtX86.avx2 "psign.w"--psignd256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-psignd256 = Ext.intrinsic ExtX86.avx2 "psign.d"--pmulhrsw256 :: Ext.T (V16Int16 -> V16Int16 -> LLVM.CodeGenFunction r (V16Int16))-pmulhrsw256 = Ext.intrinsic ExtX86.avx2 "pmul.hr.sw"--pmulhrsw128_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-pmulhrsw128_mask = Ext.intrinsic ExtX86.avx512 "mask.pmul.hr.sw.128"--pmulhrsw256_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-pmulhrsw256_mask = Ext.intrinsic ExtX86.avx512 "mask.pmul.hr.sw.256"--pmulhrsw512_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-pmulhrsw512_mask = Ext.intrinsic ExtX86.avx512 "mask.pmul.hr.sw.512"--pmovsxbd256 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V8Int32))-pmovsxbd256 = Ext.intrinsic ExtX86.avx2 "pmovsxbd"--pmovsxbq256 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V4Int64))-pmovsxbq256 = Ext.intrinsic ExtX86.avx2 "pmovsxbq"--pmovsxbw256 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V16Int16))-pmovsxbw256 = Ext.intrinsic ExtX86.avx2 "pmovsxbw"--pmovsxdq256 :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V4Int64))-pmovsxdq256 = Ext.intrinsic ExtX86.avx2 "pmovsxdq"--pmovsxwd256 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V8Int32))-pmovsxwd256 = Ext.intrinsic ExtX86.avx2 "pmovsxwd"--pmovsxwq256 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V4Int64))-pmovsxwq256 = Ext.intrinsic ExtX86.avx2 "pmovsxwq"--pmovzxbd256 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V8Int32))-pmovzxbd256 = Ext.intrinsic ExtX86.avx2 "pmovzxbd"--pmovzxbq256 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V4Int64))-pmovzxbq256 = Ext.intrinsic ExtX86.avx2 "pmovzxbq"--pmovzxbw256 :: Ext.T (V16Int8 -> LLVM.CodeGenFunction r (V16Int16))-pmovzxbw256 = Ext.intrinsic ExtX86.avx2 "pmovzxbw"--pmovzxdq256 :: Ext.T (V4Int32 -> LLVM.CodeGenFunction r (V4Int64))-pmovzxdq256 = Ext.intrinsic ExtX86.avx2 "pmovzxdq"--pmovzxwd256 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V8Int32))-pmovzxwd256 = Ext.intrinsic ExtX86.avx2 "pmovzxwd"--pmovzxwq256 :: Ext.T (V8Int16 -> LLVM.CodeGenFunction r (V4Int64))-pmovzxwq256 = Ext.intrinsic ExtX86.avx2 "pmovzxwq"--pblendvb256 :: Ext.T (V32Int8 -> V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-pblendvb256 = Ext.intrinsic ExtX86.avx2 "pblendvb"--pbroadcastd512_gpr_mask :: Ext.T (LLVM.Value I.Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pbroadcastd512_gpr_mask = Ext.intrinsic ExtX86.avx512 "mask.pbroadcast.d.gpr.512"--pbroadcastq512_gpr_mask :: Ext.T (LLVM.Value I.Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-pbroadcastq512_gpr_mask = Ext.intrinsic ExtX86.avx512 "mask.pbroadcast.q.gpr.512"--pbroadcastq512_mem_mask :: Ext.T (LLVM.Value I.Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-pbroadcastq512_mem_mask = Ext.intrinsic ExtX86.avx512 "mask.pbroadcast.q.mem.512"--permvarsi256 :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-permvarsi256 = Ext.intrinsic ExtX86.avx2 "permd"--permvarsf256 :: Ext.T (V8Float -> V8Int32 -> LLVM.CodeGenFunction r (V8Float))-permvarsf256 = Ext.intrinsic ExtX86.avx2 "permps"--permti256 :: Ext.T (V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-permti256 = Ext.intrinsic ExtX86.avx2 "vperm2i128"--extractf32x4_mask :: Ext.T (V16Float -> LLVM.Value I.Int32 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-extractf32x4_mask = Ext.intrinsic ExtX86.avx512 "mask.vextractf32x4.512"--extracti32x4_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-extracti32x4_mask = Ext.intrinsic ExtX86.avx512 "mask.vextracti32x4.512"--extractf32x4_256_mask :: Ext.T (V8Float -> LLVM.Value I.Int32 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-extractf32x4_256_mask = Ext.intrinsic ExtX86.avx512 "mask.vextractf32x4.256"--extracti32x4_256_mask :: Ext.T (V8Int32 -> LLVM.Value I.Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-extracti32x4_256_mask = Ext.intrinsic ExtX86.avx512 "mask.vextracti32x4.256"--extractf64x2_256_mask :: Ext.T (V4Double -> LLVM.Value I.Int32 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-extractf64x2_256_mask = Ext.intrinsic ExtX86.avx512 "mask.vextractf64x2.256"--extracti64x2_256_mask :: Ext.T (V4Int64 -> LLVM.Value I.Int32 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-extracti64x2_256_mask = Ext.intrinsic ExtX86.avx512 "mask.vextracti64x2.256"--extractf64x2_512_mask :: Ext.T (V8Double -> LLVM.Value I.Int32 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-extractf64x2_512_mask = Ext.intrinsic ExtX86.avx512 "mask.vextractf64x2.512"--extracti64x2_512_mask :: Ext.T (V8Int64 -> LLVM.Value I.Int32 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-extracti64x2_512_mask = Ext.intrinsic ExtX86.avx512 "mask.vextracti64x2.512"--extractf32x8_mask :: Ext.T (V16Float -> LLVM.Value I.Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-extractf32x8_mask = Ext.intrinsic ExtX86.avx512 "mask.vextractf32x8.512"--extracti32x8_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-extracti32x8_mask = Ext.intrinsic ExtX86.avx512 "mask.vextracti32x8.512"--extractf64x4_mask :: Ext.T (V8Double -> LLVM.Value I.Int32 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-extractf64x4_mask = Ext.intrinsic ExtX86.avx512 "mask.vextractf64x4.512"--extracti64x4_mask :: Ext.T (V8Int64 -> LLVM.Value I.Int32 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-extracti64x4_mask = Ext.intrinsic ExtX86.avx512 "mask.vextracti64x4.512"--insertf32x4_256_mask :: Ext.T (V8Float -> V4Float -> LLVM.Value I.Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-insertf32x4_256_mask = Ext.intrinsic ExtX86.avx512 "mask.insertf32x4.256"--insertf32x4_512_mask :: Ext.T (V16Float -> V4Float -> LLVM.Value I.Int32 -> V16Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V16Float))-insertf32x4_512_mask = Ext.intrinsic ExtX86.avx512 "mask.insertf32x4.512"--insertf32x8_mask :: Ext.T (V16Float -> V8Float -> LLVM.Value I.Int32 -> V16Float -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Float))-insertf32x8_mask = Ext.intrinsic ExtX86.avx512 "mask.insertf32x8.512"--insertf64x2_256_mask :: Ext.T (V4Double -> V2Double -> LLVM.Value I.Int32 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-insertf64x2_256_mask = Ext.intrinsic ExtX86.avx512 "mask.insertf64x2.256"--insertf64x2_512_mask :: Ext.T (V8Double -> V2Double -> LLVM.Value I.Int32 -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-insertf64x2_512_mask = Ext.intrinsic ExtX86.avx512 "mask.insertf64x2.512"--insertf64x4_mask :: Ext.T (V8Double -> V4Double -> LLVM.Value I.Int32 -> V8Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Double))-insertf64x4_mask = Ext.intrinsic ExtX86.avx512 "mask.insertf64x4.512"--inserti32x4_256_mask :: Ext.T (V8Int32 -> V4Int32 -> LLVM.Value I.Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-inserti32x4_256_mask = Ext.intrinsic ExtX86.avx512 "mask.inserti32x4.256"--inserti32x4_512_mask :: Ext.T (V16Int32 -> V4Int32 -> LLVM.Value I.Int32 -> V16Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V16Int32))-inserti32x4_512_mask = Ext.intrinsic ExtX86.avx512 "mask.inserti32x4.512"--inserti32x8_mask :: Ext.T (V16Int32 -> V8Int32 -> LLVM.Value I.Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-inserti32x8_mask = Ext.intrinsic ExtX86.avx512 "mask.inserti32x8.512"--inserti64x2_256_mask :: Ext.T (V4Int64 -> V2Int64 -> LLVM.Value I.Int32 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-inserti64x2_256_mask = Ext.intrinsic ExtX86.avx512 "mask.inserti64x2.256"--inserti64x2_512_mask :: Ext.T (V8Int64 -> V2Int64 -> LLVM.Value I.Int32 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-inserti64x2_512_mask = Ext.intrinsic ExtX86.avx512 "mask.inserti64x2.512"--inserti64x4_mask :: Ext.T (V8Int64 -> V4Int64 -> LLVM.Value I.Int32 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-inserti64x4_mask = Ext.intrinsic ExtX86.avx512 "mask.inserti64x4.512"--maskloadd :: Ext.T (LLVM.Value (Ptr ()) -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-maskloadd = Ext.intrinsic ExtX86.avx2 "maskload.d"--maskloadq :: Ext.T (LLVM.Value (Ptr ()) -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-maskloadq = Ext.intrinsic ExtX86.avx2 "maskload.q"--maskloadd256 :: Ext.T (LLVM.Value (Ptr ()) -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-maskloadd256 = Ext.intrinsic ExtX86.avx2 "maskload.d.256"--maskloadq256 :: Ext.T (LLVM.Value (Ptr ()) -> V4Int64 -> LLVM.CodeGenFunction r (V4Int64))-maskloadq256 = Ext.intrinsic ExtX86.avx2 "maskload.q.256"--loaddqusi512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-loaddqusi512_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.d.512"--loaddqudi512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-loaddqudi512_mask = Ext.intrinsic ExtX86.avx512 "mask.loadu.q.512"--maskstored :: Ext.T (LLVM.Value (Ptr ()) -> V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstored = Ext.intrinsic ExtX86.avx2 "maskstore.d"--maskstoreq :: Ext.T (LLVM.Value (Ptr ()) -> V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstoreq = Ext.intrinsic ExtX86.avx2 "maskstore.q"--maskstored256 :: Ext.T (LLVM.Value (Ptr ()) -> V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstored256 = Ext.intrinsic ExtX86.avx2 "maskstore.d.256"--maskstoreq256 :: Ext.T (LLVM.Value (Ptr ()) -> V4Int64 -> V4Int64 -> LLVM.CodeGenFunction r (LLVM.Value ()))-maskstoreq256 = Ext.intrinsic ExtX86.avx2 "maskstore.q.256"--storedqusi512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storedqusi512_mask = Ext.intrinsic ExtX86.avx512 "mask.storeu.d.512"--storedqudi512_mask :: Ext.T (LLVM.Value (Ptr ()) -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (LLVM.Value ()))-storedqudi512_mask = Ext.intrinsic ExtX86.avx512 "mask.storeu.q.512"--psllv4si :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-psllv4si = Ext.intrinsic ExtX86.avx2 "psllv.d"--psllv8si :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-psllv8si = Ext.intrinsic ExtX86.avx2 "psllv.d.256"--psllv2di :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-psllv2di = Ext.intrinsic ExtX86.avx2 "psllv.q"--psllv4di :: Ext.T (V4Int64 -> V4Int64 -> LLVM.CodeGenFunction r (V4Int64))-psllv4di = Ext.intrinsic ExtX86.avx2 "psllv.q.256"--psrlv4si :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-psrlv4si = Ext.intrinsic ExtX86.avx2 "psrlv.d"--psrlv8si :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-psrlv8si = Ext.intrinsic ExtX86.avx2 "psrlv.d.256"--psrlv2di :: Ext.T (V2Int64 -> V2Int64 -> LLVM.CodeGenFunction r (V2Int64))-psrlv2di = Ext.intrinsic ExtX86.avx2 "psrlv.q"--psrlv4di :: Ext.T (V4Int64 -> V4Int64 -> LLVM.CodeGenFunction r (V4Int64))-psrlv4di = Ext.intrinsic ExtX86.avx2 "psrlv.q.256"--psrav4si :: Ext.T (V4Int32 -> V4Int32 -> LLVM.CodeGenFunction r (V4Int32))-psrav4si = Ext.intrinsic ExtX86.avx2 "psrav.d"--psrav8si :: Ext.T (V8Int32 -> V8Int32 -> LLVM.CodeGenFunction r (V8Int32))-psrav8si = Ext.intrinsic ExtX86.avx2 "psrav.d.256"--psllv16si_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psllv16si_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv.d"--psllv8di_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psllv8di_mask = Ext.intrinsic ExtX86.avx512 "mask.psllv.q"--psrav16si_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psrav16si_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav.d"--psrav8di_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psrav8di_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav.q"--psrlv16si_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-psrlv16si_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv.d"--psrlv8di_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psrlv8di_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv.q"--pslldq512 :: Ext.T (V8Int64 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int64))-pslldq512 = Ext.intrinsic ExtX86.avx512 "psll.dq.512"--psrldq512 :: Ext.T (V8Int64 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Int64))-psrldq512 = Ext.intrinsic ExtX86.avx512 "psrl.dq.512"--pslld128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pslld128_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.d.128"--pslld256_mask :: Ext.T (V8Int32 -> V4Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pslld256_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.d.256"--pslldi128_mask :: Ext.T (V4Int32 -> LLVM.Value I.Int8 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-pslldi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.di.128"--pslldi256_mask :: Ext.T (V8Int32 -> LLVM.Value I.Int8 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-pslldi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.di.256"--pslldi512_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int8 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-pslldi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.di.512"--psllq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psllq128_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.q.128"--psllq256_mask :: Ext.T (V4Int64 -> V2Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psllq256_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.q.256"--psllqi128_mask :: Ext.T (V2Int64 -> LLVM.Value I.Int8 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psllqi128_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.qi.128"--psllqi256_mask :: Ext.T (V4Int64 -> LLVM.Value I.Int8 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psllqi256_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.qi.256"--psllqi512_mask :: Ext.T (V8Int64 -> LLVM.Value I.Int8 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-psllqi512_mask = Ext.intrinsic ExtX86.avx512 "mask.psll.qi.512"--psrav16hi_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psrav16hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav16.hi"--psrav32hi_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psrav32hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav32.hi"--psrav4si_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-psrav4si_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav4.si"--psrav8hi_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psrav8hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav8.hi"--psrav8si_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-psrav8si_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav8.si"--psravq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psravq128_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav.q.128"--psravq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psravq256_mask = Ext.intrinsic ExtX86.avx512 "mask.psrav.q.256"--psrlv16hi_mask :: Ext.T (V16Int16 -> V16Int16 -> V16Int16 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int16))-psrlv16hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv16.hi"--psrlv2di_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-psrlv2di_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv2.di"--psrlv32hi_mask :: Ext.T (V32Int16 -> V32Int16 -> V32Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V32Int16))-psrlv32hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv32hi"--psrlv4di_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-psrlv4di_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv4.di"--psrlv4si_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-psrlv4si_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv4.si"--psrlv8hi_mask :: Ext.T (V8Int16 -> V8Int16 -> V8Int16 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int16))-psrlv8hi_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv8.hi"--psrlv8si_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-psrlv8si_mask = Ext.intrinsic ExtX86.avx512 "mask.psrlv8.si"--prorvd128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-prorvd128_mask = Ext.intrinsic ExtX86.avx512 "mask.prorv.d.128"--prorvd256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-prorvd256_mask = Ext.intrinsic ExtX86.avx512 "mask.prorv.d.256"--prorvd512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-prorvd512_mask = Ext.intrinsic ExtX86.avx512 "mask.prorv.d.512"--prorvq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-prorvq128_mask = Ext.intrinsic ExtX86.avx512 "mask.prorv.q.128"--prorvq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-prorvq256_mask = Ext.intrinsic ExtX86.avx512 "mask.prorv.q.256"--prorvq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-prorvq512_mask = Ext.intrinsic ExtX86.avx512 "mask.prorv.q.512"--prold128_mask :: Ext.T (V4Int32 -> LLVM.Value I.Int8 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-prold128_mask = Ext.intrinsic ExtX86.avx512 "mask.prol.d.128"--prold256_mask :: Ext.T (V8Int32 -> LLVM.Value I.Int8 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-prold256_mask = Ext.intrinsic ExtX86.avx512 "mask.prol.d.256"--prold512_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int8 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-prold512_mask = Ext.intrinsic ExtX86.avx512 "mask.prol.d.512"--prolq128_mask :: Ext.T (V2Int64 -> LLVM.Value I.Int8 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-prolq128_mask = Ext.intrinsic ExtX86.avx512 "mask.prol.q.128"--prolq256_mask :: Ext.T (V4Int64 -> LLVM.Value I.Int8 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-prolq256_mask = Ext.intrinsic ExtX86.avx512 "mask.prol.q.256"--prolq512_mask :: Ext.T (V8Int64 -> LLVM.Value I.Int8 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-prolq512_mask = Ext.intrinsic ExtX86.avx512 "mask.prol.q.512"--prolvd128_mask :: Ext.T (V4Int32 -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-prolvd128_mask = Ext.intrinsic ExtX86.avx512 "mask.prolv.d.128"--prolvd256_mask :: Ext.T (V8Int32 -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-prolvd256_mask = Ext.intrinsic ExtX86.avx512 "mask.prolv.d.256"--prolvd512_mask :: Ext.T (V16Int32 -> V16Int32 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-prolvd512_mask = Ext.intrinsic ExtX86.avx512 "mask.prolv.d.512"--prolvq128_mask :: Ext.T (V2Int64 -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-prolvq128_mask = Ext.intrinsic ExtX86.avx512 "mask.prolv.q.128"--prolvq256_mask :: Ext.T (V4Int64 -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-prolvq256_mask = Ext.intrinsic ExtX86.avx512 "mask.prolv.q.256"--prolvq512_mask :: Ext.T (V8Int64 -> V8Int64 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-prolvq512_mask = Ext.intrinsic ExtX86.avx512 "mask.prolv.q.512"--prord128_mask :: Ext.T (V4Int32 -> LLVM.Value I.Int8 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-prord128_mask = Ext.intrinsic ExtX86.avx512 "mask.pror.d.128"--prord256_mask :: Ext.T (V8Int32 -> LLVM.Value I.Int8 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-prord256_mask = Ext.intrinsic ExtX86.avx512 "mask.pror.d.256"--prord512_mask :: Ext.T (V16Int32 -> LLVM.Value I.Int8 -> V16Int32 -> LLVM.Value I.Int16 -> LLVM.CodeGenFunction r (V16Int32))-prord512_mask = Ext.intrinsic ExtX86.avx512 "mask.pror.d.512"--prorq128_mask :: Ext.T (V2Int64 -> LLVM.Value I.Int8 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-prorq128_mask = Ext.intrinsic ExtX86.avx512 "mask.pror.q.128"--prorq256_mask :: Ext.T (V4Int64 -> LLVM.Value I.Int8 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-prorq256_mask = Ext.intrinsic ExtX86.avx512 "mask.pror.q.256"--prorq512_mask :: Ext.T (V8Int64 -> LLVM.Value I.Int8 -> V8Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int64))-prorq512_mask = Ext.intrinsic ExtX86.avx512 "mask.pror.q.512"--gatherd_pd :: Ext.T (V2Double -> LLVM.Value (Ptr ()) -> V4Int32 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-gatherd_pd = Ext.intrinsic ExtX86.avx2 "gather.d.pd"--gatherd_pd256 :: Ext.T (V4Double -> LLVM.Value (Ptr ()) -> V4Int32 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-gatherd_pd256 = Ext.intrinsic ExtX86.avx2 "gather.d.pd.256"--gatherq_pd :: Ext.T (V2Double -> LLVM.Value (Ptr ()) -> V2Int64 -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-gatherq_pd = Ext.intrinsic ExtX86.avx2 "gather.q.pd"--gatherq_pd256 :: Ext.T (V4Double -> LLVM.Value (Ptr ()) -> V4Int64 -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-gatherq_pd256 = Ext.intrinsic ExtX86.avx2 "gather.q.pd.256"--gatherd_ps :: Ext.T (V4Float -> LLVM.Value (Ptr ()) -> V4Int32 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-gatherd_ps = Ext.intrinsic ExtX86.avx2 "gather.d.ps"--gatherd_ps256 :: Ext.T (V8Float -> LLVM.Value (Ptr ()) -> V8Int32 -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-gatherd_ps256 = Ext.intrinsic ExtX86.avx2 "gather.d.ps.256"--gatherq_ps :: Ext.T (V4Float -> LLVM.Value (Ptr ()) -> V2Int64 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-gatherq_ps = Ext.intrinsic ExtX86.avx2 "gather.q.ps"--gatherq_ps256 :: Ext.T (V4Float -> LLVM.Value (Ptr ()) -> V4Int64 -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-gatherq_ps256 = Ext.intrinsic ExtX86.avx2 "gather.q.ps.256"--gatherd_q :: Ext.T (V2Int64 -> LLVM.Value (Ptr ()) -> V4Int32 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-gatherd_q = Ext.intrinsic ExtX86.avx2 "gather.d.q"--gatherd_q256 :: Ext.T (V4Int64 -> LLVM.Value (Ptr ()) -> V4Int32 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-gatherd_q256 = Ext.intrinsic ExtX86.avx2 "gather.d.q.256"--gatherq_q :: Ext.T (V2Int64 -> LLVM.Value (Ptr ()) -> V2Int64 -> V2Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Int64))-gatherq_q = Ext.intrinsic ExtX86.avx2 "gather.q.q"--gatherq_q256 :: Ext.T (V4Int64 -> LLVM.Value (Ptr ()) -> V4Int64 -> V4Int64 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int64))-gatherq_q256 = Ext.intrinsic ExtX86.avx2 "gather.q.q.256"--gatherd_d :: Ext.T (V4Int32 -> LLVM.Value (Ptr ()) -> V4Int32 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-gatherd_d = Ext.intrinsic ExtX86.avx2 "gather.d.d"--gatherd_d256 :: Ext.T (V8Int32 -> LLVM.Value (Ptr ()) -> V8Int32 -> V8Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Int32))-gatherd_d256 = Ext.intrinsic ExtX86.avx2 "gather.d.d.256"--gatherq_d :: Ext.T (V4Int32 -> LLVM.Value (Ptr ()) -> V2Int64 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-gatherq_d = Ext.intrinsic ExtX86.avx2 "gather.q.d"--gatherq_d256 :: Ext.T (V4Int32 -> LLVM.Value (Ptr ()) -> V4Int64 -> V4Int32 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Int32))-gatherq_d256 = Ext.intrinsic ExtX86.avx2 "gather.q.d.256"--pmovmskb256 :: Ext.T (V32Int8 -> LLVM.CodeGenFunction r (LLVM.Value I.Int32))-pmovmskb256 = Ext.intrinsic ExtX86.avx2 "pmovmskb"--pshufb256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.CodeGenFunction r (V32Int8))-pshufb256 = Ext.intrinsic ExtX86.avx2 "pshuf.b"--mpsadbw256 :: Ext.T (V32Int8 -> V32Int8 -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V16Int16))-mpsadbw256 = Ext.intrinsic ExtX86.avx2 "mpsadbw"--movntdqa256 :: Ext.T (LLVM.Value (Ptr ()) -> LLVM.CodeGenFunction r (V4Int64))-movntdqa256 = Ext.intrinsic ExtX86.avx2 "movntdqa"--vfmaddss :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfmaddss = Ext.intrinsic ExtX86.fma "vfmadd.ss"--vfmaddsd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfmaddsd = Ext.intrinsic ExtX86.fma "vfmadd.sd"--vfmaddps :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfmaddps = Ext.intrinsic ExtX86.fma "vfmadd.ps"--vfmaddpd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfmaddpd = Ext.intrinsic ExtX86.fma "vfmadd.pd"--vfmaddps256 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-vfmaddps256 = Ext.intrinsic ExtX86.fma "vfmadd.ps.256"--vfmaddpd256 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-vfmaddpd256 = Ext.intrinsic ExtX86.fma "vfmadd.pd.256"--vfmsubss :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfmsubss = Ext.intrinsic ExtX86.fma "vfmsub.ss"--vfmsubsd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfmsubsd = Ext.intrinsic ExtX86.fma "vfmsub.sd"--vfmsubps :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfmsubps = Ext.intrinsic ExtX86.fma "vfmsub.ps"--vfmsubpd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfmsubpd = Ext.intrinsic ExtX86.fma "vfmsub.pd"--vfmsubps256 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-vfmsubps256 = Ext.intrinsic ExtX86.fma "vfmsub.ps.256"--vfmsubpd256 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-vfmsubpd256 = Ext.intrinsic ExtX86.fma "vfmsub.pd.256"--vfnmaddss :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfnmaddss = Ext.intrinsic ExtX86.fma "vfnmadd.ss"--vfnmaddsd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfnmaddsd = Ext.intrinsic ExtX86.fma "vfnmadd.sd"--vfnmaddps :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfnmaddps = Ext.intrinsic ExtX86.fma "vfnmadd.ps"--vfnmaddpd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfnmaddpd = Ext.intrinsic ExtX86.fma "vfnmadd.pd"--vfnmaddps256 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-vfnmaddps256 = Ext.intrinsic ExtX86.fma "vfnmadd.ps.256"--vfnmaddpd256 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-vfnmaddpd256 = Ext.intrinsic ExtX86.fma "vfnmadd.pd.256"--vfnmsubss :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfnmsubss = Ext.intrinsic ExtX86.fma "vfnmsub.ss"--vfnmsubsd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfnmsubsd = Ext.intrinsic ExtX86.fma "vfnmsub.sd"--vfnmsubps :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfnmsubps = Ext.intrinsic ExtX86.fma "vfnmsub.ps"--vfnmsubpd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfnmsubpd = Ext.intrinsic ExtX86.fma "vfnmsub.pd"--vfnmsubps256 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-vfnmsubps256 = Ext.intrinsic ExtX86.fma "vfnmsub.ps.256"--vfnmsubpd256 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-vfnmsubpd256 = Ext.intrinsic ExtX86.fma "vfnmsub.pd.256"--vfmaddsubps :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfmaddsubps = Ext.intrinsic ExtX86.fma "vfmaddsub.ps"--vfmaddsubpd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfmaddsubpd = Ext.intrinsic ExtX86.fma "vfmaddsub.pd"--vfmaddsubps256 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-vfmaddsubps256 = Ext.intrinsic ExtX86.fma "vfmaddsub.ps.256"--vfmaddsubpd256 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-vfmaddsubpd256 = Ext.intrinsic ExtX86.fma "vfmaddsub.pd.256"--vfmsubaddps :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.CodeGenFunction r (V4Float))-vfmsubaddps = Ext.intrinsic ExtX86.fma "vfmsubadd.ps"--vfmsubaddpd :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.CodeGenFunction r (V2Double))-vfmsubaddpd = Ext.intrinsic ExtX86.fma "vfmsubadd.pd"--vfmsubaddps256 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.CodeGenFunction r (V8Float))-vfmsubaddps256 = Ext.intrinsic ExtX86.fma "vfmsubadd.ps.256"--vfmsubaddpd256 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.CodeGenFunction r (V4Double))-vfmsubaddpd256 = Ext.intrinsic ExtX86.fma "vfmsubadd.pd.256"--vfmaddpd128_mask :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmaddpd128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmadd.pd.128"--vfmaddpd128_mask3 :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmaddpd128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmadd.pd.128"--vfmaddpd128_maskz :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmaddpd128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmadd.pd.128"--vfmaddpd256_mask :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmaddpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmadd.pd.256"--vfmaddpd256_mask3 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmaddpd256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmadd.pd.256"--vfmaddpd256_maskz :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmaddpd256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmadd.pd.256"--vfmaddpd512_mask :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmaddpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmadd.pd.512"--vfmaddpd512_mask3 :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmaddpd512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmadd.pd.512"--vfmaddpd512_maskz :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmaddpd512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmadd.pd.512"--vfmaddps128_mask :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmaddps128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmadd.ps.128"--vfmaddps128_mask3 :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmaddps128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmadd.ps.128"--vfmaddps128_maskz :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmaddps128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmadd.ps.128"--vfmaddps256_mask :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmaddps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmadd.ps.256"--vfmaddps256_mask3 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmaddps256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmadd.ps.256"--vfmaddps256_maskz :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmaddps256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmadd.ps.256"--vfmaddps512_mask :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmaddps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmadd.ps.512"--vfmaddps512_mask3 :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmaddps512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmadd.ps.512"--vfmaddps512_maskz :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmaddps512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmadd.ps.512"--vfmaddsubpd128_mask :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmaddsubpd128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmaddsub.pd.128"--vfmaddsubpd128_mask3 :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmaddsubpd128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmaddsub.pd.128"--vfmaddsubpd128_maskz :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmaddsubpd128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmaddsub.pd.128"--vfmaddsubpd256_mask :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmaddsubpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmaddsub.pd.256"--vfmaddsubpd256_mask3 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmaddsubpd256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmaddsub.pd.256"--vfmaddsubpd256_maskz :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmaddsubpd256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmaddsub.pd.256"--vfmaddsubpd512_mask :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmaddsubpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmaddsub.pd.512"--vfmaddsubpd512_mask3 :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmaddsubpd512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmaddsub.pd.512"--vfmaddsubpd512_maskz :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmaddsubpd512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmaddsub.pd.512"--vfmaddsubps128_mask :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmaddsubps128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmaddsub.ps.128"--vfmaddsubps128_mask3 :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmaddsubps128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmaddsub.ps.128"--vfmaddsubps128_maskz :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmaddsubps128_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmaddsub.ps.128"--vfmaddsubps256_mask :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmaddsubps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmaddsub.ps.256"--vfmaddsubps256_mask3 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmaddsubps256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmaddsub.ps.256"--vfmaddsubps256_maskz :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmaddsubps256_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmaddsub.ps.256"--vfmaddsubps512_mask :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmaddsubps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfmaddsub.ps.512"--vfmaddsubps512_mask3 :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmaddsubps512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmaddsub.ps.512"--vfmaddsubps512_maskz :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmaddsubps512_maskz = Ext.intrinsic ExtX86.avx512 "maskz.vfmaddsub.ps.512"--vfmsubpd128_mask3 :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmsubpd128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsub.pd.128"--vfmsubpd256_mask3 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmsubpd256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsub.pd.256"--vfmsubpd512_mask3 :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmsubpd512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsub.pd.512"--vfmsubps128_mask3 :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmsubps128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsub.ps.128"--vfmsubps256_mask3 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmsubps256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsub.ps.256"--vfmsubps512_mask3 :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmsubps512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsub.ps.512"--vfmsubaddpd128_mask3 :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfmsubaddpd128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsubadd.pd.128"--vfmsubaddpd256_mask3 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfmsubaddpd256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsubadd.pd.256"--vfmsubaddpd512_mask3 :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfmsubaddpd512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsubadd.pd.512"--vfmsubaddps128_mask3 :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfmsubaddps128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsubadd.ps.128"--vfmsubaddps256_mask3 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfmsubaddps256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsubadd.ps.256"--vfmsubaddps512_mask3 :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfmsubaddps512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfmsubadd.ps.512"--vfnmaddpd128_mask :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfnmaddpd128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmadd.pd.128"--vfnmaddpd256_mask :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfnmaddpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmadd.pd.256"--vfnmaddpd512_mask :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfnmaddpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmadd.pd.512"--vfnmaddps128_mask :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfnmaddps128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmadd.ps.128"--vfnmaddps256_mask :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfnmaddps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmadd.ps.256"--vfnmaddps512_mask :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfnmaddps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmadd.ps.512"--vfnmsubpd128_mask :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfnmsubpd128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmsub.pd.128"--vfnmsubpd128_mask3 :: Ext.T (V2Double -> V2Double -> V2Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V2Double))-vfnmsubpd128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfnmsub.pd.128"--vfnmsubpd256_mask :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfnmsubpd256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmsub.pd.256"--vfnmsubpd256_mask3 :: Ext.T (V4Double -> V4Double -> V4Double -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Double))-vfnmsubpd256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfnmsub.pd.256"--vfnmsubpd512_mask :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfnmsubpd512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmsub.pd.512"--vfnmsubpd512_mask3 :: Ext.T (V8Double -> V8Double -> V8Double -> LLVM.Value I.Int8 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V8Double))-vfnmsubpd512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfnmsub.pd.512"--vfnmsubps128_mask :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfnmsubps128_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmsub.ps.128"--vfnmsubps128_mask3 :: Ext.T (V4Float -> V4Float -> V4Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V4Float))-vfnmsubps128_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfnmsub.ps.128"--vfnmsubps256_mask :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfnmsubps256_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmsub.ps.256"--vfnmsubps256_mask3 :: Ext.T (V8Float -> V8Float -> V8Float -> LLVM.Value I.Int8 -> LLVM.CodeGenFunction r (V8Float))-vfnmsubps256_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfnmsub.ps.256"--vfnmsubps512_mask :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfnmsubps512_mask = Ext.intrinsic ExtX86.avx512 "mask.vfnmsub.ps.512"--vfnmsubps512_mask3 :: Ext.T (V16Float -> V16Float -> V16Float -> LLVM.Value I.Int16 -> LLVM.Value I.Int32 -> LLVM.CodeGenFunction r (V16Float))-vfnmsubps512_mask3 = Ext.intrinsic ExtX86.avx512 "mask3.vfnmsub.ps.512"--
src/LLVM/Extra/FastMath.hs view
@@ -1,8 +1,38 @@ {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE UndecidableInstances #-} {-# LANGUAGE GeneralizedNewtypeDeriving #-}-module LLVM.Extra.FastMath where+module LLVM.Extra.FastMath ( + NoNaNs(NoNaNs),+ NoInfs(NoInfs),+ NoSignedZeros(NoSignedZeros),+ AllowReciprocal(AllowReciprocal),+ Fast(Fast),+ Flags(setFlags), + Number(Number, deconsNumber),+ getNumber,+ mvNumber,+ mvDenumber,++ MultiValue(setMultiValueFlags),+ attachMultiValueFlags,+ liftNumberM,+ liftNumberM2,+ mvecNumber,+ mvecDenumber,++ MultiVector(setMultiVectorFlags),+ attachMultiVectorFlags,+ liftMultiVectorM,+ liftMultiVectorM2,++ Tuple(setTupleFlags),+ Context(Context),+ attachTupleFlags,+ liftContext,+ liftContext2,+ ) 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@@ -264,14 +294,12 @@ fmap mvecNumber . MultiVector.insert k (mvDenumber x) . mvecDenumber instance- (Flags flags,- MultiVector a, MV.IntegerConstant a, MultiVector.IntegerConstant a) =>+ (Flags flags, MultiVector 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) =>+ (Flags flags, MultiVector a, MultiVector.RationalConstant a) => MultiVector.RationalConstant (Number flags a) where fromRational' = mvecNumber . MultiVector.fromRational'
src/LLVM/Extra/Iterator.hs view
@@ -1,7 +1,34 @@ {-# LANGUAGE ExistentialQuantification #-} {-# LANGUAGE Rank2Types #-} {-# LANGUAGE TypeFamilies #-}-module LLVM.Extra.Iterator where+module LLVM.Extra.Iterator (+ T,+ -- * consumers+ mapM_,+ mapState_,+ mapStateM_,+ mapWhileState_,+ -- * producers+ empty,+ singleton,+ cons,+ iterate,+ countDown,+ arrayPtrs,+ -- * modifiers+ mapM,+ mapMaybe,+ catMaybes,+ takeWhileJust,+ takeWhile,+ cartesian,+ take,+ -- * application examples+ fixedLengthLoop,+ arrayLoop,+ arrayLoopWithExit,+ arrayLoop2,+ ) where import qualified LLVM.Extra.MaybeContinuation as MaybeCont import qualified LLVM.Extra.Maybe as Maybe@@ -13,7 +40,7 @@ import LLVM.Util.Loop (Phi, ) import LLVM.Core (CodeGenFunction, Value, value, valueOf,- CmpRet, CmpResult, IsInteger, IsType, IsConst, )+ CmpRet, IsInteger, IsType, IsConst, IsPrimitive) import Foreign.Ptr (Ptr, ) @@ -25,7 +52,7 @@ import Data.Tuple.HT (mapFst, mapSnd, ) -import Prelude2010 hiding (iterate, takeWhile, take, mapM)+import Prelude2010 hiding (iterate, takeWhile, take, mapM, mapM_) import Prelude () @@ -164,6 +191,7 @@ (Phi a, Class.Undefined a) => (a -> CodeGenFunction r a) -> a -> T r a iterate f a = Cons a (\a0 -> MaybeCont.lift $ fmap ((,) a0) $ f a0) + cartesianAux :: (Phi a, Phi b, Class.Undefined a, Class.Undefined b) => T r a -> T r b -> T r (Maybe.T (a,b))@@ -180,22 +208,19 @@ (\(b1,sb1) -> return (Maybe.just (a1,b1), (Maybe.just a1, sa1, sb1)))) ---- * helper functions- cartesian :: (Phi a, Phi b, Class.Undefined a, Class.Undefined b) => T r a -> T r b -> T r (a,b) cartesian as bs = catMaybes $ cartesianAux as bs countDown ::- (Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ (Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> T r (Value i) countDown len = takeWhile (A.cmp LLVM.CmpLT (value LLVM.zero)) $ iterate A.dec len take ::- (Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ (Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> T r a -> T r a take len xs = liftA2 const xs (countDown len) @@ -206,8 +231,7 @@ -- * examples fixedLengthLoop ::- (Phi s,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ (Phi s, Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> s -> (s -> CodeGenFunction r s) -> CodeGenFunction r s@@ -215,8 +239,7 @@ mapState_ (const loopBody) (countDown len) start arrayLoop ::- (Phi a, IsType b,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ (Phi a, IsType b, Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr b) -> a -> (Value (Ptr b) -> a -> CodeGenFunction r a) -> CodeGenFunction r a@@ -224,8 +247,7 @@ mapState_ loopBody (take len $ arrayPtrs ptr) start arrayLoopWithExit ::- (Phi s, IsType a,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ (Phi s, IsType a, Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr a) -> s -> (Value (Ptr a) -> s -> CodeGenFunction r (Value Bool, s)) -> CodeGenFunction r (Value i, s)@@ -239,8 +261,7 @@ return (pos, end) arrayLoop2 ::- (Phi s, IsType a, IsType b,- Num i, IsConst i, IsInteger i, CmpRet i, CmpResult i ~ Bool) =>+ (Phi s, IsType a, IsType b, Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr a) -> Value (Ptr b) -> s -> (Value (Ptr a) -> Value (Ptr b) -> s -> CodeGenFunction r s) -> CodeGenFunction r s
src/LLVM/Extra/MaybeContinuation.hs view
@@ -12,10 +12,8 @@ import qualified LLVM.Core as LLVM import LLVM.Core- (Value, value, valueOf,- CodeGenFunction,- IsConst, IsType, IsFirstClass, IsInteger,- CmpRet, CmpResult, )+ (CodeGenFunction, Value, value, valueOf,+ IsConst, IsType, IsPrimitive, IsInteger, CmpRet) import LLVM.Util.Loop (Phi, ) -- (phis, addPhis, ) import qualified Control.Monad as M@@ -150,7 +148,7 @@ fixedLengthLoop :: (Phi s, Undefined s,- Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> s -> (s -> T r (Maybe.T s) s) -> CodeGenFunction r (Value i, Maybe.T s)@@ -175,7 +173,7 @@ -} arrayLoop :: (Phi s, Undefined s, IsType a,- Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr a) -> s -> (Value (Ptr a) -> s -> T r (Maybe.T (Value (Ptr a), s)) s) ->@@ -190,7 +188,7 @@ arrayLoop2 :: (Phi s, Undefined s, IsType a, IsType b,- Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i, CmpResult i ~ Bool) =>+ Num i, IsConst i, IsInteger i, CmpRet i, IsPrimitive i) => Value i -> Value (Ptr a) -> Value (Ptr b) -> s -> (Value (Ptr a) -> Value (Ptr b) -> s ->
src/LLVM/Extra/MaybePrivate.hs view
@@ -90,8 +90,7 @@ lift2 f (Cons b0 a0) (Cons b1 a1) = Monad.liftM (flip Cons (f a0 a1)) (LLVM.and b0 b1) -sequence ::- T (CodeGenFunction r a) -> CodeGenFunction r (T a)+sequence :: T (CodeGenFunction r a) -> CodeGenFunction r (T a) sequence (Cons b0 a0) = Monad.liftM (Cons b0) a0
src/LLVM/Extra/Multi/Iterator.hs view
@@ -49,14 +49,14 @@ take len xs = liftA2 const xs (countDown len) -class Enum a where+class (MultiValue.C a) => Enum a where succ, pred :: MultiValue.T a -> LLVM.CodeGenFunction r (MultiValue.T a) enumFrom :: MultiValue.T a -> Iter.T r (MultiValue.T a) enumFromTo :: MultiValue.T a -> MultiValue.T a -> Iter.T r (MultiValue.T a) instance (LLVM.IsInteger w, SoV.IntegerConstant w, Num w,- LLVM.CmpRet w, LLVM.CmpResult w ~ Bool, P.Enum e) =>+ LLVM.CmpRet w, LLVM.IsPrimitive w, P.Enum e) => Enum (Enum.T w e) where succ = MultiValue.succ pred = MultiValue.pred@@ -71,7 +71,7 @@ succMax :: (LLVM.IsInteger w, SoV.IntegerConstant w, Num w,- LLVM.CmpRet w, LLVM.CmpResult w ~ Bool, P.Enum e) =>+ LLVM.CmpRet w, LLVM.IsPrimitive w, P.Enum e) => MultiValue.T (Enum.T w e) -> MultiValue.T (Enum.T w e) -> LLVM.CodeGenFunction r (Maybe.T (MultiValue.T (Enum.T w e)))@@ -87,7 +87,7 @@ -} _enumFromToSimple :: (LLVM.IsInteger w, SoV.IntegerConstant w, Num w,- LLVM.CmpRet w, LLVM.CmpResult w ~ Bool, P.Enum e) =>+ LLVM.CmpRet w, LLVM.IsPrimitive w, P.Enum e) => MultiValue.T (Enum.T w e) -> MultiValue.T (Enum.T w e) -> Iter.T r (MultiValue.T (Enum.T w e))
src/LLVM/Extra/Multi/Value/Private.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} {-# LANGUAGE MultiParamTypeClasses #-} module LLVM.Extra.Multi.Value.Private where@@ -14,7 +15,6 @@ import LLVM.Core (WordN, IntN, ) import qualified Type.Data.Num.Decimal.Number as Dec-import Type.Data.Num.Decimal (D1) import Foreign.StablePtr (StablePtr, ) import Foreign.Ptr (Ptr, FunPtr, )@@ -284,7 +284,7 @@ -- cannot be an instance of 'Comparison' because there is no 'Real' instance cmpEnum ::- (LLVM.CmpRet w, LLVM.CmpResult w ~ Bool) =>+ (LLVM.CmpRet w, LLVM.IsPrimitive w) => LLVM.CmpPredicate -> T (Enum.T w a) -> T (Enum.T w a) -> LLVM.CodeGenFunction r (T Bool) cmpEnum = liftM2 . LLVM.cmp@@ -1009,8 +1009,8 @@ class (Repr LLVM.Value i ~ LLVM.Value ir,- LLVM.IsInteger ir, SoV.IntegerConstant ir, LLVM.CmpRet ir,- LLVM.NumberOfElements ir ~ D1, LLVM.CmpResult ir ~ Bool) =>+ LLVM.IsInteger ir, SoV.IntegerConstant ir,+ LLVM.CmpRet ir, LLVM.IsPrimitive ir) => NativeInteger i ir where instance NativeInteger Word8 Word8 where@@ -1023,11 +1023,13 @@ instance NativeInteger Int32 Int32 where instance NativeInteger Int64 Int64 where +instance NativeInteger a a => NativeInteger (Tagged tag a) a where + class (Repr LLVM.Value a ~ LLVM.Value ar,- LLVM.IsFloating ar, SoV.RationalConstant ar, LLVM.CmpRet ar,- LLVM.NumberOfElements ar ~ D1, LLVM.CmpResult ar ~ Bool) =>+ LLVM.IsFloating ar, SoV.RationalConstant ar,+ LLVM.CmpRet ar, LLVM.IsPrimitive ar) => NativeFloating a ar where instance NativeFloating Float Float where
src/LLVM/Extra/Multi/Vector.hs view
@@ -424,10 +424,12 @@ (insert k a2 v2) -class (C a) => IntegerConstant a where+class (MultiValue.IntegerConstant a, C a) => IntegerConstant a where fromInteger' :: (TypeNum.Positive n) => Integer -> T n a -class (IntegerConstant a) => RationalConstant a where+class+ (MultiValue.RationalConstant a, IntegerConstant a) =>+ RationalConstant a where fromRational' :: (TypeNum.Positive n) => Rational -> T n a instance IntegerConstant Float where fromInteger' = fromIntegerPrimitive@@ -922,7 +924,7 @@ -class (C a) => Select a where+class (MultiValue.Select a, C a) => Select a where select :: (TypeNum.Positive n) => T n Bool -> T n a -> T n a ->@@ -1035,7 +1037,7 @@ -class BitShift a where+class (MultiValue.BitShift a, C a) => BitShift a where shl :: (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a) shr :: (TypeNum.Positive n) => T n a -> T n a -> LLVM.CodeGenFunction r (T n a)
src/LLVM/Extra/ScalarOrVector.hs view
@@ -24,39 +24,36 @@ Replicate (replicate, replicateConst), replicateOf, Real (min, max, abs, signum),+ Saturated(addSat, subSat), PseudoModule (scale, scaleConst), IntegerConstant(constFromInteger), RationalConstant(constFromRational), TranscendentalConstant(constPi), ) where -import LLVM.Extra.Vector (Element, Size, )-+import qualified LLVM.Extra.ScalarOrVectorPrivate as Priv import qualified LLVM.Extra.Vector as Vector-import qualified LLVM.Extra.Extension.X86 as X86-import qualified LLVM.Extra.Extension as Ext--import qualified LLVM.Extra.Class as Class import qualified LLVM.Extra.ArithmeticPrivate as A--import qualified Type.Data.Num.Decimal as TypeNum-import Type.Data.Num.Decimal (D1, )+import LLVM.Extra.ScalarOrVectorPrivate+ (Scalar, Replicate(replicate, replicateConst)) +import qualified LLVM.Util.Intrinsic as Intrinsic+import qualified LLVM.Util.Proxy as LP import qualified LLVM.Core as LLVM import LLVM.Core- (Value, ConstValue, valueOf, constOf,- CmpRet, CmpResult, NumberOfElements,+ (Value, ConstValue, constOf,+ CmpRet, CmpResult, ShapeOf, Vector, WordN(WordN), IntN(IntN), FP128, IsConst, IsInteger, IsFloating, CodeGenFunction, ) -import Control.Monad.HT ((<=<), )+import qualified Type.Data.Num.Decimal as TypeNum -import qualified Data.NonEmpty as NonEmpty import Data.Word (Word8, Word16, Word32, Word64, ) import Data.Int (Int8, Int16, Int32, Int64, )+import Data.Maybe (fromMaybe) -import Prelude hiding (Real, replicate, min, max, abs, truncate, floor, round, )+import Prelude hiding (Real, replicate, min, max, abs, truncate) @@ -65,42 +62,12 @@ fraction :: Value a -> CodeGenFunction r (Value a) instance Fraction Float where- truncate =- mapAuto- (LLVM.inttofp . flip asTypeOf (undefined :: Value Int32) <=< LLVM.fptoint)- (Ext.with X86.roundss $ \round x -> round x (valueOf 3))- fraction =- (\x ->- fractionGen x- `Ext.run`- (Ext.with X86.cmpss $ \cmp ->- fractionLogical (\modus -> curry (runScalar (uncurry (cmp modus)))) x))- `mapAuto`- (Ext.with X86.roundss $ \round x ->- A.sub x =<< round x (valueOf 1))+ truncate = Intrinsic.truncate+ fraction = A.fraction instance Fraction Double where- truncate =- mapAuto- -- X86 only converts Double to Int32, it cannot target Int64- (LLVM.inttofp . flip asTypeOf (undefined :: Value Int32) <=< LLVM.fptoint)- (Ext.with X86.roundsd $ \round x -> round x (valueOf 3))- fraction =- (\x ->- fractionGen x- `Ext.run`- (Ext.with X86.cmpsd $ \cmp ->- fractionLogical (\modus -> curry (runScalar (uncurry (cmp modus)))) x))-{--For Doubles it would be more efficient to convert the lower 32 bit-instead of the lower 64 bit,-since x86 supports only conversion from 32 bit natively.- (Ext.with X86.cmpsd $ \cmp -> fractionLogical- (\x y -> cmp x y >>= LLVM.bitcast )--}- `mapAuto`- (Ext.with X86.roundsd $ \round x ->- A.sub x =<< round x (valueOf 1))+ truncate = Intrinsic.truncate+ fraction = A.fraction instance (TypeNum.Positive n, Vector.Real a, IsFloating a, IsConst a) => Fraction (Vector n a) where@@ -118,21 +85,21 @@ signedFraction x = A.sub x =<< truncate x -fractionGen ::+_fractionGen :: (IntegerConstant v, Fraction v, CmpRet v) => Value v -> CodeGenFunction r (Value v)-fractionGen x =+_fractionGen x = do xf <- signedFraction x b <- A.fcmp LLVM.FPOGE xf zero LLVM.select b xf =<< A.add xf (LLVM.value $ constFromInteger 1) -fractionLogical ::- (Fraction a, LLVM.IsScalarOrVector a, NumberOfElements a ~ D1,- IsInteger b, LLVM.IsScalarOrVector b, NumberOfElements b ~ D1) =>+_fractionLogical ::+ (Fraction a, LLVM.IsPrimitive a,+ IsInteger b, LLVM.IsPrimitive b) => (LLVM.FPPredicate -> Value a -> Value a -> CodeGenFunction r (Value b)) -> Value a -> CodeGenFunction r (Value a)-fractionLogical cmp x =+_fractionLogical cmp x = do xf <- signedFraction x b <- cmp LLVM.FPOLT xf zero A.sub xf =<< LLVM.inttofp b@@ -159,8 +126,7 @@ truncateToInt ::- (IsFloating a, IsInteger i,- NumberOfElements a ~ NumberOfElements i) =>+ (IsFloating a, IsInteger i, ShapeOf a ~ ShapeOf i) => Value a -> CodeGenFunction r (Value i) truncateToInt = LLVM.fptoint @@ -174,7 +140,7 @@ (IsFloating a, RationalConstant a, CmpRet a, IsInteger i, IntegerConstant i, CmpRet i, CmpResult a ~ CmpResult i,- NumberOfElements a ~ NumberOfElements i) =>+ ShapeOf a ~ ShapeOf i) => Value a -> CodeGenFunction r (Value i) roundToIntFast x = do pos <- A.cmp LLVM.CmpGT x zero@@ -185,7 +151,7 @@ (IsFloating a, CmpRet a, IsInteger i, IntegerConstant i, CmpRet i, CmpResult a ~ CmpResult i,- NumberOfElements a ~ NumberOfElements i) =>+ ShapeOf a ~ ShapeOf i) => Value a -> CodeGenFunction r (Value i) floorToInt x = do i <- truncateToInt x@@ -196,7 +162,7 @@ (IsFloating a, CmpRet a, IsInteger i, IntegerConstant i, CmpRet i, CmpResult a ~ CmpResult i,- NumberOfElements a ~ NumberOfElements i) =>+ ShapeOf a ~ ShapeOf i) => Value a -> CodeGenFunction r (Value i, Value a) splitFractionToInt x = do i <- floorToInt x@@ -207,7 +173,7 @@ (IsFloating a, CmpRet a, IsInteger i, IntegerConstant i, CmpRet i, CmpResult a ~ CmpResult i,- NumberOfElements a ~ NumberOfElements i) =>+ ShapeOf a ~ ShapeOf i) => Value a -> CodeGenFunction r (Value i) ceilingToInt x = do i <- truncateToInt x@@ -225,66 +191,7 @@ ratio = LLVM.value . constFromRational -type family Scalar vector :: * -type instance Scalar Float = Float-type instance Scalar Double = Double-type instance Scalar FP128 = FP128-type instance Scalar Bool = Bool-type instance Scalar Int8 = Int8-type instance Scalar Int16 = Int16-type instance Scalar Int32 = Int32-type instance Scalar Int64 = Int64-type instance Scalar Word8 = Word8-type instance Scalar Word16 = Word16-type instance Scalar Word32 = Word32-type instance Scalar Word64 = Word64-type instance Scalar (Vector n a) = a----class Replicate vector where- -- | an alternative is using the 'Vector.Constant' vector type- replicate :: Value (Scalar vector) -> CodeGenFunction r (Value vector)- replicateConst :: ConstValue (Scalar vector) -> ConstValue vector--instance Replicate Float where replicate = return; replicateConst = id;-instance Replicate Double where replicate = return; replicateConst = id;-instance Replicate FP128 where replicate = return; replicateConst = id;-instance Replicate Bool where replicate = return; replicateConst = id;-instance Replicate Int8 where replicate = return; replicateConst = id;-instance Replicate Int16 where replicate = return; replicateConst = id;-instance Replicate Int32 where replicate = return; replicateConst = id;-instance Replicate Int64 where replicate = return; replicateConst = id;-instance Replicate Word8 where replicate = return; replicateConst = id;-instance Replicate Word16 where replicate = return; replicateConst = id;-instance Replicate Word32 where replicate = return; replicateConst = id;-instance Replicate Word64 where replicate = return; replicateConst = id;-instance (TypeNum.Positive n, LLVM.IsPrimitive a) => Replicate (Vector n a) where-{- crashes LLVM-2.5, seems to be fixed in LLVM-2.6 -}- replicate x = do- v <- singleton x- LLVM.shufflevector v (LLVM.value LLVM.undef) LLVM.zero-{- crashes LLVM-2.5- replicate x = do- v <- LLVM.insertelement (LLVM.value LLVM.undef) x (valueOf 1)- LLVM.shufflevector v (LLVM.value LLVM.undef) (constVector $ repeat $ LLVM.constOf 1)--}-{- the (repeat zero) is also converted to 'zeroinitializer' and crashes LLVM compiler-- (constVector $ repeat LLVM.zero)--}-{-- replicate = Vector.replicate--}- replicateConst x = LLVM.constCyclicVector $ NonEmpty.Cons x []--singleton ::- (LLVM.IsPrimitive a) =>- Value a -> CodeGenFunction r (Value (Vector D1 a))-singleton x =- LLVM.insertelement (LLVM.value LLVM.undef) x (valueOf 0)- replicateOf :: (IsConst (Scalar v), Replicate v) => Scalar v -> Value v@@ -300,65 +207,27 @@ instance Real Float where- min = zipAutoWith A.min X86.minss- max = zipAutoWith A.max X86.maxss- abs = mapAuto A.abs X86.absss- -- abs x = max x =<< LLVM.neg x- -- abs x = A.abs+ min = Intrinsic.min+ max = Intrinsic.max+ abs = Intrinsic.abs signum = A.signum instance Real Double where- min = zipAutoWith A.min X86.minsd- max = zipAutoWith A.max X86.maxsd- abs = mapAuto A.abs X86.abssd+ min = Intrinsic.min+ max = Intrinsic.max+ abs = Intrinsic.abs signum = A.signum instance Real FP128 where- min = A.min- max = A.max- abs = A.abs+ min = Intrinsic.min+ max = Intrinsic.max+ abs = Intrinsic.abs signum x = do minusOne <- LLVM.inttofp $ LLVM.valueOf (-1 :: Int8) one <- LLVM.inttofp $ LLVM.valueOf ( 1 :: Int8) A.signumGen minusOne one x -infixl 1 `mapAuto`--{- |-There are functions that are intended for processing scalars-but have formally vector input and output.-This function breaks vector function down to a scalar function-by accessing the lowest vector element.--}-runScalar ::- (Vector.C v, Vector.C w, Size v ~ Size w) =>- (v -> CodeGenFunction r w) ->- (Element v -> CodeGenFunction r (Element w))-runScalar op a =- Vector.extract (valueOf 0)- =<< op- =<< Vector.insert (valueOf 0) a Class.undefTuple--mapAuto ::- (Vector.C v, Vector.C w, Size v ~ Size w) =>- (Element v -> CodeGenFunction r (Element w)) ->- Ext.T (v -> CodeGenFunction r w) ->- (Element v -> CodeGenFunction r (Element w))-mapAuto f g a =- Ext.run (f a) $- Ext.with g $ \op -> runScalar op a--zipAutoWith ::- (Vector.C u, Vector.C v, Vector.C w,- Size u ~ Size v, Size v ~ Size w) =>- (Element u -> Element v -> CodeGenFunction r (Element w)) ->- Ext.T (u -> v -> CodeGenFunction r w) ->- (Element u -> Element v -> CodeGenFunction r (Element w))-zipAutoWith f g =- curry $ mapAuto (uncurry f) (fmap uncurry g)-- instance Real Int8 where min = A.min; max = A.max; signum = A.signum; abs = A.abs; instance Real Int16 where min = A.min; max = A.max; signum = A.signum; abs = A.abs; instance Real Int32 where min = A.min; max = A.max; signum = A.signum; abs = A.abs;@@ -380,6 +249,50 @@ max = Vector.max abs = Vector.abs signum = Vector.signum+++class (IsInteger a) => Saturated a where+ addSat, subSat :: Value a -> Value a -> CodeGenFunction r (Value a)++instance Saturated Int8 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance Saturated Int16 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance Saturated Int32 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance Saturated Int64 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance Saturated Word8 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance Saturated Word16 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance Saturated Word32 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance Saturated Word64 where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance (TypeNum.Positive d) => Saturated (IntN d) where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance (TypeNum.Positive d) => Saturated (WordN d) where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;+instance+ (TypeNum.Positive n, LLVM.IsPrimitive a,+ Saturated a, Bounded a, CmpRet a, IsConst a) =>+ Saturated (Vector n a) where+ addSat = addSatProxy LP.Proxy; subSat = subSatProxy LP.Proxy;++addSatProxy, subSatProxy ::+ (IsInteger v, CmpRet v, Replicate v, ShapeOf v ~ shape,+ LLVM.ShapedType shape Bool ~ bv, ShapeOf bv ~ shape, CmpRet bv,+ Scalar v ~ a, IsConst a, Bounded a) =>+ LP.Proxy v -> Value v -> Value v -> CodeGenFunction r (Value v)+addSatProxy proxy =+ if LLVM.isSigned proxy+ then fromMaybe Priv.saddSat Intrinsic.maybeSAddSat+ else fromMaybe Priv.uaddSat Intrinsic.maybeUAddSat+subSatProxy proxy =+ if LLVM.isSigned proxy+ then fromMaybe Priv.ssubSat Intrinsic.maybeSSubSat+ else fromMaybe Priv.usubSat Intrinsic.maybeUSubSat
src/LLVM/Extra/Vector.hs view
@@ -29,9 +29,9 @@ insertChunk, modify, map, mapChunks, zipChunksWith,- chop, concat, select,+ chop, concat, signedFraction,- cumulate1, umul32to64,+ cumulate1, Arithmetic (sum, sumToPair, sumInterleavedToPair, cumulate, dotProduct, mul),@@ -40,13 +40,9 @@ truncate, floor, fraction), ) where -import qualified LLVM.Extra.Extension.X86Auto as X86A-import qualified LLVM.Extra.ExtensionCheck.X86 as X86C-import qualified LLVM.Extra.Extension.X86 as X86-import qualified LLVM.Extra.Extension as Ext- import qualified LLVM.Extra.Class as Class import qualified LLVM.Extra.ArithmeticPrivate as A+import qualified LLVM.Util.Intrinsic as Intrinsic import qualified LLVM.Core as LLVM import LLVM.Util.Loop (Phi(phis, addPhis), )@@ -58,7 +54,7 @@ CodeGenFunction, ) import qualified Type.Data.Num.Decimal as TypeNum-import Type.Data.Num.Decimal (D4, (:+:), )+import Type.Data.Num.Decimal ((:+:)) import qualified Control.Applicative as App import qualified Control.Monad.HT as M@@ -70,11 +66,9 @@ import qualified Data.Foldable as Fold import qualified Data.NonEmpty.Class as NonEmptyC import qualified Data.NonEmpty as NonEmpty-import qualified Data.Empty as Empty import qualified Data.List.HT as ListHT import qualified Data.List as List import Data.NonEmpty ((!:), )-import Data.Tuple.HT (uncurry3, ) -- import qualified Data.Bits as Bit import Data.Int (Int8, Int16, Int32, Int64, )@@ -582,7 +576,7 @@ else extractAll =<< g =<< assemble c assemble $ List.concat ds ++ d -zipChunks2With ::+_zipChunks2With :: (C ca, C cb, C cc, Size ca ~ Size cb, Size cb ~ Size cc, C la, C lb, C lc, Size la ~ Size lb, Size lb ~ Size lc, C va, C vb, C vc, Size va ~ Size vb, Size vb ~ Size vc,@@ -592,37 +586,11 @@ (ca -> cb -> CodeGenFunction r cc) -> (la -> lb -> CodeGenFunction r lc) -> (va -> vb -> CodeGenFunction r vc)-zipChunks2With f g a b =+_zipChunks2With f g a b = mapChunks2 (uncurry f) (uncurry g) (a,b) -infixl 1 `withRound` -withRound ::- (IsPrimitive a, IsPrimitive b,- TypeNum.Positive k, TypeNum.Positive m, TypeNum.Positive n) =>- CodeGenFunction r x ->- Ext.T (Value (Vector m a) -> Value Word32 -> CodeGenFunction r (Value (Vector m b))) ->- Ext.T (Value (Vector k a) -> Value Word32 -> CodeGenFunction r (Value (Vector k b))) ->- (Value (Vector n b) -> CodeGenFunction r x) ->- Word32 ->- Value (Vector n a) -> CodeGenFunction r x-withRound generic roundSmallExt _roundLargeExt post mode x =- generic- `Ext.run`- (Ext.with roundSmallExt $ \round ->- post =<< mapChunks (flip round (valueOf mode)) x)-{- crashes LLVM-3.1 in JIT mode-Stack dump:-0. Running pass 'X86 DAG->DAG Instruction Selection' on function '@_fun1'-segmentation fault-- `Ext.run`- (Ext.with2 roundSmallExt roundLargeExt $ \round roundLarge ->- post =<< mapChunks2 (flip round (valueOf mode)) (flip roundLarge (valueOf mode)) x)--}-- {- | Ideally on ix86 with SSE41 this would be translated to 'dpps'. -}@@ -692,7 +660,7 @@ getLowestPair ::- (TypeNum.Positive n) =>+ (TypeNum.Positive n, IsPrimitive a) => Value (Vector n a) -> CodeGenFunction r (Value a, Value a) getLowestPair x =@@ -819,35 +787,7 @@ (takeWhile (<sizeInTuple x) $ List.iterate (2*) 1) --inttofp ::- (TypeNum.Positive n,- IsPrimitive a, IsPrimitive b,- LLVM.IsInteger a, IsFloating b) =>- Value (Vector n a) -> CodeGenFunction r (Value (Vector n b))-inttofp = LLVM.inttofp- {--Can be used for both integer and float types,-but we need it only for Float types,-because LLVM produces ugly code for Float and even more ugly code for Double.--}-signumLogical ::- (TypeNum.Positive n,- IsPrimitive a, IsPrimitive b, IsArithmetic b) =>- (Value (Vector n a) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n b))) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n b))-signumLogical gt x = do- let zero = LLVM.value LLVM.zero- negative <- gt zero x- positive <- gt x zero- A.sub negative positive---{- {- | This one does not use vectorized select. Cf. the outcommented signumInt.@@ -895,7 +835,7 @@ let zero = LLVM.value LLVM.zero negative <- LLVM.sadapt =<< A.cmp LLVM.CmpLT x zero positive <- LLVM.sadapt =<< A.cmp LLVM.CmpGT x zero- A.sub positive negative+ A.sub negative positive signumWordGeneric :: (TypeNum.Positive n,@@ -928,210 +868,7 @@ signedFraction x = A.sub x =<< truncate x -floorGeneric ::- (IsFloating a, IsConst a, Real a, TypeNum.Positive n) =>- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-floorGeneric = floorLogical A.fcmp -{- |-On LLVM-2.6 and X86 this produces branch-free-but even slower code than 'fractionSelect',-since the comparison to booleans and-back to a floating point number is translated literally-to elementwise comparison, conversion to a 0 or -1 byte-and then to a floating point number.--}-fractionGeneric ::- (IsFloating a, IsConst a, Real a, TypeNum.Positive n) =>- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-fractionGeneric = fractionLogical A.fcmp---{--These should be replaced by A.min, A.max, A.abs-when they work, eventually.--}-class (LLVM.IsSized a, LLVM.IsSized (Mask a),- LLVM.SizeOf a ~ LLVM.SizeOf (Mask a),- LLVM.IsPrimitive a, LLVM.IsPrimitive (Mask a),- LLVM.IsInteger (Mask a)) =>- Maskable a where- type Mask a :: *--instance Maskable Int8 where type Mask Int8 = Int8-instance Maskable Int16 where type Mask Int16 = Int16-instance Maskable Int32 where type Mask Int32 = Int32-instance Maskable Int64 where type Mask Int64 = Int64-instance Maskable Word8 where type Mask Word8 = Int8-instance Maskable Word16 where type Mask Word16 = Int16-instance Maskable Word32 where type Mask Word32 = Int32-instance Maskable Word64 where type Mask Word64 = Int64-instance Maskable Float where type Mask Float = Int32-instance Maskable Double where type Mask Double = Int64--makeMask ::- (Maskable a, TypeNum.Positive n) =>- Value (Vector n a) ->- Value (Vector n Bool) ->- CodeGenFunction r (Value (Vector n (Mask a)))-makeMask _ = LLVM.sadapt---minGeneric, maxGeneric ::- (IsConst a, Real a, Maskable a, TypeNum.Positive n) =>- Value (Vector n a) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))--minGeneric x y = do- b <- makeMask x =<< A.cmp LLVM.CmpLT x y- selectLogical b x y--maxGeneric x y = do- b <- makeMask x =<< A.cmp LLVM.CmpGT x y- selectLogical b x y--absGeneric ::- (IsConst a, Real a, Maskable a, TypeNum.Positive n) =>- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-absGeneric x =- maxGeneric x =<< LLVM.neg x--absAuto ::- (TypeNum.Positive n, TypeNum.Positive m, TypeNum.Positive k,- IsConst a, Real a, Maskable a) =>- Ext.T (Value (Vector m a) -> CodeGenFunction r (Value (Vector m a))) ->- Ext.T (Value (Vector k a) -> CodeGenFunction r (Value (Vector k a))) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-absAuto byChunk byLargeChunk x =- absGeneric x- `Ext.run`- (Ext.with byChunk $ \f -> mapChunks f x)- `Ext.run`- (Ext.with2 byChunk byLargeChunk $- \ f g -> mapChunks2 f g x)---{- |-LLVM.select on boolean vectors cannot be translated to X86 code in LLVM-2.6,-thus I code my own version that calls select on all elements.-This is slow but works.-When this issue is fixed, this function will be replaced by LLVM.select.--}-select ::- (LLVM.IsFirstClass a, IsPrimitive a, TypeNum.Positive n,- LLVM.CmpRet a, LLVM.CmpResult a ~ Bool) =>- Value (Vector n Bool) ->- Value (Vector n a) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-select b x y =- map (uncurry3 LLVM.select) (b, x, y)--{- |-'floor' implemented using 'select'.-This will need jumps.--}-_floorSelect ::- (Num a, IsFloating a, IsConst a, Real a, TypeNum.Positive n) =>- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-_floorSelect x =- do xr <- truncate x- b <- A.fcmp LLVM.FPOLE xr x- select b xr =<< A.sub xr =<< replicate (valueOf 1)--{- |-'fraction' implemented using 'select'.-This will need jumps.--}-_fractionSelect ::- (Num a, IsFloating a, IsConst a, Real a, TypeNum.Positive n) =>- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-_fractionSelect x =- do xf <- signedFraction x- b <- A.fcmp LLVM.FPOGE xf (value LLVM.zero)- select b xf =<< A.add xf =<< replicate (valueOf 1)---{- |-Another implementation of 'select',-this time in terms of binary logical operations.-The selecting integers must be-(-1) for selecting an element from the first operand-and 0 for selecting an element from the second operand.-This leads to optimal code.--On SSE41 this could be done with blendvps or blendvpd.--}-selectLogical ::- (LLVM.IsFirstClass a, IsPrimitive a,- LLVM.IsInteger i, IsPrimitive i,- LLVM.IsSized a, LLVM.IsSized i,- LLVM.SizeOf a ~ LLVM.SizeOf i,- TypeNum.Positive n) =>- Value (Vector n i) ->- Value (Vector n a) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-selectLogical b x y = do--- bneg <- A.xor b- bneg <- LLVM.inv b- xm <- A.and b =<< LLVM.bitcastElements x- ym <- A.and bneg =<< LLVM.bitcastElements y- LLVM.bitcastElements =<< A.or xm ym---floorLogical ::- (IsFloating a, IsConst a, Real a,- IsPrimitive i, LLVM.IsInteger i, TypeNum.Positive n) =>- (LLVM.FPPredicate ->- Value (Vector n a) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n i))) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-floorLogical cmp x =- do xr <- truncate x- b <- cmp LLVM.FPOGT xr x- A.add xr =<< LLVM.sitofp b--fractionLogical ::- (IsFloating a, IsConst a, Real a,- IsPrimitive i, LLVM.IsInteger i, TypeNum.Positive n) =>- (LLVM.FPPredicate ->- Value (Vector n a) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n i))) ->- Value (Vector n a) ->- CodeGenFunction r (Value (Vector n a))-fractionLogical cmp x =- do xf <- signedFraction x- b <- cmp LLVM.FPOLT xf (value LLVM.zero)- A.sub xf =<< LLVM.sitofp b---order ::- (TypeNum.Positive n, TypeNum.Positive m, TypeNum.Positive k,- LLVM.IsFirstClass a, IsPrimitive a) =>- (Value (Vector n a) -> Value (Vector n a) -> CodeGenFunction r (Value (Vector n a))) ->- Ext.T (Value (Vector m a) -> Value (Vector m a) -> CodeGenFunction r (Value (Vector m a))) ->- Ext.T (Value (Vector k a) -> Value (Vector k a) -> CodeGenFunction r (Value (Vector k a))) ->- (Value (Vector n a) -> Value (Vector n a) -> CodeGenFunction r (Value (Vector n a)))-order f byChunk byLargeChunk x y =- f x y- `Ext.run`- (Ext.with byChunk $ \psel -> zipChunksWith psel x y)- `Ext.run`- (Ext.with2 byChunk byLargeChunk $- \ psel plsel -> zipChunks2With psel plsel x y)-- -- * target independent functions with target dependent optimizations {- |@@ -1190,77 +927,6 @@ mul = A.mul instance Arithmetic Float where- sum x =- Ext.runWhen (size x >= 4) (sumGeneric x) $- Ext.with X86A.haddps $ \haddp ->- {-- We can make use of the following facts:- SSE3 has Float vectors of size 4,- there is an instruction for horizontal add.- -}- do chunkSum <-- foldl1 (M.liftJoin2 A.add) $ chop x- y <- haddp chunkSum (value undef)- z <- haddp y (value undef)-{-- y <- haddp chunkSum chunkSum- z <- haddp y y--}- extractelement z (valueOf 0)-- sumToPair x =- Ext.runWhen (size x >= 4) (getLowestPair x) $- Ext.with X86A.haddps $ \haddp ->- let {-- reduce ::- [CodeGenFunction r (Value (Vector D4 Float))] ->- [CodeGenFunction r (Value (Vector D4 Float))]- -}- reduce [] = []- reduce [_] = error "vector must have size power of two"- reduce (x0:x1:xs) =- M.liftJoin2 haddp x0 x1 : reduce xs- go [] = error "vector must not be empty"- go [c] =- getLowestPair- =<< flip haddp (value undef)- =<< c- go cs = go (reduce cs)- in go $ chop x--{--The haddps based implementation cumulate is slower than the generic one.-However, one day the x86 processors may implement a cumulative sum-which we could employ with this frame.-- cumulate a x =- Ext.runWhen (size x >= 4) (cumulateGeneric a x) $- Ext.with X86.cumulate1s $ \cumulate1s -> do- (b,ys) <-- foldr- (\chunk0 cont a0 -> do- (a1,chunk1) <- cumulateFrom1 cumulate1s a0 =<< chunk0- fmap (mapSnd (chunk1:)) (cont a1))- (\a0 -> return (a0,[]))- (chop x)- a- y <- concat ys- return (b,y)--}-- dotProduct x y =- Ext.run (sum =<< A.mul x y) $- Ext.with X86A.dpps $ \dpp ->- foldl1 (M.liftJoin2 A.add) $- List.zipWith- (\mx my -> do- cx <- mx- cy <- my- flip extractelement (valueOf 0)- =<< dpp cx cy (valueOf 0xF1))- (chop x)- (chop y)- instance Arithmetic Double where instance Arithmetic Int8 where@@ -1269,105 +935,12 @@ instance Arithmetic Int64 where instance Arithmetic Word8 where instance Arithmetic Word16 where+instance Arithmetic Word32 where instance Arithmetic Word64 where -instance Arithmetic Word32 where- mul x y =- A.mul x y- `Ext.run`- (Ext.with X86A.pmuludq128 $ \pmul ->- zipChunksWith- (\cx cy -> do- evenX <- shuffleMatchPlain1 cx- (constVector4 (constOf 0, undef, constOf 2, undef))- evenY <- shuffleMatchPlain1 cy- (constVector4 (constOf 0, undef, constOf 2, undef))- evenZ64 <- pmul evenX evenY- evenZ <- LLVM.bitcast evenZ64- oddX <- shuffleMatchPlain1 cx- (constVector4 (constOf 1, undef, constOf 3, undef))- oddY <- shuffleMatchPlain1 cy- (constVector4 (constOf 1, undef, constOf 3, undef))- oddZ64 <- pmul oddX oddY- oddZ <- LLVM.bitcast oddZ64- shuffleMatchPlain2 evenZ oddZ- (constVector4 (constOf 0, constOf 4, constOf 2, constOf 6)))- x y)- `Ext.run`- Ext.wrap X86C.sse41 (A.mul x y) -umul32to64 ::- (TypeNum.Positive n) =>- Value (Vector n Word32) ->- Value (Vector n Word32) ->- CodeGenFunction r (Value (Vector n Word64))-umul32to64 x y =- (do x64 <- map LLVM.zext x- y64 <- map LLVM.zext y- A.mul x64 y64)- `Ext.run`- (Ext.with X86A.pmuludq128 $ \pmul ->- zipChunksWith- -- save an initial shuffle- (\cx cy -> do- evenX <- shuffleMatchPlain1 cx- (constVector4 (constOf 0, undef, constOf 2, undef))- evenY <- shuffleMatchPlain1 cy- (constVector4 (constOf 0, undef, constOf 2, undef))- evenZ <- pmul evenX evenY- oddX <- shuffleMatchPlain1 cx- (constVector4 (constOf 1, undef, constOf 3, undef))- oddY <- shuffleMatchPlain1 cy- (constVector4 (constOf 1, undef, constOf 3, undef))- oddZ <- pmul oddX oddY-{-- shuffleMatchPlain2 evenZ oddZ- (constVector4 (constOf 0, constOf 2, constOf 1, constOf 3))--}- assemble =<< (sequence $- extract (valueOf 0) evenZ :- extract (valueOf 0) oddZ :- extract (valueOf 1) evenZ :- extract (valueOf 1) oddZ :- []) :: CodeGenFunction r (Value (Vector D4 Word64)))-{-- -- save the final shuffle- (\cx cy -> do- lowerX <- shuffleMatchPlain1 cx- (constVector4 (constOf 0, undef, constOf 1, undef))- lowerY <- shuffleMatchPlain1 cy- (constVector4 (constOf 0, undef, constOf 1, undef))- lowerZ <- pmul lowerX lowerY- upperX <- shuffleMatchPlain1 cx- (constVector4 (constOf 2, undef, constOf 3, undef))- upperY <- shuffleMatchPlain1 cy- (constVector4 (constOf 2, undef, constOf 3, undef))- upperZ <- pmul upperX upperY-{-- shuffleMatchPlain2 lowerZ upperZ- (constVector4 (constOf 0, constOf 1, constOf 2, constOf 3))--}- concat [lowerZ, upperZ])--}- x y)---constVector4 ::- (IsConst a) =>- (ConstValue a, ConstValue a, ConstValue a, ConstValue a) ->- ConstValue (Vector D4 a)-constVector4 (a,b,c,d) =- LLVM.constVector $ a!:b!:c!:d!:Empty.Cons---{- |-Attention:-The rounding and fraction functions only work-for floating point values with maximum magnitude of @maxBound :: Int32@.-This way we save expensive handling of possibly seldom cases.--}-class (Arithmetic a, LLVM.CmpRet a, LLVM.CmpResult a ~ Bool, IsConst a) =>+class (Arithmetic a, LLVM.CmpRet a, LLVM.IsPrimitive a, IsConst a) => Real a where min, max :: (TypeNum.Positive n) =>@@ -1391,165 +964,62 @@ CodeGenFunction r (Value (Vector n a)) instance Real Float where- min = order minGeneric X86A.minps X86A.minps256- max = order maxGeneric X86A.maxps X86A.maxps256- abs x = Ext.run (absGeneric x) (Ext.with X86.absps ($x))- signum x =- signumFloatGeneric x- `Ext.run`- (Ext.with X86.cmpps $ \cmp ->- inttofp =<< mapChunks (signumLogical (cmp LLVM.FPOGT)) x)-{- crashes LLVM-3.1 in JIT mode-Stack dump:-0. Running pass 'X86 DAG->DAG Instruction Selection' on function '@_fun1'-segmentation fault-- `Ext.run`- (Ext.with X86.cmpps256 $ \cmp ->- mapChunks (signumLogical- (\a b -> LLVM.sitofp =<< cmp LLVM.FPOGT a b)) x)--}-{- crashes LLVM-3.1 in JIT mode- only efficient in AVX2, where large integer vector subtraction is available- `Ext.run`- (Ext.with X86.cmpps256 $ \cmp ->- inttofp =<< mapChunks (signumLogical (cmp LLVM.FPOGT)) x)--}- {-- An IEEE specific implementation could do some bit manipulation:- s eeeeeeee mmmmmmmmmmmmmmmmmmmmmmm- Generate a pure power of two by clearing mantissa:- s eeeeeeee 00000000000000000000000- Now subtract 1 in order to get the required bit mask for the mantissa- s eeeeeeee 11111111110000000000000- multiply with 2 in order to correct exponent- and then do bitwise AND of the mask with the original number.- This method only works for numbers from 1 to 2^23-1,- that is the range is even more smaller- than that for the rounding via Int32.- -}- truncate x =- withRound- ((LLVM.inttofp .- (id :: Value (Vector n Int32) -> Value (Vector n Int32))- <=< LLVM.fptoint) x)- X86A.roundps X86A.roundps256 return 3 x- floor x =- withRound- (floorGeneric x- `Ext.run`- (Ext.with X86.cmpps $ \cmp ->- mapChunks (floorLogical cmp) x)-{- LLVM-2.6 rearranges the MXCSR manipulations in an invalid way- `Ext.run`- (Ext.with2 (X86.withMXCSR (Bit.shiftL 1 13)) X86.cvtps2dq $- \ with cvtps2dq -> with $- LLVM.inttofp =<< mapChunks cvtps2dq x)--}- )- X86A.roundps X86A.roundps256 return 1 x- fraction x =- withRound- (fractionGeneric x- `Ext.run`- (Ext.with X86.cmpps $ \cmp ->- mapChunks (fractionLogical cmp) x)-{-- `Ext.run`- (Ext.with2 (X86.withMXCSR (Bit.shiftL 1 13)) X86.cvtps2dq $- \ with cvtps2dq -> with $- A.sub x =<< LLVM.inttofp =<< mapChunks cvtps2dq x)--}- )- X86A.roundps X86A.roundps256 (A.sub x) 1 x+ min = Intrinsic.min+ max = Intrinsic.max+ abs = Intrinsic.abs+ signum = signumFloatGeneric+ truncate = Intrinsic.truncate+ floor = Intrinsic.floor+ fraction = A.fraction instance Real Double where- min = order minGeneric X86A.minpd X86A.minpd256- max = order maxGeneric X86A.maxpd X86A.maxpd256- abs x = Ext.run (absGeneric x) (Ext.with X86.abspd ($x))- signum x =- signumFloatGeneric x- `Ext.run`- (Ext.with2 X86.cmppd X86A.cvtdq2pd $ \cmp tofp ->- mapChunks (signumLogical- (\a b -> do- c <- LLVM.bitcast =<< cmp LLVM.FPOGT a b- c0 <- extract (valueOf 0) (c :: Value (Vector D4 Int32))- c1 <- extract (valueOf 2) c- tofp =<< assemble [c0,c1])) x)-{- crashes LLVM-3.1 in JIT mode- `Ext.run`- -- we could still optimize using mapChunks2- (Ext.with2 X86.cmppd256 X86A.cvtdq2pd256 $ \cmp tofp ->- mapChunks (signumLogical- (\a b -> do- c <- LLVM.bitcast =<< cmp LLVM.FPOGT a b- c0 <- extract (valueOf 0) (c :: Value (Vector D8 Int32))- c1 <- extract (valueOf 2) c- c2 <- extract (valueOf 4) c- c3 <- extract (valueOf 6) c- tofp =<< assemble [c0,c1,c2,c3])) x)--}- truncate x =- withRound- ((LLVM.inttofp .- (id :: Value (Vector n Int64) -> Value (Vector n Int64))- <=< LLVM.fptoint) x)- X86A.roundpd X86A.roundpd256 return 3 x- floor x =- withRound- (floorGeneric x- `Ext.run`- (Ext.with X86.cmppd $ \cmp ->- mapChunks (floorLogical cmp) x))- X86A.roundpd X86A.roundpd256 return 1 x- fraction x =- withRound- (fractionGeneric x- `Ext.run`- (Ext.with X86.cmppd $ \cmp ->- mapChunks (fractionLogical cmp) x))- X86A.roundpd X86A.roundpd256 (A.sub x) 1 x+ min = Intrinsic.min+ max = Intrinsic.max+ abs = Intrinsic.abs+ signum = signumFloatGeneric+ truncate = Intrinsic.truncate+ floor = Intrinsic.floor+ fraction = A.fraction instance Real Int8 where- min = order minGeneric X86A.pminsb128 X86A.pminsb256- max = order maxGeneric X86A.pmaxsb128 X86A.pmaxsb256- abs = absAuto X86A.pabsb128 X86A.pabsb256+ min = A.min+ max = A.max+ abs = A.abs signum = signumIntGeneric truncate = return floor = return fraction = const $ return (value LLVM.zero) instance Real Int16 where- min = order minGeneric X86A.pminsw128 X86A.pminsw256- max = order maxGeneric X86A.pmaxsw128 X86A.pmaxsw256- abs = absAuto X86A.pabsw128 X86A.pabsw256+ min = A.min+ max = A.max+ abs = A.abs signum = signumIntGeneric truncate = return floor = return fraction = const $ return (value LLVM.zero) instance Real Int32 where- min = order minGeneric X86A.pminsd128 X86A.pminsd256- max = order maxGeneric X86A.pmaxsd128 X86A.pmaxsd256- abs = absAuto X86A.pabsd128 X86A.pabsd256+ min = A.min+ max = A.max+ abs = A.abs signum = signumIntGeneric truncate = return floor = return fraction = const $ return (value LLVM.zero) instance Real Int64 where- min = minGeneric- max = maxGeneric- abs = absGeneric+ min = A.min+ max = A.max+ abs = A.abs signum = signumIntGeneric truncate = return floor = return fraction = const $ return (value LLVM.zero) instance Real Word8 where- min = order minGeneric X86A.pminub128 X86A.pminub256- max = order maxGeneric X86A.pmaxub128 X86A.pmaxub256+ min = A.min+ max = A.max abs = return signum = signumWordGeneric truncate = return@@ -1557,8 +1027,8 @@ fraction = const $ return (value LLVM.zero) instance Real Word16 where- min = order minGeneric X86A.pminuw128 X86A.pminuw256- max = order maxGeneric X86A.pmaxuw128 X86A.pmaxuw256+ min = A.min+ max = A.max abs = return signum = signumWordGeneric truncate = return@@ -1566,8 +1036,8 @@ fraction = const $ return (value LLVM.zero) instance Real Word32 where- min = order minGeneric X86A.pminud128 X86A.pminud256- max = order maxGeneric X86A.pmaxud128 X86A.pmaxud256+ min = A.min+ max = A.max abs = return signum = signumWordGeneric truncate = return@@ -1575,8 +1045,8 @@ fraction = const $ return (value LLVM.zero) instance Real Word64 where- min = minGeneric- max = maxGeneric+ min = A.min+ max = A.max abs = return signum = signumWordGeneric truncate = return
− src/PrepareIntrinsics.hs
@@ -1,326 +0,0 @@-{-# LANGUAGE DeriveFunctor #-}-{-# LANGUAGE DeriveFoldable #-}-{-# LANGUAGE DeriveTraversable #-}-{- |-Parse an Intrinsics file and generate a Haskell interface to every intrinsic.-This is currently only tested and used for IntrinsicsX86.td-and relies on the flat structure of IntrinsicsX86.td.-In contrast to that, IntrinsicsPowerPC.td uses custom classes-and thus cannot be processed by this program.--A safer way would be to invoke the llvm-tblgen utility in some way.--1. We could write some Haskell or C++ code,- that queries the intrinsics from the include/llvm/Intrinsics.h interface.--2. We could write a custom variant of llvm-tblgen- with a back-end that creates the Haskell interface for intrinsics.- This can be written in C++ or- we have to call the TableGen library functions from Haskell somehow.--3. We could ask llvm-tblgen for a list of all records and parse its output.- This requires no C++ coding,- but we rely on the output format of @-print-records@.-- > llvm-tblgen -I /usr/local/llvm-3.1/include /usr/local/llvm-3.1/include/llvm/Intrinsics.td -print-records--}-module Main where--import qualified Text.ParserCombinators.Parsec.Token as T-import qualified Text.ParserCombinators.Parsec.Language as L-import qualified Text.ParserCombinators.Parsec as Parsec-import Text.ParserCombinators.Parsec (CharParser, (<|>), )--import qualified Control.Monad.Trans.Writer as MW-import qualified Data.Map as M-import qualified Data.Set as S--import qualified Data.Traversable as Trav-import qualified Data.Foldable as Fold-import qualified Data.List.HT as ListHT-import qualified Data.List as List-import qualified Data.Char as Char-import Control.Monad (mzero, )-import Control.Functor.HT (void, )-import Data.Maybe (fromMaybe, )--import qualified System.IO as IO---data Intrinsic typ = Intrinsic Name Name (FunctionType typ)- deriving (Show, Functor, Fold.Foldable, Trav.Traversable)--data FunctionType typ = FunctionType [typ] [typ]- deriving (Show, Functor, Fold.Foldable, Trav.Traversable)--type Name = String--data QualName = QualName String String String--newtype LLVMType = LLVMType String- deriving (Show)--newtype HaskellType = HaskellType {haskellTypeDecons :: String}- deriving (Show, Eq, Ord)---gccBuiltinPrefix :: String-gccBuiltinPrefix = "__builtin_ia32_"--unsignedFunctions :: S.Set String-unsignedFunctions = S.fromList $ map (gccBuiltinPrefix++) $- "packusdw128" :- "packusdw256" :- "packuswb128" :- "packuswb256" :- "paddusb128" :- "paddusb256" :- "paddusw128" :- "paddusw256" :- "phminposuw128" :- "pmaddubsw128" :- "pmaddubsw256" :- "pmaxub128" :- "pmaxub256" :- "pmaxud128" :- "pmaxud256" :- "pmaxuw128" :- "pmaxuw256" :- "pminub128" :- "pminub256" :- "pminud128" :- "pminud256" :- "pminuw128" :- "pminuw256" :- "pmulhuw128" :- "pmulhuw256" :- "pmuludq128" :- "pmuludq256" :- "psubusb128" :- "psubusb256" :- "psubusw128" :- "psubusw256" :- "vphaddubd" :- "vphaddubq" :- "vphaddubw" :- "vphaddudq" :- "vphadduwd" :- "vphadduwq" :- -- it's only the flag set that is unsigned- -- the floating point operands are always signed- "roundps" :- "roundpd" :- "roundps256" :- "roundpd256" :- "roundss" :- "roundsd" :- "cmpps" :- "cmppd" :- "cmpps256" :- "cmppd256" :- "cmpss" :- "cmpsd" :- []--translateType ::- Bool -> LLVMType ->- MW.Writer (M.Map HaskellType HaskellType) HaskellType-translateType signed (LLVMType llvmTypeStr) =- let formatQType (mqual, typ) =- maybe "" (++".") mqual ++ typ- returnType shortType longType = do- MW.tell (M.singleton shortType longType)- return shortType- composedType = do- vec <- Parsec.optionMaybe $ do- void $ Parsec.char 'v'- Parsec.many1 Parsec.digit- prim <- Parsec.choice $- (do void $ Parsec.char 'i'- fmap- (\n ->- if signed- then (Just "I", "Int"++n)- else (Just "W", "Word"++n)) $- Parsec.many1 Parsec.digit) :- (do void $ Parsec.char 'f'- n <- Parsec.many1 Parsec.digit- case n of- "32" -> return (Nothing, "Float")- "64" -> return (Nothing, "Double")- _ -> return $ (Just "LLVM", "FP" ++ n)) :- []- return $- case vec of- Nothing -> return $ HaskellType $ "LLVM.Value " ++ formatQType prim- Just d ->- returnType- (HaskellType $ "V" ++ d ++ snd prim)- (HaskellType $- "LLVM.Value (LLVM.Vector TypeNum.D" ++- d ++ " " ++ formatQType prim ++ ")")- p = do- void $ Parsec.string "llvm_"- haskType <- Parsec.choice $- (Parsec.string "x86mmx" >>- return (returnType (HaskellType "MMX") (HaskellType "LLVM.Value (LLVM.Vector TypeNum.D8 W.Word8)"))) :- (Parsec.string "ptr" >>- return (return (HaskellType "LLVM.Value (Ptr ())"))) :- composedType :- []- void $ Parsec.string "_ty"- return haskType- in case Parsec.parse p "" llvmTypeStr of- Left _msg ->- let typeSyn = HaskellType $- case llvmTypeStr of- c:cs -> Char.toUpper c : cs- _ -> ""- in do- MW.tell (M.singleton typeSyn (HaskellType "LLVM.Value ()"))- return typeSyn- Right act -> act--splitName :: Name -> QualName-splitName name =- let p = do- void $ Parsec.string "int_"- arch <- Parsec.many1 Parsec.alphaNum- void $ Parsec.char '_'- feature <- Parsec.many1 Parsec.alphaNum- void $ Parsec.char '_'- stem <- Parsec.many1 Parsec.anyChar- return $ QualName arch feature stem- in case Parsec.parse p "" name of- Left _msg -> QualName "" "" name- Right qname -> qname--featureMap :: M.Map String String-featureMap = M.fromList $- ("sse", "sse1") :- ("aesni", "aes") :- ("3dnow", "amd3dnow") :- ("3dnowa", "amd3dnowa") :- []--formatIntrinsicInHaskell :: Intrinsic HaskellType -> String-formatIntrinsicInHaskell- (Intrinsic name gccblt (FunctionType parameters results)) =- let (QualName _arch feature stem) = splitName name- dotStem = map (\c -> case c of '_' -> '.'; _ -> c) stem- haskName =- fromMaybe gccblt $- ListHT.maybePrefixOf gccBuiltinPrefix gccblt- resultStr =- if null results- then "LLVM.Value ()"- else List.intercalate ", " $ map haskellTypeDecons results- in unlines $- (haskName ++ " :: Ext.T (" ++- concatMap (\(HaskellType typ) -> typ ++ " -> ") parameters ++- "LLVM.CodeGenFunction r (" ++ resultStr ++ "))") :- (haskName ++ " = Ext.intrinsic ExtX86." ++- M.findWithDefault feature feature featureMap ++- " " ++ show dotStem) :- []--convertIntrinsics :: [Intrinsic LLVMType] -> String-convertIntrinsics intrinsics =- unlines $- "{- Do not edit! This file was created with the PrepareIntrinsics tool. -}" :- "module LLVM.Extra.Extension.X86Auto where" :- "" :- "import qualified LLVM.Extra.Extension as Ext" :- "import qualified LLVM.Extra.ExtensionCheck.X86 as ExtX86" :- "import qualified LLVM.Core as LLVM" :- "import qualified Type.Data.Num.Decimal as TypeNum" :- "import qualified Data.Int as I" :- "import qualified Data.Word as W" :- "import Foreign.Ptr (Ptr, )" :- "" :- case MW.runWriter $- mapM (\intr@(Intrinsic _ gccblt _) ->- Trav.traverse (translateType (not $ S.member gccblt unsignedFunctions)) intr) $- filter (\(Intrinsic _ gccblt _) -> not $ null gccblt) intrinsics of- (funcs, types) ->- (map (\(HaskellType short, HaskellType long) ->- "type " ++ short ++ " = " ++ long) $- M.toList types) ++- "" :- (map formatIntrinsicInHaskell funcs)--lexer :: T.TokenParser st-lexer =- T.makeTokenParser $ L.emptyDef {- L.commentStart = "/*",- L.commentEnd = "*/",- L.commentLine = "//",- L.nestedComments = False,- L.identStart = identifierStart,- L.identLetter = identifierLetter,- L.opStart = mzero,- L.opLetter = mzero,- L.caseSensitive = True,- L.reservedNames = [ "let", "def", "in" ],- L.reservedOpNames = [ "=", ":", "," ]- }--identifierStart, identifierLetter :: CharParser st Char-identifierStart = Parsec.letter <|> Parsec.char '_'--identifierLetter =- Parsec.alphaNum <|> Parsec.char '_' <|> Parsec.char '.'---gccBuiltin :: CharParser st String-gccBuiltin = do- T.reserved lexer "GCCBuiltin"- T.angles lexer $ T.stringLiteral lexer--llvmType :: CharParser st LLVMType-llvmType = fmap LLVMType $ T.identifier lexer--intrinsic :: CharParser st (FunctionType LLVMType)-intrinsic =- Parsec.between (T.reserved lexer "Intrinsic") (T.semi lexer) $- T.angles lexer $ do- results <- T.brackets lexer $ T.commaSep lexer llvmType- void $ T.comma lexer- parameters <- T.brackets lexer $ T.commaSep lexer llvmType- Parsec.optional $ do- void $ T.comma lexer- _attributes <- T.brackets lexer $ T.commaSep lexer $ T.identifier lexer- return ()- return $ FunctionType parameters results--letBlock :: CharParser st [Intrinsic LLVMType]-letBlock = do- T.reserved lexer "let"- T.reserved lexer "TargetPrefix"- void $ T.symbol lexer "="- _prefix <- T.stringLiteral lexer- T.reserved lexer "in"- T.braces lexer $ Parsec.many $ do- T.reserved lexer "def"- name <- T.identifier lexer- void $ T.colon lexer- gccblt <- Parsec.option "" $ do- gccblt <- gccBuiltin- void $ T.comma lexer- return gccblt- intr <- intrinsic- return $ Intrinsic name gccblt intr--parser :: CharParser st [Intrinsic LLVMType]-parser =- fmap concat $ Parsec.many1 letBlock--main :: IO ()-main = do- parsed <-- Parsec.parseFromFile (T.whiteSpace lexer >> parser)- "/usr/local/llvm-3.8/include/llvm/IR/IntrinsicsX86.td"- case parsed of- Left msg -> IO.hPutStrLn IO.stderr $ show msg- Right intrinsics ->- writeFile "src/LLVM/Extra/Extension/X86Auto.hs" $ convertIntrinsics intrinsics
+ test/LLVM/Extra/VectorAlt.hs view
@@ -0,0 +1,224 @@+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE FlexibleContexts #-}+{- |+This maintains old code for LLVM-2.6+where vector comparison and select on X86+did not work or generated cumbersome assembly code.+It may still be useful for testing.+-}+module LLVM.Extra.VectorAlt where++import qualified LLVM.Extra.Vector as Vector+import qualified LLVM.Extra.Arithmetic as A++import qualified LLVM.Util.Intrinsic as Intrinsic+import qualified LLVM.Core.Guided as Guided+import qualified LLVM.Core as LLVM+import LLVM.Core+ (CodeGenFunction, Value, valueOf, value, Vector,+ CmpRet, IsConst, IsArithmetic, IsFloating, IsPrimitive)++import qualified Type.Data.Num.Decimal as TypeNum++import Data.Tuple.HT (uncurry3, )++import Data.Int (Int8, Int16, Int32, Int64, )+import Data.Word (Word8, Word16, Word32, Word64, )++import Prelude hiding (max, min, abs, signum, floor, truncate)++++{-+Can be used for both integer and float types,+but we need it only for Float types,+because LLVM produces ugly code for Float and even more ugly code for Double.+-}+signum ::+ (TypeNum.Positive n,+ IsPrimitive a, IsPrimitive b, IsArithmetic b) =>+ (Value (Vector n a) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n b))) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n b))+signum gt x = do+ let zero = LLVM.value LLVM.zero+ negative <- gt zero x+ positive <- gt x zero+ A.sub negative positive++ext2 ::+ (TypeNum.Positive n) =>+ Value (Vector n Bool) ->+ CodeGenFunction r (Value (Vector n (LLVM.IntN TypeNum.D2)))+ext2 = Guided.extBool Guided.vector++{- |+This has least instruction count for Vector D4 Float on X86.+-}+signumFloat ::+ (TypeNum.Positive n,+ IsPrimitive a, IsArithmetic a, IsFloating a,+ LLVM.CmpRet a, LLVM.CmpResult a ~ Bool) =>+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+signumFloat x = do+ let zero = LLVM.value LLVM.zero+ negative <- ext2 =<< A.cmp LLVM.CmpLT x zero+ positive <- ext2 =<< A.cmp LLVM.CmpGT x zero+ LLVM.sitofp =<< A.sub negative positive+++select ::+ (TypeNum.Positive n, LLVM.IsFirstClass a, IsPrimitive a,+ LLVM.CmpRet a, LLVM.CmpResult a ~ Bool) =>+ Value (Vector n Bool) ->+ Value (Vector n a) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+select b x y =+ Vector.map (uncurry3 LLVM.select) (b, x, y)+++floor ::+ (TypeNum.Positive n, IsFloating a, Vector.Real a) =>+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+floor = floorLogical A.fcmp++fraction ::+ (TypeNum.Positive n, IsFloating a, Vector.Real a) =>+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+fraction = fractionLogical A.fcmp+++floorLogical ::+ (TypeNum.Positive n, IsFloating a, Vector.Real a,+ IsPrimitive i, LLVM.IsInteger i) =>+ (LLVM.FPPredicate ->+ Value (Vector n a) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n i))) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+floorLogical cmp x = do+ xr <- Intrinsic.truncate x+ b <- cmp LLVM.FPOGT xr x+ A.add xr =<< LLVM.sitofp b++fractionLogical ::+ (TypeNum.Positive n, IsFloating a, Vector.Real a,+ IsPrimitive i, LLVM.IsInteger i) =>+ (LLVM.FPPredicate ->+ Value (Vector n a) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n i))) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+fractionLogical cmp x = do+ xf <- Vector.signedFraction x+ b <- cmp LLVM.FPOLT xf (value LLVM.zero)+ A.sub xf =<< LLVM.sitofp b+++{- |+'floor' implemented using 'select'.+This will need jumps.+-}+floorSelect ::+ (TypeNum.Positive n, Num a, IsFloating a, Vector.Real a) =>+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+floorSelect x = do+ xr <- Intrinsic.truncate x+ b <- A.fcmp LLVM.FPOLE xr x+ select b xr =<< A.sub xr =<< Vector.replicate (valueOf 1)++{- |+'fraction' implemented using 'select'.+This will need jumps.+-}+fractionSelect ::+ (TypeNum.Positive n, Num a, IsFloating a, Vector.Real a) =>+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+fractionSelect x = do+ xf <- Vector.signedFraction x+ b <- A.fcmp LLVM.FPOGE xf (value LLVM.zero)+ select b xf =<< A.add xf =<< Vector.replicate (valueOf 1)+++class (LLVM.IsSized a, LLVM.IsSized (Mask a),+ LLVM.SizeOf a ~ LLVM.SizeOf (Mask a),+ LLVM.IsPrimitive a, LLVM.IsPrimitive (Mask a),+ LLVM.IsInteger (Mask a)) =>+ Maskable a where+ type Mask a :: *++instance Maskable Int8 where type Mask Int8 = Int8+instance Maskable Int16 where type Mask Int16 = Int16+instance Maskable Int32 where type Mask Int32 = Int32+instance Maskable Int64 where type Mask Int64 = Int64+instance Maskable Word8 where type Mask Word8 = Int8+instance Maskable Word16 where type Mask Word16 = Int16+instance Maskable Word32 where type Mask Word32 = Int32+instance Maskable Word64 where type Mask Word64 = Int64+instance Maskable Float where type Mask Float = Int32+instance Maskable Double where type Mask Double = Int64++makeMask ::+ (Maskable a, TypeNum.Positive n) =>+ Value (Vector n a) ->+ Value (Vector n Bool) ->+ CodeGenFunction r (Value (Vector n (Mask a)))+makeMask _ = Guided.extBool Guided.vector+++min, max ::+ (IsConst a, IsArithmetic a, CmpRet a, Maskable a, TypeNum.Positive n) =>+ Value (Vector n a) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))++min x y = do+ b <- makeMask x =<< A.cmp LLVM.CmpLT x y+ selectLogical b x y++max x y = do+ b <- makeMask x =<< A.cmp LLVM.CmpGT x y+ selectLogical b x y++abs ::+ (IsConst a, IsArithmetic a, CmpRet a, Maskable a, TypeNum.Positive n) =>+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+abs x = max x =<< LLVM.neg x+++{- |+Another implementation of 'select',+this time in terms of binary logical operations.+The selecting integers must be+(-1) for selecting an element from the first operand+and 0 for selecting an element from the second operand.+This leads to optimal code.++On SSE41 this could be done with blendvps or blendvpd.+-}+selectLogical ::+ (LLVM.IsFirstClass a, IsPrimitive a,+ LLVM.IsInteger i, IsPrimitive i,+ LLVM.IsSized a, LLVM.IsSized i,+ LLVM.SizeOf a ~ LLVM.SizeOf i,+ TypeNum.Positive n) =>+ Value (Vector n i) ->+ Value (Vector n a) ->+ Value (Vector n a) ->+ CodeGenFunction r (Value (Vector n a))+selectLogical b x y = do+ bneg <- LLVM.inv b+ xm <- A.and b =<< Guided.bitcast Guided.vector x+ ym <- A.and bneg =<< Guided.bitcast Guided.vector y+ Guided.bitcast Guided.vector =<< A.or xm ym
+ test/Main.hs view
@@ -0,0 +1,17 @@+module Main where++import qualified Test.Vector as Vector++import qualified LLVM.Core as LLVM++import Data.Tuple.HT (mapFst)++import qualified Test.QuickCheck as QC+++main :: IO ()+main = do+ LLVM.initializeNativeTarget++ mapM_ (\(msg,prop) -> putStr (msg++": ") >> prop >>= QC.quickCheck) $+ map (mapFst ("Vector."++)) Vector.tests
+ test/Test/Vector.hs view
@@ -0,0 +1,327 @@+{-# LANGUAGE ForeignFunctionInterface #-}+{-# LANGUAGE TypeOperators #-}+{-# LANGUAGE TypeFamilies #-}+module Test.Vector where++import qualified LLVM.Extra.ScalarOrVectorPrivate as SoVPriv+import qualified LLVM.Extra.ScalarOrVector as SoV+import qualified LLVM.Extra.VectorAlt as VectorAlt+import qualified LLVM.Extra.Vector as Vector+import qualified LLVM.Extra.Memory as Mem+import qualified LLVM.Extra.Class as Class+import qualified LLVM.ExecutionEngine as EE+import qualified LLVM.Core as LLVM++import qualified Type.Data.Num.Decimal as TypeNum+import Type.Base.Proxy (Proxy(Proxy))++import qualified Foreign.Marshal as Marsh+import Foreign.Storable.Tuple ()+import Foreign.Storable (Storable, peek)+import Foreign.Ptr (FunPtr, Ptr)++import qualified Data.Traversable as Trav+import qualified Data.Foldable as Fold+import qualified Data.Bits as Bits+import Data.Word (Word8, Word16, Word32)+import Data.Int (Int8, Int32)++import qualified Test.QuickCheck as QC+import qualified Test.QuickCheck.Monadic as QCMon++import Control.Applicative (liftA2, pure)++import qualified Prelude as P+import Prelude hiding (min, max)+++type V4 = LLVM.Vector TypeNum.D4+type V5 = LLVM.Vector TypeNum.D5+type V4Word32 = V4 Word32+type V4Int32 = V4 Int32+type V4Float = V4 Float++type Importer func = FunPtr func -> func++generateFunction ::+ EE.ExecutionFunction f =>+ Importer f -> LLVM.CodeGenModule (LLVM.Function f) -> IO f+generateFunction imprt code = do+ m <- LLVM.newModule+ fn <- do+ func <- LLVM.defineModule m $ LLVM.setTarget LLVM.hostTriple >> code+ EE.runEngineAccessWithModule m $ EE.getExecutionFunction imprt func+ LLVM.writeBitcodeToFile "test.bc" m+ return fn+++foreign import ccall safe "dynamic" derefTestCasePtr ::+ Importer (Ptr inp -> Ptr out -> IO ())++modul ::+ (Mem.Struct inp ~ minp, LLVM.IsType minp, Mem.C inp,+ Mem.Struct out ~ mout, LLVM.IsType mout, Mem.C out) =>+ (inp -> LLVM.CodeGenFunction () out) ->+ LLVM.CodeGenModule (LLVM.Function (Ptr minp -> Ptr mout -> IO ()))+modul codegen =+ LLVM.createFunction LLVM.ExternalLinkage $ \xPtr yPtr -> do+ flip Mem.store yPtr =<< codegen =<< Mem.load xPtr+ LLVM.ret ()++run ::+ (Mem.Struct inp ~ minp, LLVM.IsType minp, Mem.C inp,+ Mem.Struct out ~ mout, LLVM.IsType mout, Mem.C out,+ Storable a, Class.MakeValueTuple a, Class.ValueTuple a ~ inp,+ Storable b, Class.MakeValueTuple b, Class.ValueTuple b ~ out,+ Show a, QC.Arbitrary a) =>+ (inp -> LLVM.CodeGenFunction () out) ->+ (a -> b -> Bool) ->+ IO QC.Property+run codegen predicate = do+ funIO <- generateFunction derefTestCasePtr $ modul codegen+ return $ QC.property $ \x ->+ QCMon.monadicIO $ do+ y <-+ QCMon.run $+ Marsh.with x $ \xPtr ->+ Marsh.alloca $ \yPtr ->+ funIO (Mem.castTuplePtr xPtr) (Mem.castTuplePtr yPtr) >>+ peek yPtr+ QCMon.assert $ predicate x y+++vec4 :: V4 a -> V4 a+vec4 = id+++unop ::+ (LLVM.Value V4Int32 -> LLVM.CodeGenFunction () (LLVM.Value V4Int32)) ->+ (Int32 -> Int32) ->+ IO QC.Property+unop codegen fun =+ run codegen (\x y -> fmap fun (vec4 x) == vec4 y)++unopFloat ::+ (LLVM.Value V4Float -> LLVM.CodeGenFunction () (LLVM.Value V4Float)) ->+ (Float -> Float) ->+ IO QC.Property+unopFloat codegen fun =+ run codegen (\x y -> fmap fun (vec4 x) == vec4 y)+++binop ::+ ((TypeNum.D4 TypeNum.:*: LLVM.SizeOf am) ~ size, TypeNum.Natural size,+ Mem.FirstClass a, Mem.Stored a ~ am, LLVM.IsSized am,+ QC.Arbitrary a, Show a, Eq a, Storable a, LLVM.IsConst a,+ LLVM.IsPrimitive a, LLVM.IsPrimitive am) =>+ (LLVM.Value (V4 a) -> LLVM.Value (V4 a) ->+ LLVM.CodeGenFunction () (LLVM.Value (V4 a))) ->+ (a -> a -> a) ->+ IO QC.Property+binop codegen fun =+ run (uncurry codegen)+ (\(x,y) z -> liftA2 fun (vec4 x) (vec4 y) == vec4 z)++binopInt ::+ (LLVM.Value V4Int32 -> LLVM.Value V4Int32 ->+ LLVM.CodeGenFunction () (LLVM.Value V4Int32)) ->+ (Int32 -> Int32 -> Int32) ->+ IO QC.Property+binopInt = binop+++type Int2 = LLVM.IntN TypeNum.D2+type Int3 = LLVM.IntN TypeNum.D3+type Word2 = LLVM.WordN TypeNum.D2+type Word3 = LLVM.WordN TypeNum.D3++vectorise ::+ (TypeNum.Positive n, Integral a) =>+ Integer -> a -> LLVM.Vector n Integer+vectorise modu x =+ snd $ Trav.mapAccumL (\xi f -> f xi) (toInteger x) $+ pure (\xi -> divMod xi modu)++unpackInts ::+ (TypeNum.Positive n, TypeNum.Positive d, Integral a) =>+ Integer -> a -> LLVM.Vector n (LLVM.IntN d)+unpackInts modu =+ fmap+ (\x ->+ LLVM.IntN $+ if Bits.shiftR modu 1 Bits..&. x /= 0+ then toInteger x - modu+ else toInteger x) .+ vectorise modu++unpackWords ::+ (TypeNum.Positive n, TypeNum.Positive d, Integral a) =>+ Integer -> a -> LLVM.Vector n (LLVM.WordN d)+unpackWords modu = fmap LLVM.WordN . vectorise modu++unpackInt2 :: Word8 -> V4 Int2+unpackInt2 = unpackInts 4++unpackWord2 :: Word8 -> V4 Word2+unpackWord2 = unpackWords 4++unpackInt3 :: Word16 -> V5 Int3+unpackInt3 = unpackInts 8++unpackWord3 :: Word16 -> V5 Word3+unpackWord3 = unpackWords 8++binopV4I2 ::+ (Eq a, LLVM.IsPrimitive a, LLVM.IsSized a, LLVM.SizeOf a ~ TypeNum.D2) =>+ (Word8 -> V4 a) ->+ (LLVM.Value (V4 a) -> LLVM.Value (V4 a) ->+ LLVM.CodeGenFunction () (LLVM.Value (V4 a))) ->+ (a -> a -> a) ->+ IO QC.Property+binopV4I2 unpackBits codegen fun =+ run+ (\(x,y) -> do+ vx <- LLVM.bitcast x+ vy <- LLVM.bitcast y+ vz <- codegen vx vy+ LLVM.bitcast vz)+ (\(x,y) z ->+ liftA2 fun (unpackBits x) (unpackBits y) == unpackBits z)++type Code15 r = LLVM.CodeGenFunction r (LLVM.Value (LLVM.WordN TypeNum.D15))++binopV5I3 ::+ (Eq a, LLVM.IsPrimitive a, LLVM.IsSized a, LLVM.SizeOf a ~ TypeNum.D3) =>+ (Word16 -> V5 a) ->+ (LLVM.Value (V5 a) -> LLVM.Value (V5 a) ->+ LLVM.CodeGenFunction () (LLVM.Value (V5 a))) ->+ (a -> a -> a) ->+ IO QC.Property+binopV5I3 unpackBits codegen fun =+ run+ (\(x,y) -> do+ vx <- LLVM.bitcast =<< (LLVM.trunc x :: Code15 r)+ vy <- LLVM.bitcast =<< (LLVM.trunc y :: Code15 r)+ vz <- codegen vx vy+ LLVM.zext =<< (LLVM.bitcast vz :: Code15 r))+ (\(x,y) z ->+ liftA2 fun (unpackBits x) (unpackBits y) == unpackBits z)++binopInt8 ::+ (LLVM.Value (V4 Int8) -> LLVM.Value (V4 Int8) ->+ LLVM.CodeGenFunction () (LLVM.Value (V4 Int8))) ->+ (Int8 -> Int8 -> Int8) ->+ IO QC.Property+binopInt8 = binop++binopWord8 ::+ (LLVM.Value (V4 Word8) -> LLVM.Value (V4 Word8) ->+ LLVM.CodeGenFunction () (LLVM.Value (V4 Word8))) ->+ (Word8 -> Word8 -> Word8) ->+ IO QC.Property+binopWord8 = binop+++addSat, subSat :: (Bounded a, Integral a) => a -> a -> a+addSat = addSatMan (toInteger, fromInteger)+subSat = subSatMan (toInteger, fromInteger)++addSatMan, subSatMan ::+ (Bounded a) => (a -> Integer, Integer -> a) -> a -> a -> a+addSatMan = opSat (+)+subSatMan = opSat (-)++convertIntN :: Proxy d -> (LLVM.IntN d -> Integer, Integer -> LLVM.IntN d)+convertIntN Proxy = (\(LLVM.IntN n) -> n, LLVM.IntN)++convertWordN :: Proxy d -> (LLVM.WordN d -> Integer, Integer -> LLVM.WordN d)+convertWordN Proxy = (\(LLVM.WordN n) -> n, LLVM.WordN)++opSat ::+ (Bounded a) =>+ (Integer -> Integer -> Integer) ->+ (a -> Integer, Integer -> a) ->+ a -> a -> a+opSat op (toIntg, fromIntg) x y =+ fromIntg $+ P.max (toIntg $ minBound `asTypeOf` x) $+ P.min (toIntg $ maxBound `asTypeOf` x) $+ op (toIntg x) (toIntg y)+++fraction :: RealFrac a => a -> a+fraction x = x - fromInteger (floor x)+++split :: String -> (a -> b -> c) -> (a,a) -> b -> [(String, c)]+split name driver (intrinsic, fallback) f =+ (name ++ ".intrinsic", driver intrinsic f) :+ (name ++ ".fallback", driver fallback f) :+ []++tests :: [(String, IO QC.Property)]+tests =+ ("abs", unop Vector.abs P.abs) :+ ("signum", unop Vector.signum P.signum) :+ ("Alt.abs", unop VectorAlt.abs P.abs) :++ ("min", binopInt Vector.min P.min) :+ ("max", binopInt Vector.max P.max) :+ ("Alt.min", binopInt VectorAlt.min P.min) :+ ("Alt.max", binopInt VectorAlt.max P.max) :++ split "addSat.Word8" binopWord8 (SoV.addSat, SoVPriv.uaddSat) addSat +++ split "subSat.Word8" binopWord8 (SoV.subSat, SoVPriv.usubSat) subSat +++ split "addSat.Int8" binopInt8 (SoV.addSat, SoVPriv.saddSat) addSat +++ split "subSat.Int8" binopInt8 (SoV.subSat, SoVPriv.ssubSat) subSat ++++ split "addSat.Word3"+ (binopV5I3 unpackWord3) (SoV.addSat, SoVPriv.uaddSat)+ (addSatMan $ convertWordN TypeNum.d3) +++ split "subSat.Word3"+ (binopV5I3 unpackWord3) (SoV.subSat, SoVPriv.usubSat)+ (subSatMan $ convertWordN TypeNum.d3) +++ split "addSat.Int3"+ (binopV5I3 unpackInt3) (SoV.addSat, SoVPriv.saddSat)+ (addSatMan $ convertIntN TypeNum.d3) +++ split "subSat.Int3"+ (binopV5I3 unpackInt3) (SoV.subSat, SoVPriv.ssubSat)+ (subSatMan $ convertIntN TypeNum.d3) ++++ split "addSat.Word2"+ (binopV4I2 unpackWord2) (SoV.addSat, SoVPriv.uaddSat)+ (addSatMan $ convertWordN TypeNum.d2) +++ split "subSat.Word2"+ (binopV4I2 unpackWord2) (SoV.subSat, SoVPriv.usubSat)+ (subSatMan $ convertWordN TypeNum.d2) +++ split "addSat.Int2"+ (binopV4I2 unpackInt2) (SoV.addSat, SoVPriv.saddSat)+ (addSatMan $ convertIntN TypeNum.d2) +++ split "subSat.Int2"+ (binopV4I2 unpackInt2) (SoV.subSat, SoVPriv.ssubSat)+ (subSatMan $ convertIntN TypeNum.d2) ++++ ("sum",+ run Vector.sum (\x y -> Fold.sum (vec4 x) == (y::Int32))) :+ ("cumulate",+ run+ (uncurry Vector.cumulate)+ (\(x0,xv) (y0,yv) ->+ scanl (+) x0 (Fold.toList (vec4 xv))+ ==+ Fold.toList (vec4 yv) ++ [y0::Int32])) :+ ("dot",+ run+ (uncurry Vector.dotProduct)+ (\(x,y) z ->+ Fold.sum (liftA2 (*) (vec4 x) (vec4 y)) == (z::Int32))) :++ ("truncate", unopFloat Vector.truncate (fromInteger . P.truncate)) :+ ("floor", unopFloat Vector.floor (fromInteger . P.floor)) :+ ("fraction", unopFloat Vector.fraction fraction) :++ ("floorLogical", unopFloat VectorAlt.floor (fromInteger . P.floor)) :+ ("fractionLogical", unopFloat VectorAlt.fraction fraction) :+ ("floorSelect", unopFloat VectorAlt.floorSelect (fromInteger . P.floor)) :+ ("fractionSelect", unopFloat VectorAlt.fractionSelect fraction) :+ []
− x86/cpuid/LLVM/Extra/ExtensionCheck/X86.hs
@@ -1,71 +0,0 @@-module LLVM.Extra.ExtensionCheck.X86 (- sse1, sse2, sse3, ssse3, sse41, sse42, avx, avx2, avx512,- fma, amd3dnow, amd3dnowa, aes, sse4a,- ) where--import qualified LLVM.Extra.Extension as Ext-import qualified System.Cpuid as CPUID-import qualified System.Unsafe as Unsafe--{--I expect that the cpuid does not suddenly change-and thus calling Unsafe.performIO is safe.--}-subtarget ::- String ->- (CPUID.FlagSet CPUID.Feature1C -> CPUID.FlagSet CPUID.Feature1D -> Bool) ->- Ext.Subtarget-subtarget name q =- Ext.Subtarget "x86" name- (return $ Unsafe.performIO $ check q)--check ::- (CPUID.FlagSet CPUID.Feature1C -> CPUID.FlagSet CPUID.Feature1D -> Bool) ->- IO Bool-check q =- fmap (uncurry q) $ CPUID.features----- * target specific extensions--sse1 :: Ext.Subtarget-sse1 = subtarget "sse" (\_ecx edx -> CPUID.testFlag CPUID.sse edx)--sse2 :: Ext.Subtarget-sse2 = subtarget "sse2" (\_ecx edx -> CPUID.testFlag CPUID.sse2 edx)--sse3 :: Ext.Subtarget-sse3 = subtarget "sse3" (\ecx _edx -> CPUID.testFlag CPUID.sse3 ecx)--ssse3 :: Ext.Subtarget-ssse3 = subtarget "ssse3" (\ecx _edx -> CPUID.testFlag CPUID.ssse3 ecx)--sse41 :: Ext.Subtarget-sse41 = subtarget "sse41" (\ecx _edx -> CPUID.testFlag CPUID.sse4_1 ecx)--sse42 :: Ext.Subtarget-sse42 = subtarget "sse42" (\ecx _edx -> CPUID.testFlag CPUID.sse4_2 ecx)--avx :: Ext.Subtarget-avx = subtarget "avx" (\ecx _edx -> CPUID.testFlag CPUID.avx ecx)--avx2 :: Ext.Subtarget-avx2 = subtarget "avx2" (\ _ecx _edx -> False)--avx512 :: Ext.Subtarget-avx512 = subtarget "avx512" (\ _ecx _edx -> False)--fma :: Ext.Subtarget-fma = subtarget "fma" (\ ecx _edx -> CPUID.testFlag CPUID.fma ecx)--amd3dnow :: Ext.Subtarget-amd3dnow = subtarget "3dnow" (\ _ecx _edx -> False)--amd3dnowa :: Ext.Subtarget-amd3dnowa = subtarget "3dnowa" (\ _ecx _edx -> False)--aes :: Ext.Subtarget-aes = subtarget "aesni" (\ _ecx _edx -> False)--sse4a :: Ext.Subtarget-sse4a = subtarget "sse4a" (\ _ecx _edx -> False)
− x86/none/LLVM/Extra/ExtensionCheck/X86.hs
@@ -1,55 +0,0 @@-module LLVM.Extra.ExtensionCheck.X86 (- sse1, sse2, sse3, ssse3, sse41, sse42, avx, avx2, avx512,- fma, amd3dnow, amd3dnowa, aes, sse4a,- ) where--import qualified LLVM.Extra.Extension as Ext--subtarget :: String -> Bool -> Ext.Subtarget-subtarget name q =- Ext.Subtarget "x86" name (return q)----- * target specific extensions--sse1 :: Ext.Subtarget-sse1 = subtarget "sse" False--sse2 :: Ext.Subtarget-sse2 = subtarget "sse2" False--sse3 :: Ext.Subtarget-sse3 = subtarget "sse3" False--ssse3 :: Ext.Subtarget-ssse3 = subtarget "ssse3" False--sse41 :: Ext.Subtarget-sse41 = subtarget "sse41" False--sse42 :: Ext.Subtarget-sse42 = subtarget "sse42" False--avx :: Ext.Subtarget-avx = subtarget "avx" False--avx2 :: Ext.Subtarget-avx2 = subtarget "avx2" False--avx512 :: Ext.Subtarget-avx512 = subtarget "avx512" False--fma :: Ext.Subtarget-fma = subtarget "fma" False--amd3dnow :: Ext.Subtarget-amd3dnow = subtarget "3dnow" False--amd3dnowa :: Ext.Subtarget-amd3dnowa = subtarget "3dnowa" False--aes :: Ext.Subtarget-aes = subtarget "aesni" False--sse4a :: Ext.Subtarget-sse4a = subtarget "sse4a" False