All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
IntrinsicTrait.h
Go to the documentation of this file.
1 //=================================================================================================
20 //=================================================================================================
21 
22 #ifndef _BLAZE_MATH_INTRINSICS_INTRINSICTRAIT_H_
23 #define _BLAZE_MATH_INTRINSICS_INTRINSICTRAIT_H_
24 
25 
26 //*************************************************************************************************
27 // Includes
28 //*************************************************************************************************
29 
30 #include <boost/type_traits/remove_cv.hpp>
36 
37 
38 namespace blaze {
39 
40 //=================================================================================================
41 //
42 // CLASS INTRINSICTRAITHELPER
43 //
44 //=================================================================================================
45 
46 //*************************************************************************************************
54 template< size_t N >
55 struct IntrinsicTraitHelper;
57 //*************************************************************************************************
58 
59 
60 //*************************************************************************************************
65 template<>
66 struct IntrinsicTraitHelper<1UL>
67 {
68  typedef sse_int8_t Type;
69  enum { size = ( BLAZE_SSE2_MODE )?( 16 ):( 1 ),
70  addition = BLAZE_SSE2_MODE,
71  subtraction = BLAZE_SSE2_MODE,
72  multiplication = 0 };
73 };
75 //*************************************************************************************************
76 
77 
78 //*************************************************************************************************
83 template<>
84 struct IntrinsicTraitHelper<2UL>
85 {
86  typedef sse_int16_t Type;
87  enum { size = ( BLAZE_SSE2_MODE )?( 8 ):( 1 ),
88  addition = BLAZE_SSE2_MODE,
89  subtraction = BLAZE_SSE2_MODE,
90  multiplication = BLAZE_SSE2_MODE };
91 };
93 //*************************************************************************************************
94 
95 
96 //*************************************************************************************************
101 #if BLAZE_MIC_MODE
102 struct IntrinsicTraitHelper<4UL>
103 {
104  typedef sse_int32_t Type;
105  enum { size = 16,
106  addition = 1,
107  subtraction = 1,
108  multiplication = 1 };
109 };
110 #else
111 template<>
112 struct IntrinsicTraitHelper<4UL>
113 {
114  typedef sse_int32_t Type;
115  enum { size = ( BLAZE_SSE2_MODE )?( 4 ):( 1 ),
116  addition = BLAZE_SSE2_MODE,
117  subtraction = BLAZE_SSE2_MODE,
118  multiplication = BLAZE_SSE4_MODE };
119 };
120 #endif
121 
122 //*************************************************************************************************
123 
124 
125 //*************************************************************************************************
130 #if BLAZE_MIC_MODE
131 template<>
132 struct IntrinsicTraitHelper<8UL>
133 {
134  typedef sse_int64_t Type;
135  enum { size = 8,
136  addition = 1,
137  subtraction = 0,
138  multiplication = 0 };
139 };
140 #else
141 template<>
142 struct IntrinsicTraitHelper<8UL>
143 {
144  typedef sse_int64_t Type;
145  enum { size = ( BLAZE_SSE2_MODE )?( 2 ):( 1 ),
146  addition = BLAZE_SSE2_MODE,
147  subtraction = BLAZE_SSE2_MODE,
148  multiplication = 0 };
149 };
150 #endif
151 
152 //*************************************************************************************************
153 
154 
155 
156 
157 //=================================================================================================
158 //
159 // CLASS INTRINSICTRAITBASE
160 //
161 //=================================================================================================
162 
163 //*************************************************************************************************
168 template< typename T >
169 struct IntrinsicTraitBase
170 {
171  typedef T Type;
172  enum { size = 1,
173  alignment = AlignmentTrait<T>::value,
174  addition = 0,
175  subtraction = 0,
176  multiplication = 0 };
177 };
179 //*************************************************************************************************
180 
181 
182 //*************************************************************************************************
187 template<>
188 struct IntrinsicTraitBase<short>
189 {
190  private:
191  typedef IntrinsicTraitHelper<sizeof(short)> Helper;
192 
193  public:
194  typedef Helper::Type Type;
195  enum { size = Helper::size,
196  alignment = AlignmentTrait<short>::value,
197  addition = Helper::addition,
198  subtraction = Helper::subtraction,
199  multiplication = Helper::multiplication };
200 };
202 //*************************************************************************************************
203 
204 
205 //*************************************************************************************************
210 template<>
211 struct IntrinsicTraitBase<unsigned short>
212 {
213  private:
214  typedef IntrinsicTraitHelper<sizeof(unsigned short)> Helper;
215 
216  public:
217  typedef Helper::Type Type;
218  enum { size = Helper::size,
219  alignment = AlignmentTrait<unsigned short>::value,
220  addition = Helper::addition,
221  subtraction = Helper::subtraction,
222  multiplication = Helper::multiplication };
223 };
225 //*************************************************************************************************
226 
227 
228 //*************************************************************************************************
233 template<>
234 struct IntrinsicTraitBase<int>
235 {
236  private:
237  typedef IntrinsicTraitHelper<sizeof(int)> Helper;
238 
239  public:
240  typedef Helper::Type Type;
241  enum { size = Helper::size,
242  alignment = AlignmentTrait<int>::value,
243  addition = Helper::addition,
244  subtraction = Helper::subtraction,
245  multiplication = Helper::multiplication };
246 };
248 //*************************************************************************************************
249 
250 
251 //*************************************************************************************************
256 template<>
257 struct IntrinsicTraitBase<unsigned int>
258 {
259  private:
260  typedef IntrinsicTraitHelper<sizeof(unsigned int)> Helper;
261 
262  public:
263  typedef Helper::Type Type;
264  enum { size = Helper::size,
265  alignment = AlignmentTrait<unsigned int>::value,
266  addition = Helper::addition,
267  subtraction = Helper::subtraction,
268  multiplication = Helper::multiplication };
269 };
271 //*************************************************************************************************
272 
273 
274 //*************************************************************************************************
279 template<>
280 struct IntrinsicTraitBase<long>
281 {
282  private:
283  typedef IntrinsicTraitHelper<sizeof(long)> Helper;
284 
285  public:
286  typedef Helper::Type Type;
287  enum { size = Helper::size,
288  alignment = AlignmentTrait<long>::value,
289  addition = Helper::addition,
290  subtraction = Helper::subtraction,
291  multiplication = Helper::multiplication };
292 };
294 //*************************************************************************************************
295 
296 
297 //*************************************************************************************************
302 template<>
303 struct IntrinsicTraitBase<unsigned long>
304 {
305  private:
306  typedef IntrinsicTraitHelper<sizeof(unsigned long)> Helper;
307 
308  public:
309  typedef Helper::Type Type;
310  enum { size = Helper::size,
311  alignment = AlignmentTrait<unsigned long>::value,
312  addition = Helper::addition,
313  subtraction = Helper::subtraction,
314  multiplication = Helper::multiplication };
315 };
317 //*************************************************************************************************
318 
319 
320 //*************************************************************************************************
325 #if BLAZE_MIC_MODE
326 struct IntrinsicTraitBase<float>
327 {
328  typedef sse_float_t Type;
329  enum { size = ( 64UL / sizeof(float) ),
330  alignment = AlignmentTrait<float>::value,
331  addition = 1,
332  subtraction = 1,
333  multiplication = 1 };
334 };
335 #elif BLAZE_AVX_MODE
336 template<>
337 struct IntrinsicTraitBase<float>
338 {
339  typedef sse_float_t Type;
340  enum { size = ( 32UL / sizeof(float) ),
341  alignment = AlignmentTrait<float>::value,
342  addition = 1,
343  subtraction = 1,
344  multiplication = 1 };
345 };
346 #else
347 template<>
348 struct IntrinsicTraitBase<float>
349 {
350  typedef sse_float_t Type;
351  enum { size = ( BLAZE_SSE_MODE )?( 16UL / sizeof(float) ):( 1 ),
352  alignment = AlignmentTrait<float>::value,
353  addition = BLAZE_SSE_MODE,
354  subtraction = BLAZE_SSE_MODE,
355  multiplication = BLAZE_SSE_MODE };
356 };
357 #endif
358 
359 //*************************************************************************************************
360 
361 
362 //*************************************************************************************************
367 #if BLAZE_MIC_MODE
368 template<>
369 struct IntrinsicTraitBase<double>
370 {
371  typedef sse_double_t Type;
372  enum { size = ( 64UL / sizeof(double) ),
373  alignment = AlignmentTrait<double>::value,
374  addition = 1,
375  subtraction = 1,
376  multiplication = 1 };
377 };
378 #elif BLAZE_AVX_MODE
379 template<>
380 struct IntrinsicTraitBase<double>
381 {
382  typedef sse_double_t Type;
383  enum { size = ( 32UL / sizeof(double) ),
384  alignment = AlignmentTrait<double>::value,
385  addition = 1,
386  subtraction = 1,
387  multiplication = 1 };
388 };
389 #else
390 template<>
391 struct IntrinsicTraitBase<double>
392 {
393  typedef sse_double_t Type;
394  enum { size = ( BLAZE_SSE_MODE )?( 16UL / sizeof(double) ):( 1 ),
395  alignment = AlignmentTrait<double>::value,
396  addition = BLAZE_SSE_MODE,
397  subtraction = BLAZE_SSE_MODE,
398  multiplication = BLAZE_SSE_MODE };
399 };
400 #endif
401 
402 //*************************************************************************************************
403 
404 
405 
406 
407 //=================================================================================================
408 //
409 // CLASS INTRINSICTRAIT
410 //
411 //=================================================================================================
412 
413 //*************************************************************************************************
433 template< typename T >
434 class IntrinsicTrait : public IntrinsicTraitBase< typename boost::remove_cv<T>::type >
435 {
436  //**Compile time checks*************************************************************************
441  //**********************************************************************************************
442 };
443 //*************************************************************************************************
444 
445 } // namespace blaze
446 
447 #endif