IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
UnaryPackOp.h
Go to the documentation of this file.
1 // UnaryPackOp.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX2_UNARYPACKOP_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX2_UNARYPACKOP_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>
32 struct UnaryPackOp<eInstructionSet::eIS_Avx2, T, OpClass,
33  typename boost::enable_if_c<sizeof(T) == 1>::type>
34 {
35  static IPSDK_FORCEINLINE
37  act(const BasePack<ePackType::ePT_Avx, T>& in)
38  {
40  out._val[0] = OpClass::act(in._val[0]);
41  return out;
42  }
43 
44  static IPSDK_FORCEINLINE
45  void
46  act(const BasePack<ePackType::ePT_Avx, T>& in,
48  {
49  OpClass::act(in._val[0], out._val[0]);
50  }
51 };
52 
53 template <typename T, class OpClass>
54 struct UnaryPackOp<eInstructionSet::eIS_Avx2, T, OpClass,
55  typename boost::enable_if_c<sizeof(T) == 2>::type>
56 {
57  static IPSDK_FORCEINLINE
59  act(const BasePack<ePackType::ePT_Avx, T>& in)
60  {
62  out._val[0] = OpClass::act(in._val[0]);
63  out._val[1] = OpClass::act(in._val[1]);
64  return out;
65  }
66 
67  static IPSDK_FORCEINLINE
68  void
69  act(const BasePack<ePackType::ePT_Avx, T>& in,
71  {
72  OpClass::act(in._val[0], out._val[0]);
73  OpClass::act(in._val[1], out._val[1]);
74  }
75 };
76 
77 template <typename T, class OpClass>
78 struct UnaryPackOp<eInstructionSet::eIS_Avx2, T, OpClass,
79  typename boost::enable_if_c<sizeof(T) == 4>::type>
80 {
81  static IPSDK_FORCEINLINE
83  act(const BasePack<ePackType::ePT_Avx, T>& in)
84  {
86  out._val[0] = OpClass::act(in._val[0]);
87  out._val[1] = OpClass::act(in._val[1]);
88  out._val[2] = OpClass::act(in._val[2]);
89  out._val[3] = OpClass::act(in._val[3]);
90  return out;
91  }
92 
93  static IPSDK_FORCEINLINE
94  void
95  act(const BasePack<ePackType::ePT_Avx, T>& in,
97  {
98  OpClass::act(in._val[0], out._val[0]);
99  OpClass::act(in._val[1], out._val[1]);
100  OpClass::act(in._val[2], out._val[2]);
101  OpClass::act(in._val[3], out._val[3]);
102  }
103 };
104 
105 template <typename T, class OpClass>
107  typename boost::enable_if_c<sizeof(T) == 8>::type>
108 {
109  static IPSDK_FORCEINLINE
111  act(const BasePack<ePackType::ePT_Avx, T>& in)
112  {
114  out._val[0] = OpClass::act(in._val[0]);
115  out._val[1] = OpClass::act(in._val[1]);
116  out._val[2] = OpClass::act(in._val[2]);
117  out._val[3] = OpClass::act(in._val[3]);
118  out._val[4] = OpClass::act(in._val[4]);
119  out._val[5] = OpClass::act(in._val[5]);
120  out._val[6] = OpClass::act(in._val[6]);
121  out._val[7] = OpClass::act(in._val[7]);
122  return out;
123  }
124 
125  static IPSDK_FORCEINLINE
126  void
127  act(const BasePack<ePackType::ePT_Avx, T>& in,
129  {
130  OpClass::act(in._val[0], out._val[0]);
131  OpClass::act(in._val[1], out._val[1]);
132  OpClass::act(in._val[2], out._val[2]);
133  OpClass::act(in._val[3], out._val[3]);
134  OpClass::act(in._val[4], out._val[4]);
135  OpClass::act(in._val[5], out._val[5]);
136  OpClass::act(in._val[6], out._val[6]);
137  OpClass::act(in._val[7], out._val[7]);
138  }
139 };
140 
143 
144 } // end of namespace detail
145 } // end of namespace simd
146 } // end of namespace ipsdk
147 
148 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX2_UNARYPACKOP_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
Advanced Vector Extensions 2.
Definition: InstructionSetTypes.h:48
Predefined types associated to instruction set management.
Definition of import/export macro for library.
Definition: UnaryPackOp.h:31