5.9 KB、231行 生 Blame 履歴
1/// @ref core
2/// @file glm/detail/func_common_simd.inl
3
4#if GLM_ARCH & GLM_ARCH_SSE2_BIT
5
6#include "../simd/common.h"
7
8#include <immintrin.h>
9
10namespace glm{
11namespace detail
12{
13 template<qualifier Q>
14 struct compute_abs_vector<4, float, Q, true>
15 {
16 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)
17 {
18 vec<4, float, Q> result;
19 result.data = glm_vec4_abs(v.data);
20 return result;
21 }
22 };
23
24 template<qualifier Q>
25 struct compute_abs_vector<4, int, Q, true>
26 {
27 GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v)
28 {
29 vec<4, int, Q> result;
30 result.data = glm_ivec4_abs(v.data);
31 return result;
32 }
33 };
34
35 template<qualifier Q>
36 struct compute_floor<4, float, Q, true>
37 {
38 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)
39 {
40 vec<4, float, Q> result;
41 result.data = glm_vec4_floor(v.data);
42 return result;
43 }
44 };
45
46 template<qualifier Q>
47 struct compute_ceil<4, float, Q, true>
48 {
49 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)
50 {
51 vec<4, float, Q> result;
52 result.data = glm_vec4_ceil(v.data);
53 return result;
54 }
55 };
56
57 template<qualifier Q>
58 struct compute_fract<4, float, Q, true>
59 {
60 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)
61 {
62 vec<4, float, Q> result;
63 result.data = glm_vec4_fract(v.data);
64 return result;
65 }
66 };
67
68 template<qualifier Q>
69 struct compute_round<4, float, Q, true>
70 {
71 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v)
72 {
73 vec<4, float, Q> result;
74 result.data = glm_vec4_round(v.data);
75 return result;
76 }
77 };
78
79 template<qualifier Q>
80 struct compute_mod<4, float, Q, true>
81 {
82 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y)
83 {
84 vec<4, float, Q> result;
85 result.data = glm_vec4_mod(x.data, y.data);
86 return result;
87 }
88 };
89
90 template<qualifier Q>
91 struct compute_min_vector<4, float, Q, true>
92 {
93 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2)
94 {
95 vec<4, float, Q> result;
96 result.data = _mm_min_ps(v1.data, v2.data);
97 return result;
98 }
99 };
100
101 template<qualifier Q>
102 struct compute_min_vector<4, int, Q, true>
103 {
104 GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2)
105 {
106 vec<4, int, Q> result;
107 result.data = _mm_min_epi32(v1.data, v2.data);
108 return result;
109 }
110 };
111
112 template<qualifier Q>
113 struct compute_min_vector<4, uint, Q, true>
114 {
115 GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2)
116 {
117 vec<4, uint, Q> result;
118 result.data = _mm_min_epu32(v1.data, v2.data);
119 return result;
120 }
121 };
122
123 template<qualifier Q>
124 struct compute_max_vector<4, float, Q, true>
125 {
126 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& v1, vec<4, float, Q> const& v2)
127 {
128 vec<4, float, Q> result;
129 result.data = _mm_max_ps(v1.data, v2.data);
130 return result;
131 }
132 };
133
134 template<qualifier Q>
135 struct compute_max_vector<4, int, Q, true>
136 {
137 GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& v1, vec<4, int, Q> const& v2)
138 {
139 vec<4, int, Q> result;
140 result.data = _mm_max_epi32(v1.data, v2.data);
141 return result;
142 }
143 };
144
145 template<qualifier Q>
146 struct compute_max_vector<4, uint, Q, true>
147 {
148 GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& v1, vec<4, uint, Q> const& v2)
149 {
150 vec<4, uint, Q> result;
151 result.data = _mm_max_epu32(v1.data, v2.data);
152 return result;
153 }
154 };
155
156 template<qualifier Q>
157 struct compute_clamp_vector<4, float, Q, true>
158 {
159 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& minVal, vec<4, float, Q> const& maxVal)
160 {
161 vec<4, float, Q> result;
162 result.data = _mm_min_ps(_mm_max_ps(x.data, minVal.data), maxVal.data);
163 return result;
164 }
165 };
166
167 template<qualifier Q>
168 struct compute_clamp_vector<4, int, Q, true>
169 {
170 GLM_FUNC_QUALIFIER static vec<4, int, Q> call(vec<4, int, Q> const& x, vec<4, int, Q> const& minVal, vec<4, int, Q> const& maxVal)
171 {
172 vec<4, int, Q> result;
173 result.data = _mm_min_epi32(_mm_max_epi32(x.data, minVal.data), maxVal.data);
174 return result;
175 }
176 };
177
178 template<qualifier Q>
179 struct compute_clamp_vector<4, uint, Q, true>
180 {
181 GLM_FUNC_QUALIFIER static vec<4, uint, Q> call(vec<4, uint, Q> const& x, vec<4, uint, Q> const& minVal, vec<4, uint, Q> const& maxVal)
182 {
183 vec<4, uint, Q> result;
184 result.data = _mm_min_epu32(_mm_max_epu32(x.data, minVal.data), maxVal.data);
185 return result;
186 }
187 };
188
189 template<qualifier Q>
190 struct compute_mix_vector<4, float, bool, Q, true>
191 {
192 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& x, vec<4, float, Q> const& y, vec<4, bool, Q> const& a)
193 {
194 __m128i const Load = _mm_set_epi32(-static_cast<int>(a.w), -static_cast<int>(a.z), -static_cast<int>(a.y), -static_cast<int>(a.x));
195 __m128 const Mask = _mm_castsi128_ps(Load);
196
197 vec<4, float, Q> Result;
198# if 0 && GLM_ARCH & GLM_ARCH_AVX
199 Result.data = _mm_blendv_ps(x.data, y.data, Mask);
200# else
201 Result.data = _mm_or_ps(_mm_and_ps(Mask, y.data), _mm_andnot_ps(Mask, x.data));
202# endif
203 return Result;
204 }
205 };
206/* FIXME
207 template<qualifier Q>
208 struct compute_step_vector<float, Q, tvec4>
209 {
210 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge, vec<4, float, Q> const& x)
211 {
212 vec<4, float, Q> Result;
213 result.data = glm_vec4_step(edge.data, x.data);
214 return result;
215 }
216 };
217*/
218 template<qualifier Q>
219 struct compute_smoothstep_vector<4, float, Q, true>
220 {
221 GLM_FUNC_QUALIFIER static vec<4, float, Q> call(vec<4, float, Q> const& edge0, vec<4, float, Q> const& edge1, vec<4, float, Q> const& x)
222 {
223 vec<4, float, Q> Result;
224 Result.data = glm_vec4_smoothstep(edge0.data, edge1.data, x.data);
225 return Result;
226 }
227 };
228}//namespace detail
229}//namespace glm
230
231#endif//GLM_ARCH & GLM_ARCH_SSE2_BIT