15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_SATURATEDCASTPACK_H__ 16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_SATURATEDCASTPACK_H__ 33 template <
typename TIn,
typename TOut>
35 typename boost::enable_if_c<
36 boost::is_same<TIn, TOut>::value
40 static IPSDK_FORCEINLINE
47 static IPSDK_FORCEINLINE
56 template <
typename TIn,
typename TOut>
58 typename boost::enable_if_c<
59 boost::is_integral<TIn>::value &&
60 boost::is_integral<TOut>::value &&
61 boost::is_signed<TIn>::value==boost::is_signed<TOut>::value &&
62 sizeof(TIn)<sizeof(TOut)
66 static IPSDK_FORCEINLINE
73 static IPSDK_FORCEINLINE
82 template <
typename TIn,
typename TOut>
84 typename boost::enable_if_c<
85 boost::is_integral<TIn>::value &&
86 boost::is_integral<TOut>::value &&
87 boost::is_signed<TIn>::value &&
88 !boost::is_signed<TOut>::value &&
89 sizeof(TOut)>=sizeof(TIn)
93 static IPSDK_FORCEINLINE
102 simd::assign<eInstructionSet::eIS_Sse2>(zero, 0);
108 static IPSDK_FORCEINLINE
116 simd::assign<eInstructionSet::eIS_Sse2>(zero, 0);
118 simd::max<eInstructionSet::eIS_Sse2>(zero, in, clampedIn);
119 CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(clampedIn, out);
123 template <
typename TIn,
typename TOut>
125 typename boost::enable_if_c<
126 boost::is_integral<TIn>::value &&
127 boost::is_integral<TOut>::value &&
128 !boost::is_signed<TIn>::value &&
129 boost::is_signed<TOut>::value &&
130 sizeof(TOut)<=sizeof(TIn)
134 static IPSDK_FORCEINLINE
135 BasePack<ePackType::ePT_Sse, TOut>
136 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
138 BasePack<ePackType::ePT_Sse, TIn> packMax;
139 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
140 BasePack<ePackType::ePT_Sse, TIn> clampedIn;
141 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
142 return CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(clampedIn);
145 static IPSDK_FORCEINLINE
147 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
148 BasePack<ePackType::ePT_Sse, TOut>& out)
150 BasePack<ePackType::ePT_Sse, TIn> packMax;
151 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
152 BasePack<ePackType::ePT_Sse, TIn> clampedIn;
153 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
154 CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(clampedIn, out);
158 template <
typename TIn,
typename TOut>
160 typename boost::enable_if_c<
161 boost::is_integral<TIn>::value &&
162 boost::is_integral<TOut>::value &&
163 !boost::is_signed<TIn>::value &&
164 boost::is_signed<TOut>::value &&
165 (sizeof(TOut) > sizeof(TIn))
169 static IPSDK_FORCEINLINE
170 BasePack<ePackType::ePT_Sse, TOut>
171 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
173 return CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(in);
176 static IPSDK_FORCEINLINE
178 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
179 BasePack<ePackType::ePT_Sse, TOut>& out)
181 return CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(in, out);
185 template <
typename TIn,
typename TOut>
187 typename boost::enable_if_c<
188 boost::is_integral<TIn>::value &&
189 boost::is_integral<TOut>::value &&
190 !boost::is_signed<TIn>::value &&
191 !boost::is_signed<TOut>::value &&
192 sizeof(TOut)<sizeof(TIn)
196 static IPSDK_FORCEINLINE
197 BasePack<ePackType::ePT_Sse, TOut>
198 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
205 BasePack<ePackType::ePT_Sse, TIn> packMax;
206 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
207 BasePack<ePackType::ePT_Sse, TIn> clampedIn;
208 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
209 return CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(clampedIn);
212 static IPSDK_FORCEINLINE
214 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
215 BasePack<ePackType::ePT_Sse, TOut>& out)
220 BasePack<ePackType::ePT_Sse, TIn> packMax;
221 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
222 BasePack<ePackType::ePT_Sse, TIn> clampedIn;
223 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
224 CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(clampedIn, out);
228 template <
typename TIn,
typename TOut>
230 typename boost::enable_if_c<
231 boost::is_integral<TIn>::value &&
232 boost::is_integral<TOut>::value &&
233 boost::is_signed<TIn>::value &&
234 sizeof(TOut)<sizeof(TIn)
238 static IPSDK_FORCEINLINE
239 BasePack<ePackType::ePT_Sse, TOut>
240 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
249 BasePack<ePackType::ePT_Sse, TIn> packZero, packMax;
250 simd::assign<eInstructionSet::eIS_Sse2>(packZero, 0);
251 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
252 BasePack<ePackType::ePT_Sse, TIn> clampedIn;
253 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
254 simd::max<eInstructionSet::eIS_Sse2>(packZero, clampedIn, clampedIn);
255 return CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(clampedIn);
258 static IPSDK_FORCEINLINE
260 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
261 BasePack<ePackType::ePT_Sse, TOut>& out)
269 BasePack<ePackType::ePT_Sse, TIn> packMin, packMax;
270 simd::assign<eInstructionSet::eIS_Sse2>(packMin, NumericLimits<TOut>::min());
271 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
272 BasePack<ePackType::ePT_Sse, TIn> clampedIn;
273 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
274 simd::max<eInstructionSet::eIS_Sse2>(packMin, clampedIn, clampedIn);
275 CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(clampedIn, out);
279 template <
typename TIn>
281 typename boost::enable_if_c<boost::is_integral<TIn>::value>::type>
283 static IPSDK_FORCEINLINE
284 BasePack<ePackType::ePT_Sse, ipReal32>
285 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
287 return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal32>::act(in);
290 static IPSDK_FORCEINLINE
292 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
293 BasePack<ePackType::ePT_Sse, ipReal32>& out)
295 return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal32>::act(in, out);
299 template <
typename TOut>
301 typename boost::enable_if_c<boost::is_integral<TOut>::value>::type>
303 static IPSDK_FORCEINLINE
304 BasePack<ePackType::ePT_Sse, TOut>
305 act(
const BasePack<ePackType::ePT_Sse, ipReal32>& in)
315 BasePack<ePackType::ePT_Sse, ipReal64> clampedIn;
316 CastPack<eInstructionSet::eIS_Sse2, ipReal32, ipReal64>::act(in, clampedIn);
318 BasePack<ePackType::ePT_Sse, ipReal64> packMin, packMax;
319 simd::assign<eInstructionSet::eIS_Sse2>(packMin, NumericLimits<TOut>::min());
320 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
321 simd::min<eInstructionSet::eIS_Sse2>(packMax, clampedIn, clampedIn);
322 simd::max<eInstructionSet::eIS_Sse2>(packMin, clampedIn, clampedIn);
324 return CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn);
327 static IPSDK_FORCEINLINE
329 act(
const BasePack<ePackType::ePT_Sse, ipReal32>& in,
330 BasePack<ePackType::ePT_Sse, TOut>& out)
338 BasePack<ePackType::ePT_Sse, ipReal64> clampedIn;
339 CastPack<eInstructionSet::eIS_Sse2, ipReal32, ipReal64>::act(in, clampedIn);
341 BasePack<ePackType::ePT_Sse, ipReal64> packMin, packMax;
342 simd::assign<eInstructionSet::eIS_Sse2>(packMin, NumericLimits<TOut>::min());
343 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
344 simd::min<eInstructionSet::eIS_Sse2>(packMax, clampedIn, clampedIn);
345 simd::max<eInstructionSet::eIS_Sse2>(packMin, clampedIn, clampedIn);
347 CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn, out);
351 template <
typename TIn>
353 typename boost::enable_if_c<
354 !boost::is_same<TIn, ipReal64>::value
358 static IPSDK_FORCEINLINE
359 BasePack<ePackType::ePT_Sse, ipReal64>
360 act(
const BasePack<ePackType::ePT_Sse, TIn>& in)
362 return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal64>::act(in);
365 static IPSDK_FORCEINLINE
367 act(
const BasePack<ePackType::ePT_Sse, TIn>& in,
368 BasePack<ePackType::ePT_Sse, ipReal64>& out)
370 return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal64>::act(in, out);
374 template <
typename TOut>
376 typename boost::enable_if_c<
377 !boost::is_same<ipReal64, TOut>::value
381 static IPSDK_FORCEINLINE
382 BasePack<ePackType::ePT_Sse, TOut>
383 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in)
385 BasePack<ePackType::ePT_Sse, ipReal64> clampedIn, packMin, packMax;
386 simd::assign<eInstructionSet::eIS_Sse2>(packMin, NumericLimits<TOut>::min());
387 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
388 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
389 simd::max<eInstructionSet::eIS_Sse2>(packMin, clampedIn, clampedIn);
391 return CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn);
394 static IPSDK_FORCEINLINE
396 act(
const BasePack<ePackType::ePT_Sse, ipReal64>& in,
397 BasePack<ePackType::ePT_Sse, TOut>& out)
399 BasePack<ePackType::ePT_Sse, ipReal64> clampedIn, packMin, packMax;
400 simd::assign<eInstructionSet::eIS_Sse2>(packMin, NumericLimits<TOut>::min());
401 simd::assign<eInstructionSet::eIS_Sse2>(packMax, NumericLimits<TOut>::max());
402 simd::min<eInstructionSet::eIS_Sse2>(packMax, in, clampedIn);
403 simd::max<eInstructionSet::eIS_Sse2>(packMin, clampedIn, clampedIn);
405 CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn, out);
416 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_SATURATEDCASTPACK_H__ Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
min function; returns the minimum of 2 packs
Definition: CastPack.h:33
Definition: SaturatedCastPack.h:33
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
BasePack class; defines a set of scalars (for instruction set "standard") or registers (for all other...
IPSDK_FORCEINLINE PackT max(const PackT &in1, const PackT &in2)
returns the maximum of 2 packs
Definition: max.h:40
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Definition of import/export macro for library.
max function; returns the maximum of 2 packs
Streaming SIMD Extensions 2.
Definition: InstructionSetTypes.h:36
float ipReal32
Base types definition.
Definition: BaseTypes.h:56
structure containing intrinsic registers used to store vectorized data
Definition: BasePackDecl.h:29