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