HasSIMDDiv.h
Go to the documentation of this file.
1 //=================================================================================================
33 //=================================================================================================
34 
35 #ifndef _BLAZE_MATH_TYPETRAITS_HASSIMDDIV_H_
36 #define _BLAZE_MATH_TYPETRAITS_HASSIMDDIV_H_
37 
38 
39 //*************************************************************************************************
40 // Includes
41 //*************************************************************************************************
42 
44 #include <blaze/util/Complex.h>
45 #include <blaze/util/EnableIf.h>
47 #include <blaze/util/mpl/And.h>
52 
53 
54 namespace blaze {
55 
56 //=================================================================================================
57 //
58 // CLASS DEFINITION
59 //
60 //=================================================================================================
61 
62 //*************************************************************************************************
64 template< typename T1 // Type of the left-hand side operand
65  , typename T2 // Type of the right-hand side operand
66  , typename = void > // Restricting condition
67 struct HasSIMDDivHelper
68 {
69  enum : bool { value = false };
70 };
72 //*************************************************************************************************
73 
74 
75 //*************************************************************************************************
77 template< typename T1, typename T2 >
78 struct HasSIMDDivHelper< T1, T2, EnableIf_< And< IsNumeric<T1>, IsIntegral<T1>, IsSigned<T1>
79  , IsNumeric<T2>, IsIntegral<T2>, IsSigned<T2>
80  , Bool< sizeof(T1) == sizeof(T2) > > > >
81 {
82  enum : bool { value = ( bool( BLAZE_MIC_MODE ) && sizeof(T1) >= 4UL ) ||
83  ( bool( BLAZE_AVX512BW_MODE ) && sizeof(T1) <= 2UL ) ||
84  ( bool( BLAZE_AVX512F_MODE ) && sizeof(T1) >= 4UL ) };
85 };
86 
87 template< typename T >
88 struct HasSIMDDivHelper< complex<T>, T, EnableIf_< And< IsNumeric<T>, IsIntegral<T>, IsSigned<T> > > >
89 {
90  enum : bool { value = ( bool( BLAZE_MIC_MODE ) && sizeof(T) >= 4UL ) ||
91  ( bool( BLAZE_AVX512BW_MODE ) && sizeof(T) <= 2UL ) ||
92  ( bool( BLAZE_AVX512F_MODE ) && sizeof(T) >= 4UL ) };
93 };
95 //*************************************************************************************************
96 
97 
98 //*************************************************************************************************
100 template<>
101 struct HasSIMDDivHelper< float, float >
102 {
103  enum : bool { value = bool( BLAZE_SSE_MODE ) ||
104  bool( BLAZE_AVX_MODE ) ||
105  bool( BLAZE_MIC_MODE ) ||
106  bool( BLAZE_AVX512F_MODE ) };
107 };
109 //*************************************************************************************************
110 
111 
112 //*************************************************************************************************
114 template<>
115 struct HasSIMDDivHelper< double, double >
116 {
117  enum : bool { value = bool( BLAZE_SSE2_MODE ) ||
118  bool( BLAZE_AVX_MODE ) ||
119  bool( BLAZE_MIC_MODE ) ||
120  bool( BLAZE_AVX512F_MODE ) };
121 };
123 //*************************************************************************************************
124 
125 
126 //*************************************************************************************************
147 template< typename T1 // Type of the left-hand side operand
148  , typename T2 // Type of the right-hand side operand
149  , typename = void > // Restricting condition
151  : public BoolConstant< HasSIMDDivHelper< Decay_<T1>, Decay_<T2> >::value >
152 {};
153 //*************************************************************************************************
154 
155 } // namespace blaze
156 
157 #endif
#define BLAZE_AVX512F_MODE
Compilation switch for the AVX512F mode.This compilation switch enables/disables the AVX512F mode...
Definition: Vectorization.h:246
Generic wrapper for a compile time constant integral value.The IntegralConstant class template repres...
Definition: IntegralConstant.h:71
#define BLAZE_MIC_MODE
Compilation switch for the MIC mode.This compilation switch enables/disables the MIC mode...
Definition: Vectorization.h:299
#define BLAZE_AVX512BW_MODE
Compilation switch for the AVX512BW mode.This compilation switch enables/disables the AVX512BW mode...
Definition: Vectorization.h:264
Header file for the IsIntegral type trait.
Header file for the And class template.
Header file for the Decay type trait.
Namespace of the Blaze C++ math library.
Definition: Blaze.h:58
Availability of a SIMD division for the given data types.Depending on the available instruction set (...
Definition: HasSIMDDiv.h:150
#define BLAZE_SSE_MODE
Compilation switch for the SSE mode.This compilation switch enables/disables the SSE mode...
Definition: Vectorization.h:126
Header file for the EnableIf class template.
Header file for the IsNumeric type trait.
#define BLAZE_AVX_MODE
Compilation switch for the AVX mode.This compilation switch enables/disables the AVX mode...
Definition: Vectorization.h:211
Header file for the IsSigned type trait.
typename EnableIf< Condition, T >::Type EnableIf_
Auxiliary alias declaration for the EnableIf class template.The EnableIf_ alias declaration provides ...
Definition: EnableIf.h:224
Header file for the IntegralConstant class template.
System settings for the SSE mode.
Header file for the complex data type.
#define BLAZE_SSE2_MODE
Compilation switch for the SSE2 mode.This compilation switch enables/disables the SSE2 mode...
Definition: Vectorization.h:143