IPSDK  4_1_0_2
IPSDK : Image Processing Software Development Kit
ToBoolPack.h
Go to the documentation of this file.
1 // ToBoolPack.h:
3 // -------------------
4 //
14 
15 #ifndef __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_SSE2_TOBOOLPACK_H__
16 #define __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_SSE2_TOBOOLPACK_H__
17 
25 
26 namespace ipsdk {
27 namespace simd {
28 namespace detail {
29 
32 
36 template <>
38 {
39  static IPSDK_FORCEINLINE
42  {
43  BasePack<ePackType::ePT_Sse, ipUInt8> zero, one, regFromInNez;
45  assign<eInstructionSet::eIS_Sse2>(zero, 0);
46  assign<eInstructionSet::eIS_Sse2>(one, 1);
47  isNotEqual<eInstructionSet::eIS_Sse2>(in, zero, inNez);
48  cast<eInstructionSet::eIS_Sse2>(inNez, regFromInNez);
50  bitwiseAnd<eInstructionSet::eIS_Sse2>(
51  regFromInNez,
52  one,
53  out);
54  return out;
55  }
56 
57  static IPSDK_FORCEINLINE
58  void
61  {
62  BasePack<ePackType::ePT_Sse, ipUInt8> zero, one, regFromInNez;
64  assign<eInstructionSet::eIS_Sse2>(zero, 0);
65  assign<eInstructionSet::eIS_Sse2>(one, 1);
66  isNotEqual<eInstructionSet::eIS_Sse2>(in, zero, inNez);
67  cast<eInstructionSet::eIS_Sse2>(inNez, regFromInNez);
68  bitwiseAnd<eInstructionSet::eIS_Sse2>(regFromInNez, one, out);
69  }
70 
71  static IPSDK_FORCEINLINE
72  void
75  {
77  assign<eInstructionSet::eIS_Sse2>(one, 1);
78  cast<eInstructionSet::eIS_Sse2>(in, regFromIn);
79  bitwiseAnd<eInstructionSet::eIS_Sse2>(regFromIn, one, out);
80  }
81 };
82 
86 template <>
88 {
89  static IPSDK_FORCEINLINE
92  {
94  assign<eInstructionSet::eIS_Sse2>(zero, 0);
95  assign<eInstructionSet::eIS_Sse2>(one, 1);
96 
98  isNotEqual<eInstructionSet::eIS_Sse2>(in, zero, nez);
99  cast<eInstructionSet::eIS_Sse2>(nez, out);
100  bitwiseAnd<eInstructionSet::eIS_Sse2>(out, one, out);
101  return cast<eInstructionSet::eIS_Sse2, ipUInt8>(out);
102  }
103 
104  static IPSDK_FORCEINLINE
105  void
108  {
109  BasePack<ePackType::ePT_Sse, ipInt8> zero, one, packFromNez;
110  assign<eInstructionSet::eIS_Sse2>(zero, 0);
111  assign<eInstructionSet::eIS_Sse2>(one, 1);
113  isNotEqual<eInstructionSet::eIS_Sse2>(in, zero, nez);
114  cast<eInstructionSet::eIS_Sse2>(nez, packFromNez);
115  bitwiseAnd<eInstructionSet::eIS_Sse2>(packFromNez, one, packFromNez);
116 
117  cast<eInstructionSet::eIS_Sse2>(packFromNez, out);
118  }
119 
120  static IPSDK_FORCEINLINE
121  void
124  {
125  BasePack<ePackType::ePT_Sse, ipInt8> one, packFromIn;
126  assign<eInstructionSet::eIS_Sse2>(one, 1);
127  cast<eInstructionSet::eIS_Sse2>(in, packFromIn);
128  bitwiseAnd<eInstructionSet::eIS_Sse2>(packFromIn, one, packFromIn);
129 
130  cast<eInstructionSet::eIS_Sse2>(packFromIn, out);
131  }
132 };
133 
136 template <typename T>
138  typename boost::enable_if_c<
139  boost::is_integral<T>::value && sizeof(T) != 1>::type>
140 {
141  static IPSDK_FORCEINLINE
143  act(const BasePack<ePackType::ePT_Sse, T>& in)
144  {
146  assign<eInstructionSet::eIS_Sse2>(zero, 0);
147  assign<eInstructionSet::eIS_Sse2>(one, 1);
148 
151  isNotEqual<eInstructionSet::eIS_Sse2>(in, zero, nez);
152  cast<eInstructionSet::eIS_Sse2>(nez, packT);
153  bitwiseAnd<eInstructionSet::eIS_Sse2>(packT, one, packT);
154  return cast<eInstructionSet::eIS_Sse2, ipUInt8>(packT);
155  }
156 
157  static IPSDK_FORCEINLINE
158  void
159  act(const BasePack<ePackType::ePT_Sse, T>& in,
161  {
163  assign<eInstructionSet::eIS_Sse2>(zero, 0);
164  assign<eInstructionSet::eIS_Sse2>(one, 1);
167  isNotEqual<eInstructionSet::eIS_Sse2>(in, zero, nez);
168  cast<eInstructionSet::eIS_Sse2>(nez, packT);
169  bitwiseAnd<eInstructionSet::eIS_Sse2>(packT, one, packT);
170 
171  cast<eInstructionSet::eIS_Sse2>(packT, out);
172  }
173 
174  static IPSDK_FORCEINLINE
175  void
178  {
180  assign<eInstructionSet::eIS_Sse2>(one, 1);
182  cast<eInstructionSet::eIS_Sse2>(in, packT);
183  bitwiseAnd<eInstructionSet::eIS_Sse2>(packT, one, packT);
184 
185  cast<eInstructionSet::eIS_Sse2>(packT, out);
186  }
187 };
188 
192 template <>
194 {
195  static IPSDK_FORCEINLINE
198  {
200  inCvt._val[0] = _mm_castps_si128(in._val[0]);
201  inCvt._val[1] = _mm_castps_si128(in._val[1]);
202  inCvt._val[2] = _mm_castps_si128(in._val[2]);
203  inCvt._val[3] = _mm_castps_si128(in._val[3]);
204 
206  }
207 
208  static IPSDK_FORCEINLINE
209  void
212  {
214  inCvt._val[0] = _mm_castps_si128(in._val[0]);
215  inCvt._val[1] = _mm_castps_si128(in._val[1]);
216  inCvt._val[2] = _mm_castps_si128(in._val[2]);
217  inCvt._val[3] = _mm_castps_si128(in._val[3]);
218 
220  }
221 
222  static IPSDK_FORCEINLINE
223  void
226  {
228  inCvt._val[0] = _mm_castps_si128(in._val[0]);
229  inCvt._val[1] = _mm_castps_si128(in._val[1]);
230  inCvt._val[2] = _mm_castps_si128(in._val[2]);
231  inCvt._val[3] = _mm_castps_si128(in._val[3]);
232 
234  }
235 };
236 
239 
240 } // end of namespace detail
241 } // end of namespace simd
242 } // end of namespace ipsdk
243 
244 #endif // __IPSDKUTIL_INSTRUCTIONSET_LOGICAL_DETAIL_SSE2_TOBOOLPACK_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>
structure containing set of masks for vectorized operations
Definition: BaseMaskPackDecl.h:29
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>
Definition: ToBoolPack.h:30
Definition of import/export macro for library.
Streaming SIMD Extensions 2.
Definition: InstructionSetTypes.h:36
float ipReal32
Base types definition.
Definition: BaseTypes.h:56
structure containing intrinsic registers used to store vectorized data
Definition: BasePackDecl.h:29