IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
BinaryPackOp.h
Go to the documentation of this file.
1 // BinaryPackOp.h:
3 // ------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_BINARYPACKOP_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_BINARYPACKOP_H__
17 
21 
22 namespace ipsdk {
23 namespace simd {
24 namespace detail {
25 
28 
29 template <class OpClass, typename Scalar>
30 struct BinaryPackOp<eInstructionSet::eIS_Avx, ipReal32, OpClass, Scalar>
31 {
32  static IPSDK_FORCEINLINE
36  {
38  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
39  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
40  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
41  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
42  return out;
43  }
44 
45  static IPSDK_FORCEINLINE
46  void
50  {
51  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
52  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
53  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
54  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
55  }
56 
57  static IPSDK_FORCEINLINE
58  void
61  {
62  OpClass::act(inOut1._val[0], inOut2._val[0]);
63  OpClass::act(inOut1._val[1], inOut2._val[1]);
64  OpClass::act(inOut1._val[2], inOut2._val[2]);
65  OpClass::act(inOut1._val[3], inOut2._val[3]);
66  }
67 
68  static
69  IPSDK_FORCEINLINE
70  void
71  actPackScalar(const BasePack<ePackType::ePT_Avx, ipReal32>& in1,
72  const Scalar& in2,
74  {
75  OpClass::act(in1._val[0], in2, out._val[0]);
76  OpClass::act(in1._val[1], in2, out._val[1]);
77  OpClass::act(in1._val[2], in2, out._val[2]);
78  OpClass::act(in1._val[3], in2, out._val[3]);
79  }
80 };
81 
82 template <class OpClass, typename Scalar>
83 struct BinaryPackOp<eInstructionSet::eIS_Avx, ipReal64, OpClass, Scalar>
84 {
85  static IPSDK_FORCEINLINE
89  {
91  out._val[0] = OpClass::act(in1._val[0], in2._val[0]);
92  out._val[1] = OpClass::act(in1._val[1], in2._val[1]);
93  out._val[2] = OpClass::act(in1._val[2], in2._val[2]);
94  out._val[3] = OpClass::act(in1._val[3], in2._val[3]);
95  out._val[4] = OpClass::act(in1._val[4], in2._val[4]);
96  out._val[5] = OpClass::act(in1._val[5], in2._val[5]);
97  out._val[6] = OpClass::act(in1._val[6], in2._val[6]);
98  out._val[7] = OpClass::act(in1._val[7], in2._val[7]);
99  return out;
100  }
101 
102  static IPSDK_FORCEINLINE
103  void
107  {
108  OpClass::act(in1._val[0], in2._val[0], out._val[0]);
109  OpClass::act(in1._val[1], in2._val[1], out._val[1]);
110  OpClass::act(in1._val[2], in2._val[2], out._val[2]);
111  OpClass::act(in1._val[3], in2._val[3], out._val[3]);
112  OpClass::act(in1._val[4], in2._val[4], out._val[4]);
113  OpClass::act(in1._val[5], in2._val[5], out._val[5]);
114  OpClass::act(in1._val[6], in2._val[6], out._val[6]);
115  OpClass::act(in1._val[7], in2._val[7], out._val[7]);
116  }
117 
118  static IPSDK_FORCEINLINE
119  void
120  act_io_io(BasePack<ePackType::ePT_Avx, ipReal64>& inOut1,
122  {
123  OpClass::act(inOut1._val[0], inOut2._val[0]);
124  OpClass::act(inOut1._val[1], inOut2._val[1]);
125  OpClass::act(inOut1._val[2], inOut2._val[2]);
126  OpClass::act(inOut1._val[3], inOut2._val[3]);
127  OpClass::act(inOut1._val[4], inOut2._val[4]);
128  OpClass::act(inOut1._val[5], inOut2._val[5]);
129  OpClass::act(inOut1._val[6], inOut2._val[6]);
130  OpClass::act(inOut1._val[7], inOut2._val[7]);
131  }
132 
133  static
134  IPSDK_FORCEINLINE
135  void
136  actPackScalar(const BasePack<ePackType::ePT_Avx, ipReal64>& in1,
137  const Scalar& in2,
139  {
140  OpClass::act(in1._val[0], in2, out._val[0]);
141  OpClass::act(in1._val[1], in2, out._val[1]);
142  OpClass::act(in1._val[2], in2, out._val[2]);
143  OpClass::act(in1._val[3], in2, out._val[3]);
144  OpClass::act(in1._val[4], in2, out._val[4]);
145  OpClass::act(in1._val[5], in2, out._val[5]);
146  OpClass::act(in1._val[6], in2, out._val[6]);
147  OpClass::act(in1._val[7], in2, out._val[7]);
148  }
149 };
150 
153 
154 } // end of namespace detail
155 } // end of namespace simd
156 } // end of namespace ipsdk
157 
158 #endif // __IPSDKUTIL_INSTRUCTIONSET_DETAIL_AVX_BINARYPACKOP_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
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.
float ipReal32
Base types definition.
Definition: BaseTypes.h:56
Definition: BinaryPackOp.h:31
structure containing intrinsic registers used to store vectorized data
Definition: BasePackDecl.h:29