IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
ShiftLeftPack.h
Go to the documentation of this file.
1 // ShiftLeftPack.h:
3 // -------------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX2_SHIFTLEFTPACK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX2_SHIFTLEFTPACK_H__
17 
25 
26 namespace ipsdk {
27 namespace simd {
28 namespace detail {
29 
32 
35 template <>
37 {
38  static IPSDK_FORCEINLINE
41  ipUInt8 nbBits)
42  {
44  out._val[0] = _mm256_slli_epi16(in._val[0], nbBits);
45  out._val[1] = _mm256_slli_epi16(in._val[1], nbBits);
46  return out;
47  }
48 
49  static IPSDK_FORCEINLINE
50  void
52  ipUInt8 nbBits,
54  {
55  out._val[0] = _mm256_slli_epi16(in._val[0], nbBits);
56  out._val[1] = _mm256_slli_epi16(in._val[1], nbBits);
57  }
58 };
59 
62 template <>
64 {
65  static IPSDK_FORCEINLINE
68  ipUInt8 nbBits)
69  {
71  out._val[0] = _mm256_slli_epi16(in._val[0], nbBits);
72  out._val[1] = _mm256_slli_epi16(in._val[1], nbBits);
73  return out;
74  }
75 
76  static IPSDK_FORCEINLINE
77  void
79  ipUInt8 nbBits,
81  {
82  out._val[0] = _mm256_slli_epi16(in._val[0], nbBits);
83  out._val[1] = _mm256_slli_epi16(in._val[1], nbBits);
84  }
85 };
86 
89 template <>
91 {
92  static IPSDK_FORCEINLINE
95  ipUInt8 nbBits)
96  {
98  out._val[0] = _mm256_slli_epi32(in._val[0], nbBits);
99  out._val[1] = _mm256_slli_epi32(in._val[1], nbBits);
100  out._val[2] = _mm256_slli_epi32(in._val[2], nbBits);
101  out._val[3] = _mm256_slli_epi32(in._val[3], nbBits);
102  return out;
103  }
104 
105  static IPSDK_FORCEINLINE
106  void
108  ipUInt8 nbBits,
110  {
111  out._val[0] = _mm256_slli_epi32(in._val[0], nbBits);
112  out._val[1] = _mm256_slli_epi32(in._val[1], nbBits);
113  out._val[2] = _mm256_slli_epi32(in._val[2], nbBits);
114  out._val[3] = _mm256_slli_epi32(in._val[3], nbBits);
115  }
116 };
117 
120 template <>
122 {
123  static IPSDK_FORCEINLINE
126  ipUInt8 nbBits)
127  {
129  out._val[0] = _mm256_slli_epi32(in._val[0], nbBits);
130  out._val[1] = _mm256_slli_epi32(in._val[1], nbBits);
131  out._val[2] = _mm256_slli_epi32(in._val[2], nbBits);
132  out._val[3] = _mm256_slli_epi32(in._val[3], nbBits);
133  return out;
134  }
135 
136  static IPSDK_FORCEINLINE
137  void
139  ipUInt8 nbBits,
141  {
142  out._val[0] = _mm256_slli_epi32(in._val[0], nbBits);
143  out._val[1] = _mm256_slli_epi32(in._val[1], nbBits);
144  out._val[2] = _mm256_slli_epi32(in._val[2], nbBits);
145  out._val[3] = _mm256_slli_epi32(in._val[3], nbBits);
146  }
147 };
148 
152 template <>
154 {
155  static IPSDK_FORCEINLINE
158  ipUInt8 nbBits)
159  {
160  return cast<eInstructionSet::eIS_Avx2, ipUInt8>(
162  cast<eInstructionSet::eIS_Avx2, ipUInt16>(in), nbBits));
163  }
164 
165  static IPSDK_FORCEINLINE
166  void
168  ipUInt8 nbBits,
170  {
172  cast<eInstructionSet::eIS_Avx2>(in, packUInt16);
173  ShiftLeftPack<eInstructionSet::eIS_Avx2, ipUInt16>::act(packUInt16, nbBits, packUInt16);
174  cast<eInstructionSet::eIS_Avx2>(packUInt16, out);
175  }
176 };
177 
181 template <>
183 {
184  static IPSDK_FORCEINLINE
187  ipUInt8 nbBits)
188  {
189  return cast<eInstructionSet::eIS_Avx2, ipInt8>(
191  cast<eInstructionSet::eIS_Avx2, ipInt16>(in), nbBits));
192  }
193 
194  static IPSDK_FORCEINLINE
195  void
197  ipUInt8 nbBits,
199  {
201  cast<eInstructionSet::eIS_Avx2>(in, packInt16);
202  ShiftLeftPack<eInstructionSet::eIS_Avx2, ipInt16>::act(packInt16, nbBits, packInt16);
203  cast<eInstructionSet::eIS_Avx2>(packInt16, out);
204  }
205 };
206 
209 
210 } // end of namespace detail
211 } // end of namespace simd
212 } // end of namespace ipsdk
213 
214 #endif // __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_AVX2_SHIFTLEFTPACK_H__
int8_t ipInt8
Base types definition.
Definition: BaseTypes.h:48
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>
int32_t ipInt32
Base types definition.
Definition: BaseTypes.h:52
int16_t ipInt16
Base types definition.
Definition: BaseTypes.h:50
uint8_t ipUInt8
Base types definition.
Definition: BaseTypes.h:49
eInstructionSet
Enumerate for processor instruction set description.
Definition: InstructionSetTypes.h:31
function assigning a given value of type T to a given Pack<instructionSet, T>
Advanced Vector Extensions 2.
Definition: InstructionSetTypes.h:48
Definition of import/export macro for library.
Definition: ShiftLeftPack.h:30
uint16_t ipUInt16
Base types definition.
Definition: BaseTypes.h:51
uint32_t ipUInt32
Base types definition.
Definition: BaseTypes.h:53
structure containing intrinsic registers used to store vectorized data
Definition: BasePackDecl.h:29