IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
IfElsePack.h
Go to the documentation of this file.
1 // IfElsePack.h:
3 // -------------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX512_IFELSEPACK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX512_IFELSEPACK_H__
17 
25 
26 namespace ipsdk {
27 namespace simd {
28 namespace detail {
29 
32 
33 template <typename T>
34 struct IfElsePack<
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>& in1,
43  const typename BasePack<ePackType::ePT_Avx512, T>& in2)
44  {
47  mask._val[0],
48  in2._val[0],
49  in1._val[0]);
50 
51  return out;
52  }
53 
54  static IPSDK_FORCEINLINE
55  void
56  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
57  const typename BasePack<ePackType::ePT_Avx512, T>& in1,
58  const typename BasePack<ePackType::ePT_Avx512, T>& in2,
60  {
62  mask._val[0],
63  in2._val[0],
64  in1._val[0],
65  out._val[0]);
66  }
67 };
68 
69 template <typename T>
70 struct IfElsePack<
72  typename boost::enable_if_c<sizeof(T) == 2>::type
73 >
74 {
75  static IPSDK_FORCEINLINE
77  act(const typename BasePack<ePackType::ePT_Avx512, T>& mask,
78  const typename BasePack<ePackType::ePT_Avx512, T>& in1,
79  const typename BasePack<ePackType::ePT_Avx512, T>& in2)
80  {
83  mask._val[0],
84  in2._val[0],
85  in1._val[0]);
87  mask._val[1],
88  in2._val[1],
89  in1._val[1]);
90 
91  return out;
92  }
93 
94  static IPSDK_FORCEINLINE
95  void
96  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
97  const typename BasePack<ePackType::ePT_Avx512, T>& in1,
98  const typename BasePack<ePackType::ePT_Avx512, T>& in2,
100  {
102  mask._val[0],
103  in2._val[0],
104  in1._val[0],
105  out._val[0]);
107  mask._val[1],
108  in2._val[1],
109  in1._val[1],
110  out._val[1]);
111  }
112 };
113 
114 template <typename T>
115 struct IfElsePack<
117  typename boost::enable_if_c<sizeof(T) == 4>::type
118 >
119 {
120  static IPSDK_FORCEINLINE
122  act(const typename BasePack<ePackType::ePT_Avx512, T>& mask,
123  const typename BasePack<ePackType::ePT_Avx512, T>& in1,
124  const typename BasePack<ePackType::ePT_Avx512, T>& in2)
125  {
128  mask._val[0],
129  in2._val[0],
130  in1._val[0]);
132  mask._val[1],
133  in2._val[1],
134  in1._val[1]);
136  mask._val[2],
137  in2._val[2],
138  in1._val[2]);
140  mask._val[3],
141  in2._val[3],
142  in1._val[3]);
143 
144  return out;
145  }
146 
147  static IPSDK_FORCEINLINE
148  void
149  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
150  const typename BasePack<ePackType::ePT_Avx512, T>& in1,
151  const typename BasePack<ePackType::ePT_Avx512, T>& in2,
153  {
155  mask._val[0],
156  in2._val[0],
157  in1._val[0],
158  out._val[0]);
160  mask._val[1],
161  in2._val[1],
162  in1._val[1],
163  out._val[1]);
165  mask._val[2],
166  in2._val[2],
167  in1._val[2],
168  out._val[2]);
170  mask._val[3],
171  in2._val[3],
172  in1._val[3],
173  out._val[3]);
174  }
175 };
176 
177 template <typename T>
178 struct IfElsePack<
180  typename boost::enable_if_c<sizeof(T) == 8>::type
181 >
182 {
183  static IPSDK_FORCEINLINE
185  act(const typename BasePack<ePackType::ePT_Avx512, T>& mask,
186  const typename BasePack<ePackType::ePT_Avx512, T>& in1,
187  const typename BasePack<ePackType::ePT_Avx512, T>& in2)
188  {
191  mask._val[0],
192  in2._val[0],
193  in1._val[0]);
195  mask._val[1],
196  in2._val[1],
197  in1._val[1]);
199  mask._val[2],
200  in2._val[2],
201  in1._val[2]);
203  mask._val[3],
204  in2._val[3],
205  in1._val[3]);
207  mask._val[4],
208  in2._val[4],
209  in1._val[4]);
211  mask._val[5],
212  in2._val[5],
213  in1._val[5]);
215  mask._val[6],
216  in2._val[6],
217  in1._val[6]);
219  mask._val[7],
220  in2._val[7],
221  in1._val[7]);
222 
223  return out;
224  }
225 
226  static IPSDK_FORCEINLINE
227  void
228  act(const typename BaseMaskPack<ePackType::ePT_Avx512, T>& mask,
229  const typename BasePack<ePackType::ePT_Avx512, T>& in1,
230  const typename BasePack<ePackType::ePT_Avx512, T>& in2,
232  {
234  mask._val[0],
235  in2._val[0],
236  in1._val[0],
237  out._val[0]);
239  mask._val[1],
240  in2._val[1],
241  in1._val[1],
242  out._val[1]);
244  mask._val[2],
245  in2._val[2],
246  in1._val[2],
247  out._val[2]);
249  mask._val[3],
250  in2._val[3],
251  in1._val[3],
252  out._val[3]);
254  mask._val[4],
255  in2._val[4],
256  in1._val[4],
257  out._val[4]);
259  mask._val[5],
260  in2._val[5],
261  in1._val[5],
262  out._val[5]);
264  mask._val[6],
265  in2._val[6],
266  in1._val[6],
267  out._val[6]);
269  mask._val[7],
270  in2._val[7],
271  in1._val[7],
272  out._val[7]);
273  }
274 };
275 
278 
279 } // end of namespace detail
280 } // end of namespace simd
281 } // end of namespace ipsdk
282 
283 #endif // __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX512_IFELSEPACK_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: IfElsePack.h:30
Definition: MaskBlendReg.h:30