IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
SaturatedCastPack.h
Go to the documentation of this file.
1 // SaturatedCastPack.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_SATURATEDCASTPACK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_SATURATEDCASTPACK_H__
17 
25 
26 namespace ipsdk {
27 namespace simd {
28 namespace detail {
29 
32 
33 template <typename TIn, typename TOut>
35  typename boost::enable_if_c<
36  boost::is_same<TIn, TOut>::value
37  >::type
38 >
39 {
40  static IPSDK_FORCEINLINE
43  {
45  }
46 
47  static IPSDK_FORCEINLINE
48  void
51  {
53  }
54 };
55 
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)
63  >::type
64 >
65 {
66  static IPSDK_FORCEINLINE
69  {
71  }
72 
73  static IPSDK_FORCEINLINE
74  void
77  {
79  }
80 };
81 
82 template <typename TIn, typename TOut>
83 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, TIn, 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)
90  >::type
91 >
92 {
93  static IPSDK_FORCEINLINE
96  {
97  /*const TIn clampedIn = in._val >= 0 ? in._val : 0;
98  BasePack<ePackType::ePT_Sse, TOut> out;
99  out._val = static_cast<TOut>(clampedIn);
100  return out;*/
102  simd::assign<eInstructionSet::eIS_Sse2>(zero, 0);
104  simd::max(zero, in, clampedIn);
106  }
107 
108  static IPSDK_FORCEINLINE
109  void
110  act(const BasePack<ePackType::ePT_Sse, TIn>& in,
112  {
113  /*const TIn clampedIn = in._val >= 0 ? in._val : 0;
114  out._val = static_cast<TOut>(clampedIn);*/
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);
120  }
121 };
122 
123 template <typename TIn, typename TOut>
124 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, TIn, 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)
131  >::type
132 >
133 {
134  static IPSDK_FORCEINLINE
135  BasePack<ePackType::ePT_Sse, TOut>
136  act(const BasePack<ePackType::ePT_Sse, TIn>& in)
137  {
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);
143  }
144 
145  static IPSDK_FORCEINLINE
146  void
147  act(const BasePack<ePackType::ePT_Sse, TIn>& in,
148  BasePack<ePackType::ePT_Sse, TOut>& out)
149  {
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);
155  }
156 };
157 
158 template <typename TIn, typename TOut>
159 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, TIn, 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))
166  >::type
167 >
168 {
169  static IPSDK_FORCEINLINE
170  BasePack<ePackType::ePT_Sse, TOut>
171  act(const BasePack<ePackType::ePT_Sse, TIn>& in)
172  {
173  return CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(in);
174  }
175 
176  static IPSDK_FORCEINLINE
177  void
178  act(const BasePack<ePackType::ePT_Sse, TIn>& in,
179  BasePack<ePackType::ePT_Sse, TOut>& out)
180  {
181  return CastPack<eInstructionSet::eIS_Sse2, TIn, TOut>::act(in, out);
182  }
183 };
184 
185 template <typename TIn, typename TOut>
186 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, TIn, 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)
193  >::type
194 >
195 {
196  static IPSDK_FORCEINLINE
197  BasePack<ePackType::ePT_Sse, TOut>
198  act(const BasePack<ePackType::ePT_Sse, TIn>& in)
199  {
200  /*static TIn nMax = static_cast<TIn>(NumericLimits<TOut>::max());
201  const TIn clampedIn = (in._val >= nMax ? nMax : in._val);
202  BasePack<ePackType::ePT_Sse, TOut> out;
203  out._val = static_cast<TOut>(clampedIn);
204  return out;*/
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);
210  }
211 
212  static IPSDK_FORCEINLINE
213  void
214  act(const BasePack<ePackType::ePT_Sse, TIn>& in,
215  BasePack<ePackType::ePT_Sse, TOut>& out)
216  {
217  /*static TIn nMax = static_cast<TIn>(NumericLimits<TOut>::max());
218  const TIn clampedIn = (in._val >= nMax ? nMax : in._val);
219  out._val = static_cast<TOut>(clampedIn);*/
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);
225  }
226 };
227 
228 template <typename TIn, typename TOut>
229 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, TIn, 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)
235  >::type
236 >
237 {
238  static IPSDK_FORCEINLINE
239  BasePack<ePackType::ePT_Sse, TOut>
240  act(const BasePack<ePackType::ePT_Sse, TIn>& in)
241  {
242  /*BasePack<ePackType::ePT_Sse, TOut> out;
243  static TIn nMin = static_cast<TIn>(NumericLimits<TOut>::min());
244  static TIn nMax = static_cast<TIn>(NumericLimits<TOut>::max());
245  TIn clampedIn = (in._val > nMax ? nMax : in._val);
246  clampedIn = (clampedIn < nMin ? nMin : clampedIn);
247  out._val = static_cast<TOut>(clampedIn);
248  return out;*/
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);
256  }
257 
258  static IPSDK_FORCEINLINE
259  void
260  act(const BasePack<ePackType::ePT_Sse, TIn>& in,
261  BasePack<ePackType::ePT_Sse, TOut>& out)
262  {
263  /*static TIn nMin = static_cast<TIn>(NumericLimits<TOut>::min());
264  static TIn nMax = static_cast<TIn>(NumericLimits<TOut>::max());
265  TIn clampedIn = (in._val > nMax ? nMax : in._val);
266  clampedIn = (clampedIn < nMin ? nMin : clampedIn);
267  out._val = static_cast<TOut>(clampedIn);
268  */
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);
276  }
277 };
278 
279 template <typename TIn>
280 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, TIn, ipReal32,
281  typename boost::enable_if_c<boost::is_integral<TIn>::value>::type>
282 {
283  static IPSDK_FORCEINLINE
284  BasePack<ePackType::ePT_Sse, ipReal32>
285  act(const BasePack<ePackType::ePT_Sse, TIn>& in)
286  {
287  return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal32>::act(in);
288  }
289 
290  static IPSDK_FORCEINLINE
291  void
292  act(const BasePack<ePackType::ePT_Sse, TIn>& in,
293  BasePack<ePackType::ePT_Sse, ipReal32>& out)
294  {
295  return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal32>::act(in, out);
296  }
297 };
298 
299 template <typename TOut>
300 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, ipReal32, TOut,
301  typename boost::enable_if_c<boost::is_integral<TOut>::value>::type>
302 {
303  static IPSDK_FORCEINLINE
304  BasePack<ePackType::ePT_Sse, TOut>
305  act(const BasePack<ePackType::ePT_Sse, ipReal32>& in)
306  {
307  /*BasePack<ePackType::ePT_Sse, TOut> out;
308  static ipReal64 fMin = static_cast<ipReal64>(NumericLimits<TOut>::min());
309  static ipReal64 fMax = static_cast<ipReal64>(NumericLimits<TOut>::max());
310  ipReal64 clampedIn = in._val;
311  clampedIn = (clampedIn > fMax ? fMax : clampedIn);
312  clampedIn = (clampedIn < fMin ? fMin : clampedIn);
313  out._val = static_cast<TOut>(clampedIn);
314  return out;*/
315  BasePack<ePackType::ePT_Sse, ipReal64> clampedIn;
316  CastPack<eInstructionSet::eIS_Sse2, ipReal32, ipReal64>::act(in, clampedIn);
317 
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);
323 
324  return CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn);
325  }
326 
327  static IPSDK_FORCEINLINE
328  void
329  act(const BasePack<ePackType::ePT_Sse, ipReal32>& in,
330  BasePack<ePackType::ePT_Sse, TOut>& out)
331  {
332  /*static ipReal64 fMin = static_cast<ipReal64>(NumericLimits<TOut>::min());
333  static ipReal64 fMax = static_cast<ipReal64>(NumericLimits<TOut>::max());
334  ipReal64 clampedIn = in._val;
335  clampedIn = (clampedIn > fMax ? fMax : clampedIn);
336  clampedIn = (clampedIn < fMin ? fMin : clampedIn);
337  out._val = static_cast<TOut>(clampedIn);*/
338  BasePack<ePackType::ePT_Sse, ipReal64> clampedIn;
339  CastPack<eInstructionSet::eIS_Sse2, ipReal32, ipReal64>::act(in, clampedIn);
340 
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);
346 
347  CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn, out);
348  }
349 };
350 
351 template <typename TIn>
352 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, TIn, ipReal64,
353  typename boost::enable_if_c<
354  !boost::is_same<TIn, ipReal64>::value
355  >::type
356 >
357 {
358  static IPSDK_FORCEINLINE
359  BasePack<ePackType::ePT_Sse, ipReal64>
360  act(const BasePack<ePackType::ePT_Sse, TIn>& in)
361  {
362  return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal64>::act(in);
363  }
364 
365  static IPSDK_FORCEINLINE
366  void
367  act(const BasePack<ePackType::ePT_Sse, TIn>& in,
368  BasePack<ePackType::ePT_Sse, ipReal64>& out)
369  {
370  return CastPack<eInstructionSet::eIS_Sse2, TIn, ipReal64>::act(in, out);
371  }
372 };
373 
374 template <typename TOut>
375 struct SaturatedCastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut,
376  typename boost::enable_if_c<
377  !boost::is_same<ipReal64, TOut>::value
378  >::type
379 >
380 {
381  static IPSDK_FORCEINLINE
382  BasePack<ePackType::ePT_Sse, TOut>
383  act(const BasePack<ePackType::ePT_Sse, ipReal64>& in)
384  {
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);
390 
391  return CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn);
392  }
393 
394  static IPSDK_FORCEINLINE
395  void
396  act(const BasePack<ePackType::ePT_Sse, ipReal64>& in,
397  BasePack<ePackType::ePT_Sse, TOut>& out)
398  {
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);
404 
405  CastPack<eInstructionSet::eIS_Sse2, ipReal64, TOut>::act(clampedIn, out);
406  }
407 };
408 
411 
412 } // end of namespace detail
413 } // end of namespace simd
414 } // end of namespace ipsdk
415 
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