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_AVX512_TERNARYPACKOPRETMASK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_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 IPSDK_FORCEINLINE
40  {
42  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
43  return out;
44  }
45 
46  static IPSDK_FORCEINLINE
47  void
52  {
53  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
54  }
55 };
56 
57 template <typename T, class OpClass>
59  typename boost::enable_if_c<sizeof(T) == 2>::type>
60 {
61  static IPSDK_FORCEINLINE
66  {
68  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
69  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
70  return out;
71  }
72 
73  static IPSDK_FORCEINLINE
74  void
79  {
80  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
81  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
82  }
83 };
84 
85 template <typename T, class OpClass>
87  typename boost::enable_if_c<sizeof(T) == 4>::type>
88 {
89  static IPSDK_FORCEINLINE
94  {
96  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
97  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
98  out._val[2] = OpClass::act(in1._val[2], in2._val[2], in3._val[2]);
99  out._val[3] = OpClass::act(in1._val[3], in2._val[3], in3._val[3]);
100  return out;
101  }
102 
103  static IPSDK_FORCEINLINE
104  void
105  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
109  {
110  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
111  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
112  OpClass::act(in1._val[2], in2._val[2], in3._val[2], out._val[2]);
113  OpClass::act(in1._val[3], in2._val[3], in3._val[3], out._val[3]);
114  }
115 };
116 
117 template <typename T, class OpClass>
119  typename boost::enable_if_c<sizeof(T) == 8>::type>
120 {
121  static IPSDK_FORCEINLINE
123  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
126  {
128  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
129  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
130  out._val[2] = OpClass::act(in1._val[2], in2._val[2], in3._val[2]);
131  out._val[3] = OpClass::act(in1._val[3], in2._val[3], in3._val[3]);
132  out._val[4] = OpClass::act(in1._val[4], in2._val[4], in3._val[4]);
133  out._val[5] = OpClass::act(in1._val[5], in2._val[5], in3._val[5]);
134  out._val[6] = OpClass::act(in1._val[6], in2._val[6], in3._val[6]);
135  out._val[7] = OpClass::act(in1._val[7], in2._val[7], in3._val[7]);
136  return out;
137  }
138 
139  static IPSDK_FORCEINLINE
140  void
141  act(const BasePack<ePackType::ePT_Avx512, T>& in1,
145  {
146  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
147  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
148  OpClass::act(in1._val[2], in2._val[2], in3._val[2], out._val[2]);
149  OpClass::act(in1._val[3], in2._val[3], in3._val[3], out._val[3]);
150  OpClass::act(in1._val[4], in2._val[4], in3._val[4], out._val[4]);
151  OpClass::act(in1._val[5], in2._val[5], in3._val[5], out._val[5]);
152  OpClass::act(in1._val[6], in2._val[6], in3._val[6], out._val[6]);
153  OpClass::act(in1._val[7], in2._val[7], in3._val[7], out._val[7]);
154  }
155 };
156 
159 
160 } // end of namespace detail
161 } // end of namespace simd
162 } // end of namespace ipsdk
163 
164 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX512_TERNARYPACKOPRETMASK_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
(including fundation and byte and word instructions)
Definition: InstructionSetTypes.h:51
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.
Definition: TernaryPackOpRetMask.h:31