Some special operations on X86 processors.
If you want to use them in algorithm
you will always have to prepare an alternative implementation
in terms of plain LLVM instructions.
You will then run them with 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.
- maxss :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)
- minss :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)
- maxps :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)
- minps :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)
- maxsd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)
- minsd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)
- maxpd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)
- minpd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)
- cmpss :: T (FPPredicate -> VFloat -> VFloat -> CodeGenFunction r (Value (Vector D4 Int32)))
- cmpps :: T (FPPredicate -> VFloat -> VFloat -> CodeGenFunction r (Value (Vector D4 Int32)))
- cmpsd :: T (FPPredicate -> VDouble -> VDouble -> CodeGenFunction r (Value (Vector D2 Int64)))
- cmppd :: T (FPPredicate -> VDouble -> VDouble -> CodeGenFunction r (Value (Vector D2 Int64)))
- pcmpgtb :: T (Value (Vector D16 Int8) -> Value (Vector D16 Int8) -> CodeGenFunction r (Value (Vector D16 Int8)))
- pcmpgtw :: T (Value (Vector D8 Int16) -> Value (Vector D8 Int16) -> CodeGenFunction r (Value (Vector D8 Int16)))
- pcmpgtd :: T (Value (Vector D4 Int32) -> Value (Vector D4 Int32) -> CodeGenFunction r (Value (Vector D4 Int32)))
- pcmpgtq :: T (Value (Vector D2 Int64) -> Value (Vector D2 Int64) -> CodeGenFunction r (Value (Vector D2 Int64)))
- pcmpugtb :: T (Value (Vector D16 Word8) -> Value (Vector D16 Word8) -> CodeGenFunction r (Value (Vector D16 Word8)))
- pcmpugtw :: T (Value (Vector D8 Word16) -> Value (Vector D8 Word16) -> CodeGenFunction r (Value (Vector D8 Word16)))
- pcmpugtd :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))
- pcmpugtq :: T (Value (Vector D2 Word64) -> Value (Vector D2 Word64) -> CodeGenFunction r (Value (Vector D2 Word64)))
- pminsb :: T (Value (Vector D16 Int8) -> Value (Vector D16 Int8) -> CodeGenFunction r (Value (Vector D16 Int8)))
- pminsw :: T (Value (Vector D8 Int16) -> Value (Vector D8 Int16) -> CodeGenFunction r (Value (Vector D8 Int16)))
- pminsd :: T (Value (Vector D4 Int32) -> Value (Vector D4 Int32) -> CodeGenFunction r (Value (Vector D4 Int32)))
- pmaxsb :: T (Value (Vector D16 Int8) -> Value (Vector D16 Int8) -> CodeGenFunction r (Value (Vector D16 Int8)))
- pmaxsw :: T (Value (Vector D8 Int16) -> Value (Vector D8 Int16) -> CodeGenFunction r (Value (Vector D8 Int16)))
- pmaxsd :: T (Value (Vector D4 Int32) -> Value (Vector D4 Int32) -> CodeGenFunction r (Value (Vector D4 Int32)))
- pminub :: T (Value (Vector D16 Word8) -> Value (Vector D16 Word8) -> CodeGenFunction r (Value (Vector D16 Word8)))
- pminuw :: T (Value (Vector D8 Word16) -> Value (Vector D8 Word16) -> CodeGenFunction r (Value (Vector D8 Word16)))
- pminud :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))
- pmaxub :: T (Value (Vector D16 Word8) -> Value (Vector D16 Word8) -> CodeGenFunction r (Value (Vector D16 Word8)))
- pmaxuw :: T (Value (Vector D8 Word16) -> Value (Vector D8 Word16) -> CodeGenFunction r (Value (Vector D8 Word16)))
- pmaxud :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))
- pabsb :: T (Value (Vector D16 Int8) -> CodeGenFunction r (Value (Vector D16 Int8)))
- pabsw :: T (Value (Vector D8 Int16) -> CodeGenFunction r (Value (Vector D8 Int16)))
- pabsd :: T (Value (Vector D4 Int32) -> CodeGenFunction r (Value (Vector D4 Int32)))
- pmuludq :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D2 Word64)))
- pmulld :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))
- cvtps2dq :: T (VFloat -> CodeGenFunction r (Value (Vector D4 Int32)))
- cvtpd2dq :: T (VDouble -> CodeGenFunction r (Value (Vector D4 Int32)))
- ldmxcsr :: T (Value (Ptr Word32) -> CodeGenFunction r ())
- stmxcsr :: T (Value (Ptr Word32) -> CodeGenFunction r ())
- withMXCSR :: Word32 -> T (CodeGenFunction r a -> CodeGenFunction r a)
- haddps :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)
- haddpd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)
- dpps :: T (VFloat -> VFloat -> Value Word32 -> CodeGenFunction r VFloat)
- dppd :: T (VDouble -> VDouble -> Value Word32 -> CodeGenFunction r VDouble)
- roundss :: T (VFloat -> Value Word32 -> CodeGenFunction r VFloat)
- roundps :: T (VFloat -> Value Word32 -> CodeGenFunction r VFloat)
- roundsd :: T (VDouble -> Value Word32 -> CodeGenFunction r VDouble)
- roundpd :: T (VDouble -> Value Word32 -> CodeGenFunction r VDouble)
- absss :: T (VFloat -> CodeGenFunction r VFloat)
- abssd :: T (VDouble -> CodeGenFunction r VDouble)
- absps :: T (VFloat -> CodeGenFunction r VFloat)
- abspd :: T (VDouble -> CodeGenFunction r VDouble)
Documentation
maxss :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)Source
minss :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)Source
maxps :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)Source
minps :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)Source
maxsd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)Source
minsd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)Source
maxpd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)Source
minpd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)Source
cmpss :: T (FPPredicate -> VFloat -> VFloat -> CodeGenFunction r (Value (Vector D4 Int32)))Source
cmpps :: T (FPPredicate -> VFloat -> VFloat -> CodeGenFunction r (Value (Vector D4 Int32)))Source
cmpsd :: T (FPPredicate -> VDouble -> VDouble -> CodeGenFunction r (Value (Vector D2 Int64)))Source
cmppd :: T (FPPredicate -> VDouble -> VDouble -> CodeGenFunction r (Value (Vector D2 Int64)))Source
pcmpgtb :: T (Value (Vector D16 Int8) -> Value (Vector D16 Int8) -> CodeGenFunction r (Value (Vector D16 Int8)))Source
pcmpgtw :: T (Value (Vector D8 Int16) -> Value (Vector D8 Int16) -> CodeGenFunction r (Value (Vector D8 Int16)))Source
pcmpgtd :: T (Value (Vector D4 Int32) -> Value (Vector D4 Int32) -> CodeGenFunction r (Value (Vector D4 Int32)))Source
pcmpgtq :: T (Value (Vector D2 Int64) -> Value (Vector D2 Int64) -> CodeGenFunction r (Value (Vector D2 Int64)))Source
pcmpugtb :: T (Value (Vector D16 Word8) -> Value (Vector D16 Word8) -> CodeGenFunction r (Value (Vector D16 Word8)))Source
pcmpugtw :: T (Value (Vector D8 Word16) -> Value (Vector D8 Word16) -> CodeGenFunction r (Value (Vector D8 Word16)))Source
pcmpugtd :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))Source
pcmpugtq :: T (Value (Vector D2 Word64) -> Value (Vector D2 Word64) -> CodeGenFunction r (Value (Vector D2 Word64)))Source
pminsb :: T (Value (Vector D16 Int8) -> Value (Vector D16 Int8) -> CodeGenFunction r (Value (Vector D16 Int8)))Source
pminsw :: T (Value (Vector D8 Int16) -> Value (Vector D8 Int16) -> CodeGenFunction r (Value (Vector D8 Int16)))Source
pminsd :: T (Value (Vector D4 Int32) -> Value (Vector D4 Int32) -> CodeGenFunction r (Value (Vector D4 Int32)))Source
pmaxsb :: T (Value (Vector D16 Int8) -> Value (Vector D16 Int8) -> CodeGenFunction r (Value (Vector D16 Int8)))Source
pmaxsw :: T (Value (Vector D8 Int16) -> Value (Vector D8 Int16) -> CodeGenFunction r (Value (Vector D8 Int16)))Source
pmaxsd :: T (Value (Vector D4 Int32) -> Value (Vector D4 Int32) -> CodeGenFunction r (Value (Vector D4 Int32)))Source
pminub :: T (Value (Vector D16 Word8) -> Value (Vector D16 Word8) -> CodeGenFunction r (Value (Vector D16 Word8)))Source
pminuw :: T (Value (Vector D8 Word16) -> Value (Vector D8 Word16) -> CodeGenFunction r (Value (Vector D8 Word16)))Source
pminud :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))Source
pmaxub :: T (Value (Vector D16 Word8) -> Value (Vector D16 Word8) -> CodeGenFunction r (Value (Vector D16 Word8)))Source
pmaxuw :: T (Value (Vector D8 Word16) -> Value (Vector D8 Word16) -> CodeGenFunction r (Value (Vector D8 Word16)))Source
pmaxud :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))Source
pmuludq :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D2 Word64)))Source
pmulld :: T (Value (Vector D4 Word32) -> Value (Vector D4 Word32) -> CodeGenFunction r (Value (Vector D4 Word32)))Source
cvtpd2dq :: T (VDouble -> CodeGenFunction r (Value (Vector D4 Int32)))Source
the upper two integers are set to zero, there is no instruction that converts to Int64
ldmxcsr :: T (Value (Ptr Word32) -> CodeGenFunction r ())Source
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.
withMXCSR :: Word32 -> T (CodeGenFunction r a -> CodeGenFunction r a)Source
haddps :: T (VFloat -> VFloat -> CodeGenFunction r VFloat)Source
haddpd :: T (VDouble -> VDouble -> CodeGenFunction r VDouble)Source
absss :: T (VFloat -> CodeGenFunction r VFloat)Source
abssd :: T (VDouble -> CodeGenFunction r VDouble)Source
absps :: T (VFloat -> CodeGenFunction r VFloat)Source
abspd :: T (VDouble -> CodeGenFunction r VDouble)Source