OGLplus  (0.59.0) a C++ wrapper for rendering APIs

data_vec.hpp
Go to the documentation of this file.
1 #ifndef EAGINE_VECT_DATA_VEC_HPP
9 #define EAGINE_VECT_DATA_VEC_HPP
10 
11 #include "config.hpp"
12 #include "fwd.hpp"
13 #include <cstdint>
14 #include <utility>
15 
16 namespace eagine::vect {
17 
18 #if EAGINE_USE_SIMD
19 #if defined(__clang__)
20 
21 // int8_t
22 template <>
23 struct _vec_data<int8_t, 8> {
24  using type __attribute__((vector_size(8))) = int8_t;
25 };
26 
27 // int16_t
28 template <>
29 struct _vec_data<int16_t, 4> {
30  using type __attribute__((vector_size(8))) = int16_t;
31 };
32 
33 // int32_t
34 template <>
35 struct _vec_data<int32_t, 2> {
36  using type __attribute__((vector_size(8))) = int32_t;
37 };
38 
39 template <>
40 struct _vec_data<int32_t, 4> {
41  using type __attribute__((vector_size(16))) = int32_t;
42 };
43 
44 // int64_t
45 template <>
46 struct _vec_data<int64_t, 2> {
47  using type __attribute__((vector_size(16))) = int64_t;
48 };
49 
50 template <>
51 struct _vec_data<int64_t, 4> {
52  using type __attribute__((vector_size(32))) = int64_t;
53 };
54 
55 // float
56 template <>
57 struct _vec_data<float, 2> {
58  using type __attribute__((vector_size(8))) = float;
59 };
60 
61 template <>
62 struct _vec_data<float, 3> {
63  using type __attribute__((vector_size(16))) = float;
64 };
65 
66 template <>
67 struct _vec_data<float, 4> {
68  using type __attribute__((vector_size(16))) = float;
69 };
70 
71 // double
72 template <>
73 struct _vec_data<double, 2> {
74  using type __attribute__((vector_size(16))) = double;
75 };
76 
77 template <>
78 struct _vec_data<double, 3> {
79  using type __attribute__((vector_size(32))) = double;
80 };
81 
82 template <>
83 struct _vec_data<double, 4> {
84  using type __attribute__((vector_size(32))) = double;
85 };
86 
87 #elif defined(__GNUC__)
88 
89 template <typename T, int N>
90 struct _gnuc_vec_data {
91  using type __attribute__((vector_size(sizeof(T) * N))) = T;
92 };
93 
94 template <typename T>
95 struct _vec_data<T, 2> : _gnuc_vec_data<T, 2> {};
96 
97 template <typename T>
98 struct _vec_data<T, 3> : _gnuc_vec_data<T, 4> {};
99 
100 template <typename T>
101 struct _vec_data<T, 4> : _gnuc_vec_data<T, 4> {};
102 
103 template <typename T>
104 struct _vec_data<T, 8> : _gnuc_vec_data<T, 8> {};
105 
106 #endif // platform
107 
108 // has_vec_data<int8_t>
109 template <int N>
110 struct _has_vec_data<int8_t, N>
111  : bool_constant<
112 #if defined(__SSE2__) && __SSE2__
113  ((N == 2) || (N == 4) || (N == 8) || (N == 16)) ||
114 #endif
115 #if defined(__MMX__) && __MMX__
116  ((N == 2) || (N == 4) || (N == 8)) ||
117 #endif
118  false> {
119 };
120 
121 // has_vec_data<int16_t>
122 template <int N>
123 struct _has_vec_data<int16_t, N>
124  : bool_constant<
125 #if defined(__SSE2__) && __SSE2__
126  ((N == 2) || (N == 4) || (N == 8)) ||
127 #endif
128 #if defined(__MMX__) && __MMX__
129  ((N == 2) || (N == 4)) ||
130 #endif
131  false> {
132 };
133 
134 // has_vec_data<int32_t>
135 template <int N>
136 struct _has_vec_data<int32_t, N>
137  : bool_constant<
138 #if defined(__SSE2__) && __SSE2__
139  ((N == 2) || (N == 4)) ||
140 #endif
141 #if defined(__MMX__) && __MMX__
142  (N == 2) ||
143 #endif
144  false> {
145 };
146 
147 // has_vec_data<int64_t>
148 template <int N>
149 struct _has_vec_data<int64_t, N>
150  : bool_constant<
151 #if defined(__SSE2__) && __SSE2__
152  (N == 2) ||
153 #endif
154  false> {
155 };
156 
157 // has_vec_data<float>
158 template <int N>
159 struct _has_vec_data<float, N>
160  : bool_constant<
161 #if defined(__AVX__) && __AVX__
162  ((N == 2) || (N == 3) || (N == 4)) ||
163 #endif
164 #if defined(__SSE__) && __SSE__
165  ((N == 2) || (N == 4)) ||
166 #endif
167  false> {
168 };
169 
170 // has_vec_data<double>
171 template <int N>
172 struct _has_vec_data<double, N>
173  : bool_constant<
174 #if defined(__AVX__) && __AVX__
175  ((N == 2) || (N == 4)) ||
176 #endif
177 #if defined(__SSE2__) && __SSE2__
178  (N == 2) ||
179 #endif
180  false> {
181 };
182 #endif // EAGINE_USE_SIMD
183 
184 } // namespace eagine::vect
185 
186 #endif // EAGINE_VECT_DATA_VEC_HPP
std::integral_constant< bool, B > bool_constant
Alias for boolean constant type.
Definition: int_constant.hpp:20

Copyright © 2015-2021 Matúš Chochlík.
<chochlik -at -gmail.com>
Documentation generated on Tue Apr 13 2021 by Doxygen (version 1.8.17).