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_SSE2_BINARYPACKOPRETMASK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_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_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  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
60  const Scalar& in2,
62  {
63  OpClass::act(in1._val[0], in2, out._val[0]);
64  }
65 };
66 
67 template <typename T, class OpClass, typename Scalar>
68 struct BinaryPackOpRetMask<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
69  typename boost::enable_if_c<sizeof(T) == 2>::type>
70 {
71  static
72  IPSDK_FORCEINLINE
74  act(const BasePack<ePackType::ePT_Sse, T>& in1,
76  {
78  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
79  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
80  return out;
81  }
82 
83  static
84  IPSDK_FORCEINLINE
85  void
86  act(const BasePack<ePackType::ePT_Sse, T>& in1,
89  {
90  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
91  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
92  }
93 
94  static
95  IPSDK_FORCEINLINE
96  void
97  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
98  const Scalar& in2,
100  {
101  OpClass::act(in1._val[0], in2, out._val[0]);
102  OpClass::act(in1._val[1], in2, out._val[1]);
103  }
104 };
105 
106 template <typename T, class OpClass, typename Scalar>
107 struct BinaryPackOpRetMask<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
108  typename boost::enable_if_c<sizeof(T) == 4>::type>
109 {
110  static
111  IPSDK_FORCEINLINE
113  act(const BasePack<ePackType::ePT_Sse, T>& in1,
115  {
117  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
118  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
119  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
120  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
121  return out;
122  }
123 
124  static
125  IPSDK_FORCEINLINE
126  void
127  act(const BasePack<ePackType::ePT_Sse, T>& in1,
130  {
131  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
132  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
133  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
134  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
135  }
136 
137  static
138  IPSDK_FORCEINLINE
139  void
140  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
141  const Scalar& in2,
143  {
144  OpClass::act(in1._val[0], in2, out._val[0]);
145  OpClass::act(in1._val[1], in2, out._val[1]);
146  OpClass::act(in1._val[2], in2, out._val[2]);
147  OpClass::act(in1._val[3], in2, out._val[3]);
148  }
149 };
150 
151 template <typename T, class OpClass, typename Scalar>
152 struct BinaryPackOpRetMask<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
153  typename boost::enable_if_c<sizeof(T) == 8>::type>
154 {
155  static
156  IPSDK_FORCEINLINE
158  act(const BasePack<ePackType::ePT_Sse, T>& in1,
160  {
162  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
163  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
164  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
165  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
166  out._val[4] = OpClass::act(in1._val[4], in2._val[4]);
167  out._val[5] = OpClass::act(in1._val[5], in2._val[5]);
168  out._val[6] = OpClass::act(in1._val[6], in2._val[6]);
169  out._val[7] = OpClass::act(in1._val[7], in2._val[7]);
170  return out;
171  }
172 
173  static
174  IPSDK_FORCEINLINE
175  void
176  act(const BasePack<ePackType::ePT_Sse, T>& in1,
179  {
180  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
181  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
182  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
183  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
184  OpClass::act(in1._val[4], in2._val[4], out._val[4]);
185  OpClass::act(in1._val[5], in2._val[5], out._val[5]);
186  OpClass::act(in1._val[6], in2._val[6], out._val[6]);
187  OpClass::act(in1._val[7], in2._val[7], out._val[7]);
188  }
189 
190  static
191  IPSDK_FORCEINLINE
192  void
193  actPackScalar(const BasePack<ePackType::ePT_Sse, T>& in1,
194  const Scalar& in2,
196  {
197  OpClass::act(in1._val[0], in2, out._val[0]);
198  OpClass::act(in1._val[1], in2, out._val[1]);
199  OpClass::act(in1._val[2], in2, out._val[2]);
200  OpClass::act(in1._val[3], in2, out._val[3]);
201  OpClass::act(in1._val[4], in2, out._val[4]);
202  OpClass::act(in1._val[5], in2, out._val[5]);
203  OpClass::act(in1._val[6], in2, out._val[6]);
204  OpClass::act(in1._val[7], in2, out._val[7]);
205  }
206 };
207 
210 
211 } // end of namespace detail
212 } // end of namespace simd
213 } // end of namespace ipsdk
214 
215 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_BINARYPACKOPRETMASK_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: BinaryPackOpRetMask.h:31
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