IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
IsOutOfRangeReg.h
Go to the documentation of this file.
1 // IsOutOfRangeReg.h:
3 // -------------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_COMPARISON_DETAIL_AVX2_ISOUTOFRANGEREG_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_COMPARISON_DETAIL_AVX2_ISOUTOFRANGEREG_H__
17 
22 
23 namespace ipsdk {
24 namespace simd {
25 namespace detail {
26 
29 
30 template <>
32 {
33  static IPSDK_FORCEINLINE
35  act(const AvxType<ipInt8>::Type& in,
36  const AvxType<ipInt8>::Type& regMin,
37  const AvxType<ipInt8>::Type& regMax)
38  {
39  return _mm256_or_si256(
42  }
43 
44  static IPSDK_FORCEINLINE
45  void
46  act(const AvxType<ipInt8>::Type& in,
47  const AvxType<ipInt8>::Type& regMin,
48  const AvxType<ipInt8>::Type& regMax,
50  {
51  AvxType<ipInt8>::Type regLtMin;
52  AvxType<ipInt8>::Type regGtMax;
55  out = _mm256_or_si256(regLtMin, regGtMax);
56  }
57 };
58 
59 template <>
61 {
62  static IPSDK_FORCEINLINE
64  act(const AvxType<ipUInt8>::Type& in,
65  const AvxType<ipUInt8>::Type& regMin,
66  const AvxType<ipUInt8>::Type& regMax)
67  {
68  const AvxType<ipUInt8>::Type& c =
70  const AvxType<ipUInt8>::Type& inCvt =
72  const AvxType<ipUInt8>::Type& minCvt =
74  const AvxType<ipUInt8>::Type& maxCvt =
76 
77  const AvxType<ipUInt8>::Type inGtMin = _mm256_cmpgt_epi8(inCvt, minCvt);
78  const AvxType<ipUInt8>::Type inEqMin = _mm256_cmpeq_epi8(inCvt, minCvt);
79  const AvxType<ipUInt8>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
80 
81  const AvxType<ipUInt8>::Type allbits =
83  const AvxType<ipUInt8>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
84 
85  const AvxType<ipUInt8>::Type inGtMax = _mm256_cmpgt_epi8(inCvt, maxCvt);
86  return _mm256_or_si256(inLtMin, inGtMax);
87  }
88 
89  static IPSDK_FORCEINLINE
90  void
91  act(const AvxType<ipUInt8>::Type& in,
92  const AvxType<ipUInt8>::Type& regMin,
93  const AvxType<ipUInt8>::Type& regMax,
95  {
100  AvxType<ipUInt8>::Type minCvt;
102  AvxType<ipUInt8>::Type maxCvt;
104 
105  const AvxType<ipUInt8>::Type inGtMin = _mm256_cmpgt_epi8(inCvt, minCvt);
106  const AvxType<ipUInt8>::Type inEqMin = _mm256_cmpeq_epi8(inCvt, minCvt);
107  const AvxType<ipUInt8>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
108 
109  const AvxType<ipUInt8>::Type allbits =
111  const AvxType<ipUInt8>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
112 
113  const AvxType<ipUInt8>::Type inGtMax = _mm256_cmpgt_epi8(inCvt, maxCvt);
114  out = _mm256_or_si256(inLtMin, inGtMax);
115  }
116 };
117 
118 template <>
120 {
121  static IPSDK_FORCEINLINE
123  act(const AvxType<ipInt16>::Type& in,
124  const AvxType<ipInt16>::Type& regMin,
125  const AvxType<ipInt16>::Type& regMax)
126  {
127  return _mm256_or_si256(
130  }
131 
132  static IPSDK_FORCEINLINE
133  void
134  act(const AvxType<ipInt16>::Type& in,
135  const AvxType<ipInt16>::Type& regMin,
136  const AvxType<ipInt16>::Type& regMax,
138  {
139  AvxType<ipInt16>::Type regLtMin;
140  AvxType<ipInt16>::Type regGtMax;
143  out = _mm256_or_si256(regLtMin, regGtMax);
144  }
145 };
146 
147 template <>
149 {
150  static IPSDK_FORCEINLINE
152  act(const AvxType<ipUInt16>::Type& in,
153  const AvxType<ipUInt16>::Type& regMin,
154  const AvxType<ipUInt16>::Type& regMax)
155  {
156  const AvxType<ipUInt16>::Type& c =
158  const AvxType<ipUInt16>::Type& inCvt =
160  const AvxType<ipUInt16>::Type& minCvt =
162  const AvxType<ipUInt16>::Type& maxCvt =
164 
165  const AvxType<ipUInt16>::Type inGtMin = _mm256_cmpgt_epi16(inCvt, minCvt);
166  const AvxType<ipUInt16>::Type inEqMin = _mm256_cmpeq_epi16(inCvt, minCvt);
167  const AvxType<ipUInt16>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
168 
169  const AvxType<ipUInt8>::Type allbits =
171  const AvxType<ipUInt16>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
172 
173  const AvxType<ipUInt16>::Type inGtMax = _mm256_cmpgt_epi16(inCvt, maxCvt);
174  return _mm256_or_si256(inLtMin, inGtMax);
175  }
176 
177  static IPSDK_FORCEINLINE
178  void
179  act(const AvxType<ipUInt16>::Type& in,
180  const AvxType<ipUInt16>::Type& regMin,
181  const AvxType<ipUInt16>::Type& regMax,
183  {
192 
193  const AvxType<ipUInt16>::Type inGtMin = _mm256_cmpgt_epi16(inCvt, minCvt);
194  const AvxType<ipUInt16>::Type inEqMin = _mm256_cmpeq_epi16(inCvt, minCvt);
195  const AvxType<ipUInt16>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
196 
197  const AvxType<ipUInt8>::Type allbits =
199  const AvxType<ipUInt16>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
200 
201  const AvxType<ipUInt16>::Type inGtMax = _mm256_cmpgt_epi16(inCvt, maxCvt);
202  out = _mm256_or_si256(inLtMin, inGtMax);
203  }
204 };
205 
206 template <>
208 {
209  static IPSDK_FORCEINLINE
211  act(const AvxType<ipInt32>::Type& in,
212  const AvxType<ipInt32>::Type& regMin,
213  const AvxType<ipInt32>::Type& regMax)
214  {
215  return _mm256_or_si256(
218  }
219 
220  static IPSDK_FORCEINLINE
221  void
222  act(const AvxType<ipInt32>::Type& in,
223  const AvxType<ipInt32>::Type& regMin,
224  const AvxType<ipInt32>::Type& regMax,
226  {
227  AvxType<ipInt32>::Type regLtMin;
228  AvxType<ipInt32>::Type regGtMax;
231  out = _mm256_or_si256(regLtMin, regGtMax);
232  }
233 };
234 
235 template <>
237 {
238  static IPSDK_FORCEINLINE
240  act(const AvxType<ipUInt32>::Type& in,
241  const AvxType<ipUInt32>::Type& regMin,
242  const AvxType<ipUInt32>::Type& regMax)
243  {
244  const AvxType<ipUInt32>::Type& c =
246  const AvxType<ipUInt32>::Type& inCvt =
248  const AvxType<ipUInt32>::Type& minCvt =
250  const AvxType<ipUInt32>::Type& maxCvt =
252 
253  const AvxType<ipUInt32>::Type inGtMin = _mm256_cmpgt_epi32(inCvt, minCvt);
254  const AvxType<ipUInt32>::Type inEqMin = _mm256_cmpeq_epi32(inCvt, minCvt);
255  const AvxType<ipUInt32>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
256 
257  const AvxType<ipUInt8>::Type allbits =
259  const AvxType<ipUInt32>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
260 
261  const AvxType<ipUInt32>::Type inGtMax = _mm256_cmpgt_epi32(inCvt, maxCvt);
262  return _mm256_or_si256(inLtMin, inGtMax);
263  }
264 
265  static IPSDK_FORCEINLINE
266  void
267  act(const AvxType<ipUInt32>::Type& in,
268  const AvxType<ipUInt32>::Type& regMin,
269  const AvxType<ipUInt32>::Type& regMax,
271  {
280 
281  const AvxType<ipUInt32>::Type inGtMin = _mm256_cmpgt_epi32(inCvt, minCvt);
282  const AvxType<ipUInt32>::Type inEqMin = _mm256_cmpeq_epi32(inCvt, minCvt);
283  const AvxType<ipUInt32>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
284 
285  const AvxType<ipUInt8>::Type allbits =
287  const AvxType<ipUInt32>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
288 
289  const AvxType<ipUInt32>::Type inGtMax = _mm256_cmpgt_epi32(inCvt, maxCvt);
290  out = _mm256_or_si256(inLtMin, inGtMax);
291  }
292 };
293 
294 template <>
296 {
297  static IPSDK_FORCEINLINE
299  act(const AvxType<ipInt64>::Type& in,
300  const AvxType<ipInt64>::Type& regMin,
301  const AvxType<ipInt64>::Type& regMax)
302  {
303  return _mm256_or_si256(
306  }
307 
308  static IPSDK_FORCEINLINE
309  void
310  act(const AvxType<ipInt64>::Type& in,
311  const AvxType<ipInt64>::Type& regMin,
312  const AvxType<ipInt64>::Type& regMax,
314  {
315  AvxType<ipInt64>::Type regLtMin;
316  AvxType<ipInt64>::Type regGtMax;
319  out = _mm256_or_si256(regLtMin, regGtMax);
320  }
321 };
322 
323 template <>
325 {
326  static IPSDK_FORCEINLINE
328  act(const AvxType<ipUInt64>::Type& in,
329  const AvxType<ipUInt64>::Type& regMin,
330  const AvxType<ipUInt64>::Type& regMax)
331  {
332  const AvxType<ipUInt64>::Type& c =
334  const AvxType<ipUInt64>::Type& inCvt =
336  const AvxType<ipUInt64>::Type& minCvt =
338  const AvxType<ipUInt64>::Type& maxCvt =
340 
341  const AvxType<ipUInt64>::Type inGtMin = _mm256_cmpgt_epi64(inCvt, minCvt);
342  const AvxType<ipUInt64>::Type inEqMin = _mm256_cmpeq_epi64(inCvt, minCvt);
343  const AvxType<ipUInt64>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
344 
345  const AvxType<ipUInt8>::Type allbits =
347  const AvxType<ipUInt64>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
348 
349  const AvxType<ipUInt64>::Type inGtMax = _mm256_cmpgt_epi64(inCvt, maxCvt);
350  return _mm256_or_si256(inLtMin, inGtMax);
351  }
352 
353  static IPSDK_FORCEINLINE
354  void
355  act(const AvxType<ipUInt64>::Type& in,
356  const AvxType<ipUInt64>::Type& regMin,
357  const AvxType<ipUInt64>::Type& regMax,
359  {
368 
369  const AvxType<ipUInt64>::Type inGtMin = _mm256_cmpgt_epi64(inCvt, minCvt);
370  const AvxType<ipUInt64>::Type inEqMin = _mm256_cmpeq_epi64(inCvt, minCvt);
371  const AvxType<ipUInt64>::Type inGtOrEqMin = _mm256_or_si256(inGtMin, inEqMin);
372 
373  const AvxType<ipUInt8>::Type allbits =
375  const AvxType<ipUInt64>::Type inLtMin = _mm256_xor_si256(inGtOrEqMin, allbits);
376 
377  const AvxType<ipUInt64>::Type inGtMax = _mm256_cmpgt_epi64(inCvt, maxCvt);
378  out = _mm256_or_si256(inLtMin, inGtMax);
379  }
380 };
381 
382 template <>
384 {
385  static IPSDK_FORCEINLINE
387  act(const AvxType<ipReal32>::Type& in,
388  const AvxType<ipReal32>::Type& regMin,
389  const AvxType<ipReal32>::Type& regMax)
390  {
392  }
393 
394  static IPSDK_FORCEINLINE
395  void
396  act(const AvxType<ipReal32>::Type& in,
397  const AvxType<ipReal32>::Type& regMin,
398  const AvxType<ipReal32>::Type& regMax,
400  {
402  }
403 };
404 
405 template <>
407 {
408  static IPSDK_FORCEINLINE
410  act(const AvxType<ipReal64>::Type& in,
411  const AvxType<ipReal64>::Type& regMin,
412  const AvxType<ipReal64>::Type& regMax)
413  {
415  }
416 
417  static IPSDK_FORCEINLINE
418  void
419  act(const AvxType<ipReal64>::Type& in,
420  const AvxType<ipReal64>::Type& regMin,
421  const AvxType<ipReal64>::Type& regMax,
423  {
425  }
426 };
427 
430 
431 } // end of namespace detail
432 } // end of namespace simd
433 } // end of namespace ipsdk
434 
436 
437 #endif // __IPSDKUTIL_INSTRUCTIONSET_COMPARISON_DETAIL_AVX2_ISOUTOFRANGEREG_H__
Definition: IsOutOfRangeReg.h:30
int8_t ipInt8
Base types definition.
Definition: BaseTypes.h:48
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
uint64_t ipUInt64
Base types definition.
Definition: BaseTypes.h:55
Definition: IsGreaterRegDecl.h:30
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
int32_t ipInt32
Base types definition.
Definition: BaseTypes.h:52
int16_t ipInt16
Base types definition.
Definition: BaseTypes.h:50
uint8_t ipUInt8
Base types definition.
Definition: BaseTypes.h:49
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Advanced Vector Extensions 2.
Definition: InstructionSetTypes.h:48
Definition: BitwiseXOrReg.h:30
Definition of import/export macro for library.
Definition: RegMaskType.h:29
int64_t ipInt64
Base types definition.
Definition: BaseTypes.h:54
structure used to retrieve AVX type associated to a base type
Definition: AvxTypes.h:33
Definition: IsLessRegDecl.h:30
uint16_t ipUInt16
Base types definition.
Definition: BaseTypes.h:51
Definition: AssignRegDecl.h:31
float ipReal32
Base types definition.
Definition: BaseTypes.h:56
uint32_t ipUInt32
Base types definition.
Definition: BaseTypes.h:53