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_SSE2_BINARYPACKOP_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_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_Sse2, T, OpClass, Scalar,
33  typename boost::enable_if_c<sizeof(T) == 1>::type>
34 {
35  static
36  IPSDK_FORCEINLINE
38  act(const BasePack<ePackType::ePT_Sse, T>& in1,
40  {
42  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
43  return out;
44  }
45 
46  static
47  IPSDK_FORCEINLINE
48  void
49  act(const BasePack<ePackType::ePT_Sse, T>& in1,
52  {
53  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
54  }
55 
56  static
57  IPSDK_FORCEINLINE
58  void
59  act_io_io(BasePack<ePackType::ePT_Sse, T>& inOut1,
61  {
62  OpClass::act(inOut1._val[0], inOut2._val[0]);
63  }
64 
65  static
66  IPSDK_FORCEINLINE
67  void
68  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
69  const Scalar& in2,
71  {
72  OpClass::act(in1._val[0], in2, out._val[0]);
73  }
74 };
75 
76 template <typename T, class OpClass, typename Scalar>
77 struct BinaryPackOp<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
78  typename boost::enable_if_c<sizeof(T) == 2>::type>
79 {
80  static
81  IPSDK_FORCEINLINE
83  act(const BasePack<ePackType::ePT_Sse, T>& in1,
85  {
87  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
88  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
89  return out;
90  }
91 
92  static
93  IPSDK_FORCEINLINE
94  void
95  act(const BasePack<ePackType::ePT_Sse, T>& in1,
98  {
99  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
100  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
101  }
102 
103  static
104  IPSDK_FORCEINLINE
105  void
106  act_io_io(BasePack<ePackType::ePT_Sse, T>& inOut1,
108  {
109  OpClass::act(inOut1._val[0], inOut2._val[0]);
110  OpClass::act(inOut1._val[1], inOut2._val[1]);
111  }
112 
113 
114  static
115  IPSDK_FORCEINLINE
116  void
117  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
118  const Scalar& in2,
120  {
121  OpClass::act(in1._val[0], in2, out._val[0]);
122  OpClass::act(in1._val[1], in2, out._val[1]);
123  }
124 };
125 
126 template <typename T, class OpClass, typename Scalar>
127 struct BinaryPackOp<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
128  typename boost::enable_if_c<sizeof(T) == 4>::type>
129 {
130  static
131  IPSDK_FORCEINLINE
133  act(const BasePack<ePackType::ePT_Sse, T>& in1,
135  {
137  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
138  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
139  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
140  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
141  return out;
142  }
143 
144  static
145  IPSDK_FORCEINLINE
146  void
147  act(const BasePack<ePackType::ePT_Sse, T>& in1,
150  {
151  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
152  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
153  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
154  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
155  }
156 
157  static
158  IPSDK_FORCEINLINE
159  void
160  act_io_io(BasePack<ePackType::ePT_Sse, T>& inOut1,
162  {
163  OpClass::act(inOut1._val[0], inOut2._val[0]);
164  OpClass::act(inOut1._val[1], inOut2._val[1]);
165  OpClass::act(inOut1._val[2], inOut2._val[2]);
166  OpClass::act(inOut1._val[3], inOut2._val[3]);
167  }
168 
169  static
170  IPSDK_FORCEINLINE
171  void
172  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
173  const Scalar& in2,
175  {
176  OpClass::act(in1._val[0], in2, out._val[0]);
177  OpClass::act(in1._val[1], in2, out._val[1]);
178  OpClass::act(in1._val[2], in2, out._val[2]);
179  OpClass::act(in1._val[3], in2, out._val[3]);
180  }
181 };
182 
183 template <typename T, class OpClass, typename Scalar>
184 struct BinaryPackOp<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
185  typename boost::enable_if_c<sizeof(T) == 8>::type>
186 {
187  static
188  IPSDK_FORCEINLINE
190  act(const BasePack<ePackType::ePT_Sse, T>& in1,
192  {
194  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
195  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
196  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
197  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
198  out._val[4] = OpClass::act(in1._val[4], in2._val[4]);
199  out._val[5] = OpClass::act(in1._val[5], in2._val[5]);
200  out._val[6] = OpClass::act(in1._val[6], in2._val[6]);
201  out._val[7] = OpClass::act(in1._val[7], in2._val[7]);
202  return out;
203  }
204 
205  static
206  IPSDK_FORCEINLINE
207  void
208  act(const BasePack<ePackType::ePT_Sse, T>& in1,
211  {
212  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
213  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
214  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
215  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
216  OpClass::act(in1._val[4], in2._val[4], out._val[4]);
217  OpClass::act(in1._val[5], in2._val[5], out._val[5]);
218  OpClass::act(in1._val[6], in2._val[6], out._val[6]);
219  OpClass::act(in1._val[7], in2._val[7], out._val[7]);
220  }
221 
222  static
223  IPSDK_FORCEINLINE
224  void
225  act_io_io(BasePack<ePackType::ePT_Sse, T>& inOut1,
227  {
228  OpClass::act(inOut1._val[0], inOut2._val[0]);
229  OpClass::act(inOut1._val[1], inOut2._val[1]);
230  OpClass::act(inOut1._val[2], inOut2._val[2]);
231  OpClass::act(inOut1._val[3], inOut2._val[3]);
232  OpClass::act(inOut1._val[4], inOut2._val[4]);
233  OpClass::act(inOut1._val[5], inOut2._val[5]);
234  OpClass::act(inOut1._val[6], inOut2._val[6]);
235  OpClass::act(inOut1._val[7], inOut2._val[7]);
236  }
237 
238  static
239  IPSDK_FORCEINLINE
240  void
241  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
242  const Scalar& in2,
244  {
245  OpClass::act(in1._val[0], in2, out._val[0]);
246  OpClass::act(in1._val[1], in2, out._val[1]);
247  OpClass::act(in1._val[2], in2, out._val[2]);
248  OpClass::act(in1._val[3], in2, out._val[3]);
249  OpClass::act(in1._val[4], in2, out._val[4]);
250  OpClass::act(in1._val[5], in2, out._val[5]);
251  OpClass::act(in1._val[6], in2, out._val[6]);
252  OpClass::act(in1._val[7], in2, out._val[7]);
253  }
254 };
255 
258 
259 } // end of namespace detail
260 } // end of namespace simd
261 } // end of namespace ipsdk
262 
263 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_BINARYPACKOP_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
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.
Streaming SIMD Extensions 2.
Definition: InstructionSetTypes.h:36
Definition: BinaryPackOp.h:31