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_AVX_TERNARYPACKOPRETMASK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_TERNARYPACKOPRETMASK_H__
17 
21 
22 namespace ipsdk {
23 namespace simd {
24 namespace detail {
25 
28 
29 template <typename T, class OpClass>
31  typename boost::enable_if_c<sizeof(T) == 4>::type>
32 {
33  static IPSDK_FORCEINLINE
35  act(const BasePack<ePackType::ePT_Avx, T>& in1,
38  {
40  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
41  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
42  out._val[2] = OpClass::act(in1._val[2], in2._val[2], in3._val[2]);
43  out._val[3] = OpClass::act(in1._val[3], in2._val[3], in3._val[3]);
44  return out;
45  }
46 
47  static IPSDK_FORCEINLINE
48  void
49  act(const BasePack<ePackType::ePT_Avx, T>& in1,
53  {
54  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
55  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
56  OpClass::act(in1._val[2], in2._val[2], in3._val[2], out._val[2]);
57  OpClass::act(in1._val[3], in2._val[3], in3._val[3], out._val[3]);
58  }
59 };
60 
61 template <typename T, class OpClass>
63  typename boost::enable_if_c<sizeof(T) == 8>::type>
64 {
65  static IPSDK_FORCEINLINE
67  act(const BasePack<ePackType::ePT_Avx, T>& in1,
70  {
72  out._val[0] = OpClass::act(in1._val[0], in2._val[0], in3._val[0]);
73  out._val[1] = OpClass::act(in1._val[1], in2._val[1], in3._val[1]);
74  out._val[2] = OpClass::act(in1._val[2], in2._val[2], in3._val[2]);
75  out._val[3] = OpClass::act(in1._val[3], in2._val[3], in3._val[3]);
76  out._val[4] = OpClass::act(in1._val[0], in2._val[4], in3._val[4]);
77  out._val[5] = OpClass::act(in1._val[1], in2._val[5], in3._val[5]);
78  out._val[6] = OpClass::act(in1._val[2], in2._val[6], in3._val[6]);
79  out._val[7] = OpClass::act(in1._val[3], in2._val[7], in3._val[7]);
80  return out;
81  }
82 
83  static IPSDK_FORCEINLINE
84  void
85  act(const BasePack<ePackType::ePT_Avx, T>& in1,
89  {
90  OpClass::act(in1._val[0], in2._val[0], in3._val[0], out._val[0]);
91  OpClass::act(in1._val[1], in2._val[1], in3._val[1], out._val[1]);
92  OpClass::act(in1._val[2], in2._val[2], in3._val[2], out._val[2]);
93  OpClass::act(in1._val[3], in2._val[3], in3._val[3], out._val[3]);
94  OpClass::act(in1._val[4], in2._val[4], in3._val[4], out._val[4]);
95  OpClass::act(in1._val[5], in2._val[5], in3._val[5], out._val[5]);
96  OpClass::act(in1._val[6], in2._val[6], in3._val[6], out._val[6]);
97  OpClass::act(in1._val[7], in2._val[7], in3._val[7], out._val[7]);
98  }
99 };
100 
103 
104 } // end of namespace detail
105 } // end of namespace simd
106 } // end of namespace ipsdk
107 
108 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_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
Advanced Vector Extensions.
Definition: InstructionSetTypes.h:44
Predefined types associated to instruction set management.
Definition of import/export macro for library.
Definition: TernaryPackOpRetMask.h:31