IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
IfElsePack.h
Go to the documentation of this file.
1 // IfElsePack.h:
3 // -------------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX2_IFELSEPACK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX2_IFELSEPACK_H__
17 
23 
24 namespace ipsdk {
25 namespace simd {
26 namespace detail {
27 
30 
31 template <typename T>
33  typename boost::enable_if_c<boost::is_integral<T>::value>::type
34 >
35 {
36  static IPSDK_FORCEINLINE
41  {
43  cast<eInstructionSet::eIS_Avx2>(mask, packFromMask);
45  bitwiseSelect(packFromMask, in1, in2, out);
46  return out;
47  }
48 
49  static IPSDK_FORCEINLINE
50  void
55  {
57  cast<eInstructionSet::eIS_Avx2>(mask, packFromMask);
58 
59  bitwiseSelect<eInstructionSet::eIS_Avx2>(packFromMask, in1, in2, out);
60  }
61 };
62 
63 template <>
65 {
66  static IPSDK_FORCEINLINE
71  {
73  cast<eInstructionSet::eIS_Avx2>(mask, packFromMask);
74 
75  out._val[0] = _mm256_blendv_ps(in2._val[0], in1._val[0],
76  packFromMask._val[0]);
77  out._val[1] = _mm256_blendv_ps(in2._val[1], in1._val[1],
78  packFromMask._val[1]);
79  out._val[2] = _mm256_blendv_ps(in2._val[2], in1._val[2],
80  packFromMask._val[2]);
81  out._val[3] = _mm256_blendv_ps(in2._val[3], in1._val[3],
82  packFromMask._val[3]);
83 
84  return out;
85  }
86 
87  static IPSDK_FORCEINLINE
88  void
93  {
95  cast<eInstructionSet::eIS_Avx2>(mask, packFromMask);
96 
97  out._val[0] = _mm256_blendv_ps(in2._val[0], in1._val[0],
98  packFromMask._val[0]);
99  out._val[1] = _mm256_blendv_ps(in2._val[1], in1._val[1],
100  packFromMask._val[1]);
101  out._val[2] = _mm256_blendv_ps(in2._val[2], in1._val[2],
102  packFromMask._val[2]);
103  out._val[3] = _mm256_blendv_ps(in2._val[3], in1._val[3],
104  packFromMask._val[3]);
105  }
106 };
107 
108 template <>
110 {
111  static IPSDK_FORCEINLINE
116  {
117  BasePack<ePackType::ePT_Avx, ipReal64> packFromMask, out;
118  cast<eInstructionSet::eIS_Avx2>(mask, packFromMask);
119 
120  out._val[0] = _mm256_blendv_pd(in2._val[0], in1._val[0],
121  packFromMask._val[0]);
122  out._val[1] = _mm256_blendv_pd(in2._val[1], in1._val[1],
123  packFromMask._val[1]);
124  out._val[2] = _mm256_blendv_pd(in2._val[2], in1._val[2],
125  packFromMask._val[2]);
126  out._val[3] = _mm256_blendv_pd(in2._val[3], in1._val[3],
127  packFromMask._val[3]);
128  out._val[4] = _mm256_blendv_pd(in2._val[4], in1._val[4],
129  packFromMask._val[4]);
130  out._val[5] = _mm256_blendv_pd(in2._val[5], in1._val[5],
131  packFromMask._val[5]);
132  out._val[6] = _mm256_blendv_pd(in2._val[6], in1._val[6],
133  packFromMask._val[6]);
134  out._val[7] = _mm256_blendv_pd(in2._val[7], in1._val[7],
135  packFromMask._val[7]);
136 
137  return out;
138  }
139 
140  static IPSDK_FORCEINLINE
141  void
146  {
148  cast<eInstructionSet::eIS_Avx2>(mask, packFromMask);
149 
150  out._val[0] = _mm256_blendv_pd(in2._val[0], in1._val[0],
151  packFromMask._val[0]);
152  out._val[1] = _mm256_blendv_pd(in2._val[1], in1._val[1],
153  packFromMask._val[1]);
154  out._val[2] = _mm256_blendv_pd(in2._val[2], in1._val[2],
155  packFromMask._val[2]);
156  out._val[3] = _mm256_blendv_pd(in2._val[3], in1._val[3],
157  packFromMask._val[3]);
158  out._val[4] = _mm256_blendv_pd(in2._val[4], in1._val[4],
159  packFromMask._val[4]);
160  out._val[5] = _mm256_blendv_pd(in2._val[5], in1._val[5],
161  packFromMask._val[5]);
162  out._val[6] = _mm256_blendv_pd(in2._val[6], in1._val[6],
163  packFromMask._val[6]);
164  out._val[7] = _mm256_blendv_pd(in2._val[7], in1._val[7],
165  packFromMask._val[7]);
166  }
167 };
168 
171 
172 } // end of namespace detail
173 } // end of namespace simd
174 } // end of namespace ipsdk
175 
176 #endif // __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX2_IFELSEPACK_H__
Defines the IPSDK_FORCEINLINE.
Main namespace for IPSDK library.
Definition: AlgorithmFunctionEfficiency.h:22
cast function; casts a Pack<instructionSet, TIn> to a Pack<instructionSet, TOut>
structure containing set of masks for vectorized operations
Definition: BaseMaskPackDecl.h:29
double ipReal64
Base types definition.
Definition: BaseTypes.h:57
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
Advanced Vector Extensions 2.
Definition: InstructionSetTypes.h:48
Definition of import/export macro for library.
IPSDK_FORCEINLINE PackT bitwiseSelect(const PackT &mask, const PackT &in1, const PackT &in2)
bitwiseSelect function; vectorized arithmetic addition of data contained in 2 Register structures ...
Definition: bitwiseSelect.h:37
Definition: IfElsePack.h:30
float ipReal32
Base types definition.
Definition: BaseTypes.h:56
structure containing intrinsic registers used to store vectorized data
Definition: BasePackDecl.h:29