1 | /* Copyright (C) 2012-2014 Povilas Kanapickas <povilas@radix.lt> |
2 | |
3 | Distributed under the Boost Software License, Version 1.0. |
4 | (See accompanying file LICENSE_1_0.txt or copy at |
5 | http://www.boost.org/LICENSE_1_0.txt) |
6 | */ |
7 | |
8 | #ifndef LIBSIMDPP_SIMDPP_TYPES_FWD_H |
9 | #define LIBSIMDPP_SIMDPP_TYPES_FWD_H |
10 | |
11 | #ifndef LIBSIMDPP_SIMD_H |
12 | #error "This file must be included through simd.h" |
13 | #endif |
14 | #include <simdpp/setup_arch.h> |
15 | #include <simdpp/types/tag.h> |
16 | |
17 | /* This is an internal helper file that contains forward declarations of the |
18 | vector templates and typedefs of specific vector types urcoah |
19 | */ |
20 | namespace simdpp { |
21 | namespace SIMDPP_ARCH_NAMESPACE { |
22 | |
23 | namespace detail { |
24 | //template<int> void construct_eval(); |
25 | } // namespace detail |
26 | |
27 | // types |
28 | template<unsigned N, class E = void> class float32; |
29 | template<unsigned N, class E = void> class mask_float32; |
30 | |
31 | using float32x4 = float32<4>; |
32 | using float32x8 = float32<8>; |
33 | using mask_float32x4 = mask_float32<4>; |
34 | using mask_float32x8 = mask_float32<8>; |
35 | |
36 | template<unsigned N, class E = void> class float64; |
37 | template<unsigned N, class E = void> class mask_float64; |
38 | |
39 | using float64x2 = float64<2>; |
40 | using float64x4 = float64<4>; |
41 | using mask_float64x2 = mask_float64<2>; |
42 | using mask_float64x4 = mask_float64<4>; |
43 | |
44 | template<unsigned N, class E = void> class int8; |
45 | template<unsigned N, class E = void> class uint8; |
46 | template<unsigned N, class E = void> class mask_int8; |
47 | |
48 | using int8x16 = int8<16>; |
49 | using int8x32 = int8<32>; |
50 | using uint8x16 = uint8<16>; |
51 | using uint8x32 = uint8<32>; |
52 | using mask_int8x16 = mask_int8<16>; |
53 | using mask_int8x32 = mask_int8<32>; |
54 | |
55 | template<unsigned N, class E = void> class int16; |
56 | template<unsigned N, class E = void> class uint16; |
57 | template<unsigned N, class E = void> class mask_int16; |
58 | |
59 | using int16x8 = int16<8>; |
60 | using int16x16 = int16<16>; |
61 | using uint16x8 = uint16<8>; |
62 | using uint16x16 = uint16<16>; |
63 | using mask_int16x8 = mask_int16<8>; |
64 | using mask_int16x16 = mask_int16<16>; |
65 | |
66 | template<unsigned N, class E = void> class int32; |
67 | template<unsigned N, class E = void> class uint32; |
68 | template<unsigned N, class E = void> class mask_int32; |
69 | |
70 | using int32x4 = int32<4>; |
71 | using int32x8 = int32<8>; |
72 | using uint32x4 = uint32<4>; |
73 | using uint32x8 = uint32<8>; |
74 | using mask_int32x4 = mask_int32<4>; |
75 | using mask_int32x8 = mask_int32<8>; |
76 | |
77 | template<unsigned N, class E = void> class int64; |
78 | template<unsigned N, class E = void> class uint64; |
79 | template<unsigned N, class E = void> class mask_int64; |
80 | |
81 | using int64x2 = int64<2>; |
82 | using int64x4 = int64<4>; |
83 | using uint64x2 = uint64<2>; |
84 | using uint64x4 = uint64<4>; |
85 | using mask_int64x2 = mask_int64<2>; |
86 | using mask_int64x4 = mask_int64<4>; |
87 | |
88 | #if SIMDPP_USE_AVX512F |
89 | #define SIMDPP_FAST_FLOAT32_SIZE 16 |
90 | #define SIMDPP_FAST_FLOAT64_SIZE 8 |
91 | #elif SIMDPP_USE_AVX |
92 | #define SIMDPP_FAST_FLOAT32_SIZE 8 |
93 | #define SIMDPP_FAST_FLOAT64_SIZE 4 |
94 | #elif SIMDPP_USE_SSE2 || SIMDPP_USE_NEON || SIMDPP_USE_ALTIVEC || SIMDPP_USE_MSA || SIMDPP_USE_NULL |
95 | #define SIMDPP_FAST_FLOAT32_SIZE 4 |
96 | #define SIMDPP_FAST_FLOAT64_SIZE 2 |
97 | #endif |
98 | |
99 | #if SIMDPP_USE_AVX512BW |
100 | #define SIMDPP_FAST_INT8_SIZE 64 |
101 | #define SIMDPP_FAST_INT16_SIZE 32 |
102 | #define SIMDPP_FAST_INT32_SIZE 16 |
103 | #define SIMDPP_FAST_INT64_SIZE 8 |
104 | #elif SIMDPP_USE_AVX512F |
105 | #define SIMDPP_FAST_INT8_SIZE 32 |
106 | #define SIMDPP_FAST_INT16_SIZE 16 |
107 | #define SIMDPP_FAST_INT32_SIZE 16 |
108 | #define SIMDPP_FAST_INT64_SIZE 8 |
109 | #elif SIMDPP_USE_AVX2 |
110 | #define SIMDPP_FAST_INT8_SIZE 32 |
111 | #define SIMDPP_FAST_INT16_SIZE 16 |
112 | #define SIMDPP_FAST_INT32_SIZE 8 |
113 | #define SIMDPP_FAST_INT64_SIZE 4 |
114 | #elif SIMDPP_USE_SSE2 || SIMDPP_USE_NEON || SIMDPP_USE_ALTIVEC || SIMDPP_USE_MSA || SIMDPP_USE_NULL |
115 | #define SIMDPP_FAST_INT8_SIZE 16 |
116 | #define SIMDPP_FAST_INT16_SIZE 8 |
117 | #define SIMDPP_FAST_INT32_SIZE 4 |
118 | #define SIMDPP_FAST_INT64_SIZE 2 |
119 | #endif |
120 | |
121 | using float32v = float32<SIMDPP_FAST_FLOAT32_SIZE>; |
122 | using mask_float32v = mask_float32<SIMDPP_FAST_FLOAT32_SIZE>; |
123 | using float64v = float64<SIMDPP_FAST_FLOAT64_SIZE>; |
124 | using mask_float64v = mask_float64<SIMDPP_FAST_FLOAT64_SIZE>; |
125 | |
126 | using int8v = int8<SIMDPP_FAST_INT8_SIZE>; |
127 | using uint8v = uint8<SIMDPP_FAST_INT8_SIZE>; |
128 | using mask_int8v = mask_int8<SIMDPP_FAST_INT8_SIZE>; |
129 | |
130 | using int16v = int16<SIMDPP_FAST_INT16_SIZE>; |
131 | using uint16v = uint16<SIMDPP_FAST_INT16_SIZE>; |
132 | using mask_int16v = mask_int16<SIMDPP_FAST_INT16_SIZE>; |
133 | |
134 | using int32v = int32<SIMDPP_FAST_INT32_SIZE>; |
135 | using uint32v = uint32<SIMDPP_FAST_INT32_SIZE>; |
136 | using mask_int32v = mask_int32<SIMDPP_FAST_INT32_SIZE>; |
137 | |
138 | using int64v = int64<SIMDPP_FAST_INT64_SIZE>; |
139 | using uint64v = uint64<SIMDPP_FAST_INT64_SIZE>; |
140 | using mask_int64v = mask_int64<SIMDPP_FAST_INT64_SIZE>; |
141 | |
142 | using mask_float32v2 = mask_float32<SIMDPP_FAST_FLOAT32_SIZE*2>; |
143 | using float64v2 = float64<SIMDPP_FAST_FLOAT64_SIZE*2>; |
144 | using mask_float64v2 = mask_float64<SIMDPP_FAST_FLOAT64_SIZE*2>; |
145 | |
146 | using int8v2 = int8<SIMDPP_FAST_INT8_SIZE*2>; |
147 | using uint8v2 = uint8<SIMDPP_FAST_INT8_SIZE*2>; |
148 | using mask_int8v2 = mask_int8<SIMDPP_FAST_INT8_SIZE*2>; |
149 | |
150 | using int16v2 = int16<SIMDPP_FAST_INT16_SIZE*2>; |
151 | using uint16v2 = uint16<SIMDPP_FAST_INT16_SIZE*2>; |
152 | using mask_int16v2 = mask_int16<SIMDPP_FAST_INT16_SIZE*2>; |
153 | |
154 | using int32v2 = int32<SIMDPP_FAST_INT32_SIZE*2>; |
155 | using uint32v2 = uint32<SIMDPP_FAST_INT32_SIZE*2>; |
156 | using mask_int32v2 = mask_int32<SIMDPP_FAST_INT32_SIZE*2>; |
157 | |
158 | using int64v2 = int64<SIMDPP_FAST_INT64_SIZE*2>; |
159 | using uint64v2 = uint64<SIMDPP_FAST_INT64_SIZE*2>; |
160 | using mask_int64v2 = mask_int64<SIMDPP_FAST_INT64_SIZE*2>; |
161 | |
162 | |
163 | using float32v4 = float32<SIMDPP_FAST_FLOAT32_SIZE*4>; |
164 | using mask_float32v4 = mask_float32<SIMDPP_FAST_FLOAT32_SIZE*4>; |
165 | using float64v4 = float64<SIMDPP_FAST_FLOAT64_SIZE*4>; |
166 | using mask_float64v4 = mask_float64<SIMDPP_FAST_FLOAT64_SIZE*4>; |
167 | |
168 | using int8v4 = int8<SIMDPP_FAST_INT8_SIZE*4>; |
169 | using uint8v4 = uint8<SIMDPP_FAST_INT8_SIZE*4>; |
170 | using mask_int8v4 = mask_int8<SIMDPP_FAST_INT8_SIZE*4>; |
171 | |
172 | using int16v4 = int16<SIMDPP_FAST_INT16_SIZE*4>; |
173 | using uint16v4 = uint16<SIMDPP_FAST_INT16_SIZE*4>; |
174 | using mask_int16v4 = mask_int16<SIMDPP_FAST_INT16_SIZE*4>; |
175 | |
176 | using int32v4 = int32<SIMDPP_FAST_INT32_SIZE*4>; |
177 | using uint32v4 = uint32<SIMDPP_FAST_INT32_SIZE*4>; |
178 | using mask_int32v4 = mask_int32<SIMDPP_FAST_INT32_SIZE*4>; |
179 | |
180 | using int64v4 = int64<SIMDPP_FAST_INT64_SIZE*4>; |
181 | using uint64v4 = uint64<SIMDPP_FAST_INT64_SIZE*4>; |
182 | using mask_int64v4 = mask_int64<SIMDPP_FAST_INT64_SIZE*4>; |
183 | |
184 | } // namespace SIMDPP_ARCH_NAMESPACE |
185 | } // namespace simdpp |
186 | |
187 | #endif |
188 | |