22 #ifndef _BLAZE_MATH_INTRINSICS_INTRINSICTRAIT_H_
23 #define _BLAZE_MATH_INTRINSICS_INTRINSICTRAIT_H_
55 struct IntrinsicTraitHelper;
67 struct IntrinsicTraitHelper<1UL>
69 typedef sse_int8_t Type;
77 struct IntrinsicTraitHelper<1UL>
79 typedef sse_int8_t Type;
97 struct IntrinsicTraitHelper<2UL>
99 typedef sse_int16_t Type;
103 multiplication = 1 };
107 struct IntrinsicTraitHelper<2UL>
109 typedef sse_int16_t Type;
127 struct IntrinsicTraitHelper<4UL>
129 typedef sse_int32_t Type;
133 multiplication = 1 };
135 #elif BLAZE_AVX2_MODE
137 struct IntrinsicTraitHelper<4UL>
139 typedef sse_int32_t Type;
143 multiplication = 1 };
147 struct IntrinsicTraitHelper<4UL>
149 typedef sse_int32_t Type;
167 struct IntrinsicTraitHelper<8UL>
169 typedef sse_int64_t Type;
173 multiplication = 0 };
175 #elif BLAZE_AVX2_MODE
177 struct IntrinsicTraitHelper<8UL>
179 typedef sse_int64_t Type;
183 multiplication = 0 };
187 struct IntrinsicTraitHelper<8UL>
189 typedef sse_int64_t Type;
193 multiplication = 0 };
213 template<
typename T >
214 struct IntrinsicTraitBase
218 alignment = AlignmentTrait<T>::value,
221 multiplication = 0 };
233 struct IntrinsicTraitBase<short>
236 typedef IntrinsicTraitHelper<sizeof(short)> Helper;
239 typedef Helper::Type Type;
240 enum { size = Helper::size,
241 alignment = AlignmentTrait<short>::value,
242 addition = Helper::addition,
243 subtraction = Helper::subtraction,
244 multiplication = Helper::multiplication };
256 struct IntrinsicTraitBase<unsigned short>
259 typedef IntrinsicTraitHelper<sizeof(unsigned short)> Helper;
262 typedef Helper::Type Type;
263 enum { size = Helper::size,
264 alignment = AlignmentTrait<unsigned short>::value,
265 addition = Helper::addition,
266 subtraction = Helper::subtraction,
267 multiplication = Helper::multiplication };
279 struct IntrinsicTraitBase<int>
282 typedef IntrinsicTraitHelper<sizeof(int)> Helper;
285 typedef Helper::Type Type;
286 enum { size = Helper::size,
287 alignment = AlignmentTrait<int>::value,
288 addition = Helper::addition,
289 subtraction = Helper::subtraction,
290 multiplication = Helper::multiplication };
302 struct IntrinsicTraitBase<unsigned int>
305 typedef IntrinsicTraitHelper<sizeof(unsigned int)> Helper;
308 typedef Helper::Type Type;
309 enum { size = Helper::size,
310 alignment = AlignmentTrait<unsigned int>::value,
311 addition = Helper::addition,
312 subtraction = Helper::subtraction,
313 multiplication = Helper::multiplication };
325 struct IntrinsicTraitBase<long>
328 typedef IntrinsicTraitHelper<sizeof(long)> Helper;
331 typedef Helper::Type Type;
332 enum { size = Helper::size,
333 alignment = AlignmentTrait<long>::value,
334 addition = Helper::addition,
335 subtraction = Helper::subtraction,
336 multiplication = Helper::multiplication };
348 struct IntrinsicTraitBase<unsigned long>
351 typedef IntrinsicTraitHelper<sizeof(unsigned long)> Helper;
354 typedef Helper::Type Type;
355 enum { size = Helper::size,
356 alignment = AlignmentTrait<unsigned long>::value,
357 addition = Helper::addition,
358 subtraction = Helper::subtraction,
359 multiplication = Helper::multiplication };
371 struct IntrinsicTraitBase<float>
373 typedef sse_float_t Type;
374 enum { size = ( 64UL /
sizeof(float) ),
375 alignment = AlignmentTrait<float>::value,
378 multiplication = 1 };
382 struct IntrinsicTraitBase<float>
384 typedef sse_float_t Type;
385 enum { size = ( 32UL /
sizeof(float) ),
386 alignment = AlignmentTrait<float>::value,
389 multiplication = 1 };
393 struct IntrinsicTraitBase<float>
395 typedef sse_float_t Type;
397 alignment = AlignmentTrait<float>::value,
414 struct IntrinsicTraitBase<double>
416 typedef sse_double_t Type;
417 enum { size = ( 64UL /
sizeof(double) ),
418 alignment = AlignmentTrait<double>::value,
421 multiplication = 1 };
425 struct IntrinsicTraitBase<double>
427 typedef sse_double_t Type;
428 enum { size = ( 32UL /
sizeof(double) ),
429 alignment = AlignmentTrait<double>::value,
432 multiplication = 1 };
436 struct IntrinsicTraitBase<double>
438 typedef sse_double_t Type;
440 alignment = AlignmentTrait<double>::value,
457 struct IntrinsicTraitBase< complex<float> >
459 typedef sse_cfloat_t Type;
460 enum { size = ( 32UL /
sizeof(complex<float>) ),
461 alignment = AlignmentTrait< complex<float> >::value,
464 multiplication = 1 };
470 struct IntrinsicTraitBase< complex<float> >
472 typedef sse_cfloat_t Type;
473 enum { size = (
BLAZE_SSE_MODE )?( 16UL /
sizeof(complex<float>) ):( 1 ),
474 alignment = AlignmentTrait< complex<float> >::value,
493 struct IntrinsicTraitBase< complex<double> >
495 typedef sse_cdouble_t Type;
496 enum { size = ( 32UL /
sizeof(complex<double>) ),
497 alignment = AlignmentTrait< complex<double> >::value,
500 multiplication = 1 };
506 struct IntrinsicTraitBase< complex<double> >
508 typedef sse_cdouble_t Type;
509 enum { size = (
BLAZE_SSE_MODE )?( 16UL /
sizeof(complex<double>) ):( 1 ),
510 alignment = AlignmentTrait< complex<double> >::value,
550 template<
typename T >