annotate clang/lib/Headers/smmintrin.h @ 176:de4ac79aef9d

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 17:13:11 +0900
parents 1d019706d866
children c4bab56944e8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 /*===---- smmintrin.h - SSE4 intrinsics ------------------------------------===
anatofuz
parents:
diff changeset
2 *
anatofuz
parents:
diff changeset
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 * See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 *
anatofuz
parents:
diff changeset
7 *===-----------------------------------------------------------------------===
anatofuz
parents:
diff changeset
8 */
anatofuz
parents:
diff changeset
9
anatofuz
parents:
diff changeset
10 #ifndef __SMMINTRIN_H
anatofuz
parents:
diff changeset
11 #define __SMMINTRIN_H
anatofuz
parents:
diff changeset
12
anatofuz
parents:
diff changeset
13 #include <tmmintrin.h>
anatofuz
parents:
diff changeset
14
anatofuz
parents:
diff changeset
15 /* Define the default attributes for the functions in this file. */
anatofuz
parents:
diff changeset
16 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse4.1"), __min_vector_width__(128)))
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 /* SSE4 Rounding macros. */
anatofuz
parents:
diff changeset
19 #define _MM_FROUND_TO_NEAREST_INT 0x00
anatofuz
parents:
diff changeset
20 #define _MM_FROUND_TO_NEG_INF 0x01
anatofuz
parents:
diff changeset
21 #define _MM_FROUND_TO_POS_INF 0x02
anatofuz
parents:
diff changeset
22 #define _MM_FROUND_TO_ZERO 0x03
anatofuz
parents:
diff changeset
23 #define _MM_FROUND_CUR_DIRECTION 0x04
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 #define _MM_FROUND_RAISE_EXC 0x00
anatofuz
parents:
diff changeset
26 #define _MM_FROUND_NO_EXC 0x08
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 #define _MM_FROUND_NINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEAREST_INT)
anatofuz
parents:
diff changeset
29 #define _MM_FROUND_FLOOR (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_NEG_INF)
anatofuz
parents:
diff changeset
30 #define _MM_FROUND_CEIL (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_POS_INF)
anatofuz
parents:
diff changeset
31 #define _MM_FROUND_TRUNC (_MM_FROUND_RAISE_EXC | _MM_FROUND_TO_ZERO)
anatofuz
parents:
diff changeset
32 #define _MM_FROUND_RINT (_MM_FROUND_RAISE_EXC | _MM_FROUND_CUR_DIRECTION)
anatofuz
parents:
diff changeset
33 #define _MM_FROUND_NEARBYINT (_MM_FROUND_NO_EXC | _MM_FROUND_CUR_DIRECTION)
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 /// Rounds up each element of the 128-bit vector of [4 x float] to an
anatofuz
parents:
diff changeset
36 /// integer and returns the rounded values in a 128-bit vector of
anatofuz
parents:
diff changeset
37 /// [4 x float].
anatofuz
parents:
diff changeset
38 ///
anatofuz
parents:
diff changeset
39 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
40 ///
anatofuz
parents:
diff changeset
41 /// \code
anatofuz
parents:
diff changeset
42 /// __m128 _mm_ceil_ps(__m128 X);
anatofuz
parents:
diff changeset
43 /// \endcode
anatofuz
parents:
diff changeset
44 ///
anatofuz
parents:
diff changeset
45 /// This intrinsic corresponds to the <c> VROUNDPS / ROUNDPS </c> instruction.
anatofuz
parents:
diff changeset
46 ///
anatofuz
parents:
diff changeset
47 /// \param X
anatofuz
parents:
diff changeset
48 /// A 128-bit vector of [4 x float] values to be rounded up.
anatofuz
parents:
diff changeset
49 /// \returns A 128-bit vector of [4 x float] containing the rounded values.
anatofuz
parents:
diff changeset
50 #define _mm_ceil_ps(X) _mm_round_ps((X), _MM_FROUND_CEIL)
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 /// Rounds up each element of the 128-bit vector of [2 x double] to an
anatofuz
parents:
diff changeset
53 /// integer and returns the rounded values in a 128-bit vector of
anatofuz
parents:
diff changeset
54 /// [2 x double].
anatofuz
parents:
diff changeset
55 ///
anatofuz
parents:
diff changeset
56 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
57 ///
anatofuz
parents:
diff changeset
58 /// \code
anatofuz
parents:
diff changeset
59 /// __m128d _mm_ceil_pd(__m128d X);
anatofuz
parents:
diff changeset
60 /// \endcode
anatofuz
parents:
diff changeset
61 ///
anatofuz
parents:
diff changeset
62 /// This intrinsic corresponds to the <c> VROUNDPD / ROUNDPD </c> instruction.
anatofuz
parents:
diff changeset
63 ///
anatofuz
parents:
diff changeset
64 /// \param X
anatofuz
parents:
diff changeset
65 /// A 128-bit vector of [2 x double] values to be rounded up.
anatofuz
parents:
diff changeset
66 /// \returns A 128-bit vector of [2 x double] containing the rounded values.
anatofuz
parents:
diff changeset
67 #define _mm_ceil_pd(X) _mm_round_pd((X), _MM_FROUND_CEIL)
anatofuz
parents:
diff changeset
68
anatofuz
parents:
diff changeset
69 /// Copies three upper elements of the first 128-bit vector operand to
anatofuz
parents:
diff changeset
70 /// the corresponding three upper elements of the 128-bit result vector of
anatofuz
parents:
diff changeset
71 /// [4 x float]. Rounds up the lowest element of the second 128-bit vector
anatofuz
parents:
diff changeset
72 /// operand to an integer and copies it to the lowest element of the 128-bit
anatofuz
parents:
diff changeset
73 /// result vector of [4 x float].
anatofuz
parents:
diff changeset
74 ///
anatofuz
parents:
diff changeset
75 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
76 ///
anatofuz
parents:
diff changeset
77 /// \code
anatofuz
parents:
diff changeset
78 /// __m128 _mm_ceil_ss(__m128 X, __m128 Y);
anatofuz
parents:
diff changeset
79 /// \endcode
anatofuz
parents:
diff changeset
80 ///
anatofuz
parents:
diff changeset
81 /// This intrinsic corresponds to the <c> VROUNDSS / ROUNDSS </c> instruction.
anatofuz
parents:
diff changeset
82 ///
anatofuz
parents:
diff changeset
83 /// \param X
anatofuz
parents:
diff changeset
84 /// A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
anatofuz
parents:
diff changeset
85 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
86 /// \param Y
anatofuz
parents:
diff changeset
87 /// A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
anatofuz
parents:
diff changeset
88 /// rounded up to the nearest integer and copied to the corresponding bits
anatofuz
parents:
diff changeset
89 /// of the result.
anatofuz
parents:
diff changeset
90 /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
anatofuz
parents:
diff changeset
91 /// values.
anatofuz
parents:
diff changeset
92 #define _mm_ceil_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_CEIL)
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 /// Copies the upper element of the first 128-bit vector operand to the
anatofuz
parents:
diff changeset
95 /// corresponding upper element of the 128-bit result vector of [2 x double].
anatofuz
parents:
diff changeset
96 /// Rounds up the lower element of the second 128-bit vector operand to an
anatofuz
parents:
diff changeset
97 /// integer and copies it to the lower element of the 128-bit result vector
anatofuz
parents:
diff changeset
98 /// of [2 x double].
anatofuz
parents:
diff changeset
99 ///
anatofuz
parents:
diff changeset
100 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
101 ///
anatofuz
parents:
diff changeset
102 /// \code
anatofuz
parents:
diff changeset
103 /// __m128d _mm_ceil_sd(__m128d X, __m128d Y);
anatofuz
parents:
diff changeset
104 /// \endcode
anatofuz
parents:
diff changeset
105 ///
anatofuz
parents:
diff changeset
106 /// This intrinsic corresponds to the <c> VROUNDSD / ROUNDSD </c> instruction.
anatofuz
parents:
diff changeset
107 ///
anatofuz
parents:
diff changeset
108 /// \param X
anatofuz
parents:
diff changeset
109 /// A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
anatofuz
parents:
diff changeset
110 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
111 /// \param Y
anatofuz
parents:
diff changeset
112 /// A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
anatofuz
parents:
diff changeset
113 /// rounded up to the nearest integer and copied to the corresponding bits
anatofuz
parents:
diff changeset
114 /// of the result.
anatofuz
parents:
diff changeset
115 /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
anatofuz
parents:
diff changeset
116 /// values.
anatofuz
parents:
diff changeset
117 #define _mm_ceil_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_CEIL)
anatofuz
parents:
diff changeset
118
anatofuz
parents:
diff changeset
119 /// Rounds down each element of the 128-bit vector of [4 x float] to an
anatofuz
parents:
diff changeset
120 /// an integer and returns the rounded values in a 128-bit vector of
anatofuz
parents:
diff changeset
121 /// [4 x float].
anatofuz
parents:
diff changeset
122 ///
anatofuz
parents:
diff changeset
123 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
124 ///
anatofuz
parents:
diff changeset
125 /// \code
anatofuz
parents:
diff changeset
126 /// __m128 _mm_floor_ps(__m128 X);
anatofuz
parents:
diff changeset
127 /// \endcode
anatofuz
parents:
diff changeset
128 ///
anatofuz
parents:
diff changeset
129 /// This intrinsic corresponds to the <c> VROUNDPS / ROUNDPS </c> instruction.
anatofuz
parents:
diff changeset
130 ///
anatofuz
parents:
diff changeset
131 /// \param X
anatofuz
parents:
diff changeset
132 /// A 128-bit vector of [4 x float] values to be rounded down.
anatofuz
parents:
diff changeset
133 /// \returns A 128-bit vector of [4 x float] containing the rounded values.
anatofuz
parents:
diff changeset
134 #define _mm_floor_ps(X) _mm_round_ps((X), _MM_FROUND_FLOOR)
anatofuz
parents:
diff changeset
135
anatofuz
parents:
diff changeset
136 /// Rounds down each element of the 128-bit vector of [2 x double] to an
anatofuz
parents:
diff changeset
137 /// integer and returns the rounded values in a 128-bit vector of
anatofuz
parents:
diff changeset
138 /// [2 x double].
anatofuz
parents:
diff changeset
139 ///
anatofuz
parents:
diff changeset
140 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
141 ///
anatofuz
parents:
diff changeset
142 /// \code
anatofuz
parents:
diff changeset
143 /// __m128d _mm_floor_pd(__m128d X);
anatofuz
parents:
diff changeset
144 /// \endcode
anatofuz
parents:
diff changeset
145 ///
anatofuz
parents:
diff changeset
146 /// This intrinsic corresponds to the <c> VROUNDPD / ROUNDPD </c> instruction.
anatofuz
parents:
diff changeset
147 ///
anatofuz
parents:
diff changeset
148 /// \param X
anatofuz
parents:
diff changeset
149 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
150 /// \returns A 128-bit vector of [2 x double] containing the rounded values.
anatofuz
parents:
diff changeset
151 #define _mm_floor_pd(X) _mm_round_pd((X), _MM_FROUND_FLOOR)
anatofuz
parents:
diff changeset
152
anatofuz
parents:
diff changeset
153 /// Copies three upper elements of the first 128-bit vector operand to
anatofuz
parents:
diff changeset
154 /// the corresponding three upper elements of the 128-bit result vector of
anatofuz
parents:
diff changeset
155 /// [4 x float]. Rounds down the lowest element of the second 128-bit vector
anatofuz
parents:
diff changeset
156 /// operand to an integer and copies it to the lowest element of the 128-bit
anatofuz
parents:
diff changeset
157 /// result vector of [4 x float].
anatofuz
parents:
diff changeset
158 ///
anatofuz
parents:
diff changeset
159 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
160 ///
anatofuz
parents:
diff changeset
161 /// \code
anatofuz
parents:
diff changeset
162 /// __m128 _mm_floor_ss(__m128 X, __m128 Y);
anatofuz
parents:
diff changeset
163 /// \endcode
anatofuz
parents:
diff changeset
164 ///
anatofuz
parents:
diff changeset
165 /// This intrinsic corresponds to the <c> VROUNDSS / ROUNDSS </c> instruction.
anatofuz
parents:
diff changeset
166 ///
anatofuz
parents:
diff changeset
167 /// \param X
anatofuz
parents:
diff changeset
168 /// A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
anatofuz
parents:
diff changeset
169 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
170 /// \param Y
anatofuz
parents:
diff changeset
171 /// A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
anatofuz
parents:
diff changeset
172 /// rounded down to the nearest integer and copied to the corresponding bits
anatofuz
parents:
diff changeset
173 /// of the result.
anatofuz
parents:
diff changeset
174 /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
anatofuz
parents:
diff changeset
175 /// values.
anatofuz
parents:
diff changeset
176 #define _mm_floor_ss(X, Y) _mm_round_ss((X), (Y), _MM_FROUND_FLOOR)
anatofuz
parents:
diff changeset
177
anatofuz
parents:
diff changeset
178 /// Copies the upper element of the first 128-bit vector operand to the
anatofuz
parents:
diff changeset
179 /// corresponding upper element of the 128-bit result vector of [2 x double].
anatofuz
parents:
diff changeset
180 /// Rounds down the lower element of the second 128-bit vector operand to an
anatofuz
parents:
diff changeset
181 /// integer and copies it to the lower element of the 128-bit result vector
anatofuz
parents:
diff changeset
182 /// of [2 x double].
anatofuz
parents:
diff changeset
183 ///
anatofuz
parents:
diff changeset
184 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
185 ///
anatofuz
parents:
diff changeset
186 /// \code
anatofuz
parents:
diff changeset
187 /// __m128d _mm_floor_sd(__m128d X, __m128d Y);
anatofuz
parents:
diff changeset
188 /// \endcode
anatofuz
parents:
diff changeset
189 ///
anatofuz
parents:
diff changeset
190 /// This intrinsic corresponds to the <c> VROUNDSD / ROUNDSD </c> instruction.
anatofuz
parents:
diff changeset
191 ///
anatofuz
parents:
diff changeset
192 /// \param X
anatofuz
parents:
diff changeset
193 /// A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
anatofuz
parents:
diff changeset
194 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
195 /// \param Y
anatofuz
parents:
diff changeset
196 /// A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
anatofuz
parents:
diff changeset
197 /// rounded down to the nearest integer and copied to the corresponding bits
anatofuz
parents:
diff changeset
198 /// of the result.
anatofuz
parents:
diff changeset
199 /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
anatofuz
parents:
diff changeset
200 /// values.
anatofuz
parents:
diff changeset
201 #define _mm_floor_sd(X, Y) _mm_round_sd((X), (Y), _MM_FROUND_FLOOR)
anatofuz
parents:
diff changeset
202
anatofuz
parents:
diff changeset
203 /// Rounds each element of the 128-bit vector of [4 x float] to an
anatofuz
parents:
diff changeset
204 /// integer value according to the rounding control specified by the second
anatofuz
parents:
diff changeset
205 /// argument and returns the rounded values in a 128-bit vector of
anatofuz
parents:
diff changeset
206 /// [4 x float].
anatofuz
parents:
diff changeset
207 ///
anatofuz
parents:
diff changeset
208 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
209 ///
anatofuz
parents:
diff changeset
210 /// \code
anatofuz
parents:
diff changeset
211 /// __m128 _mm_round_ps(__m128 X, const int M);
anatofuz
parents:
diff changeset
212 /// \endcode
anatofuz
parents:
diff changeset
213 ///
anatofuz
parents:
diff changeset
214 /// This intrinsic corresponds to the <c> VROUNDPS / ROUNDPS </c> instruction.
anatofuz
parents:
diff changeset
215 ///
anatofuz
parents:
diff changeset
216 /// \param X
anatofuz
parents:
diff changeset
217 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
218 /// \param M
anatofuz
parents:
diff changeset
219 /// An integer value that specifies the rounding operation. \n
anatofuz
parents:
diff changeset
220 /// Bits [7:4] are reserved. \n
anatofuz
parents:
diff changeset
221 /// Bit [3] is a precision exception value: \n
anatofuz
parents:
diff changeset
222 /// 0: A normal PE exception is used \n
anatofuz
parents:
diff changeset
223 /// 1: The PE field is not updated \n
anatofuz
parents:
diff changeset
224 /// Bit [2] is the rounding control source: \n
anatofuz
parents:
diff changeset
225 /// 0: Use bits [1:0] of \a M \n
anatofuz
parents:
diff changeset
226 /// 1: Use the current MXCSR setting \n
anatofuz
parents:
diff changeset
227 /// Bits [1:0] contain the rounding control definition: \n
anatofuz
parents:
diff changeset
228 /// 00: Nearest \n
anatofuz
parents:
diff changeset
229 /// 01: Downward (toward negative infinity) \n
anatofuz
parents:
diff changeset
230 /// 10: Upward (toward positive infinity) \n
anatofuz
parents:
diff changeset
231 /// 11: Truncated
anatofuz
parents:
diff changeset
232 /// \returns A 128-bit vector of [4 x float] containing the rounded values.
anatofuz
parents:
diff changeset
233 #define _mm_round_ps(X, M) \
anatofuz
parents:
diff changeset
234 (__m128)__builtin_ia32_roundps((__v4sf)(__m128)(X), (M))
anatofuz
parents:
diff changeset
235
anatofuz
parents:
diff changeset
236 /// Copies three upper elements of the first 128-bit vector operand to
anatofuz
parents:
diff changeset
237 /// the corresponding three upper elements of the 128-bit result vector of
anatofuz
parents:
diff changeset
238 /// [4 x float]. Rounds the lowest element of the second 128-bit vector
anatofuz
parents:
diff changeset
239 /// operand to an integer value according to the rounding control specified
anatofuz
parents:
diff changeset
240 /// by the third argument and copies it to the lowest element of the 128-bit
anatofuz
parents:
diff changeset
241 /// result vector of [4 x float].
anatofuz
parents:
diff changeset
242 ///
anatofuz
parents:
diff changeset
243 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
244 ///
anatofuz
parents:
diff changeset
245 /// \code
anatofuz
parents:
diff changeset
246 /// __m128 _mm_round_ss(__m128 X, __m128 Y, const int M);
anatofuz
parents:
diff changeset
247 /// \endcode
anatofuz
parents:
diff changeset
248 ///
anatofuz
parents:
diff changeset
249 /// This intrinsic corresponds to the <c> VROUNDSS / ROUNDSS </c> instruction.
anatofuz
parents:
diff changeset
250 ///
anatofuz
parents:
diff changeset
251 /// \param X
anatofuz
parents:
diff changeset
252 /// A 128-bit vector of [4 x float]. The values stored in bits [127:32] are
anatofuz
parents:
diff changeset
253 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
254 /// \param Y
anatofuz
parents:
diff changeset
255 /// A 128-bit vector of [4 x float]. The value stored in bits [31:0] is
anatofuz
parents:
diff changeset
256 /// rounded to the nearest integer using the specified rounding control and
anatofuz
parents:
diff changeset
257 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
258 /// \param M
anatofuz
parents:
diff changeset
259 /// An integer value that specifies the rounding operation. \n
anatofuz
parents:
diff changeset
260 /// Bits [7:4] are reserved. \n
anatofuz
parents:
diff changeset
261 /// Bit [3] is a precision exception value: \n
anatofuz
parents:
diff changeset
262 /// 0: A normal PE exception is used \n
anatofuz
parents:
diff changeset
263 /// 1: The PE field is not updated \n
anatofuz
parents:
diff changeset
264 /// Bit [2] is the rounding control source: \n
anatofuz
parents:
diff changeset
265 /// 0: Use bits [1:0] of \a M \n
anatofuz
parents:
diff changeset
266 /// 1: Use the current MXCSR setting \n
anatofuz
parents:
diff changeset
267 /// Bits [1:0] contain the rounding control definition: \n
anatofuz
parents:
diff changeset
268 /// 00: Nearest \n
anatofuz
parents:
diff changeset
269 /// 01: Downward (toward negative infinity) \n
anatofuz
parents:
diff changeset
270 /// 10: Upward (toward positive infinity) \n
anatofuz
parents:
diff changeset
271 /// 11: Truncated
anatofuz
parents:
diff changeset
272 /// \returns A 128-bit vector of [4 x float] containing the copied and rounded
anatofuz
parents:
diff changeset
273 /// values.
anatofuz
parents:
diff changeset
274 #define _mm_round_ss(X, Y, M) \
anatofuz
parents:
diff changeset
275 (__m128)__builtin_ia32_roundss((__v4sf)(__m128)(X), \
anatofuz
parents:
diff changeset
276 (__v4sf)(__m128)(Y), (M))
anatofuz
parents:
diff changeset
277
anatofuz
parents:
diff changeset
278 /// Rounds each element of the 128-bit vector of [2 x double] to an
anatofuz
parents:
diff changeset
279 /// integer value according to the rounding control specified by the second
anatofuz
parents:
diff changeset
280 /// argument and returns the rounded values in a 128-bit vector of
anatofuz
parents:
diff changeset
281 /// [2 x double].
anatofuz
parents:
diff changeset
282 ///
anatofuz
parents:
diff changeset
283 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
284 ///
anatofuz
parents:
diff changeset
285 /// \code
anatofuz
parents:
diff changeset
286 /// __m128d _mm_round_pd(__m128d X, const int M);
anatofuz
parents:
diff changeset
287 /// \endcode
anatofuz
parents:
diff changeset
288 ///
anatofuz
parents:
diff changeset
289 /// This intrinsic corresponds to the <c> VROUNDPD / ROUNDPD </c> instruction.
anatofuz
parents:
diff changeset
290 ///
anatofuz
parents:
diff changeset
291 /// \param X
anatofuz
parents:
diff changeset
292 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
293 /// \param M
anatofuz
parents:
diff changeset
294 /// An integer value that specifies the rounding operation. \n
anatofuz
parents:
diff changeset
295 /// Bits [7:4] are reserved. \n
anatofuz
parents:
diff changeset
296 /// Bit [3] is a precision exception value: \n
anatofuz
parents:
diff changeset
297 /// 0: A normal PE exception is used \n
anatofuz
parents:
diff changeset
298 /// 1: The PE field is not updated \n
anatofuz
parents:
diff changeset
299 /// Bit [2] is the rounding control source: \n
anatofuz
parents:
diff changeset
300 /// 0: Use bits [1:0] of \a M \n
anatofuz
parents:
diff changeset
301 /// 1: Use the current MXCSR setting \n
anatofuz
parents:
diff changeset
302 /// Bits [1:0] contain the rounding control definition: \n
anatofuz
parents:
diff changeset
303 /// 00: Nearest \n
anatofuz
parents:
diff changeset
304 /// 01: Downward (toward negative infinity) \n
anatofuz
parents:
diff changeset
305 /// 10: Upward (toward positive infinity) \n
anatofuz
parents:
diff changeset
306 /// 11: Truncated
anatofuz
parents:
diff changeset
307 /// \returns A 128-bit vector of [2 x double] containing the rounded values.
anatofuz
parents:
diff changeset
308 #define _mm_round_pd(X, M) \
anatofuz
parents:
diff changeset
309 (__m128d)__builtin_ia32_roundpd((__v2df)(__m128d)(X), (M))
anatofuz
parents:
diff changeset
310
anatofuz
parents:
diff changeset
311 /// Copies the upper element of the first 128-bit vector operand to the
anatofuz
parents:
diff changeset
312 /// corresponding upper element of the 128-bit result vector of [2 x double].
anatofuz
parents:
diff changeset
313 /// Rounds the lower element of the second 128-bit vector operand to an
anatofuz
parents:
diff changeset
314 /// integer value according to the rounding control specified by the third
anatofuz
parents:
diff changeset
315 /// argument and copies it to the lower element of the 128-bit result vector
anatofuz
parents:
diff changeset
316 /// of [2 x double].
anatofuz
parents:
diff changeset
317 ///
anatofuz
parents:
diff changeset
318 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
319 ///
anatofuz
parents:
diff changeset
320 /// \code
anatofuz
parents:
diff changeset
321 /// __m128d _mm_round_sd(__m128d X, __m128d Y, const int M);
anatofuz
parents:
diff changeset
322 /// \endcode
anatofuz
parents:
diff changeset
323 ///
anatofuz
parents:
diff changeset
324 /// This intrinsic corresponds to the <c> VROUNDSD / ROUNDSD </c> instruction.
anatofuz
parents:
diff changeset
325 ///
anatofuz
parents:
diff changeset
326 /// \param X
anatofuz
parents:
diff changeset
327 /// A 128-bit vector of [2 x double]. The value stored in bits [127:64] is
anatofuz
parents:
diff changeset
328 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
329 /// \param Y
anatofuz
parents:
diff changeset
330 /// A 128-bit vector of [2 x double]. The value stored in bits [63:0] is
anatofuz
parents:
diff changeset
331 /// rounded to the nearest integer using the specified rounding control and
anatofuz
parents:
diff changeset
332 /// copied to the corresponding bits of the result.
anatofuz
parents:
diff changeset
333 /// \param M
anatofuz
parents:
diff changeset
334 /// An integer value that specifies the rounding operation. \n
anatofuz
parents:
diff changeset
335 /// Bits [7:4] are reserved. \n
anatofuz
parents:
diff changeset
336 /// Bit [3] is a precision exception value: \n
anatofuz
parents:
diff changeset
337 /// 0: A normal PE exception is used \n
anatofuz
parents:
diff changeset
338 /// 1: The PE field is not updated \n
anatofuz
parents:
diff changeset
339 /// Bit [2] is the rounding control source: \n
anatofuz
parents:
diff changeset
340 /// 0: Use bits [1:0] of \a M \n
anatofuz
parents:
diff changeset
341 /// 1: Use the current MXCSR setting \n
anatofuz
parents:
diff changeset
342 /// Bits [1:0] contain the rounding control definition: \n
anatofuz
parents:
diff changeset
343 /// 00: Nearest \n
anatofuz
parents:
diff changeset
344 /// 01: Downward (toward negative infinity) \n
anatofuz
parents:
diff changeset
345 /// 10: Upward (toward positive infinity) \n
anatofuz
parents:
diff changeset
346 /// 11: Truncated
anatofuz
parents:
diff changeset
347 /// \returns A 128-bit vector of [2 x double] containing the copied and rounded
anatofuz
parents:
diff changeset
348 /// values.
anatofuz
parents:
diff changeset
349 #define _mm_round_sd(X, Y, M) \
anatofuz
parents:
diff changeset
350 (__m128d)__builtin_ia32_roundsd((__v2df)(__m128d)(X), \
anatofuz
parents:
diff changeset
351 (__v2df)(__m128d)(Y), (M))
anatofuz
parents:
diff changeset
352
anatofuz
parents:
diff changeset
353 /* SSE4 Packed Blending Intrinsics. */
anatofuz
parents:
diff changeset
354 /// Returns a 128-bit vector of [2 x double] where the values are
anatofuz
parents:
diff changeset
355 /// selected from either the first or second operand as specified by the
anatofuz
parents:
diff changeset
356 /// third operand, the control mask.
anatofuz
parents:
diff changeset
357 ///
anatofuz
parents:
diff changeset
358 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
359 ///
anatofuz
parents:
diff changeset
360 /// \code
anatofuz
parents:
diff changeset
361 /// __m128d _mm_blend_pd(__m128d V1, __m128d V2, const int M);
anatofuz
parents:
diff changeset
362 /// \endcode
anatofuz
parents:
diff changeset
363 ///
anatofuz
parents:
diff changeset
364 /// This intrinsic corresponds to the <c> VBLENDPD / BLENDPD </c> instruction.
anatofuz
parents:
diff changeset
365 ///
anatofuz
parents:
diff changeset
366 /// \param V1
anatofuz
parents:
diff changeset
367 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
368 /// \param V2
anatofuz
parents:
diff changeset
369 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
370 /// \param M
anatofuz
parents:
diff changeset
371 /// An immediate integer operand, with mask bits [1:0] specifying how the
anatofuz
parents:
diff changeset
372 /// values are to be copied. The position of the mask bit corresponds to the
anatofuz
parents:
diff changeset
373 /// index of a copied value. When a mask bit is 0, the corresponding 64-bit
anatofuz
parents:
diff changeset
374 /// element in operand \a V1 is copied to the same position in the result.
anatofuz
parents:
diff changeset
375 /// When a mask bit is 1, the corresponding 64-bit element in operand \a V2
anatofuz
parents:
diff changeset
376 /// is copied to the same position in the result.
anatofuz
parents:
diff changeset
377 /// \returns A 128-bit vector of [2 x double] containing the copied values.
anatofuz
parents:
diff changeset
378 #define _mm_blend_pd(V1, V2, M) \
anatofuz
parents:
diff changeset
379 (__m128d) __builtin_ia32_blendpd ((__v2df)(__m128d)(V1), \
anatofuz
parents:
diff changeset
380 (__v2df)(__m128d)(V2), (int)(M))
anatofuz
parents:
diff changeset
381
anatofuz
parents:
diff changeset
382 /// Returns a 128-bit vector of [4 x float] where the values are selected
anatofuz
parents:
diff changeset
383 /// from either the first or second operand as specified by the third
anatofuz
parents:
diff changeset
384 /// operand, the control mask.
anatofuz
parents:
diff changeset
385 ///
anatofuz
parents:
diff changeset
386 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
387 ///
anatofuz
parents:
diff changeset
388 /// \code
anatofuz
parents:
diff changeset
389 /// __m128 _mm_blend_ps(__m128 V1, __m128 V2, const int M);
anatofuz
parents:
diff changeset
390 /// \endcode
anatofuz
parents:
diff changeset
391 ///
anatofuz
parents:
diff changeset
392 /// This intrinsic corresponds to the <c> VBLENDPS / BLENDPS </c> instruction.
anatofuz
parents:
diff changeset
393 ///
anatofuz
parents:
diff changeset
394 /// \param V1
anatofuz
parents:
diff changeset
395 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
396 /// \param V2
anatofuz
parents:
diff changeset
397 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
398 /// \param M
anatofuz
parents:
diff changeset
399 /// An immediate integer operand, with mask bits [3:0] specifying how the
anatofuz
parents:
diff changeset
400 /// values are to be copied. The position of the mask bit corresponds to the
anatofuz
parents:
diff changeset
401 /// index of a copied value. When a mask bit is 0, the corresponding 32-bit
anatofuz
parents:
diff changeset
402 /// element in operand \a V1 is copied to the same position in the result.
anatofuz
parents:
diff changeset
403 /// When a mask bit is 1, the corresponding 32-bit element in operand \a V2
anatofuz
parents:
diff changeset
404 /// is copied to the same position in the result.
anatofuz
parents:
diff changeset
405 /// \returns A 128-bit vector of [4 x float] containing the copied values.
anatofuz
parents:
diff changeset
406 #define _mm_blend_ps(V1, V2, M) \
anatofuz
parents:
diff changeset
407 (__m128) __builtin_ia32_blendps ((__v4sf)(__m128)(V1), \
anatofuz
parents:
diff changeset
408 (__v4sf)(__m128)(V2), (int)(M))
anatofuz
parents:
diff changeset
409
anatofuz
parents:
diff changeset
410 /// Returns a 128-bit vector of [2 x double] where the values are
anatofuz
parents:
diff changeset
411 /// selected from either the first or second operand as specified by the
anatofuz
parents:
diff changeset
412 /// third operand, the control mask.
anatofuz
parents:
diff changeset
413 ///
anatofuz
parents:
diff changeset
414 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
415 ///
anatofuz
parents:
diff changeset
416 /// This intrinsic corresponds to the <c> VBLENDVPD / BLENDVPD </c> instruction.
anatofuz
parents:
diff changeset
417 ///
anatofuz
parents:
diff changeset
418 /// \param __V1
anatofuz
parents:
diff changeset
419 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
420 /// \param __V2
anatofuz
parents:
diff changeset
421 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
422 /// \param __M
anatofuz
parents:
diff changeset
423 /// A 128-bit vector operand, with mask bits 127 and 63 specifying how the
anatofuz
parents:
diff changeset
424 /// values are to be copied. The position of the mask bit corresponds to the
anatofuz
parents:
diff changeset
425 /// most significant bit of a copied value. When a mask bit is 0, the
anatofuz
parents:
diff changeset
426 /// corresponding 64-bit element in operand \a __V1 is copied to the same
anatofuz
parents:
diff changeset
427 /// position in the result. When a mask bit is 1, the corresponding 64-bit
anatofuz
parents:
diff changeset
428 /// element in operand \a __V2 is copied to the same position in the result.
anatofuz
parents:
diff changeset
429 /// \returns A 128-bit vector of [2 x double] containing the copied values.
anatofuz
parents:
diff changeset
430 static __inline__ __m128d __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
431 _mm_blendv_pd (__m128d __V1, __m128d __V2, __m128d __M)
anatofuz
parents:
diff changeset
432 {
anatofuz
parents:
diff changeset
433 return (__m128d) __builtin_ia32_blendvpd ((__v2df)__V1, (__v2df)__V2,
anatofuz
parents:
diff changeset
434 (__v2df)__M);
anatofuz
parents:
diff changeset
435 }
anatofuz
parents:
diff changeset
436
anatofuz
parents:
diff changeset
437 /// Returns a 128-bit vector of [4 x float] where the values are
anatofuz
parents:
diff changeset
438 /// selected from either the first or second operand as specified by the
anatofuz
parents:
diff changeset
439 /// third operand, the control mask.
anatofuz
parents:
diff changeset
440 ///
anatofuz
parents:
diff changeset
441 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
442 ///
anatofuz
parents:
diff changeset
443 /// This intrinsic corresponds to the <c> VBLENDVPS / BLENDVPS </c> instruction.
anatofuz
parents:
diff changeset
444 ///
anatofuz
parents:
diff changeset
445 /// \param __V1
anatofuz
parents:
diff changeset
446 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
447 /// \param __V2
anatofuz
parents:
diff changeset
448 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
449 /// \param __M
anatofuz
parents:
diff changeset
450 /// A 128-bit vector operand, with mask bits 127, 95, 63, and 31 specifying
anatofuz
parents:
diff changeset
451 /// how the values are to be copied. The position of the mask bit corresponds
anatofuz
parents:
diff changeset
452 /// to the most significant bit of a copied value. When a mask bit is 0, the
anatofuz
parents:
diff changeset
453 /// corresponding 32-bit element in operand \a __V1 is copied to the same
anatofuz
parents:
diff changeset
454 /// position in the result. When a mask bit is 1, the corresponding 32-bit
anatofuz
parents:
diff changeset
455 /// element in operand \a __V2 is copied to the same position in the result.
anatofuz
parents:
diff changeset
456 /// \returns A 128-bit vector of [4 x float] containing the copied values.
anatofuz
parents:
diff changeset
457 static __inline__ __m128 __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
458 _mm_blendv_ps (__m128 __V1, __m128 __V2, __m128 __M)
anatofuz
parents:
diff changeset
459 {
anatofuz
parents:
diff changeset
460 return (__m128) __builtin_ia32_blendvps ((__v4sf)__V1, (__v4sf)__V2,
anatofuz
parents:
diff changeset
461 (__v4sf)__M);
anatofuz
parents:
diff changeset
462 }
anatofuz
parents:
diff changeset
463
anatofuz
parents:
diff changeset
464 /// Returns a 128-bit vector of [16 x i8] where the values are selected
anatofuz
parents:
diff changeset
465 /// from either of the first or second operand as specified by the third
anatofuz
parents:
diff changeset
466 /// operand, the control mask.
anatofuz
parents:
diff changeset
467 ///
anatofuz
parents:
diff changeset
468 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
469 ///
anatofuz
parents:
diff changeset
470 /// This intrinsic corresponds to the <c> VPBLENDVB / PBLENDVB </c> instruction.
anatofuz
parents:
diff changeset
471 ///
anatofuz
parents:
diff changeset
472 /// \param __V1
anatofuz
parents:
diff changeset
473 /// A 128-bit vector of [16 x i8].
anatofuz
parents:
diff changeset
474 /// \param __V2
anatofuz
parents:
diff changeset
475 /// A 128-bit vector of [16 x i8].
anatofuz
parents:
diff changeset
476 /// \param __M
anatofuz
parents:
diff changeset
477 /// A 128-bit vector operand, with mask bits 127, 119, 111...7 specifying
anatofuz
parents:
diff changeset
478 /// how the values are to be copied. The position of the mask bit corresponds
anatofuz
parents:
diff changeset
479 /// to the most significant bit of a copied value. When a mask bit is 0, the
anatofuz
parents:
diff changeset
480 /// corresponding 8-bit element in operand \a __V1 is copied to the same
anatofuz
parents:
diff changeset
481 /// position in the result. When a mask bit is 1, the corresponding 8-bit
anatofuz
parents:
diff changeset
482 /// element in operand \a __V2 is copied to the same position in the result.
anatofuz
parents:
diff changeset
483 /// \returns A 128-bit vector of [16 x i8] containing the copied values.
anatofuz
parents:
diff changeset
484 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
485 _mm_blendv_epi8 (__m128i __V1, __m128i __V2, __m128i __M)
anatofuz
parents:
diff changeset
486 {
anatofuz
parents:
diff changeset
487 return (__m128i) __builtin_ia32_pblendvb128 ((__v16qi)__V1, (__v16qi)__V2,
anatofuz
parents:
diff changeset
488 (__v16qi)__M);
anatofuz
parents:
diff changeset
489 }
anatofuz
parents:
diff changeset
490
anatofuz
parents:
diff changeset
491 /// Returns a 128-bit vector of [8 x i16] where the values are selected
anatofuz
parents:
diff changeset
492 /// from either of the first or second operand as specified by the third
anatofuz
parents:
diff changeset
493 /// operand, the control mask.
anatofuz
parents:
diff changeset
494 ///
anatofuz
parents:
diff changeset
495 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
496 ///
anatofuz
parents:
diff changeset
497 /// \code
anatofuz
parents:
diff changeset
498 /// __m128i _mm_blend_epi16(__m128i V1, __m128i V2, const int M);
anatofuz
parents:
diff changeset
499 /// \endcode
anatofuz
parents:
diff changeset
500 ///
anatofuz
parents:
diff changeset
501 /// This intrinsic corresponds to the <c> VPBLENDW / PBLENDW </c> instruction.
anatofuz
parents:
diff changeset
502 ///
anatofuz
parents:
diff changeset
503 /// \param V1
anatofuz
parents:
diff changeset
504 /// A 128-bit vector of [8 x i16].
anatofuz
parents:
diff changeset
505 /// \param V2
anatofuz
parents:
diff changeset
506 /// A 128-bit vector of [8 x i16].
anatofuz
parents:
diff changeset
507 /// \param M
anatofuz
parents:
diff changeset
508 /// An immediate integer operand, with mask bits [7:0] specifying how the
anatofuz
parents:
diff changeset
509 /// values are to be copied. The position of the mask bit corresponds to the
anatofuz
parents:
diff changeset
510 /// index of a copied value. When a mask bit is 0, the corresponding 16-bit
anatofuz
parents:
diff changeset
511 /// element in operand \a V1 is copied to the same position in the result.
anatofuz
parents:
diff changeset
512 /// When a mask bit is 1, the corresponding 16-bit element in operand \a V2
anatofuz
parents:
diff changeset
513 /// is copied to the same position in the result.
anatofuz
parents:
diff changeset
514 /// \returns A 128-bit vector of [8 x i16] containing the copied values.
anatofuz
parents:
diff changeset
515 #define _mm_blend_epi16(V1, V2, M) \
anatofuz
parents:
diff changeset
516 (__m128i) __builtin_ia32_pblendw128 ((__v8hi)(__m128i)(V1), \
anatofuz
parents:
diff changeset
517 (__v8hi)(__m128i)(V2), (int)(M))
anatofuz
parents:
diff changeset
518
anatofuz
parents:
diff changeset
519 /* SSE4 Dword Multiply Instructions. */
anatofuz
parents:
diff changeset
520 /// Multiples corresponding elements of two 128-bit vectors of [4 x i32]
anatofuz
parents:
diff changeset
521 /// and returns the lower 32 bits of the each product in a 128-bit vector of
anatofuz
parents:
diff changeset
522 /// [4 x i32].
anatofuz
parents:
diff changeset
523 ///
anatofuz
parents:
diff changeset
524 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
525 ///
anatofuz
parents:
diff changeset
526 /// This intrinsic corresponds to the <c> VPMULLD / PMULLD </c> instruction.
anatofuz
parents:
diff changeset
527 ///
anatofuz
parents:
diff changeset
528 /// \param __V1
anatofuz
parents:
diff changeset
529 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
530 /// \param __V2
anatofuz
parents:
diff changeset
531 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
532 /// \returns A 128-bit integer vector containing the products of both operands.
anatofuz
parents:
diff changeset
533 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
534 _mm_mullo_epi32 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
535 {
anatofuz
parents:
diff changeset
536 return (__m128i) ((__v4su)__V1 * (__v4su)__V2);
anatofuz
parents:
diff changeset
537 }
anatofuz
parents:
diff changeset
538
anatofuz
parents:
diff changeset
539 /// Multiplies corresponding even-indexed elements of two 128-bit
anatofuz
parents:
diff changeset
540 /// vectors of [4 x i32] and returns a 128-bit vector of [2 x i64]
anatofuz
parents:
diff changeset
541 /// containing the products.
anatofuz
parents:
diff changeset
542 ///
anatofuz
parents:
diff changeset
543 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
544 ///
anatofuz
parents:
diff changeset
545 /// This intrinsic corresponds to the <c> VPMULDQ / PMULDQ </c> instruction.
anatofuz
parents:
diff changeset
546 ///
anatofuz
parents:
diff changeset
547 /// \param __V1
anatofuz
parents:
diff changeset
548 /// A 128-bit vector of [4 x i32].
anatofuz
parents:
diff changeset
549 /// \param __V2
anatofuz
parents:
diff changeset
550 /// A 128-bit vector of [4 x i32].
anatofuz
parents:
diff changeset
551 /// \returns A 128-bit vector of [2 x i64] containing the products of both
anatofuz
parents:
diff changeset
552 /// operands.
anatofuz
parents:
diff changeset
553 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
554 _mm_mul_epi32 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
555 {
anatofuz
parents:
diff changeset
556 return (__m128i) __builtin_ia32_pmuldq128 ((__v4si)__V1, (__v4si)__V2);
anatofuz
parents:
diff changeset
557 }
anatofuz
parents:
diff changeset
558
anatofuz
parents:
diff changeset
559 /* SSE4 Floating Point Dot Product Instructions. */
anatofuz
parents:
diff changeset
560 /// Computes the dot product of the two 128-bit vectors of [4 x float]
anatofuz
parents:
diff changeset
561 /// and returns it in the elements of the 128-bit result vector of
anatofuz
parents:
diff changeset
562 /// [4 x float].
anatofuz
parents:
diff changeset
563 ///
anatofuz
parents:
diff changeset
564 /// The immediate integer operand controls which input elements
anatofuz
parents:
diff changeset
565 /// will contribute to the dot product, and where the final results are
anatofuz
parents:
diff changeset
566 /// returned.
anatofuz
parents:
diff changeset
567 ///
anatofuz
parents:
diff changeset
568 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
569 ///
anatofuz
parents:
diff changeset
570 /// \code
anatofuz
parents:
diff changeset
571 /// __m128 _mm_dp_ps(__m128 X, __m128 Y, const int M);
anatofuz
parents:
diff changeset
572 /// \endcode
anatofuz
parents:
diff changeset
573 ///
anatofuz
parents:
diff changeset
574 /// This intrinsic corresponds to the <c> VDPPS / DPPS </c> instruction.
anatofuz
parents:
diff changeset
575 ///
anatofuz
parents:
diff changeset
576 /// \param X
anatofuz
parents:
diff changeset
577 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
578 /// \param Y
anatofuz
parents:
diff changeset
579 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
580 /// \param M
anatofuz
parents:
diff changeset
581 /// An immediate integer operand. Mask bits [7:4] determine which elements
anatofuz
parents:
diff changeset
582 /// of the input vectors are used, with bit [4] corresponding to the lowest
anatofuz
parents:
diff changeset
583 /// element and bit [7] corresponding to the highest element of each [4 x
anatofuz
parents:
diff changeset
584 /// float] vector. If a bit is set, the corresponding elements from the two
anatofuz
parents:
diff changeset
585 /// input vectors are used as an input for dot product; otherwise that input
anatofuz
parents:
diff changeset
586 /// is treated as zero. Bits [3:0] determine which elements of the result
anatofuz
parents:
diff changeset
587 /// will receive a copy of the final dot product, with bit [0] corresponding
anatofuz
parents:
diff changeset
588 /// to the lowest element and bit [3] corresponding to the highest element of
anatofuz
parents:
diff changeset
589 /// each [4 x float] subvector. If a bit is set, the dot product is returned
anatofuz
parents:
diff changeset
590 /// in the corresponding element; otherwise that element is set to zero.
anatofuz
parents:
diff changeset
591 /// \returns A 128-bit vector of [4 x float] containing the dot product.
anatofuz
parents:
diff changeset
592 #define _mm_dp_ps(X, Y, M) \
anatofuz
parents:
diff changeset
593 (__m128) __builtin_ia32_dpps((__v4sf)(__m128)(X), \
anatofuz
parents:
diff changeset
594 (__v4sf)(__m128)(Y), (M))
anatofuz
parents:
diff changeset
595
anatofuz
parents:
diff changeset
596 /// Computes the dot product of the two 128-bit vectors of [2 x double]
anatofuz
parents:
diff changeset
597 /// and returns it in the elements of the 128-bit result vector of
anatofuz
parents:
diff changeset
598 /// [2 x double].
anatofuz
parents:
diff changeset
599 ///
anatofuz
parents:
diff changeset
600 /// The immediate integer operand controls which input
anatofuz
parents:
diff changeset
601 /// elements will contribute to the dot product, and where the final results
anatofuz
parents:
diff changeset
602 /// are returned.
anatofuz
parents:
diff changeset
603 ///
anatofuz
parents:
diff changeset
604 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
605 ///
anatofuz
parents:
diff changeset
606 /// \code
anatofuz
parents:
diff changeset
607 /// __m128d _mm_dp_pd(__m128d X, __m128d Y, const int M);
anatofuz
parents:
diff changeset
608 /// \endcode
anatofuz
parents:
diff changeset
609 ///
anatofuz
parents:
diff changeset
610 /// This intrinsic corresponds to the <c> VDPPD / DPPD </c> instruction.
anatofuz
parents:
diff changeset
611 ///
anatofuz
parents:
diff changeset
612 /// \param X
anatofuz
parents:
diff changeset
613 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
614 /// \param Y
anatofuz
parents:
diff changeset
615 /// A 128-bit vector of [2 x double].
anatofuz
parents:
diff changeset
616 /// \param M
anatofuz
parents:
diff changeset
617 /// An immediate integer operand. Mask bits [5:4] determine which elements
anatofuz
parents:
diff changeset
618 /// of the input vectors are used, with bit [4] corresponding to the lowest
anatofuz
parents:
diff changeset
619 /// element and bit [5] corresponding to the highest element of each of [2 x
anatofuz
parents:
diff changeset
620 /// double] vector. If a bit is set, the corresponding elements from the two
anatofuz
parents:
diff changeset
621 /// input vectors are used as an input for dot product; otherwise that input
anatofuz
parents:
diff changeset
622 /// is treated as zero. Bits [1:0] determine which elements of the result
anatofuz
parents:
diff changeset
623 /// will receive a copy of the final dot product, with bit [0] corresponding
anatofuz
parents:
diff changeset
624 /// to the lowest element and bit [1] corresponding to the highest element of
anatofuz
parents:
diff changeset
625 /// each [2 x double] vector. If a bit is set, the dot product is returned in
anatofuz
parents:
diff changeset
626 /// the corresponding element; otherwise that element is set to zero.
anatofuz
parents:
diff changeset
627 #define _mm_dp_pd(X, Y, M) \
anatofuz
parents:
diff changeset
628 (__m128d) __builtin_ia32_dppd((__v2df)(__m128d)(X), \
anatofuz
parents:
diff changeset
629 (__v2df)(__m128d)(Y), (M))
anatofuz
parents:
diff changeset
630
anatofuz
parents:
diff changeset
631 /* SSE4 Streaming Load Hint Instruction. */
anatofuz
parents:
diff changeset
632 /// Loads integer values from a 128-bit aligned memory location to a
anatofuz
parents:
diff changeset
633 /// 128-bit integer vector.
anatofuz
parents:
diff changeset
634 ///
anatofuz
parents:
diff changeset
635 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
636 ///
anatofuz
parents:
diff changeset
637 /// This intrinsic corresponds to the <c> VMOVNTDQA / MOVNTDQA </c> instruction.
anatofuz
parents:
diff changeset
638 ///
anatofuz
parents:
diff changeset
639 /// \param __V
anatofuz
parents:
diff changeset
640 /// A pointer to a 128-bit aligned memory location that contains the integer
anatofuz
parents:
diff changeset
641 /// values.
anatofuz
parents:
diff changeset
642 /// \returns A 128-bit integer vector containing the data stored at the
anatofuz
parents:
diff changeset
643 /// specified memory location.
anatofuz
parents:
diff changeset
644 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
645 _mm_stream_load_si128 (__m128i const *__V)
anatofuz
parents:
diff changeset
646 {
anatofuz
parents:
diff changeset
647 return (__m128i) __builtin_nontemporal_load ((const __v2di *) __V);
anatofuz
parents:
diff changeset
648 }
anatofuz
parents:
diff changeset
649
anatofuz
parents:
diff changeset
650 /* SSE4 Packed Integer Min/Max Instructions. */
anatofuz
parents:
diff changeset
651 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
652 /// [16 x i8] and returns a 128-bit vector of [16 x i8] containing the lesser
anatofuz
parents:
diff changeset
653 /// of the two values.
anatofuz
parents:
diff changeset
654 ///
anatofuz
parents:
diff changeset
655 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
656 ///
anatofuz
parents:
diff changeset
657 /// This intrinsic corresponds to the <c> VPMINSB / PMINSB </c> instruction.
anatofuz
parents:
diff changeset
658 ///
anatofuz
parents:
diff changeset
659 /// \param __V1
anatofuz
parents:
diff changeset
660 /// A 128-bit vector of [16 x i8].
anatofuz
parents:
diff changeset
661 /// \param __V2
anatofuz
parents:
diff changeset
662 /// A 128-bit vector of [16 x i8]
anatofuz
parents:
diff changeset
663 /// \returns A 128-bit vector of [16 x i8] containing the lesser values.
anatofuz
parents:
diff changeset
664 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
665 _mm_min_epi8 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
666 {
anatofuz
parents:
diff changeset
667 return (__m128i) __builtin_ia32_pminsb128 ((__v16qi) __V1, (__v16qi) __V2);
anatofuz
parents:
diff changeset
668 }
anatofuz
parents:
diff changeset
669
anatofuz
parents:
diff changeset
670 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
671 /// [16 x i8] and returns a 128-bit vector of [16 x i8] containing the
anatofuz
parents:
diff changeset
672 /// greater value of the two.
anatofuz
parents:
diff changeset
673 ///
anatofuz
parents:
diff changeset
674 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
675 ///
anatofuz
parents:
diff changeset
676 /// This intrinsic corresponds to the <c> VPMAXSB / PMAXSB </c> instruction.
anatofuz
parents:
diff changeset
677 ///
anatofuz
parents:
diff changeset
678 /// \param __V1
anatofuz
parents:
diff changeset
679 /// A 128-bit vector of [16 x i8].
anatofuz
parents:
diff changeset
680 /// \param __V2
anatofuz
parents:
diff changeset
681 /// A 128-bit vector of [16 x i8].
anatofuz
parents:
diff changeset
682 /// \returns A 128-bit vector of [16 x i8] containing the greater values.
anatofuz
parents:
diff changeset
683 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
684 _mm_max_epi8 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
685 {
anatofuz
parents:
diff changeset
686 return (__m128i) __builtin_ia32_pmaxsb128 ((__v16qi) __V1, (__v16qi) __V2);
anatofuz
parents:
diff changeset
687 }
anatofuz
parents:
diff changeset
688
anatofuz
parents:
diff changeset
689 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
690 /// [8 x u16] and returns a 128-bit vector of [8 x u16] containing the lesser
anatofuz
parents:
diff changeset
691 /// value of the two.
anatofuz
parents:
diff changeset
692 ///
anatofuz
parents:
diff changeset
693 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
694 ///
anatofuz
parents:
diff changeset
695 /// This intrinsic corresponds to the <c> VPMINUW / PMINUW </c> instruction.
anatofuz
parents:
diff changeset
696 ///
anatofuz
parents:
diff changeset
697 /// \param __V1
anatofuz
parents:
diff changeset
698 /// A 128-bit vector of [8 x u16].
anatofuz
parents:
diff changeset
699 /// \param __V2
anatofuz
parents:
diff changeset
700 /// A 128-bit vector of [8 x u16].
anatofuz
parents:
diff changeset
701 /// \returns A 128-bit vector of [8 x u16] containing the lesser values.
anatofuz
parents:
diff changeset
702 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
703 _mm_min_epu16 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
704 {
anatofuz
parents:
diff changeset
705 return (__m128i) __builtin_ia32_pminuw128 ((__v8hi) __V1, (__v8hi) __V2);
anatofuz
parents:
diff changeset
706 }
anatofuz
parents:
diff changeset
707
anatofuz
parents:
diff changeset
708 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
709 /// [8 x u16] and returns a 128-bit vector of [8 x u16] containing the
anatofuz
parents:
diff changeset
710 /// greater value of the two.
anatofuz
parents:
diff changeset
711 ///
anatofuz
parents:
diff changeset
712 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
713 ///
anatofuz
parents:
diff changeset
714 /// This intrinsic corresponds to the <c> VPMAXUW / PMAXUW </c> instruction.
anatofuz
parents:
diff changeset
715 ///
anatofuz
parents:
diff changeset
716 /// \param __V1
anatofuz
parents:
diff changeset
717 /// A 128-bit vector of [8 x u16].
anatofuz
parents:
diff changeset
718 /// \param __V2
anatofuz
parents:
diff changeset
719 /// A 128-bit vector of [8 x u16].
anatofuz
parents:
diff changeset
720 /// \returns A 128-bit vector of [8 x u16] containing the greater values.
anatofuz
parents:
diff changeset
721 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
722 _mm_max_epu16 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
723 {
anatofuz
parents:
diff changeset
724 return (__m128i) __builtin_ia32_pmaxuw128 ((__v8hi) __V1, (__v8hi) __V2);
anatofuz
parents:
diff changeset
725 }
anatofuz
parents:
diff changeset
726
anatofuz
parents:
diff changeset
727 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
728 /// [4 x i32] and returns a 128-bit vector of [4 x i32] containing the lesser
anatofuz
parents:
diff changeset
729 /// value of the two.
anatofuz
parents:
diff changeset
730 ///
anatofuz
parents:
diff changeset
731 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
732 ///
anatofuz
parents:
diff changeset
733 /// This intrinsic corresponds to the <c> VPMINSD / PMINSD </c> instruction.
anatofuz
parents:
diff changeset
734 ///
anatofuz
parents:
diff changeset
735 /// \param __V1
anatofuz
parents:
diff changeset
736 /// A 128-bit vector of [4 x i32].
anatofuz
parents:
diff changeset
737 /// \param __V2
anatofuz
parents:
diff changeset
738 /// A 128-bit vector of [4 x i32].
anatofuz
parents:
diff changeset
739 /// \returns A 128-bit vector of [4 x i32] containing the lesser values.
anatofuz
parents:
diff changeset
740 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
741 _mm_min_epi32 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
742 {
anatofuz
parents:
diff changeset
743 return (__m128i) __builtin_ia32_pminsd128 ((__v4si) __V1, (__v4si) __V2);
anatofuz
parents:
diff changeset
744 }
anatofuz
parents:
diff changeset
745
anatofuz
parents:
diff changeset
746 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
747 /// [4 x i32] and returns a 128-bit vector of [4 x i32] containing the
anatofuz
parents:
diff changeset
748 /// greater value of the two.
anatofuz
parents:
diff changeset
749 ///
anatofuz
parents:
diff changeset
750 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
751 ///
anatofuz
parents:
diff changeset
752 /// This intrinsic corresponds to the <c> VPMAXSD / PMAXSD </c> instruction.
anatofuz
parents:
diff changeset
753 ///
anatofuz
parents:
diff changeset
754 /// \param __V1
anatofuz
parents:
diff changeset
755 /// A 128-bit vector of [4 x i32].
anatofuz
parents:
diff changeset
756 /// \param __V2
anatofuz
parents:
diff changeset
757 /// A 128-bit vector of [4 x i32].
anatofuz
parents:
diff changeset
758 /// \returns A 128-bit vector of [4 x i32] containing the greater values.
anatofuz
parents:
diff changeset
759 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
760 _mm_max_epi32 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
761 {
anatofuz
parents:
diff changeset
762 return (__m128i) __builtin_ia32_pmaxsd128 ((__v4si) __V1, (__v4si) __V2);
anatofuz
parents:
diff changeset
763 }
anatofuz
parents:
diff changeset
764
anatofuz
parents:
diff changeset
765 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
766 /// [4 x u32] and returns a 128-bit vector of [4 x u32] containing the lesser
anatofuz
parents:
diff changeset
767 /// value of the two.
anatofuz
parents:
diff changeset
768 ///
anatofuz
parents:
diff changeset
769 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
770 ///
anatofuz
parents:
diff changeset
771 /// This intrinsic corresponds to the <c> VPMINUD / PMINUD </c> instruction.
anatofuz
parents:
diff changeset
772 ///
anatofuz
parents:
diff changeset
773 /// \param __V1
anatofuz
parents:
diff changeset
774 /// A 128-bit vector of [4 x u32].
anatofuz
parents:
diff changeset
775 /// \param __V2
anatofuz
parents:
diff changeset
776 /// A 128-bit vector of [4 x u32].
anatofuz
parents:
diff changeset
777 /// \returns A 128-bit vector of [4 x u32] containing the lesser values.
anatofuz
parents:
diff changeset
778 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
779 _mm_min_epu32 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
780 {
anatofuz
parents:
diff changeset
781 return (__m128i) __builtin_ia32_pminud128((__v4si) __V1, (__v4si) __V2);
anatofuz
parents:
diff changeset
782 }
anatofuz
parents:
diff changeset
783
anatofuz
parents:
diff changeset
784 /// Compares the corresponding elements of two 128-bit vectors of
anatofuz
parents:
diff changeset
785 /// [4 x u32] and returns a 128-bit vector of [4 x u32] containing the
anatofuz
parents:
diff changeset
786 /// greater value of the two.
anatofuz
parents:
diff changeset
787 ///
anatofuz
parents:
diff changeset
788 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
789 ///
anatofuz
parents:
diff changeset
790 /// This intrinsic corresponds to the <c> VPMAXUD / PMAXUD </c> instruction.
anatofuz
parents:
diff changeset
791 ///
anatofuz
parents:
diff changeset
792 /// \param __V1
anatofuz
parents:
diff changeset
793 /// A 128-bit vector of [4 x u32].
anatofuz
parents:
diff changeset
794 /// \param __V2
anatofuz
parents:
diff changeset
795 /// A 128-bit vector of [4 x u32].
anatofuz
parents:
diff changeset
796 /// \returns A 128-bit vector of [4 x u32] containing the greater values.
anatofuz
parents:
diff changeset
797 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
798 _mm_max_epu32 (__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
799 {
anatofuz
parents:
diff changeset
800 return (__m128i) __builtin_ia32_pmaxud128((__v4si) __V1, (__v4si) __V2);
anatofuz
parents:
diff changeset
801 }
anatofuz
parents:
diff changeset
802
anatofuz
parents:
diff changeset
803 /* SSE4 Insertion and Extraction from XMM Register Instructions. */
anatofuz
parents:
diff changeset
804 /// Takes the first argument \a X and inserts an element from the second
anatofuz
parents:
diff changeset
805 /// argument \a Y as selected by the third argument \a N. That result then
anatofuz
parents:
diff changeset
806 /// has elements zeroed out also as selected by the third argument \a N. The
anatofuz
parents:
diff changeset
807 /// resulting 128-bit vector of [4 x float] is then returned.
anatofuz
parents:
diff changeset
808 ///
anatofuz
parents:
diff changeset
809 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
810 ///
anatofuz
parents:
diff changeset
811 /// \code
anatofuz
parents:
diff changeset
812 /// __m128 _mm_insert_ps(__m128 X, __m128 Y, const int N);
anatofuz
parents:
diff changeset
813 /// \endcode
anatofuz
parents:
diff changeset
814 ///
anatofuz
parents:
diff changeset
815 /// This intrinsic corresponds to the <c> VINSERTPS </c> instruction.
anatofuz
parents:
diff changeset
816 ///
anatofuz
parents:
diff changeset
817 /// \param X
anatofuz
parents:
diff changeset
818 /// A 128-bit vector source operand of [4 x float]. With the exception of
anatofuz
parents:
diff changeset
819 /// those bits in the result copied from parameter \a Y and zeroed by bits
anatofuz
parents:
diff changeset
820 /// [3:0] of \a N, all bits from this parameter are copied to the result.
anatofuz
parents:
diff changeset
821 /// \param Y
anatofuz
parents:
diff changeset
822 /// A 128-bit vector source operand of [4 x float]. One single-precision
anatofuz
parents:
diff changeset
823 /// floating-point element from this source, as determined by the immediate
anatofuz
parents:
diff changeset
824 /// parameter, is copied to the result.
anatofuz
parents:
diff changeset
825 /// \param N
anatofuz
parents:
diff changeset
826 /// Specifies which bits from operand \a Y will be copied, which bits in the
anatofuz
parents:
diff changeset
827 /// result they will be be copied to, and which bits in the result will be
anatofuz
parents:
diff changeset
828 /// cleared. The following assignments are made: \n
anatofuz
parents:
diff changeset
829 /// Bits [7:6] specify the bits to copy from operand \a Y: \n
anatofuz
parents:
diff changeset
830 /// 00: Selects bits [31:0] from operand \a Y. \n
anatofuz
parents:
diff changeset
831 /// 01: Selects bits [63:32] from operand \a Y. \n
anatofuz
parents:
diff changeset
832 /// 10: Selects bits [95:64] from operand \a Y. \n
anatofuz
parents:
diff changeset
833 /// 11: Selects bits [127:96] from operand \a Y. \n
anatofuz
parents:
diff changeset
834 /// Bits [5:4] specify the bits in the result to which the selected bits
anatofuz
parents:
diff changeset
835 /// from operand \a Y are copied: \n
anatofuz
parents:
diff changeset
836 /// 00: Copies the selected bits from \a Y to result bits [31:0]. \n
anatofuz
parents:
diff changeset
837 /// 01: Copies the selected bits from \a Y to result bits [63:32]. \n
anatofuz
parents:
diff changeset
838 /// 10: Copies the selected bits from \a Y to result bits [95:64]. \n
anatofuz
parents:
diff changeset
839 /// 11: Copies the selected bits from \a Y to result bits [127:96]. \n
anatofuz
parents:
diff changeset
840 /// Bits[3:0]: If any of these bits are set, the corresponding result
anatofuz
parents:
diff changeset
841 /// element is cleared.
anatofuz
parents:
diff changeset
842 /// \returns A 128-bit vector of [4 x float] containing the copied
anatofuz
parents:
diff changeset
843 /// single-precision floating point elements from the operands.
anatofuz
parents:
diff changeset
844 #define _mm_insert_ps(X, Y, N) __builtin_ia32_insertps128((X), (Y), (N))
anatofuz
parents:
diff changeset
845
anatofuz
parents:
diff changeset
846 /// Extracts a 32-bit integer from a 128-bit vector of [4 x float] and
anatofuz
parents:
diff changeset
847 /// returns it, using the immediate value parameter \a N as a selector.
anatofuz
parents:
diff changeset
848 ///
anatofuz
parents:
diff changeset
849 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
850 ///
anatofuz
parents:
diff changeset
851 /// \code
anatofuz
parents:
diff changeset
852 /// int _mm_extract_ps(__m128 X, const int N);
anatofuz
parents:
diff changeset
853 /// \endcode
anatofuz
parents:
diff changeset
854 ///
anatofuz
parents:
diff changeset
855 /// This intrinsic corresponds to the <c> VEXTRACTPS / EXTRACTPS </c>
anatofuz
parents:
diff changeset
856 /// instruction.
anatofuz
parents:
diff changeset
857 ///
anatofuz
parents:
diff changeset
858 /// \param X
anatofuz
parents:
diff changeset
859 /// A 128-bit vector of [4 x float].
anatofuz
parents:
diff changeset
860 /// \param N
anatofuz
parents:
diff changeset
861 /// An immediate value. Bits [1:0] determines which bits from the argument
anatofuz
parents:
diff changeset
862 /// \a X are extracted and returned: \n
anatofuz
parents:
diff changeset
863 /// 00: Bits [31:0] of parameter \a X are returned. \n
anatofuz
parents:
diff changeset
864 /// 01: Bits [63:32] of parameter \a X are returned. \n
anatofuz
parents:
diff changeset
865 /// 10: Bits [95:64] of parameter \a X are returned. \n
anatofuz
parents:
diff changeset
866 /// 11: Bits [127:96] of parameter \a X are returned.
anatofuz
parents:
diff changeset
867 /// \returns A 32-bit integer containing the extracted 32 bits of float data.
anatofuz
parents:
diff changeset
868 #define _mm_extract_ps(X, N) (__extension__ \
anatofuz
parents:
diff changeset
869 ({ union { int __i; float __f; } __t; \
anatofuz
parents:
diff changeset
870 __t.__f = __builtin_ia32_vec_ext_v4sf((__v4sf)(__m128)(X), (int)(N)); \
anatofuz
parents:
diff changeset
871 __t.__i;}))
anatofuz
parents:
diff changeset
872
anatofuz
parents:
diff changeset
873 /* Miscellaneous insert and extract macros. */
anatofuz
parents:
diff changeset
874 /* Extract a single-precision float from X at index N into D. */
anatofuz
parents:
diff changeset
875 #define _MM_EXTRACT_FLOAT(D, X, N) \
anatofuz
parents:
diff changeset
876 { (D) = __builtin_ia32_vec_ext_v4sf((__v4sf)(__m128)(X), (int)(N)); }
anatofuz
parents:
diff changeset
877
anatofuz
parents:
diff changeset
878 /* Or together 2 sets of indexes (X and Y) with the zeroing bits (Z) to create
anatofuz
parents:
diff changeset
879 an index suitable for _mm_insert_ps. */
anatofuz
parents:
diff changeset
880 #define _MM_MK_INSERTPS_NDX(X, Y, Z) (((X) << 6) | ((Y) << 4) | (Z))
anatofuz
parents:
diff changeset
881
anatofuz
parents:
diff changeset
882 /* Extract a float from X at index N into the first index of the return. */
anatofuz
parents:
diff changeset
883 #define _MM_PICK_OUT_PS(X, N) _mm_insert_ps (_mm_setzero_ps(), (X), \
anatofuz
parents:
diff changeset
884 _MM_MK_INSERTPS_NDX((N), 0, 0x0e))
anatofuz
parents:
diff changeset
885
anatofuz
parents:
diff changeset
886 /* Insert int into packed integer array at index. */
anatofuz
parents:
diff changeset
887 /// Constructs a 128-bit vector of [16 x i8] by first making a copy of
anatofuz
parents:
diff changeset
888 /// the 128-bit integer vector parameter, and then inserting the lower 8 bits
anatofuz
parents:
diff changeset
889 /// of an integer parameter \a I into an offset specified by the immediate
anatofuz
parents:
diff changeset
890 /// value parameter \a N.
anatofuz
parents:
diff changeset
891 ///
anatofuz
parents:
diff changeset
892 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
893 ///
anatofuz
parents:
diff changeset
894 /// \code
anatofuz
parents:
diff changeset
895 /// __m128i _mm_insert_epi8(__m128i X, int I, const int N);
anatofuz
parents:
diff changeset
896 /// \endcode
anatofuz
parents:
diff changeset
897 ///
anatofuz
parents:
diff changeset
898 /// This intrinsic corresponds to the <c> VPINSRB / PINSRB </c> instruction.
anatofuz
parents:
diff changeset
899 ///
anatofuz
parents:
diff changeset
900 /// \param X
anatofuz
parents:
diff changeset
901 /// A 128-bit integer vector of [16 x i8]. This vector is copied to the
anatofuz
parents:
diff changeset
902 /// result and then one of the sixteen elements in the result vector is
anatofuz
parents:
diff changeset
903 /// replaced by the lower 8 bits of \a I.
anatofuz
parents:
diff changeset
904 /// \param I
anatofuz
parents:
diff changeset
905 /// An integer. The lower 8 bits of this operand are written to the result
anatofuz
parents:
diff changeset
906 /// beginning at the offset specified by \a N.
anatofuz
parents:
diff changeset
907 /// \param N
anatofuz
parents:
diff changeset
908 /// An immediate value. Bits [3:0] specify the bit offset in the result at
anatofuz
parents:
diff changeset
909 /// which the lower 8 bits of \a I are written. \n
anatofuz
parents:
diff changeset
910 /// 0000: Bits [7:0] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
911 /// 0001: Bits [15:8] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
912 /// 0010: Bits [23:16] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
913 /// 0011: Bits [31:24] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
914 /// 0100: Bits [39:32] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
915 /// 0101: Bits [47:40] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
916 /// 0110: Bits [55:48] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
917 /// 0111: Bits [63:56] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
918 /// 1000: Bits [71:64] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
919 /// 1001: Bits [79:72] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
920 /// 1010: Bits [87:80] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
921 /// 1011: Bits [95:88] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
922 /// 1100: Bits [103:96] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
923 /// 1101: Bits [111:104] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
924 /// 1110: Bits [119:112] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
925 /// 1111: Bits [127:120] of the result are used for insertion.
anatofuz
parents:
diff changeset
926 /// \returns A 128-bit integer vector containing the constructed values.
anatofuz
parents:
diff changeset
927 #define _mm_insert_epi8(X, I, N) \
anatofuz
parents:
diff changeset
928 (__m128i)__builtin_ia32_vec_set_v16qi((__v16qi)(__m128i)(X), \
anatofuz
parents:
diff changeset
929 (int)(I), (int)(N))
anatofuz
parents:
diff changeset
930
anatofuz
parents:
diff changeset
931 /// Constructs a 128-bit vector of [4 x i32] by first making a copy of
anatofuz
parents:
diff changeset
932 /// the 128-bit integer vector parameter, and then inserting the 32-bit
anatofuz
parents:
diff changeset
933 /// integer parameter \a I at the offset specified by the immediate value
anatofuz
parents:
diff changeset
934 /// parameter \a N.
anatofuz
parents:
diff changeset
935 ///
anatofuz
parents:
diff changeset
936 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
937 ///
anatofuz
parents:
diff changeset
938 /// \code
anatofuz
parents:
diff changeset
939 /// __m128i _mm_insert_epi32(__m128i X, int I, const int N);
anatofuz
parents:
diff changeset
940 /// \endcode
anatofuz
parents:
diff changeset
941 ///
anatofuz
parents:
diff changeset
942 /// This intrinsic corresponds to the <c> VPINSRD / PINSRD </c> instruction.
anatofuz
parents:
diff changeset
943 ///
anatofuz
parents:
diff changeset
944 /// \param X
anatofuz
parents:
diff changeset
945 /// A 128-bit integer vector of [4 x i32]. This vector is copied to the
anatofuz
parents:
diff changeset
946 /// result and then one of the four elements in the result vector is
anatofuz
parents:
diff changeset
947 /// replaced by \a I.
anatofuz
parents:
diff changeset
948 /// \param I
anatofuz
parents:
diff changeset
949 /// A 32-bit integer that is written to the result beginning at the offset
anatofuz
parents:
diff changeset
950 /// specified by \a N.
anatofuz
parents:
diff changeset
951 /// \param N
anatofuz
parents:
diff changeset
952 /// An immediate value. Bits [1:0] specify the bit offset in the result at
anatofuz
parents:
diff changeset
953 /// which the integer \a I is written. \n
anatofuz
parents:
diff changeset
954 /// 00: Bits [31:0] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
955 /// 01: Bits [63:32] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
956 /// 10: Bits [95:64] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
957 /// 11: Bits [127:96] of the result are used for insertion.
anatofuz
parents:
diff changeset
958 /// \returns A 128-bit integer vector containing the constructed values.
anatofuz
parents:
diff changeset
959 #define _mm_insert_epi32(X, I, N) \
anatofuz
parents:
diff changeset
960 (__m128i)__builtin_ia32_vec_set_v4si((__v4si)(__m128i)(X), \
anatofuz
parents:
diff changeset
961 (int)(I), (int)(N))
anatofuz
parents:
diff changeset
962
anatofuz
parents:
diff changeset
963 #ifdef __x86_64__
anatofuz
parents:
diff changeset
964 /// Constructs a 128-bit vector of [2 x i64] by first making a copy of
anatofuz
parents:
diff changeset
965 /// the 128-bit integer vector parameter, and then inserting the 64-bit
anatofuz
parents:
diff changeset
966 /// integer parameter \a I, using the immediate value parameter \a N as an
anatofuz
parents:
diff changeset
967 /// insertion location selector.
anatofuz
parents:
diff changeset
968 ///
anatofuz
parents:
diff changeset
969 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
970 ///
anatofuz
parents:
diff changeset
971 /// \code
anatofuz
parents:
diff changeset
972 /// __m128i _mm_insert_epi64(__m128i X, long long I, const int N);
anatofuz
parents:
diff changeset
973 /// \endcode
anatofuz
parents:
diff changeset
974 ///
anatofuz
parents:
diff changeset
975 /// This intrinsic corresponds to the <c> VPINSRQ / PINSRQ </c> instruction.
anatofuz
parents:
diff changeset
976 ///
anatofuz
parents:
diff changeset
977 /// \param X
anatofuz
parents:
diff changeset
978 /// A 128-bit integer vector of [2 x i64]. This vector is copied to the
anatofuz
parents:
diff changeset
979 /// result and then one of the two elements in the result vector is replaced
anatofuz
parents:
diff changeset
980 /// by \a I.
anatofuz
parents:
diff changeset
981 /// \param I
anatofuz
parents:
diff changeset
982 /// A 64-bit integer that is written to the result beginning at the offset
anatofuz
parents:
diff changeset
983 /// specified by \a N.
anatofuz
parents:
diff changeset
984 /// \param N
anatofuz
parents:
diff changeset
985 /// An immediate value. Bit [0] specifies the bit offset in the result at
anatofuz
parents:
diff changeset
986 /// which the integer \a I is written. \n
anatofuz
parents:
diff changeset
987 /// 0: Bits [63:0] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
988 /// 1: Bits [127:64] of the result are used for insertion. \n
anatofuz
parents:
diff changeset
989 /// \returns A 128-bit integer vector containing the constructed values.
anatofuz
parents:
diff changeset
990 #define _mm_insert_epi64(X, I, N) \
anatofuz
parents:
diff changeset
991 (__m128i)__builtin_ia32_vec_set_v2di((__v2di)(__m128i)(X), \
anatofuz
parents:
diff changeset
992 (long long)(I), (int)(N))
anatofuz
parents:
diff changeset
993 #endif /* __x86_64__ */
anatofuz
parents:
diff changeset
994
anatofuz
parents:
diff changeset
995 /* Extract int from packed integer array at index. This returns the element
anatofuz
parents:
diff changeset
996 * as a zero extended value, so it is unsigned.
anatofuz
parents:
diff changeset
997 */
anatofuz
parents:
diff changeset
998 /// Extracts an 8-bit element from the 128-bit integer vector of
anatofuz
parents:
diff changeset
999 /// [16 x i8], using the immediate value parameter \a N as a selector.
anatofuz
parents:
diff changeset
1000 ///
anatofuz
parents:
diff changeset
1001 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1002 ///
anatofuz
parents:
diff changeset
1003 /// \code
anatofuz
parents:
diff changeset
1004 /// int _mm_extract_epi8(__m128i X, const int N);
anatofuz
parents:
diff changeset
1005 /// \endcode
anatofuz
parents:
diff changeset
1006 ///
anatofuz
parents:
diff changeset
1007 /// This intrinsic corresponds to the <c> VPEXTRB / PEXTRB </c> instruction.
anatofuz
parents:
diff changeset
1008 ///
anatofuz
parents:
diff changeset
1009 /// \param X
anatofuz
parents:
diff changeset
1010 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
1011 /// \param N
anatofuz
parents:
diff changeset
1012 /// An immediate value. Bits [3:0] specify which 8-bit vector element from
anatofuz
parents:
diff changeset
1013 /// the argument \a X to extract and copy to the result. \n
anatofuz
parents:
diff changeset
1014 /// 0000: Bits [7:0] of parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1015 /// 0001: Bits [15:8] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1016 /// 0010: Bits [23:16] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1017 /// 0011: Bits [31:24] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1018 /// 0100: Bits [39:32] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1019 /// 0101: Bits [47:40] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1020 /// 0110: Bits [55:48] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1021 /// 0111: Bits [63:56] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1022 /// 1000: Bits [71:64] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1023 /// 1001: Bits [79:72] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1024 /// 1010: Bits [87:80] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1025 /// 1011: Bits [95:88] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1026 /// 1100: Bits [103:96] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1027 /// 1101: Bits [111:104] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1028 /// 1110: Bits [119:112] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1029 /// 1111: Bits [127:120] of the parameter \a X are extracted.
anatofuz
parents:
diff changeset
1030 /// \returns An unsigned integer, whose lower 8 bits are selected from the
anatofuz
parents:
diff changeset
1031 /// 128-bit integer vector parameter and the remaining bits are assigned
anatofuz
parents:
diff changeset
1032 /// zeros.
anatofuz
parents:
diff changeset
1033 #define _mm_extract_epi8(X, N) \
anatofuz
parents:
diff changeset
1034 (int)(unsigned char)__builtin_ia32_vec_ext_v16qi((__v16qi)(__m128i)(X), \
anatofuz
parents:
diff changeset
1035 (int)(N))
anatofuz
parents:
diff changeset
1036
anatofuz
parents:
diff changeset
1037 /// Extracts a 32-bit element from the 128-bit integer vector of
anatofuz
parents:
diff changeset
1038 /// [4 x i32], using the immediate value parameter \a N as a selector.
anatofuz
parents:
diff changeset
1039 ///
anatofuz
parents:
diff changeset
1040 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1041 ///
anatofuz
parents:
diff changeset
1042 /// \code
anatofuz
parents:
diff changeset
1043 /// int _mm_extract_epi32(__m128i X, const int N);
anatofuz
parents:
diff changeset
1044 /// \endcode
anatofuz
parents:
diff changeset
1045 ///
anatofuz
parents:
diff changeset
1046 /// This intrinsic corresponds to the <c> VPEXTRD / PEXTRD </c> instruction.
anatofuz
parents:
diff changeset
1047 ///
anatofuz
parents:
diff changeset
1048 /// \param X
anatofuz
parents:
diff changeset
1049 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
1050 /// \param N
anatofuz
parents:
diff changeset
1051 /// An immediate value. Bits [1:0] specify which 32-bit vector element from
anatofuz
parents:
diff changeset
1052 /// the argument \a X to extract and copy to the result. \n
anatofuz
parents:
diff changeset
1053 /// 00: Bits [31:0] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1054 /// 01: Bits [63:32] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1055 /// 10: Bits [95:64] of the parameter \a X are extracted. \n
anatofuz
parents:
diff changeset
1056 /// 11: Bits [127:96] of the parameter \a X are exracted.
anatofuz
parents:
diff changeset
1057 /// \returns An integer, whose lower 32 bits are selected from the 128-bit
anatofuz
parents:
diff changeset
1058 /// integer vector parameter and the remaining bits are assigned zeros.
anatofuz
parents:
diff changeset
1059 #define _mm_extract_epi32(X, N) \
anatofuz
parents:
diff changeset
1060 (int)__builtin_ia32_vec_ext_v4si((__v4si)(__m128i)(X), (int)(N))
anatofuz
parents:
diff changeset
1061
anatofuz
parents:
diff changeset
1062 #ifdef __x86_64__
anatofuz
parents:
diff changeset
1063 /// Extracts a 64-bit element from the 128-bit integer vector of
anatofuz
parents:
diff changeset
1064 /// [2 x i64], using the immediate value parameter \a N as a selector.
anatofuz
parents:
diff changeset
1065 ///
anatofuz
parents:
diff changeset
1066 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1067 ///
anatofuz
parents:
diff changeset
1068 /// \code
anatofuz
parents:
diff changeset
1069 /// long long _mm_extract_epi64(__m128i X, const int N);
anatofuz
parents:
diff changeset
1070 /// \endcode
anatofuz
parents:
diff changeset
1071 ///
anatofuz
parents:
diff changeset
1072 /// This intrinsic corresponds to the <c> VPEXTRQ / PEXTRQ </c> instruction.
anatofuz
parents:
diff changeset
1073 ///
anatofuz
parents:
diff changeset
1074 /// \param X
anatofuz
parents:
diff changeset
1075 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
1076 /// \param N
anatofuz
parents:
diff changeset
1077 /// An immediate value. Bit [0] specifies which 64-bit vector element from
anatofuz
parents:
diff changeset
1078 /// the argument \a X to return. \n
anatofuz
parents:
diff changeset
1079 /// 0: Bits [63:0] are returned. \n
anatofuz
parents:
diff changeset
1080 /// 1: Bits [127:64] are returned. \n
anatofuz
parents:
diff changeset
1081 /// \returns A 64-bit integer.
anatofuz
parents:
diff changeset
1082 #define _mm_extract_epi64(X, N) \
anatofuz
parents:
diff changeset
1083 (long long)__builtin_ia32_vec_ext_v2di((__v2di)(__m128i)(X), (int)(N))
anatofuz
parents:
diff changeset
1084 #endif /* __x86_64 */
anatofuz
parents:
diff changeset
1085
anatofuz
parents:
diff changeset
1086 /* SSE4 128-bit Packed Integer Comparisons. */
anatofuz
parents:
diff changeset
1087 /// Tests whether the specified bits in a 128-bit integer vector are all
anatofuz
parents:
diff changeset
1088 /// zeros.
anatofuz
parents:
diff changeset
1089 ///
anatofuz
parents:
diff changeset
1090 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1091 ///
anatofuz
parents:
diff changeset
1092 /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
anatofuz
parents:
diff changeset
1093 ///
anatofuz
parents:
diff changeset
1094 /// \param __M
anatofuz
parents:
diff changeset
1095 /// A 128-bit integer vector containing the bits to be tested.
anatofuz
parents:
diff changeset
1096 /// \param __V
anatofuz
parents:
diff changeset
1097 /// A 128-bit integer vector selecting which bits to test in operand \a __M.
anatofuz
parents:
diff changeset
1098 /// \returns TRUE if the specified bits are all zeros; FALSE otherwise.
anatofuz
parents:
diff changeset
1099 static __inline__ int __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1100 _mm_testz_si128(__m128i __M, __m128i __V)
anatofuz
parents:
diff changeset
1101 {
anatofuz
parents:
diff changeset
1102 return __builtin_ia32_ptestz128((__v2di)__M, (__v2di)__V);
anatofuz
parents:
diff changeset
1103 }
anatofuz
parents:
diff changeset
1104
anatofuz
parents:
diff changeset
1105 /// Tests whether the specified bits in a 128-bit integer vector are all
anatofuz
parents:
diff changeset
1106 /// ones.
anatofuz
parents:
diff changeset
1107 ///
anatofuz
parents:
diff changeset
1108 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1109 ///
anatofuz
parents:
diff changeset
1110 /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
anatofuz
parents:
diff changeset
1111 ///
anatofuz
parents:
diff changeset
1112 /// \param __M
anatofuz
parents:
diff changeset
1113 /// A 128-bit integer vector containing the bits to be tested.
anatofuz
parents:
diff changeset
1114 /// \param __V
anatofuz
parents:
diff changeset
1115 /// A 128-bit integer vector selecting which bits to test in operand \a __M.
anatofuz
parents:
diff changeset
1116 /// \returns TRUE if the specified bits are all ones; FALSE otherwise.
anatofuz
parents:
diff changeset
1117 static __inline__ int __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1118 _mm_testc_si128(__m128i __M, __m128i __V)
anatofuz
parents:
diff changeset
1119 {
anatofuz
parents:
diff changeset
1120 return __builtin_ia32_ptestc128((__v2di)__M, (__v2di)__V);
anatofuz
parents:
diff changeset
1121 }
anatofuz
parents:
diff changeset
1122
anatofuz
parents:
diff changeset
1123 /// Tests whether the specified bits in a 128-bit integer vector are
anatofuz
parents:
diff changeset
1124 /// neither all zeros nor all ones.
anatofuz
parents:
diff changeset
1125 ///
anatofuz
parents:
diff changeset
1126 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1127 ///
anatofuz
parents:
diff changeset
1128 /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
anatofuz
parents:
diff changeset
1129 ///
anatofuz
parents:
diff changeset
1130 /// \param __M
anatofuz
parents:
diff changeset
1131 /// A 128-bit integer vector containing the bits to be tested.
anatofuz
parents:
diff changeset
1132 /// \param __V
anatofuz
parents:
diff changeset
1133 /// A 128-bit integer vector selecting which bits to test in operand \a __M.
anatofuz
parents:
diff changeset
1134 /// \returns TRUE if the specified bits are neither all zeros nor all ones;
anatofuz
parents:
diff changeset
1135 /// FALSE otherwise.
anatofuz
parents:
diff changeset
1136 static __inline__ int __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1137 _mm_testnzc_si128(__m128i __M, __m128i __V)
anatofuz
parents:
diff changeset
1138 {
anatofuz
parents:
diff changeset
1139 return __builtin_ia32_ptestnzc128((__v2di)__M, (__v2di)__V);
anatofuz
parents:
diff changeset
1140 }
anatofuz
parents:
diff changeset
1141
anatofuz
parents:
diff changeset
1142 /// Tests whether the specified bits in a 128-bit integer vector are all
anatofuz
parents:
diff changeset
1143 /// ones.
anatofuz
parents:
diff changeset
1144 ///
anatofuz
parents:
diff changeset
1145 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1146 ///
anatofuz
parents:
diff changeset
1147 /// \code
anatofuz
parents:
diff changeset
1148 /// int _mm_test_all_ones(__m128i V);
anatofuz
parents:
diff changeset
1149 /// \endcode
anatofuz
parents:
diff changeset
1150 ///
anatofuz
parents:
diff changeset
1151 /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
anatofuz
parents:
diff changeset
1152 ///
anatofuz
parents:
diff changeset
1153 /// \param V
anatofuz
parents:
diff changeset
1154 /// A 128-bit integer vector containing the bits to be tested.
anatofuz
parents:
diff changeset
1155 /// \returns TRUE if the bits specified in the operand are all set to 1; FALSE
anatofuz
parents:
diff changeset
1156 /// otherwise.
anatofuz
parents:
diff changeset
1157 #define _mm_test_all_ones(V) _mm_testc_si128((V), _mm_cmpeq_epi32((V), (V)))
anatofuz
parents:
diff changeset
1158
anatofuz
parents:
diff changeset
1159 /// Tests whether the specified bits in a 128-bit integer vector are
anatofuz
parents:
diff changeset
1160 /// neither all zeros nor all ones.
anatofuz
parents:
diff changeset
1161 ///
anatofuz
parents:
diff changeset
1162 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1163 ///
anatofuz
parents:
diff changeset
1164 /// \code
anatofuz
parents:
diff changeset
1165 /// int _mm_test_mix_ones_zeros(__m128i M, __m128i V);
anatofuz
parents:
diff changeset
1166 /// \endcode
anatofuz
parents:
diff changeset
1167 ///
anatofuz
parents:
diff changeset
1168 /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
anatofuz
parents:
diff changeset
1169 ///
anatofuz
parents:
diff changeset
1170 /// \param M
anatofuz
parents:
diff changeset
1171 /// A 128-bit integer vector containing the bits to be tested.
anatofuz
parents:
diff changeset
1172 /// \param V
anatofuz
parents:
diff changeset
1173 /// A 128-bit integer vector selecting which bits to test in operand \a M.
anatofuz
parents:
diff changeset
1174 /// \returns TRUE if the specified bits are neither all zeros nor all ones;
anatofuz
parents:
diff changeset
1175 /// FALSE otherwise.
anatofuz
parents:
diff changeset
1176 #define _mm_test_mix_ones_zeros(M, V) _mm_testnzc_si128((M), (V))
anatofuz
parents:
diff changeset
1177
anatofuz
parents:
diff changeset
1178 /// Tests whether the specified bits in a 128-bit integer vector are all
anatofuz
parents:
diff changeset
1179 /// zeros.
anatofuz
parents:
diff changeset
1180 ///
anatofuz
parents:
diff changeset
1181 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1182 ///
anatofuz
parents:
diff changeset
1183 /// \code
anatofuz
parents:
diff changeset
1184 /// int _mm_test_all_zeros(__m128i M, __m128i V);
anatofuz
parents:
diff changeset
1185 /// \endcode
anatofuz
parents:
diff changeset
1186 ///
anatofuz
parents:
diff changeset
1187 /// This intrinsic corresponds to the <c> VPTEST / PTEST </c> instruction.
anatofuz
parents:
diff changeset
1188 ///
anatofuz
parents:
diff changeset
1189 /// \param M
anatofuz
parents:
diff changeset
1190 /// A 128-bit integer vector containing the bits to be tested.
anatofuz
parents:
diff changeset
1191 /// \param V
anatofuz
parents:
diff changeset
1192 /// A 128-bit integer vector selecting which bits to test in operand \a M.
anatofuz
parents:
diff changeset
1193 /// \returns TRUE if the specified bits are all zeros; FALSE otherwise.
anatofuz
parents:
diff changeset
1194 #define _mm_test_all_zeros(M, V) _mm_testz_si128 ((M), (V))
anatofuz
parents:
diff changeset
1195
anatofuz
parents:
diff changeset
1196 /* SSE4 64-bit Packed Integer Comparisons. */
anatofuz
parents:
diff changeset
1197 /// Compares each of the corresponding 64-bit values of the 128-bit
anatofuz
parents:
diff changeset
1198 /// integer vectors for equality.
anatofuz
parents:
diff changeset
1199 ///
anatofuz
parents:
diff changeset
1200 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1201 ///
anatofuz
parents:
diff changeset
1202 /// This intrinsic corresponds to the <c> VPCMPEQQ / PCMPEQQ </c> instruction.
anatofuz
parents:
diff changeset
1203 ///
anatofuz
parents:
diff changeset
1204 /// \param __V1
anatofuz
parents:
diff changeset
1205 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
1206 /// \param __V2
anatofuz
parents:
diff changeset
1207 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
1208 /// \returns A 128-bit integer vector containing the comparison results.
anatofuz
parents:
diff changeset
1209 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1210 _mm_cmpeq_epi64(__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
1211 {
anatofuz
parents:
diff changeset
1212 return (__m128i)((__v2di)__V1 == (__v2di)__V2);
anatofuz
parents:
diff changeset
1213 }
anatofuz
parents:
diff changeset
1214
anatofuz
parents:
diff changeset
1215 /* SSE4 Packed Integer Sign-Extension. */
anatofuz
parents:
diff changeset
1216 /// Sign-extends each of the lower eight 8-bit integer elements of a
anatofuz
parents:
diff changeset
1217 /// 128-bit vector of [16 x i8] to 16-bit values and returns them in a
anatofuz
parents:
diff changeset
1218 /// 128-bit vector of [8 x i16]. The upper eight elements of the input vector
anatofuz
parents:
diff changeset
1219 /// are unused.
anatofuz
parents:
diff changeset
1220 ///
anatofuz
parents:
diff changeset
1221 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1222 ///
anatofuz
parents:
diff changeset
1223 /// This intrinsic corresponds to the <c> VPMOVSXBW / PMOVSXBW </c> instruction.
anatofuz
parents:
diff changeset
1224 ///
anatofuz
parents:
diff changeset
1225 /// \param __V
anatofuz
parents:
diff changeset
1226 /// A 128-bit vector of [16 x i8]. The lower eight 8-bit elements are sign-
anatofuz
parents:
diff changeset
1227 /// extended to 16-bit values.
anatofuz
parents:
diff changeset
1228 /// \returns A 128-bit vector of [8 x i16] containing the sign-extended values.
anatofuz
parents:
diff changeset
1229 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1230 _mm_cvtepi8_epi16(__m128i __V)
anatofuz
parents:
diff changeset
1231 {
anatofuz
parents:
diff changeset
1232 /* This function always performs a signed extension, but __v16qi is a char
anatofuz
parents:
diff changeset
1233 which may be signed or unsigned, so use __v16qs. */
anatofuz
parents:
diff changeset
1234 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi);
anatofuz
parents:
diff changeset
1235 }
anatofuz
parents:
diff changeset
1236
anatofuz
parents:
diff changeset
1237 /// Sign-extends each of the lower four 8-bit integer elements of a
anatofuz
parents:
diff changeset
1238 /// 128-bit vector of [16 x i8] to 32-bit values and returns them in a
anatofuz
parents:
diff changeset
1239 /// 128-bit vector of [4 x i32]. The upper twelve elements of the input
anatofuz
parents:
diff changeset
1240 /// vector are unused.
anatofuz
parents:
diff changeset
1241 ///
anatofuz
parents:
diff changeset
1242 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1243 ///
anatofuz
parents:
diff changeset
1244 /// This intrinsic corresponds to the <c> VPMOVSXBD / PMOVSXBD </c> instruction.
anatofuz
parents:
diff changeset
1245 ///
anatofuz
parents:
diff changeset
1246 /// \param __V
anatofuz
parents:
diff changeset
1247 /// A 128-bit vector of [16 x i8]. The lower four 8-bit elements are
anatofuz
parents:
diff changeset
1248 /// sign-extended to 32-bit values.
anatofuz
parents:
diff changeset
1249 /// \returns A 128-bit vector of [4 x i32] containing the sign-extended values.
anatofuz
parents:
diff changeset
1250 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1251 _mm_cvtepi8_epi32(__m128i __V)
anatofuz
parents:
diff changeset
1252 {
anatofuz
parents:
diff changeset
1253 /* This function always performs a signed extension, but __v16qi is a char
anatofuz
parents:
diff changeset
1254 which may be signed or unsigned, so use __v16qs. */
anatofuz
parents:
diff changeset
1255 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1, 2, 3), __v4si);
anatofuz
parents:
diff changeset
1256 }
anatofuz
parents:
diff changeset
1257
anatofuz
parents:
diff changeset
1258 /// Sign-extends each of the lower two 8-bit integer elements of a
anatofuz
parents:
diff changeset
1259 /// 128-bit integer vector of [16 x i8] to 64-bit values and returns them in
anatofuz
parents:
diff changeset
1260 /// a 128-bit vector of [2 x i64]. The upper fourteen elements of the input
anatofuz
parents:
diff changeset
1261 /// vector are unused.
anatofuz
parents:
diff changeset
1262 ///
anatofuz
parents:
diff changeset
1263 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1264 ///
anatofuz
parents:
diff changeset
1265 /// This intrinsic corresponds to the <c> VPMOVSXBQ / PMOVSXBQ </c> instruction.
anatofuz
parents:
diff changeset
1266 ///
anatofuz
parents:
diff changeset
1267 /// \param __V
anatofuz
parents:
diff changeset
1268 /// A 128-bit vector of [16 x i8]. The lower two 8-bit elements are
anatofuz
parents:
diff changeset
1269 /// sign-extended to 64-bit values.
anatofuz
parents:
diff changeset
1270 /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
anatofuz
parents:
diff changeset
1271 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1272 _mm_cvtepi8_epi64(__m128i __V)
anatofuz
parents:
diff changeset
1273 {
anatofuz
parents:
diff changeset
1274 /* This function always performs a signed extension, but __v16qi is a char
anatofuz
parents:
diff changeset
1275 which may be signed or unsigned, so use __v16qs. */
anatofuz
parents:
diff changeset
1276 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qs)__V, (__v16qs)__V, 0, 1), __v2di);
anatofuz
parents:
diff changeset
1277 }
anatofuz
parents:
diff changeset
1278
anatofuz
parents:
diff changeset
1279 /// Sign-extends each of the lower four 16-bit integer elements of a
anatofuz
parents:
diff changeset
1280 /// 128-bit integer vector of [8 x i16] to 32-bit values and returns them in
anatofuz
parents:
diff changeset
1281 /// a 128-bit vector of [4 x i32]. The upper four elements of the input
anatofuz
parents:
diff changeset
1282 /// vector are unused.
anatofuz
parents:
diff changeset
1283 ///
anatofuz
parents:
diff changeset
1284 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1285 ///
anatofuz
parents:
diff changeset
1286 /// This intrinsic corresponds to the <c> VPMOVSXWD / PMOVSXWD </c> instruction.
anatofuz
parents:
diff changeset
1287 ///
anatofuz
parents:
diff changeset
1288 /// \param __V
anatofuz
parents:
diff changeset
1289 /// A 128-bit vector of [8 x i16]. The lower four 16-bit elements are
anatofuz
parents:
diff changeset
1290 /// sign-extended to 32-bit values.
anatofuz
parents:
diff changeset
1291 /// \returns A 128-bit vector of [4 x i32] containing the sign-extended values.
anatofuz
parents:
diff changeset
1292 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1293 _mm_cvtepi16_epi32(__m128i __V)
anatofuz
parents:
diff changeset
1294 {
anatofuz
parents:
diff changeset
1295 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1, 2, 3), __v4si);
anatofuz
parents:
diff changeset
1296 }
anatofuz
parents:
diff changeset
1297
anatofuz
parents:
diff changeset
1298 /// Sign-extends each of the lower two 16-bit integer elements of a
anatofuz
parents:
diff changeset
1299 /// 128-bit integer vector of [8 x i16] to 64-bit values and returns them in
anatofuz
parents:
diff changeset
1300 /// a 128-bit vector of [2 x i64]. The upper six elements of the input
anatofuz
parents:
diff changeset
1301 /// vector are unused.
anatofuz
parents:
diff changeset
1302 ///
anatofuz
parents:
diff changeset
1303 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1304 ///
anatofuz
parents:
diff changeset
1305 /// This intrinsic corresponds to the <c> VPMOVSXWQ / PMOVSXWQ </c> instruction.
anatofuz
parents:
diff changeset
1306 ///
anatofuz
parents:
diff changeset
1307 /// \param __V
anatofuz
parents:
diff changeset
1308 /// A 128-bit vector of [8 x i16]. The lower two 16-bit elements are
anatofuz
parents:
diff changeset
1309 /// sign-extended to 64-bit values.
anatofuz
parents:
diff changeset
1310 /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
anatofuz
parents:
diff changeset
1311 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1312 _mm_cvtepi16_epi64(__m128i __V)
anatofuz
parents:
diff changeset
1313 {
anatofuz
parents:
diff changeset
1314 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hi)__V, (__v8hi)__V, 0, 1), __v2di);
anatofuz
parents:
diff changeset
1315 }
anatofuz
parents:
diff changeset
1316
anatofuz
parents:
diff changeset
1317 /// Sign-extends each of the lower two 32-bit integer elements of a
anatofuz
parents:
diff changeset
1318 /// 128-bit integer vector of [4 x i32] to 64-bit values and returns them in
anatofuz
parents:
diff changeset
1319 /// a 128-bit vector of [2 x i64]. The upper two elements of the input vector
anatofuz
parents:
diff changeset
1320 /// are unused.
anatofuz
parents:
diff changeset
1321 ///
anatofuz
parents:
diff changeset
1322 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1323 ///
anatofuz
parents:
diff changeset
1324 /// This intrinsic corresponds to the <c> VPMOVSXDQ / PMOVSXDQ </c> instruction.
anatofuz
parents:
diff changeset
1325 ///
anatofuz
parents:
diff changeset
1326 /// \param __V
anatofuz
parents:
diff changeset
1327 /// A 128-bit vector of [4 x i32]. The lower two 32-bit elements are
anatofuz
parents:
diff changeset
1328 /// sign-extended to 64-bit values.
anatofuz
parents:
diff changeset
1329 /// \returns A 128-bit vector of [2 x i64] containing the sign-extended values.
anatofuz
parents:
diff changeset
1330 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1331 _mm_cvtepi32_epi64(__m128i __V)
anatofuz
parents:
diff changeset
1332 {
anatofuz
parents:
diff changeset
1333 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v4si)__V, (__v4si)__V, 0, 1), __v2di);
anatofuz
parents:
diff changeset
1334 }
anatofuz
parents:
diff changeset
1335
anatofuz
parents:
diff changeset
1336 /* SSE4 Packed Integer Zero-Extension. */
anatofuz
parents:
diff changeset
1337 /// Zero-extends each of the lower eight 8-bit integer elements of a
anatofuz
parents:
diff changeset
1338 /// 128-bit vector of [16 x i8] to 16-bit values and returns them in a
anatofuz
parents:
diff changeset
1339 /// 128-bit vector of [8 x i16]. The upper eight elements of the input vector
anatofuz
parents:
diff changeset
1340 /// are unused.
anatofuz
parents:
diff changeset
1341 ///
anatofuz
parents:
diff changeset
1342 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1343 ///
anatofuz
parents:
diff changeset
1344 /// This intrinsic corresponds to the <c> VPMOVZXBW / PMOVZXBW </c> instruction.
anatofuz
parents:
diff changeset
1345 ///
anatofuz
parents:
diff changeset
1346 /// \param __V
anatofuz
parents:
diff changeset
1347 /// A 128-bit vector of [16 x i8]. The lower eight 8-bit elements are
anatofuz
parents:
diff changeset
1348 /// zero-extended to 16-bit values.
anatofuz
parents:
diff changeset
1349 /// \returns A 128-bit vector of [8 x i16] containing the zero-extended values.
anatofuz
parents:
diff changeset
1350 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1351 _mm_cvtepu8_epi16(__m128i __V)
anatofuz
parents:
diff changeset
1352 {
anatofuz
parents:
diff changeset
1353 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3, 4, 5, 6, 7), __v8hi);
anatofuz
parents:
diff changeset
1354 }
anatofuz
parents:
diff changeset
1355
anatofuz
parents:
diff changeset
1356 /// Zero-extends each of the lower four 8-bit integer elements of a
anatofuz
parents:
diff changeset
1357 /// 128-bit vector of [16 x i8] to 32-bit values and returns them in a
anatofuz
parents:
diff changeset
1358 /// 128-bit vector of [4 x i32]. The upper twelve elements of the input
anatofuz
parents:
diff changeset
1359 /// vector are unused.
anatofuz
parents:
diff changeset
1360 ///
anatofuz
parents:
diff changeset
1361 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1362 ///
anatofuz
parents:
diff changeset
1363 /// This intrinsic corresponds to the <c> VPMOVZXBD / PMOVZXBD </c> instruction.
anatofuz
parents:
diff changeset
1364 ///
anatofuz
parents:
diff changeset
1365 /// \param __V
anatofuz
parents:
diff changeset
1366 /// A 128-bit vector of [16 x i8]. The lower four 8-bit elements are
anatofuz
parents:
diff changeset
1367 /// zero-extended to 32-bit values.
anatofuz
parents:
diff changeset
1368 /// \returns A 128-bit vector of [4 x i32] containing the zero-extended values.
anatofuz
parents:
diff changeset
1369 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1370 _mm_cvtepu8_epi32(__m128i __V)
anatofuz
parents:
diff changeset
1371 {
anatofuz
parents:
diff changeset
1372 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1, 2, 3), __v4si);
anatofuz
parents:
diff changeset
1373 }
anatofuz
parents:
diff changeset
1374
anatofuz
parents:
diff changeset
1375 /// Zero-extends each of the lower two 8-bit integer elements of a
anatofuz
parents:
diff changeset
1376 /// 128-bit integer vector of [16 x i8] to 64-bit values and returns them in
anatofuz
parents:
diff changeset
1377 /// a 128-bit vector of [2 x i64]. The upper fourteen elements of the input
anatofuz
parents:
diff changeset
1378 /// vector are unused.
anatofuz
parents:
diff changeset
1379 ///
anatofuz
parents:
diff changeset
1380 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1381 ///
anatofuz
parents:
diff changeset
1382 /// This intrinsic corresponds to the <c> VPMOVZXBQ / PMOVZXBQ </c> instruction.
anatofuz
parents:
diff changeset
1383 ///
anatofuz
parents:
diff changeset
1384 /// \param __V
anatofuz
parents:
diff changeset
1385 /// A 128-bit vector of [16 x i8]. The lower two 8-bit elements are
anatofuz
parents:
diff changeset
1386 /// zero-extended to 64-bit values.
anatofuz
parents:
diff changeset
1387 /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
anatofuz
parents:
diff changeset
1388 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1389 _mm_cvtepu8_epi64(__m128i __V)
anatofuz
parents:
diff changeset
1390 {
anatofuz
parents:
diff changeset
1391 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v16qu)__V, (__v16qu)__V, 0, 1), __v2di);
anatofuz
parents:
diff changeset
1392 }
anatofuz
parents:
diff changeset
1393
anatofuz
parents:
diff changeset
1394 /// Zero-extends each of the lower four 16-bit integer elements of a
anatofuz
parents:
diff changeset
1395 /// 128-bit integer vector of [8 x i16] to 32-bit values and returns them in
anatofuz
parents:
diff changeset
1396 /// a 128-bit vector of [4 x i32]. The upper four elements of the input
anatofuz
parents:
diff changeset
1397 /// vector are unused.
anatofuz
parents:
diff changeset
1398 ///
anatofuz
parents:
diff changeset
1399 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1400 ///
anatofuz
parents:
diff changeset
1401 /// This intrinsic corresponds to the <c> VPMOVZXWD / PMOVZXWD </c> instruction.
anatofuz
parents:
diff changeset
1402 ///
anatofuz
parents:
diff changeset
1403 /// \param __V
anatofuz
parents:
diff changeset
1404 /// A 128-bit vector of [8 x i16]. The lower four 16-bit elements are
anatofuz
parents:
diff changeset
1405 /// zero-extended to 32-bit values.
anatofuz
parents:
diff changeset
1406 /// \returns A 128-bit vector of [4 x i32] containing the zero-extended values.
anatofuz
parents:
diff changeset
1407 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1408 _mm_cvtepu16_epi32(__m128i __V)
anatofuz
parents:
diff changeset
1409 {
anatofuz
parents:
diff changeset
1410 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1, 2, 3), __v4si);
anatofuz
parents:
diff changeset
1411 }
anatofuz
parents:
diff changeset
1412
anatofuz
parents:
diff changeset
1413 /// Zero-extends each of the lower two 16-bit integer elements of a
anatofuz
parents:
diff changeset
1414 /// 128-bit integer vector of [8 x i16] to 64-bit values and returns them in
anatofuz
parents:
diff changeset
1415 /// a 128-bit vector of [2 x i64]. The upper six elements of the input vector
anatofuz
parents:
diff changeset
1416 /// are unused.
anatofuz
parents:
diff changeset
1417 ///
anatofuz
parents:
diff changeset
1418 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1419 ///
anatofuz
parents:
diff changeset
1420 /// This intrinsic corresponds to the <c> VPMOVZXWQ / PMOVZXWQ </c> instruction.
anatofuz
parents:
diff changeset
1421 ///
anatofuz
parents:
diff changeset
1422 /// \param __V
anatofuz
parents:
diff changeset
1423 /// A 128-bit vector of [8 x i16]. The lower two 16-bit elements are
anatofuz
parents:
diff changeset
1424 /// zero-extended to 64-bit values.
anatofuz
parents:
diff changeset
1425 /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
anatofuz
parents:
diff changeset
1426 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1427 _mm_cvtepu16_epi64(__m128i __V)
anatofuz
parents:
diff changeset
1428 {
anatofuz
parents:
diff changeset
1429 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v8hu)__V, (__v8hu)__V, 0, 1), __v2di);
anatofuz
parents:
diff changeset
1430 }
anatofuz
parents:
diff changeset
1431
anatofuz
parents:
diff changeset
1432 /// Zero-extends each of the lower two 32-bit integer elements of a
anatofuz
parents:
diff changeset
1433 /// 128-bit integer vector of [4 x i32] to 64-bit values and returns them in
anatofuz
parents:
diff changeset
1434 /// a 128-bit vector of [2 x i64]. The upper two elements of the input vector
anatofuz
parents:
diff changeset
1435 /// are unused.
anatofuz
parents:
diff changeset
1436 ///
anatofuz
parents:
diff changeset
1437 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1438 ///
anatofuz
parents:
diff changeset
1439 /// This intrinsic corresponds to the <c> VPMOVZXDQ / PMOVZXDQ </c> instruction.
anatofuz
parents:
diff changeset
1440 ///
anatofuz
parents:
diff changeset
1441 /// \param __V
anatofuz
parents:
diff changeset
1442 /// A 128-bit vector of [4 x i32]. The lower two 32-bit elements are
anatofuz
parents:
diff changeset
1443 /// zero-extended to 64-bit values.
anatofuz
parents:
diff changeset
1444 /// \returns A 128-bit vector of [2 x i64] containing the zero-extended values.
anatofuz
parents:
diff changeset
1445 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1446 _mm_cvtepu32_epi64(__m128i __V)
anatofuz
parents:
diff changeset
1447 {
anatofuz
parents:
diff changeset
1448 return (__m128i)__builtin_convertvector(__builtin_shufflevector((__v4su)__V, (__v4su)__V, 0, 1), __v2di);
anatofuz
parents:
diff changeset
1449 }
anatofuz
parents:
diff changeset
1450
anatofuz
parents:
diff changeset
1451 /* SSE4 Pack with Unsigned Saturation. */
anatofuz
parents:
diff changeset
1452 /// Converts 32-bit signed integers from both 128-bit integer vector
anatofuz
parents:
diff changeset
1453 /// operands into 16-bit unsigned integers, and returns the packed result.
anatofuz
parents:
diff changeset
1454 /// Values greater than 0xFFFF are saturated to 0xFFFF. Values less than
anatofuz
parents:
diff changeset
1455 /// 0x0000 are saturated to 0x0000.
anatofuz
parents:
diff changeset
1456 ///
anatofuz
parents:
diff changeset
1457 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1458 ///
anatofuz
parents:
diff changeset
1459 /// This intrinsic corresponds to the <c> VPACKUSDW / PACKUSDW </c> instruction.
anatofuz
parents:
diff changeset
1460 ///
anatofuz
parents:
diff changeset
1461 /// \param __V1
anatofuz
parents:
diff changeset
1462 /// A 128-bit vector of [4 x i32]. Each 32-bit element is treated as a
anatofuz
parents:
diff changeset
1463 /// signed integer and is converted to a 16-bit unsigned integer with
anatofuz
parents:
diff changeset
1464 /// saturation. Values greater than 0xFFFF are saturated to 0xFFFF. Values
anatofuz
parents:
diff changeset
1465 /// less than 0x0000 are saturated to 0x0000. The converted [4 x i16] values
anatofuz
parents:
diff changeset
1466 /// are written to the lower 64 bits of the result.
anatofuz
parents:
diff changeset
1467 /// \param __V2
anatofuz
parents:
diff changeset
1468 /// A 128-bit vector of [4 x i32]. Each 32-bit element is treated as a
anatofuz
parents:
diff changeset
1469 /// signed integer and is converted to a 16-bit unsigned integer with
anatofuz
parents:
diff changeset
1470 /// saturation. Values greater than 0xFFFF are saturated to 0xFFFF. Values
anatofuz
parents:
diff changeset
1471 /// less than 0x0000 are saturated to 0x0000. The converted [4 x i16] values
anatofuz
parents:
diff changeset
1472 /// are written to the higher 64 bits of the result.
anatofuz
parents:
diff changeset
1473 /// \returns A 128-bit vector of [8 x i16] containing the converted values.
anatofuz
parents:
diff changeset
1474 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1475 _mm_packus_epi32(__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
1476 {
anatofuz
parents:
diff changeset
1477 return (__m128i) __builtin_ia32_packusdw128((__v4si)__V1, (__v4si)__V2);
anatofuz
parents:
diff changeset
1478 }
anatofuz
parents:
diff changeset
1479
anatofuz
parents:
diff changeset
1480 /* SSE4 Multiple Packed Sums of Absolute Difference. */
anatofuz
parents:
diff changeset
1481 /// Subtracts 8-bit unsigned integer values and computes the absolute
anatofuz
parents:
diff changeset
1482 /// values of the differences to the corresponding bits in the destination.
anatofuz
parents:
diff changeset
1483 /// Then sums of the absolute differences are returned according to the bit
anatofuz
parents:
diff changeset
1484 /// fields in the immediate operand.
anatofuz
parents:
diff changeset
1485 ///
anatofuz
parents:
diff changeset
1486 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1487 ///
anatofuz
parents:
diff changeset
1488 /// \code
anatofuz
parents:
diff changeset
1489 /// __m128i _mm_mpsadbw_epu8(__m128i X, __m128i Y, const int M);
anatofuz
parents:
diff changeset
1490 /// \endcode
anatofuz
parents:
diff changeset
1491 ///
anatofuz
parents:
diff changeset
1492 /// This intrinsic corresponds to the <c> VMPSADBW / MPSADBW </c> instruction.
anatofuz
parents:
diff changeset
1493 ///
anatofuz
parents:
diff changeset
1494 /// \param X
anatofuz
parents:
diff changeset
1495 /// A 128-bit vector of [16 x i8].
anatofuz
parents:
diff changeset
1496 /// \param Y
anatofuz
parents:
diff changeset
1497 /// A 128-bit vector of [16 x i8].
anatofuz
parents:
diff changeset
1498 /// \param M
anatofuz
parents:
diff changeset
1499 /// An 8-bit immediate operand specifying how the absolute differences are to
anatofuz
parents:
diff changeset
1500 /// be calculated, according to the following algorithm:
anatofuz
parents:
diff changeset
1501 /// \code
anatofuz
parents:
diff changeset
1502 /// // M2 represents bit 2 of the immediate operand
anatofuz
parents:
diff changeset
1503 /// // M10 represents bits [1:0] of the immediate operand
anatofuz
parents:
diff changeset
1504 /// i = M2 * 4;
anatofuz
parents:
diff changeset
1505 /// j = M10 * 4;
anatofuz
parents:
diff changeset
1506 /// for (k = 0; k < 8; k = k + 1) {
anatofuz
parents:
diff changeset
1507 /// d0 = abs(X[i + k + 0] - Y[j + 0]);
anatofuz
parents:
diff changeset
1508 /// d1 = abs(X[i + k + 1] - Y[j + 1]);
anatofuz
parents:
diff changeset
1509 /// d2 = abs(X[i + k + 2] - Y[j + 2]);
anatofuz
parents:
diff changeset
1510 /// d3 = abs(X[i + k + 3] - Y[j + 3]);
anatofuz
parents:
diff changeset
1511 /// r[k] = d0 + d1 + d2 + d3;
anatofuz
parents:
diff changeset
1512 /// }
anatofuz
parents:
diff changeset
1513 /// \endcode
anatofuz
parents:
diff changeset
1514 /// \returns A 128-bit integer vector containing the sums of the sets of
anatofuz
parents:
diff changeset
1515 /// absolute differences between both operands.
anatofuz
parents:
diff changeset
1516 #define _mm_mpsadbw_epu8(X, Y, M) \
anatofuz
parents:
diff changeset
1517 (__m128i) __builtin_ia32_mpsadbw128((__v16qi)(__m128i)(X), \
anatofuz
parents:
diff changeset
1518 (__v16qi)(__m128i)(Y), (M))
anatofuz
parents:
diff changeset
1519
anatofuz
parents:
diff changeset
1520 /// Finds the minimum unsigned 16-bit element in the input 128-bit
anatofuz
parents:
diff changeset
1521 /// vector of [8 x u16] and returns it and along with its index.
anatofuz
parents:
diff changeset
1522 ///
anatofuz
parents:
diff changeset
1523 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1524 ///
anatofuz
parents:
diff changeset
1525 /// This intrinsic corresponds to the <c> VPHMINPOSUW / PHMINPOSUW </c>
anatofuz
parents:
diff changeset
1526 /// instruction.
anatofuz
parents:
diff changeset
1527 ///
anatofuz
parents:
diff changeset
1528 /// \param __V
anatofuz
parents:
diff changeset
1529 /// A 128-bit vector of [8 x u16].
anatofuz
parents:
diff changeset
1530 /// \returns A 128-bit value where bits [15:0] contain the minimum value found
anatofuz
parents:
diff changeset
1531 /// in parameter \a __V, bits [18:16] contain the index of the minimum value
anatofuz
parents:
diff changeset
1532 /// and the remaining bits are set to 0.
anatofuz
parents:
diff changeset
1533 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1534 _mm_minpos_epu16(__m128i __V)
anatofuz
parents:
diff changeset
1535 {
anatofuz
parents:
diff changeset
1536 return (__m128i) __builtin_ia32_phminposuw128((__v8hi)__V);
anatofuz
parents:
diff changeset
1537 }
anatofuz
parents:
diff changeset
1538
anatofuz
parents:
diff changeset
1539 /* Handle the sse4.2 definitions here. */
anatofuz
parents:
diff changeset
1540
anatofuz
parents:
diff changeset
1541 /* These definitions are normally in nmmintrin.h, but gcc puts them in here
anatofuz
parents:
diff changeset
1542 so we'll do the same. */
anatofuz
parents:
diff changeset
1543
anatofuz
parents:
diff changeset
1544 #undef __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
1545 #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse4.2")))
anatofuz
parents:
diff changeset
1546
anatofuz
parents:
diff changeset
1547 /* These specify the type of data that we're comparing. */
anatofuz
parents:
diff changeset
1548 #define _SIDD_UBYTE_OPS 0x00
anatofuz
parents:
diff changeset
1549 #define _SIDD_UWORD_OPS 0x01
anatofuz
parents:
diff changeset
1550 #define _SIDD_SBYTE_OPS 0x02
anatofuz
parents:
diff changeset
1551 #define _SIDD_SWORD_OPS 0x03
anatofuz
parents:
diff changeset
1552
anatofuz
parents:
diff changeset
1553 /* These specify the type of comparison operation. */
anatofuz
parents:
diff changeset
1554 #define _SIDD_CMP_EQUAL_ANY 0x00
anatofuz
parents:
diff changeset
1555 #define _SIDD_CMP_RANGES 0x04
anatofuz
parents:
diff changeset
1556 #define _SIDD_CMP_EQUAL_EACH 0x08
anatofuz
parents:
diff changeset
1557 #define _SIDD_CMP_EQUAL_ORDERED 0x0c
anatofuz
parents:
diff changeset
1558
anatofuz
parents:
diff changeset
1559 /* These macros specify the polarity of the operation. */
anatofuz
parents:
diff changeset
1560 #define _SIDD_POSITIVE_POLARITY 0x00
anatofuz
parents:
diff changeset
1561 #define _SIDD_NEGATIVE_POLARITY 0x10
anatofuz
parents:
diff changeset
1562 #define _SIDD_MASKED_POSITIVE_POLARITY 0x20
anatofuz
parents:
diff changeset
1563 #define _SIDD_MASKED_NEGATIVE_POLARITY 0x30
anatofuz
parents:
diff changeset
1564
anatofuz
parents:
diff changeset
1565 /* These macros are used in _mm_cmpXstri() to specify the return. */
anatofuz
parents:
diff changeset
1566 #define _SIDD_LEAST_SIGNIFICANT 0x00
anatofuz
parents:
diff changeset
1567 #define _SIDD_MOST_SIGNIFICANT 0x40
anatofuz
parents:
diff changeset
1568
anatofuz
parents:
diff changeset
1569 /* These macros are used in _mm_cmpXstri() to specify the return. */
anatofuz
parents:
diff changeset
1570 #define _SIDD_BIT_MASK 0x00
anatofuz
parents:
diff changeset
1571 #define _SIDD_UNIT_MASK 0x40
anatofuz
parents:
diff changeset
1572
anatofuz
parents:
diff changeset
1573 /* SSE4.2 Packed Comparison Intrinsics. */
anatofuz
parents:
diff changeset
1574 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1575 /// data with implicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1576 /// \a A and \a B. Returns a 128-bit integer vector representing the result
anatofuz
parents:
diff changeset
1577 /// mask of the comparison.
anatofuz
parents:
diff changeset
1578 ///
anatofuz
parents:
diff changeset
1579 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1580 ///
anatofuz
parents:
diff changeset
1581 /// \code
anatofuz
parents:
diff changeset
1582 /// __m128i _mm_cmpistrm(__m128i A, __m128i B, const int M);
anatofuz
parents:
diff changeset
1583 /// \endcode
anatofuz
parents:
diff changeset
1584 ///
anatofuz
parents:
diff changeset
1585 /// This intrinsic corresponds to the <c> VPCMPISTRM / PCMPISTRM </c>
anatofuz
parents:
diff changeset
1586 /// instruction.
anatofuz
parents:
diff changeset
1587 ///
anatofuz
parents:
diff changeset
1588 /// \param A
anatofuz
parents:
diff changeset
1589 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1590 /// compared.
anatofuz
parents:
diff changeset
1591 /// \param B
anatofuz
parents:
diff changeset
1592 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1593 /// compared.
anatofuz
parents:
diff changeset
1594 /// \param M
anatofuz
parents:
diff changeset
1595 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1596 /// words, the type of comparison to perform, and the format of the return
anatofuz
parents:
diff changeset
1597 /// value. \n
anatofuz
parents:
diff changeset
1598 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1599 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1600 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1601 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1602 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1603 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1604 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1605 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1606 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1607 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1608 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1609 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1610 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1611 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1612 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1613 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1614 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1615 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1616 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1617 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1618 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
1619 /// Bit [6]: Determines whether the result is zero-extended or expanded to 16
anatofuz
parents:
diff changeset
1620 /// bytes. \n
anatofuz
parents:
diff changeset
1621 /// 0: The result is zero-extended to 16 bytes. \n
anatofuz
parents:
diff changeset
1622 /// 1: The result is expanded to 16 bytes (this expansion is performed by
anatofuz
parents:
diff changeset
1623 /// repeating each bit 8 or 16 times).
anatofuz
parents:
diff changeset
1624 /// \returns Returns a 128-bit integer vector representing the result mask of
anatofuz
parents:
diff changeset
1625 /// the comparison.
anatofuz
parents:
diff changeset
1626 #define _mm_cmpistrm(A, B, M) \
anatofuz
parents:
diff changeset
1627 (__m128i)__builtin_ia32_pcmpistrm128((__v16qi)(__m128i)(A), \
anatofuz
parents:
diff changeset
1628 (__v16qi)(__m128i)(B), (int)(M))
anatofuz
parents:
diff changeset
1629
anatofuz
parents:
diff changeset
1630 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1631 /// data with implicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1632 /// \a A and \a B. Returns an integer representing the result index of the
anatofuz
parents:
diff changeset
1633 /// comparison.
anatofuz
parents:
diff changeset
1634 ///
anatofuz
parents:
diff changeset
1635 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1636 ///
anatofuz
parents:
diff changeset
1637 /// \code
anatofuz
parents:
diff changeset
1638 /// int _mm_cmpistri(__m128i A, __m128i B, const int M);
anatofuz
parents:
diff changeset
1639 /// \endcode
anatofuz
parents:
diff changeset
1640 ///
anatofuz
parents:
diff changeset
1641 /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
anatofuz
parents:
diff changeset
1642 /// instruction.
anatofuz
parents:
diff changeset
1643 ///
anatofuz
parents:
diff changeset
1644 /// \param A
anatofuz
parents:
diff changeset
1645 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1646 /// compared.
anatofuz
parents:
diff changeset
1647 /// \param B
anatofuz
parents:
diff changeset
1648 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1649 /// compared.
anatofuz
parents:
diff changeset
1650 /// \param M
anatofuz
parents:
diff changeset
1651 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1652 /// words, the type of comparison to perform, and the format of the return
anatofuz
parents:
diff changeset
1653 /// value. \n
anatofuz
parents:
diff changeset
1654 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1655 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1656 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1657 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1658 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1659 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1660 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1661 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1662 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1663 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1664 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1665 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1666 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1667 /// 11: Substring: Search B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1668 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1669 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1670 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1671 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1672 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1673 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1674 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
1675 /// Bit [6]: Determines whether the index of the lowest set bit or the
anatofuz
parents:
diff changeset
1676 /// highest set bit is returned. \n
anatofuz
parents:
diff changeset
1677 /// 0: The index of the least significant set bit. \n
anatofuz
parents:
diff changeset
1678 /// 1: The index of the most significant set bit. \n
anatofuz
parents:
diff changeset
1679 /// \returns Returns an integer representing the result index of the comparison.
anatofuz
parents:
diff changeset
1680 #define _mm_cmpistri(A, B, M) \
anatofuz
parents:
diff changeset
1681 (int)__builtin_ia32_pcmpistri128((__v16qi)(__m128i)(A), \
anatofuz
parents:
diff changeset
1682 (__v16qi)(__m128i)(B), (int)(M))
anatofuz
parents:
diff changeset
1683
anatofuz
parents:
diff changeset
1684 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1685 /// data with explicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1686 /// \a A and \a B. Returns a 128-bit integer vector representing the result
anatofuz
parents:
diff changeset
1687 /// mask of the comparison.
anatofuz
parents:
diff changeset
1688 ///
anatofuz
parents:
diff changeset
1689 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1690 ///
anatofuz
parents:
diff changeset
1691 /// \code
anatofuz
parents:
diff changeset
1692 /// __m128i _mm_cmpestrm(__m128i A, int LA, __m128i B, int LB, const int M);
anatofuz
parents:
diff changeset
1693 /// \endcode
anatofuz
parents:
diff changeset
1694 ///
anatofuz
parents:
diff changeset
1695 /// This intrinsic corresponds to the <c> VPCMPESTRM / PCMPESTRM </c>
anatofuz
parents:
diff changeset
1696 /// instruction.
anatofuz
parents:
diff changeset
1697 ///
anatofuz
parents:
diff changeset
1698 /// \param A
anatofuz
parents:
diff changeset
1699 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1700 /// compared.
anatofuz
parents:
diff changeset
1701 /// \param LA
anatofuz
parents:
diff changeset
1702 /// An integer that specifies the length of the string in \a A.
anatofuz
parents:
diff changeset
1703 /// \param B
anatofuz
parents:
diff changeset
1704 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1705 /// compared.
anatofuz
parents:
diff changeset
1706 /// \param LB
anatofuz
parents:
diff changeset
1707 /// An integer that specifies the length of the string in \a B.
anatofuz
parents:
diff changeset
1708 /// \param M
anatofuz
parents:
diff changeset
1709 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1710 /// words, the type of comparison to perform, and the format of the return
anatofuz
parents:
diff changeset
1711 /// value. \n
anatofuz
parents:
diff changeset
1712 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1713 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1714 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1715 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1716 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1717 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1718 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1719 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1720 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1721 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1722 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1723 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1724 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1725 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1726 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1727 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1728 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1729 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1730 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1731 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1732 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
1733 /// Bit [6]: Determines whether the result is zero-extended or expanded to 16
anatofuz
parents:
diff changeset
1734 /// bytes. \n
anatofuz
parents:
diff changeset
1735 /// 0: The result is zero-extended to 16 bytes. \n
anatofuz
parents:
diff changeset
1736 /// 1: The result is expanded to 16 bytes (this expansion is performed by
anatofuz
parents:
diff changeset
1737 /// repeating each bit 8 or 16 times). \n
anatofuz
parents:
diff changeset
1738 /// \returns Returns a 128-bit integer vector representing the result mask of
anatofuz
parents:
diff changeset
1739 /// the comparison.
anatofuz
parents:
diff changeset
1740 #define _mm_cmpestrm(A, LA, B, LB, M) \
anatofuz
parents:
diff changeset
1741 (__m128i)__builtin_ia32_pcmpestrm128((__v16qi)(__m128i)(A), (int)(LA), \
anatofuz
parents:
diff changeset
1742 (__v16qi)(__m128i)(B), (int)(LB), \
anatofuz
parents:
diff changeset
1743 (int)(M))
anatofuz
parents:
diff changeset
1744
anatofuz
parents:
diff changeset
1745 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1746 /// data with explicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1747 /// \a A and \a B. Returns an integer representing the result index of the
anatofuz
parents:
diff changeset
1748 /// comparison.
anatofuz
parents:
diff changeset
1749 ///
anatofuz
parents:
diff changeset
1750 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1751 ///
anatofuz
parents:
diff changeset
1752 /// \code
anatofuz
parents:
diff changeset
1753 /// int _mm_cmpestri(__m128i A, int LA, __m128i B, int LB, const int M);
anatofuz
parents:
diff changeset
1754 /// \endcode
anatofuz
parents:
diff changeset
1755 ///
anatofuz
parents:
diff changeset
1756 /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
anatofuz
parents:
diff changeset
1757 /// instruction.
anatofuz
parents:
diff changeset
1758 ///
anatofuz
parents:
diff changeset
1759 /// \param A
anatofuz
parents:
diff changeset
1760 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1761 /// compared.
anatofuz
parents:
diff changeset
1762 /// \param LA
anatofuz
parents:
diff changeset
1763 /// An integer that specifies the length of the string in \a A.
anatofuz
parents:
diff changeset
1764 /// \param B
anatofuz
parents:
diff changeset
1765 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1766 /// compared.
anatofuz
parents:
diff changeset
1767 /// \param LB
anatofuz
parents:
diff changeset
1768 /// An integer that specifies the length of the string in \a B.
anatofuz
parents:
diff changeset
1769 /// \param M
anatofuz
parents:
diff changeset
1770 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1771 /// words, the type of comparison to perform, and the format of the return
anatofuz
parents:
diff changeset
1772 /// value. \n
anatofuz
parents:
diff changeset
1773 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1774 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1775 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1776 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1777 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1778 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1779 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1780 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1781 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1782 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1783 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1784 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1785 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1786 /// 11: Substring: Search B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1787 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1788 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1789 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1790 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1791 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1792 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1793 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
1794 /// Bit [6]: Determines whether the index of the lowest set bit or the
anatofuz
parents:
diff changeset
1795 /// highest set bit is returned. \n
anatofuz
parents:
diff changeset
1796 /// 0: The index of the least significant set bit. \n
anatofuz
parents:
diff changeset
1797 /// 1: The index of the most significant set bit. \n
anatofuz
parents:
diff changeset
1798 /// \returns Returns an integer representing the result index of the comparison.
anatofuz
parents:
diff changeset
1799 #define _mm_cmpestri(A, LA, B, LB, M) \
anatofuz
parents:
diff changeset
1800 (int)__builtin_ia32_pcmpestri128((__v16qi)(__m128i)(A), (int)(LA), \
anatofuz
parents:
diff changeset
1801 (__v16qi)(__m128i)(B), (int)(LB), \
anatofuz
parents:
diff changeset
1802 (int)(M))
anatofuz
parents:
diff changeset
1803
anatofuz
parents:
diff changeset
1804 /* SSE4.2 Packed Comparison Intrinsics and EFlag Reading. */
anatofuz
parents:
diff changeset
1805 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1806 /// data with implicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1807 /// \a A and \a B. Returns 1 if the bit mask is zero and the length of the
anatofuz
parents:
diff changeset
1808 /// string in \a B is the maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
1809 ///
anatofuz
parents:
diff changeset
1810 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1811 ///
anatofuz
parents:
diff changeset
1812 /// \code
anatofuz
parents:
diff changeset
1813 /// int _mm_cmpistra(__m128i A, __m128i B, const int M);
anatofuz
parents:
diff changeset
1814 /// \endcode
anatofuz
parents:
diff changeset
1815 ///
anatofuz
parents:
diff changeset
1816 /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
anatofuz
parents:
diff changeset
1817 /// instruction.
anatofuz
parents:
diff changeset
1818 ///
anatofuz
parents:
diff changeset
1819 /// \param A
anatofuz
parents:
diff changeset
1820 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1821 /// compared.
anatofuz
parents:
diff changeset
1822 /// \param B
anatofuz
parents:
diff changeset
1823 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1824 /// compared.
anatofuz
parents:
diff changeset
1825 /// \param M
anatofuz
parents:
diff changeset
1826 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1827 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
1828 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1829 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1830 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1831 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1832 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1833 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1834 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1835 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1836 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1837 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1838 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1839 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1840 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1841 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1842 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1843 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1844 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1845 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1846 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1847 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1848 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
1849 /// \returns Returns 1 if the bit mask is zero and the length of the string in
anatofuz
parents:
diff changeset
1850 /// \a B is the maximum; otherwise, returns 0.
anatofuz
parents:
diff changeset
1851 #define _mm_cmpistra(A, B, M) \
anatofuz
parents:
diff changeset
1852 (int)__builtin_ia32_pcmpistria128((__v16qi)(__m128i)(A), \
anatofuz
parents:
diff changeset
1853 (__v16qi)(__m128i)(B), (int)(M))
anatofuz
parents:
diff changeset
1854
anatofuz
parents:
diff changeset
1855 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1856 /// data with implicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1857 /// \a A and \a B. Returns 1 if the bit mask is non-zero, otherwise, returns
anatofuz
parents:
diff changeset
1858 /// 0.
anatofuz
parents:
diff changeset
1859 ///
anatofuz
parents:
diff changeset
1860 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1861 ///
anatofuz
parents:
diff changeset
1862 /// \code
anatofuz
parents:
diff changeset
1863 /// int _mm_cmpistrc(__m128i A, __m128i B, const int M);
anatofuz
parents:
diff changeset
1864 /// \endcode
anatofuz
parents:
diff changeset
1865 ///
anatofuz
parents:
diff changeset
1866 /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
anatofuz
parents:
diff changeset
1867 /// instruction.
anatofuz
parents:
diff changeset
1868 ///
anatofuz
parents:
diff changeset
1869 /// \param A
anatofuz
parents:
diff changeset
1870 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1871 /// compared.
anatofuz
parents:
diff changeset
1872 /// \param B
anatofuz
parents:
diff changeset
1873 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1874 /// compared.
anatofuz
parents:
diff changeset
1875 /// \param M
anatofuz
parents:
diff changeset
1876 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1877 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
1878 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1879 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1880 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1881 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1882 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1883 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1884 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1885 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1886 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1887 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1888 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1889 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1890 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1891 /// 11: Substring: Search B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1892 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1893 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1894 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1895 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1896 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1897 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1898 /// to the size of \a A or \a B.
anatofuz
parents:
diff changeset
1899 /// \returns Returns 1 if the bit mask is non-zero, otherwise, returns 0.
anatofuz
parents:
diff changeset
1900 #define _mm_cmpistrc(A, B, M) \
anatofuz
parents:
diff changeset
1901 (int)__builtin_ia32_pcmpistric128((__v16qi)(__m128i)(A), \
anatofuz
parents:
diff changeset
1902 (__v16qi)(__m128i)(B), (int)(M))
anatofuz
parents:
diff changeset
1903
anatofuz
parents:
diff changeset
1904 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1905 /// data with implicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1906 /// \a A and \a B. Returns bit 0 of the resulting bit mask.
anatofuz
parents:
diff changeset
1907 ///
anatofuz
parents:
diff changeset
1908 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1909 ///
anatofuz
parents:
diff changeset
1910 /// \code
anatofuz
parents:
diff changeset
1911 /// int _mm_cmpistro(__m128i A, __m128i B, const int M);
anatofuz
parents:
diff changeset
1912 /// \endcode
anatofuz
parents:
diff changeset
1913 ///
anatofuz
parents:
diff changeset
1914 /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
anatofuz
parents:
diff changeset
1915 /// instruction.
anatofuz
parents:
diff changeset
1916 ///
anatofuz
parents:
diff changeset
1917 /// \param A
anatofuz
parents:
diff changeset
1918 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1919 /// compared.
anatofuz
parents:
diff changeset
1920 /// \param B
anatofuz
parents:
diff changeset
1921 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1922 /// compared.
anatofuz
parents:
diff changeset
1923 /// \param M
anatofuz
parents:
diff changeset
1924 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1925 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
1926 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1927 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1928 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1929 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1930 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1931 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1932 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1933 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1934 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1935 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1936 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1937 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1938 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1939 /// 11: Substring: Search B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1940 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1941 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1942 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1943 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1944 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1945 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1946 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
1947 /// \returns Returns bit 0 of the resulting bit mask.
anatofuz
parents:
diff changeset
1948 #define _mm_cmpistro(A, B, M) \
anatofuz
parents:
diff changeset
1949 (int)__builtin_ia32_pcmpistrio128((__v16qi)(__m128i)(A), \
anatofuz
parents:
diff changeset
1950 (__v16qi)(__m128i)(B), (int)(M))
anatofuz
parents:
diff changeset
1951
anatofuz
parents:
diff changeset
1952 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
1953 /// data with implicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
1954 /// \a A and \a B. Returns 1 if the length of the string in \a A is less than
anatofuz
parents:
diff changeset
1955 /// the maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
1956 ///
anatofuz
parents:
diff changeset
1957 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
1958 ///
anatofuz
parents:
diff changeset
1959 /// \code
anatofuz
parents:
diff changeset
1960 /// int _mm_cmpistrs(__m128i A, __m128i B, const int M);
anatofuz
parents:
diff changeset
1961 /// \endcode
anatofuz
parents:
diff changeset
1962 ///
anatofuz
parents:
diff changeset
1963 /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
anatofuz
parents:
diff changeset
1964 /// instruction.
anatofuz
parents:
diff changeset
1965 ///
anatofuz
parents:
diff changeset
1966 /// \param A
anatofuz
parents:
diff changeset
1967 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1968 /// compared.
anatofuz
parents:
diff changeset
1969 /// \param B
anatofuz
parents:
diff changeset
1970 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
1971 /// compared.
anatofuz
parents:
diff changeset
1972 /// \param M
anatofuz
parents:
diff changeset
1973 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
1974 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
1975 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
1976 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
1977 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
1978 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
1979 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
1980 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
1981 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
1982 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
1983 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
1984 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
1985 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
1986 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
1987 /// \a B for equality. \n
anatofuz
parents:
diff changeset
1988 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
1989 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
1990 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
1991 /// 00: No effect. \n
anatofuz
parents:
diff changeset
1992 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
1993 /// 10: No effect. \n
anatofuz
parents:
diff changeset
1994 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
1995 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
1996 /// \returns Returns 1 if the length of the string in \a A is less than the
anatofuz
parents:
diff changeset
1997 /// maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
1998 #define _mm_cmpistrs(A, B, M) \
anatofuz
parents:
diff changeset
1999 (int)__builtin_ia32_pcmpistris128((__v16qi)(__m128i)(A), \
anatofuz
parents:
diff changeset
2000 (__v16qi)(__m128i)(B), (int)(M))
anatofuz
parents:
diff changeset
2001
anatofuz
parents:
diff changeset
2002 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
2003 /// data with implicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
2004 /// \a A and \a B. Returns 1 if the length of the string in \a B is less than
anatofuz
parents:
diff changeset
2005 /// the maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2006 ///
anatofuz
parents:
diff changeset
2007 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2008 ///
anatofuz
parents:
diff changeset
2009 /// \code
anatofuz
parents:
diff changeset
2010 /// int _mm_cmpistrz(__m128i A, __m128i B, const int M);
anatofuz
parents:
diff changeset
2011 /// \endcode
anatofuz
parents:
diff changeset
2012 ///
anatofuz
parents:
diff changeset
2013 /// This intrinsic corresponds to the <c> VPCMPISTRI / PCMPISTRI </c>
anatofuz
parents:
diff changeset
2014 /// instruction.
anatofuz
parents:
diff changeset
2015 ///
anatofuz
parents:
diff changeset
2016 /// \param A
anatofuz
parents:
diff changeset
2017 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2018 /// compared.
anatofuz
parents:
diff changeset
2019 /// \param B
anatofuz
parents:
diff changeset
2020 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2021 /// compared.
anatofuz
parents:
diff changeset
2022 /// \param M
anatofuz
parents:
diff changeset
2023 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
2024 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
2025 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
2026 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
2027 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
2028 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
2029 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
2030 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
2031 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
2032 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
2033 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
2034 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
2035 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
2036 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
2037 /// \a B for equality. \n
anatofuz
parents:
diff changeset
2038 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
2039 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
2040 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
2041 /// 00: No effect. \n
anatofuz
parents:
diff changeset
2042 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
2043 /// 10: No effect. \n
anatofuz
parents:
diff changeset
2044 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
2045 /// to the size of \a A or \a B.
anatofuz
parents:
diff changeset
2046 /// \returns Returns 1 if the length of the string in \a B is less than the
anatofuz
parents:
diff changeset
2047 /// maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2048 #define _mm_cmpistrz(A, B, M) \
anatofuz
parents:
diff changeset
2049 (int)__builtin_ia32_pcmpistriz128((__v16qi)(__m128i)(A), \
anatofuz
parents:
diff changeset
2050 (__v16qi)(__m128i)(B), (int)(M))
anatofuz
parents:
diff changeset
2051
anatofuz
parents:
diff changeset
2052 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
2053 /// data with explicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
2054 /// \a A and \a B. Returns 1 if the bit mask is zero and the length of the
anatofuz
parents:
diff changeset
2055 /// string in \a B is the maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2056 ///
anatofuz
parents:
diff changeset
2057 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2058 ///
anatofuz
parents:
diff changeset
2059 /// \code
anatofuz
parents:
diff changeset
2060 /// int _mm_cmpestra(__m128i A, int LA, __m128i B, int LB, const int M);
anatofuz
parents:
diff changeset
2061 /// \endcode
anatofuz
parents:
diff changeset
2062 ///
anatofuz
parents:
diff changeset
2063 /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
anatofuz
parents:
diff changeset
2064 /// instruction.
anatofuz
parents:
diff changeset
2065 ///
anatofuz
parents:
diff changeset
2066 /// \param A
anatofuz
parents:
diff changeset
2067 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2068 /// compared.
anatofuz
parents:
diff changeset
2069 /// \param LA
anatofuz
parents:
diff changeset
2070 /// An integer that specifies the length of the string in \a A.
anatofuz
parents:
diff changeset
2071 /// \param B
anatofuz
parents:
diff changeset
2072 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2073 /// compared.
anatofuz
parents:
diff changeset
2074 /// \param LB
anatofuz
parents:
diff changeset
2075 /// An integer that specifies the length of the string in \a B.
anatofuz
parents:
diff changeset
2076 /// \param M
anatofuz
parents:
diff changeset
2077 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
2078 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
2079 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
2080 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
2081 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
2082 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
2083 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
2084 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
2085 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
2086 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
2087 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
2088 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
2089 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
2090 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
2091 /// \a B for equality. \n
anatofuz
parents:
diff changeset
2092 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
2093 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
2094 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
2095 /// 00: No effect. \n
anatofuz
parents:
diff changeset
2096 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
2097 /// 10: No effect. \n
anatofuz
parents:
diff changeset
2098 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
2099 /// to the size of \a A or \a B.
anatofuz
parents:
diff changeset
2100 /// \returns Returns 1 if the bit mask is zero and the length of the string in
anatofuz
parents:
diff changeset
2101 /// \a B is the maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2102 #define _mm_cmpestra(A, LA, B, LB, M) \
anatofuz
parents:
diff changeset
2103 (int)__builtin_ia32_pcmpestria128((__v16qi)(__m128i)(A), (int)(LA), \
anatofuz
parents:
diff changeset
2104 (__v16qi)(__m128i)(B), (int)(LB), \
anatofuz
parents:
diff changeset
2105 (int)(M))
anatofuz
parents:
diff changeset
2106
anatofuz
parents:
diff changeset
2107 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
2108 /// data with explicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
2109 /// \a A and \a B. Returns 1 if the resulting mask is non-zero, otherwise,
anatofuz
parents:
diff changeset
2110 /// returns 0.
anatofuz
parents:
diff changeset
2111 ///
anatofuz
parents:
diff changeset
2112 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2113 ///
anatofuz
parents:
diff changeset
2114 /// \code
anatofuz
parents:
diff changeset
2115 /// int _mm_cmpestrc(__m128i A, int LA, __m128i B, int LB, const int M);
anatofuz
parents:
diff changeset
2116 /// \endcode
anatofuz
parents:
diff changeset
2117 ///
anatofuz
parents:
diff changeset
2118 /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
anatofuz
parents:
diff changeset
2119 /// instruction.
anatofuz
parents:
diff changeset
2120 ///
anatofuz
parents:
diff changeset
2121 /// \param A
anatofuz
parents:
diff changeset
2122 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2123 /// compared.
anatofuz
parents:
diff changeset
2124 /// \param LA
anatofuz
parents:
diff changeset
2125 /// An integer that specifies the length of the string in \a A.
anatofuz
parents:
diff changeset
2126 /// \param B
anatofuz
parents:
diff changeset
2127 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2128 /// compared.
anatofuz
parents:
diff changeset
2129 /// \param LB
anatofuz
parents:
diff changeset
2130 /// An integer that specifies the length of the string in \a B.
anatofuz
parents:
diff changeset
2131 /// \param M
anatofuz
parents:
diff changeset
2132 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
2133 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
2134 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
2135 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
2136 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
2137 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
2138 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
2139 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
2140 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
2141 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
2142 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
2143 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
2144 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
2145 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
2146 /// \a B for equality. \n
anatofuz
parents:
diff changeset
2147 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
2148 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
2149 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
2150 /// 00: No effect. \n
anatofuz
parents:
diff changeset
2151 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
2152 /// 10: No effect. \n
anatofuz
parents:
diff changeset
2153 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
2154 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
2155 /// \returns Returns 1 if the resulting mask is non-zero, otherwise, returns 0.
anatofuz
parents:
diff changeset
2156 #define _mm_cmpestrc(A, LA, B, LB, M) \
anatofuz
parents:
diff changeset
2157 (int)__builtin_ia32_pcmpestric128((__v16qi)(__m128i)(A), (int)(LA), \
anatofuz
parents:
diff changeset
2158 (__v16qi)(__m128i)(B), (int)(LB), \
anatofuz
parents:
diff changeset
2159 (int)(M))
anatofuz
parents:
diff changeset
2160
anatofuz
parents:
diff changeset
2161 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
2162 /// data with explicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
2163 /// \a A and \a B. Returns bit 0 of the resulting bit mask.
anatofuz
parents:
diff changeset
2164 ///
anatofuz
parents:
diff changeset
2165 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2166 ///
anatofuz
parents:
diff changeset
2167 /// \code
anatofuz
parents:
diff changeset
2168 /// int _mm_cmpestro(__m128i A, int LA, __m128i B, int LB, const int M);
anatofuz
parents:
diff changeset
2169 /// \endcode
anatofuz
parents:
diff changeset
2170 ///
anatofuz
parents:
diff changeset
2171 /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
anatofuz
parents:
diff changeset
2172 /// instruction.
anatofuz
parents:
diff changeset
2173 ///
anatofuz
parents:
diff changeset
2174 /// \param A
anatofuz
parents:
diff changeset
2175 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2176 /// compared.
anatofuz
parents:
diff changeset
2177 /// \param LA
anatofuz
parents:
diff changeset
2178 /// An integer that specifies the length of the string in \a A.
anatofuz
parents:
diff changeset
2179 /// \param B
anatofuz
parents:
diff changeset
2180 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2181 /// compared.
anatofuz
parents:
diff changeset
2182 /// \param LB
anatofuz
parents:
diff changeset
2183 /// An integer that specifies the length of the string in \a B.
anatofuz
parents:
diff changeset
2184 /// \param M
anatofuz
parents:
diff changeset
2185 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
2186 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
2187 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
2188 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
2189 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
2190 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
2191 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
2192 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
2193 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
2194 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
2195 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
2196 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
2197 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
2198 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
2199 /// \a B for equality. \n
anatofuz
parents:
diff changeset
2200 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
2201 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
2202 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
2203 /// 00: No effect. \n
anatofuz
parents:
diff changeset
2204 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
2205 /// 10: No effect. \n
anatofuz
parents:
diff changeset
2206 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
2207 /// to the size of \a A or \a B.
anatofuz
parents:
diff changeset
2208 /// \returns Returns bit 0 of the resulting bit mask.
anatofuz
parents:
diff changeset
2209 #define _mm_cmpestro(A, LA, B, LB, M) \
anatofuz
parents:
diff changeset
2210 (int)__builtin_ia32_pcmpestrio128((__v16qi)(__m128i)(A), (int)(LA), \
anatofuz
parents:
diff changeset
2211 (__v16qi)(__m128i)(B), (int)(LB), \
anatofuz
parents:
diff changeset
2212 (int)(M))
anatofuz
parents:
diff changeset
2213
anatofuz
parents:
diff changeset
2214 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
2215 /// data with explicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
2216 /// \a A and \a B. Returns 1 if the length of the string in \a A is less than
anatofuz
parents:
diff changeset
2217 /// the maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2218 ///
anatofuz
parents:
diff changeset
2219 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2220 ///
anatofuz
parents:
diff changeset
2221 /// \code
anatofuz
parents:
diff changeset
2222 /// int _mm_cmpestrs(__m128i A, int LA, __m128i B, int LB, const int M);
anatofuz
parents:
diff changeset
2223 /// \endcode
anatofuz
parents:
diff changeset
2224 ///
anatofuz
parents:
diff changeset
2225 /// This intrinsic corresponds to the <c> VPCMPESTRI / PCMPESTRI </c>
anatofuz
parents:
diff changeset
2226 /// instruction.
anatofuz
parents:
diff changeset
2227 ///
anatofuz
parents:
diff changeset
2228 /// \param A
anatofuz
parents:
diff changeset
2229 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2230 /// compared.
anatofuz
parents:
diff changeset
2231 /// \param LA
anatofuz
parents:
diff changeset
2232 /// An integer that specifies the length of the string in \a A.
anatofuz
parents:
diff changeset
2233 /// \param B
anatofuz
parents:
diff changeset
2234 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2235 /// compared.
anatofuz
parents:
diff changeset
2236 /// \param LB
anatofuz
parents:
diff changeset
2237 /// An integer that specifies the length of the string in \a B.
anatofuz
parents:
diff changeset
2238 /// \param M
anatofuz
parents:
diff changeset
2239 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
2240 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
2241 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
2242 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
2243 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
2244 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
2245 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
2246 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
2247 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
2248 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
2249 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
2250 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
2251 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
2252 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
2253 /// \a B for equality. \n
anatofuz
parents:
diff changeset
2254 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
2255 /// Bits [5:4]: Determine whether to perform a one's complement in the bit
anatofuz
parents:
diff changeset
2256 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
2257 /// 00: No effect. \n
anatofuz
parents:
diff changeset
2258 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
2259 /// 10: No effect. \n
anatofuz
parents:
diff changeset
2260 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
2261 /// to the size of \a A or \a B. \n
anatofuz
parents:
diff changeset
2262 /// \returns Returns 1 if the length of the string in \a A is less than the
anatofuz
parents:
diff changeset
2263 /// maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2264 #define _mm_cmpestrs(A, LA, B, LB, M) \
anatofuz
parents:
diff changeset
2265 (int)__builtin_ia32_pcmpestris128((__v16qi)(__m128i)(A), (int)(LA), \
anatofuz
parents:
diff changeset
2266 (__v16qi)(__m128i)(B), (int)(LB), \
anatofuz
parents:
diff changeset
2267 (int)(M))
anatofuz
parents:
diff changeset
2268
anatofuz
parents:
diff changeset
2269 /// Uses the immediate operand \a M to perform a comparison of string
anatofuz
parents:
diff changeset
2270 /// data with explicitly defined lengths that is contained in source operands
anatofuz
parents:
diff changeset
2271 /// \a A and \a B. Returns 1 if the length of the string in \a B is less than
anatofuz
parents:
diff changeset
2272 /// the maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2273 ///
anatofuz
parents:
diff changeset
2274 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2275 ///
anatofuz
parents:
diff changeset
2276 /// \code
anatofuz
parents:
diff changeset
2277 /// int _mm_cmpestrz(__m128i A, int LA, __m128i B, int LB, const int M);
anatofuz
parents:
diff changeset
2278 /// \endcode
anatofuz
parents:
diff changeset
2279 ///
anatofuz
parents:
diff changeset
2280 /// This intrinsic corresponds to the <c> VPCMPESTRI </c> instruction.
anatofuz
parents:
diff changeset
2281 ///
anatofuz
parents:
diff changeset
2282 /// \param A
anatofuz
parents:
diff changeset
2283 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2284 /// compared.
anatofuz
parents:
diff changeset
2285 /// \param LA
anatofuz
parents:
diff changeset
2286 /// An integer that specifies the length of the string in \a A.
anatofuz
parents:
diff changeset
2287 /// \param B
anatofuz
parents:
diff changeset
2288 /// A 128-bit integer vector containing one of the source operands to be
anatofuz
parents:
diff changeset
2289 /// compared.
anatofuz
parents:
diff changeset
2290 /// \param LB
anatofuz
parents:
diff changeset
2291 /// An integer that specifies the length of the string in \a B.
anatofuz
parents:
diff changeset
2292 /// \param M
anatofuz
parents:
diff changeset
2293 /// An 8-bit immediate operand specifying whether the characters are bytes or
anatofuz
parents:
diff changeset
2294 /// words and the type of comparison to perform. \n
anatofuz
parents:
diff changeset
2295 /// Bits [1:0]: Determine source data format. \n
anatofuz
parents:
diff changeset
2296 /// 00: 16 unsigned bytes \n
anatofuz
parents:
diff changeset
2297 /// 01: 8 unsigned words \n
anatofuz
parents:
diff changeset
2298 /// 10: 16 signed bytes \n
anatofuz
parents:
diff changeset
2299 /// 11: 8 signed words \n
anatofuz
parents:
diff changeset
2300 /// Bits [3:2]: Determine comparison type and aggregation method. \n
anatofuz
parents:
diff changeset
2301 /// 00: Subset: Each character in \a B is compared for equality with all
anatofuz
parents:
diff changeset
2302 /// the characters in \a A. \n
anatofuz
parents:
diff changeset
2303 /// 01: Ranges: Each character in \a B is compared to \a A. The comparison
anatofuz
parents:
diff changeset
2304 /// basis is greater than or equal for even-indexed elements in \a A,
anatofuz
parents:
diff changeset
2305 /// and less than or equal for odd-indexed elements in \a A. \n
anatofuz
parents:
diff changeset
2306 /// 10: Match: Compare each pair of corresponding characters in \a A and
anatofuz
parents:
diff changeset
2307 /// \a B for equality. \n
anatofuz
parents:
diff changeset
2308 /// 11: Substring: Search \a B for substring matches of \a A. \n
anatofuz
parents:
diff changeset
2309 /// Bits [5:4]: Determine whether to perform a one's complement on the bit
anatofuz
parents:
diff changeset
2310 /// mask of the comparison results. \n
anatofuz
parents:
diff changeset
2311 /// 00: No effect. \n
anatofuz
parents:
diff changeset
2312 /// 01: Negate the bit mask. \n
anatofuz
parents:
diff changeset
2313 /// 10: No effect. \n
anatofuz
parents:
diff changeset
2314 /// 11: Negate the bit mask only for bits with an index less than or equal
anatofuz
parents:
diff changeset
2315 /// to the size of \a A or \a B.
anatofuz
parents:
diff changeset
2316 /// \returns Returns 1 if the length of the string in \a B is less than the
anatofuz
parents:
diff changeset
2317 /// maximum, otherwise, returns 0.
anatofuz
parents:
diff changeset
2318 #define _mm_cmpestrz(A, LA, B, LB, M) \
anatofuz
parents:
diff changeset
2319 (int)__builtin_ia32_pcmpestriz128((__v16qi)(__m128i)(A), (int)(LA), \
anatofuz
parents:
diff changeset
2320 (__v16qi)(__m128i)(B), (int)(LB), \
anatofuz
parents:
diff changeset
2321 (int)(M))
anatofuz
parents:
diff changeset
2322
anatofuz
parents:
diff changeset
2323 /* SSE4.2 Compare Packed Data -- Greater Than. */
anatofuz
parents:
diff changeset
2324 /// Compares each of the corresponding 64-bit values of the 128-bit
anatofuz
parents:
diff changeset
2325 /// integer vectors to determine if the values in the first operand are
anatofuz
parents:
diff changeset
2326 /// greater than those in the second operand.
anatofuz
parents:
diff changeset
2327 ///
anatofuz
parents:
diff changeset
2328 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2329 ///
anatofuz
parents:
diff changeset
2330 /// This intrinsic corresponds to the <c> VPCMPGTQ / PCMPGTQ </c> instruction.
anatofuz
parents:
diff changeset
2331 ///
anatofuz
parents:
diff changeset
2332 /// \param __V1
anatofuz
parents:
diff changeset
2333 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
2334 /// \param __V2
anatofuz
parents:
diff changeset
2335 /// A 128-bit integer vector.
anatofuz
parents:
diff changeset
2336 /// \returns A 128-bit integer vector containing the comparison results.
anatofuz
parents:
diff changeset
2337 static __inline__ __m128i __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
2338 _mm_cmpgt_epi64(__m128i __V1, __m128i __V2)
anatofuz
parents:
diff changeset
2339 {
anatofuz
parents:
diff changeset
2340 return (__m128i)((__v2di)__V1 > (__v2di)__V2);
anatofuz
parents:
diff changeset
2341 }
anatofuz
parents:
diff changeset
2342
anatofuz
parents:
diff changeset
2343 /* SSE4.2 Accumulate CRC32. */
anatofuz
parents:
diff changeset
2344 /// Adds the unsigned integer operand to the CRC-32C checksum of the
anatofuz
parents:
diff changeset
2345 /// unsigned char operand.
anatofuz
parents:
diff changeset
2346 ///
anatofuz
parents:
diff changeset
2347 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2348 ///
anatofuz
parents:
diff changeset
2349 /// This intrinsic corresponds to the <c> CRC32B </c> instruction.
anatofuz
parents:
diff changeset
2350 ///
anatofuz
parents:
diff changeset
2351 /// \param __C
anatofuz
parents:
diff changeset
2352 /// An unsigned integer operand to add to the CRC-32C checksum of operand
anatofuz
parents:
diff changeset
2353 /// \a __D.
anatofuz
parents:
diff changeset
2354 /// \param __D
anatofuz
parents:
diff changeset
2355 /// An unsigned 8-bit integer operand used to compute the CRC-32C checksum.
anatofuz
parents:
diff changeset
2356 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
anatofuz
parents:
diff changeset
2357 /// operand \a __D.
anatofuz
parents:
diff changeset
2358 static __inline__ unsigned int __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
2359 _mm_crc32_u8(unsigned int __C, unsigned char __D)
anatofuz
parents:
diff changeset
2360 {
anatofuz
parents:
diff changeset
2361 return __builtin_ia32_crc32qi(__C, __D);
anatofuz
parents:
diff changeset
2362 }
anatofuz
parents:
diff changeset
2363
anatofuz
parents:
diff changeset
2364 /// Adds the unsigned integer operand to the CRC-32C checksum of the
anatofuz
parents:
diff changeset
2365 /// unsigned short operand.
anatofuz
parents:
diff changeset
2366 ///
anatofuz
parents:
diff changeset
2367 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2368 ///
anatofuz
parents:
diff changeset
2369 /// This intrinsic corresponds to the <c> CRC32W </c> instruction.
anatofuz
parents:
diff changeset
2370 ///
anatofuz
parents:
diff changeset
2371 /// \param __C
anatofuz
parents:
diff changeset
2372 /// An unsigned integer operand to add to the CRC-32C checksum of operand
anatofuz
parents:
diff changeset
2373 /// \a __D.
anatofuz
parents:
diff changeset
2374 /// \param __D
anatofuz
parents:
diff changeset
2375 /// An unsigned 16-bit integer operand used to compute the CRC-32C checksum.
anatofuz
parents:
diff changeset
2376 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
anatofuz
parents:
diff changeset
2377 /// operand \a __D.
anatofuz
parents:
diff changeset
2378 static __inline__ unsigned int __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
2379 _mm_crc32_u16(unsigned int __C, unsigned short __D)
anatofuz
parents:
diff changeset
2380 {
anatofuz
parents:
diff changeset
2381 return __builtin_ia32_crc32hi(__C, __D);
anatofuz
parents:
diff changeset
2382 }
anatofuz
parents:
diff changeset
2383
anatofuz
parents:
diff changeset
2384 /// Adds the first unsigned integer operand to the CRC-32C checksum of
anatofuz
parents:
diff changeset
2385 /// the second unsigned integer operand.
anatofuz
parents:
diff changeset
2386 ///
anatofuz
parents:
diff changeset
2387 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2388 ///
anatofuz
parents:
diff changeset
2389 /// This intrinsic corresponds to the <c> CRC32L </c> instruction.
anatofuz
parents:
diff changeset
2390 ///
anatofuz
parents:
diff changeset
2391 /// \param __C
anatofuz
parents:
diff changeset
2392 /// An unsigned integer operand to add to the CRC-32C checksum of operand
anatofuz
parents:
diff changeset
2393 /// \a __D.
anatofuz
parents:
diff changeset
2394 /// \param __D
anatofuz
parents:
diff changeset
2395 /// An unsigned 32-bit integer operand used to compute the CRC-32C checksum.
anatofuz
parents:
diff changeset
2396 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
anatofuz
parents:
diff changeset
2397 /// operand \a __D.
anatofuz
parents:
diff changeset
2398 static __inline__ unsigned int __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
2399 _mm_crc32_u32(unsigned int __C, unsigned int __D)
anatofuz
parents:
diff changeset
2400 {
anatofuz
parents:
diff changeset
2401 return __builtin_ia32_crc32si(__C, __D);
anatofuz
parents:
diff changeset
2402 }
anatofuz
parents:
diff changeset
2403
anatofuz
parents:
diff changeset
2404 #ifdef __x86_64__
anatofuz
parents:
diff changeset
2405 /// Adds the unsigned integer operand to the CRC-32C checksum of the
anatofuz
parents:
diff changeset
2406 /// unsigned 64-bit integer operand.
anatofuz
parents:
diff changeset
2407 ///
anatofuz
parents:
diff changeset
2408 /// \headerfile <x86intrin.h>
anatofuz
parents:
diff changeset
2409 ///
anatofuz
parents:
diff changeset
2410 /// This intrinsic corresponds to the <c> CRC32Q </c> instruction.
anatofuz
parents:
diff changeset
2411 ///
anatofuz
parents:
diff changeset
2412 /// \param __C
anatofuz
parents:
diff changeset
2413 /// An unsigned integer operand to add to the CRC-32C checksum of operand
anatofuz
parents:
diff changeset
2414 /// \a __D.
anatofuz
parents:
diff changeset
2415 /// \param __D
anatofuz
parents:
diff changeset
2416 /// An unsigned 64-bit integer operand used to compute the CRC-32C checksum.
anatofuz
parents:
diff changeset
2417 /// \returns The result of adding operand \a __C to the CRC-32C checksum of
anatofuz
parents:
diff changeset
2418 /// operand \a __D.
anatofuz
parents:
diff changeset
2419 static __inline__ unsigned long long __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
2420 _mm_crc32_u64(unsigned long long __C, unsigned long long __D)
anatofuz
parents:
diff changeset
2421 {
anatofuz
parents:
diff changeset
2422 return __builtin_ia32_crc32di(__C, __D);
anatofuz
parents:
diff changeset
2423 }
anatofuz
parents:
diff changeset
2424 #endif /* __x86_64__ */
anatofuz
parents:
diff changeset
2425
anatofuz
parents:
diff changeset
2426 #undef __DEFAULT_FN_ATTRS
anatofuz
parents:
diff changeset
2427
anatofuz
parents:
diff changeset
2428 #include <popcntintrin.h>
anatofuz
parents:
diff changeset
2429
anatofuz
parents:
diff changeset
2430 #endif /* __SMMINTRIN_H */