IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
IfElse0Pack.h
Go to the documentation of this file.
1 // IfElse0Pack.h:
3 // -------------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX512_IFELSE0PACK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX512_IFELSE0PACK_H__
17 
25 
26 namespace ipsdk {
27 namespace simd {
28 namespace detail {
29 
32 
33 template <typename T>
34 struct IfElse0Pack<
36  typename boost::enable_if_c<sizeof(T) == 1>::type
37 >
38 {
39  static IPSDK_FORCEINLINE
41  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
42  const typename BasePack<ePackType::ePT_Avx512, T>& in)
43  {
44  const typename Avx512Type<T>::Type zeroReg =
46 
49  mask._val[0],
50  zeroReg,
51  in1._val[0]);
52 
53  return out;
54  }
55 
56  static IPSDK_FORCEINLINE
57  void
58  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
59  const typename BasePack<ePackType::ePT_Avx512, T>& in,
61  {
62  const typename Avx512Type<T>::Type zeroReg =
64 
66  mask._val[0],
67  zeroReg,
68  in._val[0],
69  out._val[0]);
70  }
71 };
72 
73 template <typename T>
74 struct IfElse0Pack<
76  typename boost::enable_if_c<sizeof(T) == 2>::type
77 >
78 {
79  static IPSDK_FORCEINLINE
81  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
82  const typename BasePack<ePackType::ePT_Avx512, T>& in)
83  {
84  const typename Avx512Type<T>::Type zeroReg =
86 
89  mask._val[0],
90  zeroReg,
91  in1._val[0]);
93  mask._val[1],
94  zeroReg,
95  in1._val[1]);
96 
97  return out;
98  }
99 
100  static IPSDK_FORCEINLINE
101  void
102  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
103  const typename BasePack<ePackType::ePT_Avx512, T>& in,
105  {
106  const typename Avx512Type<T>::Type zeroReg =
108 
110  mask._val[0],
111  zeroReg,
112  in._val[0],
113  out._val[0]);
115  mask._val[1],
116  zeroReg,
117  in._val[1],
118  out._val[1]);
119  }
120 };
121 
122 template <typename T>
123 struct IfElse0Pack<
125  typename boost::enable_if_c<sizeof(T) == 4>::type
126 >
127 {
128  static IPSDK_FORCEINLINE
130  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
131  const typename BasePack<ePackType::ePT_Avx512, T>& in)
132  {
133  const typename Avx512Type<T>::Type zeroReg =
135 
138  mask._val[0],
139  zeroReg,
140  in1._val[0]);
142  mask._val[1],
143  zeroReg,
144  in1._val[1]);
146  mask._val[2],
147  zeroReg,
148  in1._val[2]);
150  mask._val[3],
151  zeroReg,
152  in1._val[3]);
153  return out;
154  }
155 
156  static IPSDK_FORCEINLINE
157  void
158  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
159  const typename BasePack<ePackType::ePT_Avx512, T>& in,
161  {
162  const typename Avx512Type<T>::Type zeroReg =
164 
166  mask._val[0],
167  zeroReg,
168  in._val[0],
169  out._val[0]);
171  mask._val[1],
172  zeroReg,
173  in._val[1],
174  out._val[1]);
176  mask._val[2],
177  zeroReg,
178  in._val[2],
179  out._val[2]);
181  mask._val[3],
182  zeroReg,
183  in._val[3],
184  out._val[3]);
185  }
186 };
187 
188 template <typename T>
189 struct IfElse0Pack<
191  typename boost::enable_if_c<sizeof(T) == 8>::type
192 >
193 {
194  static IPSDK_FORCEINLINE
196  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
197  const typename BasePack<ePackType::ePT_Avx512, T>& in)
198  {
199  const typename Avx512Type<T>::Type zeroReg =
201 
204  mask._val[0],
205  zeroReg,
206  in1._val[0]);
208  mask._val[1],
209  zeroReg,
210  in1._val[1]);
212  mask._val[2],
213  zeroReg,
214  in1._val[2]);
216  mask._val[3],
217  zeroReg,
218  in1._val[3]);
220  mask._val[4],
221  zeroReg,
222  in1._val[4]);
224  mask._val[5],
225  zeroReg,
226  in1._val[5]);
228  mask._val[6],
229  zeroReg,
230  in1._val[6]);
232  mask._val[7],
233  zeroReg,
234  in1._val[7]);
235  return out;
236  }
237 
238  static IPSDK_FORCEINLINE
239  void
240  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
241  const typename BasePack<ePackType::ePT_Avx512, T>& in,
243  {
244  const typename Avx512Type<T>::Type zeroReg =
246 
248  mask._val[0],
249  zeroReg,
250  in._val[0],
251  out._val[0]);
253  mask._val[1],
254  zeroReg,
255  in._val[1],
256  out._val[1]);
258  mask._val[2],
259  zeroReg,
260  in._val[2],
261  out._val[2]);
263  mask._val[3],
264  zeroReg,
265  in._val[3],
266  out._val[3]);
268  mask._val[4],
269  zeroReg,
270  in._val[4],
271  out._val[4]);
273  mask._val[5],
274  zeroReg,
275  in._val[5],
276  out._val[5]);
278  mask._val[6],
279  zeroReg,
280  in._val[6],
281  out._val[6]);
283  mask._val[7],
284  zeroReg,
285  in._val[7],
286  out._val[7]);
287  }
288 };
289 
292 
293 } // end of namespace detail
294 } // end of namespace simd
295 } // end of namespace ipsdk
296 
297 #endif // __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX512_IFELSE0PACK_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
cast function; casts a Pack<instructionSet, TIn> to a Pack<instructionSet, TOut>
bitwiseCast function; casts a Pack<instructionSet, TIn> to a Pack<instructionSet, TOut>...
(including fundation and byte and word instructions)
Definition: InstructionSetTypes.h:51
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Definition of import/export macro for library.
Definition: IfElse0Pack.h:30
Definition: AllBitsToZeroReg.h:31
Definition: MaskBlendReg.h:30
structure used to retrieve AVX512 type associated to a base type
Definition: Avx512Types.h:36