File indexing completed on 2025-01-31 10:25:33
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #ifndef VC_AVX_LIMITS_H_
0029 #define VC_AVX_LIMITS_H_
0030
0031 #include "intrinsics.h"
0032 #include "types.h"
0033 #include "macros.h"
0034
0035 namespace std
0036 {
0037 #define Vc_NUM_LIM(T, _max, _min) \
0038 template <> struct numeric_limits<Vc::AVX2::Vector<T>> : public numeric_limits<T> { \
0039 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> max() Vc_NOEXCEPT \
0040 { \
0041 return _max; \
0042 } \
0043 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> min() Vc_NOEXCEPT \
0044 { \
0045 return _min; \
0046 } \
0047 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> lowest() Vc_NOEXCEPT \
0048 { \
0049 return min(); \
0050 } \
0051 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> epsilon() Vc_NOEXCEPT \
0052 { \
0053 return Vc::AVX2::Vector<T>::Zero(); \
0054 } \
0055 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> round_error() Vc_NOEXCEPT \
0056 { \
0057 return Vc::AVX2::Vector<T>::Zero(); \
0058 } \
0059 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> infinity() Vc_NOEXCEPT \
0060 { \
0061 return Vc::AVX2::Vector<T>::Zero(); \
0062 } \
0063 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> quiet_NaN() Vc_NOEXCEPT \
0064 { \
0065 return Vc::AVX2::Vector<T>::Zero(); \
0066 } \
0067 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> signaling_NaN() Vc_NOEXCEPT \
0068 { \
0069 return Vc::AVX2::Vector<T>::Zero(); \
0070 } \
0071 static Vc_INTRINSIC Vc_CONST Vc::AVX2::Vector<T> denorm_min() Vc_NOEXCEPT \
0072 { \
0073 return Vc::AVX2::Vector<T>::Zero(); \
0074 } \
0075 }
0076
0077 #ifdef Vc_IMPL_AVX2
0078 Vc_NUM_LIM(unsigned short, Vc::Detail::allone<__m256i>(), Vc::Detail::zero<__m256i>());
0079 Vc_NUM_LIM( short, _mm256_srli_epi16(Vc::Detail::allone<__m256i>(), 1), Vc::AVX::setmin_epi16());
0080 Vc_NUM_LIM( unsigned int, Vc::Detail::allone<__m256i>(), Vc::Detail::zero<__m256i>());
0081 Vc_NUM_LIM( int, _mm256_srli_epi32(Vc::Detail::allone<__m256i>(), 1), Vc::AVX::setmin_epi32());
0082 #endif
0083 #undef Vc_NUM_LIM
0084
0085 }
0086
0087 #endif