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_SSE2_BINARYMASKPACKOP_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_BINARYMASKPACKOP_H__
17 
21 
22 namespace ipsdk {
23 namespace simd {
24 namespace detail {
25 
28 
29 template <typename T,
30  class OpClass, typename Scalar>
31 struct BinaryMaskPackOp<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
32  typename boost::enable_if_c<sizeof(T) == 1>::type>
33 {
34  static
35  IPSDK_FORCEINLINE
39  {
41  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
42  return out;
43  }
44 
45  static
46  IPSDK_FORCEINLINE
47  void
51  {
52  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
53  }
54 
55  static
56  IPSDK_FORCEINLINE
57  void
58  act_io_io(BaseMaskPack<ePackType::ePT_Sse, T>& inOut1,
60  {
61  OpClass::act(inOut1._val[0], inOut2._val[0]);
62  }
63 };
64 
65 template <typename T, class OpClass, typename Scalar>
66 struct BinaryMaskPackOp<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
67  typename boost::enable_if_c<sizeof(T) == 2>::type>
68 {
69  static
70  IPSDK_FORCEINLINE
74  {
76  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
77  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
78  return out;
79  }
80 
81  static
82  IPSDK_FORCEINLINE
83  void
87  {
88  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
89  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
90  }
91 
92  static
93  IPSDK_FORCEINLINE
94  void
95  act_io_io(BaseMaskPack<ePackType::ePT_Sse, T>& inOut1,
97  {
98  OpClass::act(inOut1._val[0], inOut2._val[0]);
99  OpClass::act(inOut1._val[1], inOut2._val[1]);
100  }
101 };
102 
103 template <typename T, class OpClass, typename Scalar>
104 struct BinaryMaskPackOp<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
105  typename boost::enable_if_c<sizeof(T) == 4>::type>
106 {
107  static
108  IPSDK_FORCEINLINE
112  {
114  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
115  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
116  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
117  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
118  return out;
119  }
120 
121  static
122  IPSDK_FORCEINLINE
123  void
127  {
128  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
129  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
130  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
131  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
132  }
133 
134  static
135  IPSDK_FORCEINLINE
136  void
137  act_io_io(BaseMaskPack<ePackType::ePT_Sse, T>& inOut1,
139  {
140  OpClass::act(inOut1._val[0], inOut2._val[0]);
141  OpClass::act(inOut1._val[1], inOut2._val[1]);
142  OpClass::act(inOut1._val[2], inOut2._val[2]);
143  OpClass::act(inOut1._val[3], inOut2._val[3]);
144  }
145 };
146 
147 template <typename T, class OpClass, typename Scalar>
148 struct BinaryMaskPackOp<eInstructionSet::eIS_Sse2, T, OpClass, Scalar,
149  typename boost::enable_if_c<sizeof(T) == 8>::type>
150 {
151  static
152  IPSDK_FORCEINLINE
156  {
158  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
159  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
160  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
161  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
162  out._val[4] = OpClass::act(in1._val[4], in2._val[4]);
163  out._val[5] = OpClass::act(in1._val[5], in2._val[5]);
164  out._val[6] = OpClass::act(in1._val[6], in2._val[6]);
165  out._val[7] = OpClass::act(in1._val[7], in2._val[7]);
166  return out;
167  }
168 
169  static
170  IPSDK_FORCEINLINE
171  void
175  {
176  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
177  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
178  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
179  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
180  OpClass::act(in1._val[4], in2._val[4], out._val[4]);
181  OpClass::act(in1._val[5], in2._val[5], out._val[5]);
182  OpClass::act(in1._val[6], in2._val[6], out._val[6]);
183  OpClass::act(in1._val[7], in2._val[7], out._val[7]);
184  }
185 
186  static
187  IPSDK_FORCEINLINE
188  void
189  act_io_io(BaseMaskPack<ePackType::ePT_Sse, T>& inOut1,
191  {
192  OpClass::act(inOut1._val[0], inOut2._val[0]);
193  OpClass::act(inOut1._val[1], inOut2._val[1]);
194  OpClass::act(inOut1._val[2], inOut2._val[2]);
195  OpClass::act(inOut1._val[3], inOut2._val[3]);
196  OpClass::act(inOut1._val[4], inOut2._val[4]);
197  OpClass::act(inOut1._val[5], inOut2._val[5]);
198  OpClass::act(inOut1._val[6], inOut2._val[6]);
199  OpClass::act(inOut1._val[7], inOut2._val[7]);
200  }
201 };
202 
205 
206 } // end of namespace detail
207 } // end of namespace simd
208 } // end of namespace ipsdk
209 
210 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_BINARYMASKPACKOP_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
Definition: BinaryMaskPackOp.h:30
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