Blaze 3.9
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>
51
52
53namespace blaze {
54
55//=================================================================================================
56//
57// CLASS DEFINITION
58//
59//=================================================================================================
60
61//*************************************************************************************************
66template< typename T1 // Type of the left-hand side operand
67 , typename T2 // Type of the right-hand side operand
68 , typename = void > // Restricting condition
69struct HasSIMDDivHelper
70 : public FalseType
71{};
73//*************************************************************************************************
74
75
76//*************************************************************************************************
78template< typename T1, typename T2 >
79struct HasSIMDDivHelper< T1, T2, EnableIf_t< ( IsNumeric_v<T1> && IsNumeric_v<T2> ) &&
80 ( IsIntegral_v<T1> && IsIntegral_v<T2> ) &&
81 !( IsSigned_v<T1> ^ IsSigned_v<T2> ) &&
82 sizeof(T1) == sizeof(T2) > >
83 : public BoolConstant< bool( BLAZE_SVML_MODE ) &&
84 ( ( bool( BLAZE_AVX2_MODE ) ) ||
85 ( bool( BLAZE_MIC_MODE ) && sizeof(T1) >= 4UL ) ||
86 ( bool( BLAZE_AVX512BW_MODE ) && sizeof(T1) <= 2UL ) ||
87 ( bool( BLAZE_AVX512F_MODE ) && sizeof(T1) >= 4UL ) ) >
88{};
89
90template< typename T >
91struct HasSIMDDivHelper< complex<T>, T, EnableIf_t< IsNumeric_v<T> && IsIntegral_v<T> > >
92 : public BoolConstant< bool( BLAZE_SVML_MODE ) &&
93 ( ( bool( BLAZE_AVX2_MODE ) ) ||
94 ( bool( BLAZE_MIC_MODE ) && sizeof(T) >= 4UL ) ||
95 ( bool( BLAZE_AVX512BW_MODE ) && sizeof(T) <= 2UL ) ||
96 ( bool( BLAZE_AVX512F_MODE ) && sizeof(T) >= 4UL ) ) >
97{};
99//*************************************************************************************************
100
101
102//*************************************************************************************************
104template<>
105struct HasSIMDDivHelper< float, float >
106 : public BoolConstant< bool( BLAZE_SSE_MODE ) ||
107 bool( BLAZE_AVX_MODE ) ||
108 bool( BLAZE_MIC_MODE ) ||
109 bool( BLAZE_AVX512F_MODE ) >
110{};
112//*************************************************************************************************
113
114
115//*************************************************************************************************
117template<>
118struct HasSIMDDivHelper< double, double >
119 : public BoolConstant< bool( BLAZE_SSE2_MODE ) ||
120 bool( BLAZE_AVX_MODE ) ||
121 bool( BLAZE_MIC_MODE ) ||
122 bool( BLAZE_AVX512F_MODE ) >
123{};
125//*************************************************************************************************
126
127
128//*************************************************************************************************
149template< typename T1 // Type of the left-hand side operand
150 , typename T2 // Type of the right-hand side operand
151 , typename = void > // Restricting condition
153 : public BoolConstant< HasSIMDDivHelper< RemoveCVRef_t<T1>, RemoveCVRef_t<T2> >::value >
154{};
155//*************************************************************************************************
156
157
158//*************************************************************************************************
171template< typename T1 // Type of the left-hand side operand
172 , typename T2 > // Type of the right-hand side operand
174//*************************************************************************************************
175
176} // namespace blaze
177
178#endif
Header file for the complex data type.
Header file for the EnableIf class template.
Header file for the IntegralConstant class template.
Header file for the IsIntegral type trait.
Header file for the IsNumeric type trait.
Header file for the IsSigned type trait.
Header file for the RemoveCVRef type trait.
Complex data type of the Blaze library.
constexpr bool HasSIMDDiv_v
Auxiliary variable template for the HasSIMDDiv type trait.
Definition: HasSIMDDiv.h:173
#define BLAZE_SVML_MODE
Compilation switch for the SVML mode.
Definition: Vectorization.h:349
#define BLAZE_AVX512F_MODE
Compilation switch for the AVX512F mode.
Definition: Vectorization.h:246
#define BLAZE_AVX512BW_MODE
Compilation switch for the AVX512BW mode.
Definition: Vectorization.h:264
#define BLAZE_AVX2_MODE
Compilation switch for the AVX2 mode.
Definition: Vectorization.h:228
#define BLAZE_MIC_MODE
Compilation switch for the MIC mode.
Definition: Vectorization.h:299
constexpr bool IsNumeric_v
Auxiliary variable template for the IsNumeric type trait.
Definition: IsNumeric.h:132
BoolConstant< false > FalseType
Type/value traits base class.
Definition: IntegralConstant.h:121
typename EnableIf< Condition, T >::Type EnableIf_t
Auxiliary type for the EnableIf class template.
Definition: EnableIf.h:138
IntegralConstant< bool, B > BoolConstant
Generic wrapper for a compile time constant boolean value.
Definition: IntegralConstant.h:110
Availability of a SIMD division for the given data types.
Definition: HasSIMDDiv.h:154
Generic wrapper for a compile time constant integral value.
Definition: IntegralConstant.h:74
System settings for the SSE mode.