IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
TernaryPackOpRetMask.h
Go to the documentation of this file.
1 // TernaryPackOpRetMask.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_TERNARYPACKOPRETMASK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_TERNARYPACKOPRETMASK_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>
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,
41  {
43  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
44  return out;
45  }
46 
47  static
48  IPSDK_FORCEINLINE
49  void
50  act(const BasePack<ePackType::ePT_Sse, T>& in1,
54  {
55  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
56  }
57 };
58 
59 template <typename T, class OpClass>
61  typename boost::enable_if_c<sizeof(T) == 2>::type>
62 {
63  static
64  IPSDK_FORCEINLINE
66  act(const BasePack<ePackType::ePT_Sse, T>& in1,
69  {
71  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
72  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
73  return out;
74  }
75 
76  static
77  IPSDK_FORCEINLINE
78  void
79  act(const BasePack<ePackType::ePT_Sse, T>& in1,
83  {
84  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
85  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
86  }
87 };
88 
89 template <typename T, class OpClass>
91  typename boost::enable_if_c<sizeof(T) == 4>::type>
92 {
93  static
94  IPSDK_FORCEINLINE
96  act(const BasePack<ePackType::ePT_Sse, T>& in1,
99  {
101  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
102  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
103  out._val[2] = OpClass::act(in1._val[2], in2._val[2], in3._val[2]);
104  out._val[3] = OpClass::act(in1._val[3], in2._val[3], in3._val[3]);
105  return out;
106  }
107 
108  static
109  IPSDK_FORCEINLINE
110  void
111  act(const BasePack<ePackType::ePT_Sse, T>& in1,
115  {
116  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
117  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
118  OpClass::act(in1._val[2], in2._val[2], in3._val[2], out._val[2]);
119  OpClass::act(in1._val[3], in2._val[3], in3._val[3], out._val[3]);
120  }
121 };
122 
123 template <typename T, class OpClass>
125  typename boost::enable_if_c<sizeof(T) == 8>::type>
126 {
127  static
128  IPSDK_FORCEINLINE
130  act(const BasePack<ePackType::ePT_Sse, T>& in1,
133  {
135  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
136  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
137  out._val[2] = OpClass::act(in1._val[2], in2._val[2], in3._val[2]);
138  out._val[3] = OpClass::act(in1._val[3], in2._val[3], in3._val[3]);
139  out._val[4] = OpClass::act(in1._val[4], in2._val[4], in3._val[4]);
140  out._val[5] = OpClass::act(in1._val[5], in2._val[5], in3._val[5]);
141  out._val[6] = OpClass::act(in1._val[6], in2._val[6], in3._val[6]);
142  out._val[7] = OpClass::act(in1._val[7], in2._val[7], in3._val[7]);
143  return out;
144  }
145 
146  static
147  IPSDK_FORCEINLINE
148  void
149  act(const BasePack<ePackType::ePT_Sse, T>& in1,
153  {
154  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
155  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
156  OpClass::act(in1._val[2], in2._val[2], in3._val[2], out._val[2]);
157  OpClass::act(in1._val[3], in2._val[3], in3._val[3], out._val[3]);
158  OpClass::act(in1._val[4], in2._val[4], in3._val[4], out._val[4]);
159  OpClass::act(in1._val[5], in2._val[5], in3._val[5], out._val[5]);
160  OpClass::act(in1._val[6], in2._val[6], in3._val[6], out._val[6]);
161  OpClass::act(in1._val[7], in2._val[7], in3._val[7], out._val[7]);
162  }
163 };
164 
167 
168 } // end of namespace detail
169 } // end of namespace simd
170 } // end of namespace ipsdk
171 
172 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_SSE2_TERNARYPACKOPRETMASK_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: TernaryPackOpRetMask.h:31