IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
BinaryMaskPackOp.h
Go to the documentation of this file.
1 // BinaryMaskPackOp.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYMASKPACKOP_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYMASKPACKOP_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 BinaryMaskPackOp<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
58  {
59  OpClass::act(inOut1._val[0], inOut2._val[0]);
60  }
61 };
62 
63 template <typename T, class OpClass, typename Scalar>
64 struct BinaryMaskPackOp<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
65  typename boost::enable_if_c<sizeof(T) == 2>::type>
66 {
67  static IPSDK_FORCEINLINE
71  {
73  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
74  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
75  return out;
76  }
77 
78  static IPSDK_FORCEINLINE
79  void
83  {
84  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
85  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
86  }
87 
88  static IPSDK_FORCEINLINE
89  void
92  {
93  OpClass::act(inOut1._val[0], inOut2._val[0]);
94  OpClass::act(inOut1._val[1], inOut2._val[1]);
95  }
96 };
97 
98 template <typename T, class OpClass, typename Scalar>
99 struct BinaryMaskPackOp<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
100  typename boost::enable_if_c<sizeof(T) == 4>::type>
101 {
102  static IPSDK_FORCEINLINE
106  {
108  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
109  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
110  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
111  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
112  return out;
113  }
114 
115  static IPSDK_FORCEINLINE
116  void
120  {
121  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
122  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
123  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
124  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
125  }
126 
127  static IPSDK_FORCEINLINE
128  void
129  act_io_io(BaseMaskPack<ePackType::ePT_Avx512, T>& inOut1,
131  {
132  OpClass::act(inOut1._val[0], inOut2._val[0]);
133  OpClass::act(inOut1._val[1], inOut2._val[1]);
134  OpClass::act(inOut1._val[2], inOut2._val[2]);
135  OpClass::act(inOut1._val[3], inOut2._val[3]);
136  }
137 };
138 
139 template <typename T, class OpClass, typename Scalar>
140 struct BinaryMaskPackOp<eInstructionSet::eIS_Avx512, T, OpClass, Scalar,
141  typename boost::enable_if_c<sizeof(T) == 8>::type>
142 {
143  static IPSDK_FORCEINLINE
147  {
149  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
150  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
151  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
152  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
153  out._val[4] = OpClass::act(in1._val[4], in2._val[4]);
154  out._val[5] = OpClass::act(in1._val[5], in2._val[5]);
155  out._val[6] = OpClass::act(in1._val[6], in2._val[6]);
156  out._val[7] = OpClass::act(in1._val[7], in2._val[7]);
157  return out;
158  }
159 
160  static IPSDK_FORCEINLINE
161  void
165  {
166  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
167  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
168  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
169  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
170  OpClass::act(in1._val[4], in2._val[4], out._val[4]);
171  OpClass::act(in1._val[5], in2._val[5], out._val[5]);
172  OpClass::act(in1._val[6], in2._val[6], out._val[6]);
173  OpClass::act(in1._val[7], in2._val[7], out._val[7]);
174  }
175 
176  static IPSDK_FORCEINLINE
177  void
178  act_io_io(BaseMaskPack<ePackType::ePT_Avx512, T>& inOut1,
180  {
181  OpClass::act(inOut1._val[0], inOut2._val[0]);
182  OpClass::act(inOut1._val[1], inOut2._val[1]);
183  OpClass::act(inOut1._val[2], inOut2._val[2]);
184  OpClass::act(inOut1._val[3], inOut2._val[3]);
185  OpClass::act(inOut1._val[4], inOut2._val[4]);
186  OpClass::act(inOut1._val[5], inOut2._val[5]);
187  OpClass::act(inOut1._val[6], inOut2._val[6]);
188  OpClass::act(inOut1._val[7], inOut2._val[7]);
189  }
190 };
191 
194 
195 } // end of namespace detail
196 } // end of namespace simd
197 } // end of namespace ipsdk
198 
199 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_BINARYMASKPACKOP_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: BinaryMaskPackOp.h:30
(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.