1 #ifndef EAGINE_VECT_DATA_VEC_HPP 
    9 #define EAGINE_VECT_DATA_VEC_HPP 
   16 namespace eagine::vect {
 
   19 #if defined(__clang__) 
   23 struct _vec_data<int8_t, 8> {
 
   24     using type __attribute__((vector_size(8))) = int8_t;
 
   29 struct _vec_data<int16_t, 4> {
 
   30     using type __attribute__((vector_size(8))) = int16_t;
 
   35 struct _vec_data<int32_t, 2> {
 
   36     using type __attribute__((vector_size(8))) = int32_t;
 
   40 struct _vec_data<int32_t, 4> {
 
   41     using type __attribute__((vector_size(16))) = int32_t;
 
   46 struct _vec_data<int64_t, 2> {
 
   47     using type __attribute__((vector_size(16))) = int64_t;
 
   51 struct _vec_data<int64_t, 4> {
 
   52     using type __attribute__((vector_size(32))) = int64_t;
 
   57 struct _vec_data<float, 2> {
 
   58     using type __attribute__((vector_size(8))) = float;
 
   62 struct _vec_data<float, 3> {
 
   63     using type __attribute__((vector_size(16))) = float;
 
   67 struct _vec_data<float, 4> {
 
   68     using type __attribute__((vector_size(16))) = float;
 
   73 struct _vec_data<double, 2> {
 
   74     using type __attribute__((vector_size(16))) = double;
 
   78 struct _vec_data<double, 3> {
 
   79     using type __attribute__((vector_size(32))) = double;
 
   83 struct _vec_data<double, 4> {
 
   84     using type __attribute__((vector_size(32))) = double;
 
   87 #elif defined(__GNUC__) 
   89 template <
typename T, 
int N>
 
   90 struct _gnuc_vec_data {
 
   91     using type __attribute__((vector_size(
sizeof(T) * N))) = T;
 
   95 struct _vec_data<T, 2> : _gnuc_vec_data<T, 2> {};
 
   98 struct _vec_data<T, 3> : _gnuc_vec_data<T, 4> {};
 
  100 template <
typename T>
 
  101 struct _vec_data<T, 4> : _gnuc_vec_data<T, 4> {};
 
  103 template <
typename T>
 
  104 struct _vec_data<T, 8> : _gnuc_vec_data<T, 8> {};
 
  110 struct _has_vec_data<int8_t, N>
 
  112 #if defined(__SSE2__) && __SSE2__
 
  113       ((N == 2) || (N == 4) || (N == 8) || (N == 16)) ||
 
  115 #if defined(__MMX__) && __MMX__
 
  116       ((N == 2) || (N == 4) || (N == 8)) ||
 
  123 struct _has_vec_data<int16_t, N>
 
  125 #if defined(__SSE2__) && __SSE2__
 
  126       ((N == 2) || (N == 4) || (N == 8)) ||
 
  128 #if defined(__MMX__) && __MMX__
 
  129       ((N == 2) || (N == 4)) ||
 
  136 struct _has_vec_data<int32_t, N>
 
  138 #if defined(__SSE2__) && __SSE2__
 
  139       ((N == 2) || (N == 4)) ||
 
  141 #if defined(__MMX__) && __MMX__
 
  149 struct _has_vec_data<int64_t, N>
 
  151 #if defined(__SSE2__) && __SSE2__
 
  159 struct _has_vec_data<float, N>
 
  161 #if defined(__AVX__) && __AVX__
 
  162       ((N == 2) || (N == 3) || (N == 4)) ||
 
  164 #if defined(__SSE__) && __SSE__
 
  165       ((N == 2) || (N == 4)) ||
 
  172 struct _has_vec_data<double, N>
 
  174 #if defined(__AVX__) && __AVX__
 
  175       ((N == 2) || (N == 4)) ||
 
  177 #if defined(__SSE2__) && __SSE2__
 
  182 #endif // EAGINE_USE_SIMD 
  186 #endif // EAGINE_VECT_DATA_VEC_HPP