IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
BinaryPackOpRetMask.h
Go to the documentation of this file.
1 // BinaryPackOpRetMask.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYPACKOPRETMASK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYPACKOPRETMASK_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 BinaryPackOpRetMask<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
55  IPSDK_FORCEINLINE
56  void
57  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
58  const Scalar& in2,
60  {
61  OpClass::act(in1._val[0], in2, out._val[0]);
62  }
63 };
64 
65 template <typename T, class OpClass, typename Scalar>
66 struct BinaryPackOpRetMask<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
67  typename boost::enable_if_c<sizeof(T) == 2>::type>
68 {
69  static IPSDK_FORCEINLINE
73  {
75  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
76  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
77  return out;
78  }
79 
80  static IPSDK_FORCEINLINE
81  void
85  {
86  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
87  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
88  }
89 
90  static
91  IPSDK_FORCEINLINE
92  void
93  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
94  const Scalar& in2,
96  {
97  OpClass::act(in1._val[0], in2, out._val[0]);
98  OpClass::act(in1._val[1], in2, out._val[1]);
99  }
100 };
101 
102 template <typename T, class OpClass, typename Scalar>
103 struct BinaryPackOpRetMask<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
104  typename boost::enable_if_c<sizeof(T) == 4>::type>
105 {
106  static IPSDK_FORCEINLINE
108  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
110  {
112  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
113  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
114  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
115  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
116  return out;
117  }
118 
119  static IPSDK_FORCEINLINE
120  void
121  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
124  {
125  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
126  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
127  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
128  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
129  }
130 
131  static
132  IPSDK_FORCEINLINE
133  void
134  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
135  const Scalar& in2,
137  {
138  OpClass::act(in1._val[0], in2, out._val[0]);
139  OpClass::act(in1._val[1], in2, out._val[1]);
140  OpClass::act(in1._val[2], in2, out._val[2]);
141  OpClass::act(in1._val[3], in2, out._val[3]);
142  }
143 };
144 
145 template <typename T, class OpClass, typename Scalar>
146 struct BinaryPackOpRetMask<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
147  typename boost::enable_if_c<sizeof(T) == 8>::type>
148 {
149  static IPSDK_FORCEINLINE
151  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
153  {
155  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
156  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
157  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
158  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
159  out._val[4] = OpClass::act(in1._val[4], in2._val[4]);
160  out._val[5] = OpClass::act(in1._val[5], in2._val[5]);
161  out._val[6] = OpClass::act(in1._val[6], in2._val[6]);
162  out._val[7] = OpClass::act(in1._val[7], in2._val[7]);
163  return out;
164  }
165 
166  static IPSDK_FORCEINLINE
167  void
168  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
171  {
172  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
173  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
174  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
175  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
176  OpClass::act(in1._val[4], in2._val[4], out._val[4]);
177  OpClass::act(in1._val[5], in2._val[5], out._val[5]);
178  OpClass::act(in1._val[6], in2._val[6], out._val[6]);
179  OpClass::act(in1._val[7], in2._val[7], out._val[7]);
180  }
181 
182  static
183  IPSDK_FORCEINLINE
184  void
185  actPackScalar(const BasePack<ePackType::ePT_Avx512, T>& in1,
186  const Scalar& in2,
188  {
189  OpClass::act(in1._val[0], in2, out._val[0]);
190  OpClass::act(in1._val[1], in2, out._val[1]);
191  OpClass::act(in1._val[2], in2, out._val[2]);
192  OpClass::act(in1._val[3], in2, out._val[3]);
193  OpClass::act(in1._val[4], in2, out._val[4]);
194  OpClass::act(in1._val[5], in2, out._val[5]);
195  OpClass::act(in1._val[6], in2, out._val[6]);
196  OpClass::act(in1._val[7], in2, out._val[7]);
197  }
198 };
199 
202 
203 } // end of namespace detail
204 } // end of namespace simd
205 } // end of namespace ipsdk
206 
207 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYPACKOPRETMASK_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: BinaryPackOpRetMask.h:31
(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.