IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
BinaryPackOp.h
Go to the documentation of this file.
1 // BinaryPackOp.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYPACKOP_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYPACKOP_H__
17 
21 
22 namespace ipsdk {
23 namespace simd {
24 namespace detail {
25 
28 
29 // template structure associated to unload function
30 template <typename T,
31  class OpClass, typename Scalar>
32 struct BinaryPackOp<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
33  typename boost::enable_if_c<sizeof(T) == 1>::type>
34 {
35  static IPSDK_FORCEINLINE
39  {
41  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
42  return out;
43  }
44 
45  static IPSDK_FORCEINLINE
46  void
50  {
51  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
52  }
53 
54  static IPSDK_FORCEINLINE
55  void
56  act_io_io(BasePack<ePackType::ePT_Avx512, T>& inOut1,
58  {
59  OpClass::act(inOut1._val[0], inOut2._val[0]);
60  }
61 
62  static
63  IPSDK_FORCEINLINE
64  void
65  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
66  const Scalar& in2,
68  {
69  OpClass::act(in1._val[0], in2, out._val[0]);
70  }
71 };
72 
73 template <typename T, class OpClass, typename Scalar>
74 struct BinaryPackOp<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
75  typename boost::enable_if_c<sizeof(T) == 2>::type>
76 {
77  static IPSDK_FORCEINLINE
81  {
83  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
84  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
85  return out;
86  }
87 
88  static IPSDK_FORCEINLINE
89  void
93  {
94  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
95  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
96  }
97 
98  static IPSDK_FORCEINLINE
99  void
100  act_io_io(BasePack<ePackType::ePT_Avx512, T>& inOut1,
102  {
103  OpClass::act(inOut1._val[0], inOut2._val[0]);
104  OpClass::act(inOut1._val[1], inOut2._val[1]);
105  }
106 
107  static
108  IPSDK_FORCEINLINE
109  void
110  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
111  const Scalar& in2,
113  {
114  OpClass::act(in1._val[0], in2, out._val[0]);
115  OpClass::act(in1._val[1], in2, out._val[1]);
116  }
117 };
118 
119 template <typename T, class OpClass, typename Scalar>
120 struct BinaryPackOp<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
121  typename boost::enable_if_c<sizeof(T) == 4>::type>
122 {
123  static IPSDK_FORCEINLINE
125  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
127  {
129  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
130  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
131  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
132  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
133  return out;
134  }
135 
136  static IPSDK_FORCEINLINE
137  void
138  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
141  {
142  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
143  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
144  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
145  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
146  }
147 
148  static IPSDK_FORCEINLINE
149  void
150  act_io_io(BasePack<ePackType::ePT_Avx512, T>& inOut1,
152  {
153  OpClass::act(inOut1._val[0], inOut2._val[0]);
154  OpClass::act(inOut1._val[1], inOut2._val[1]);
155  OpClass::act(inOut1._val[2], inOut2._val[2]);
156  OpClass::act(inOut1._val[3], inOut2._val[3]);
157  }
158 
159  static
160  IPSDK_FORCEINLINE
161  void
162  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
163  const Scalar& in2,
165  {
166  OpClass::act(in1._val[0], in2, out._val[0]);
167  OpClass::act(in1._val[1], in2, out._val[1]);
168  OpClass::act(in1._val[2], in2, out._val[2]);
169  OpClass::act(in1._val[3], in2, out._val[3]);
170  }
171 };
172 
173 template <typename T, class OpClass, typename Scalar>
174 struct BinaryPackOp<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
175  typename boost::enable_if_c<sizeof(T) == 8>::type>
176 {
177  static IPSDK_FORCEINLINE
179  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
181  {
183  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
184  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
185  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
186  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
187  out._val[4] = OpClass::act(in1._val[4], in2._val[4]);
188  out._val[5] = OpClass::act(in1._val[5], in2._val[5]);
189  out._val[6] = OpClass::act(in1._val[6], in2._val[6]);
190  out._val[7] = OpClass::act(in1._val[7], in2._val[7]);
191  return out;
192  }
193 
194  static IPSDK_FORCEINLINE
195  void
196  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
199  {
200  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
201  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
202  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
203  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
204  OpClass::act(in1._val[4], in2._val[4], out._val[4]);
205  OpClass::act(in1._val[5], in2._val[5], out._val[5]);
206  OpClass::act(in1._val[6], in2._val[6], out._val[6]);
207  OpClass::act(in1._val[7], in2._val[7], out._val[7]);
208  }
209 
210  static IPSDK_FORCEINLINE
211  void
212  act_io_io(BasePack<ePackType::ePT_Avx512, T>& inOut1,
214  {
215  OpClass::act(inOut1._val[0], inOut2._val[0]);
216  OpClass::act(inOut1._val[1], inOut2._val[1]);
217  OpClass::act(inOut1._val[2], inOut2._val[2]);
218  OpClass::act(inOut1._val[3], inOut2._val[3]);
219  OpClass::act(inOut1._val[4], inOut2._val[4]);
220  OpClass::act(inOut1._val[5], inOut2._val[5]);
221  OpClass::act(inOut1._val[6], inOut2._val[6]);
222  OpClass::act(inOut1._val[7], inOut2._val[7]);
223  }
224 
225  static
226  IPSDK_FORCEINLINE
227  void
228  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
229  const Scalar& in2,
231  {
232  OpClass::act(in1._val[0], in2, out._val[0]);
233  OpClass::act(in1._val[1], in2, out._val[1]);
234  OpClass::act(in1._val[2], in2, out._val[2]);
235  OpClass::act(in1._val[3], in2, out._val[3]);
236  OpClass::act(in1._val[4], in2, out._val[4]);
237  OpClass::act(in1._val[5], in2, out._val[5]);
238  OpClass::act(in1._val[6], in2, out._val[6]);
239  OpClass::act(in1._val[7], in2, out._val[7]);
240  }
241 };
242 
245 
246 } // end of namespace detail
247 } // end of namespace simd
248 } // end of namespace ipsdk
249 
250 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYPACKOP_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
(including fundation and byte and word instructions)
Definition: InstructionSetTypes.h:51
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Predefined types associated to instruction set management.
Definition of import/export macro for library.
Definition: BinaryPackOp.h:31