xref: /openbsd-src/gnu/llvm/clang/lib/Headers/mmintrin.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
1e5dd7070Spatrick /*===---- mmintrin.h - MMX intrinsics --------------------------------------===
2e5dd7070Spatrick  *
3e5dd7070Spatrick  * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4e5dd7070Spatrick  * See https://llvm.org/LICENSE.txt for license information.
5e5dd7070Spatrick  * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6e5dd7070Spatrick  *
7e5dd7070Spatrick  *===-----------------------------------------------------------------------===
8e5dd7070Spatrick  */
9e5dd7070Spatrick 
10e5dd7070Spatrick #ifndef __MMINTRIN_H
11e5dd7070Spatrick #define __MMINTRIN_H
12e5dd7070Spatrick 
13*12c85518Srobert #if !defined(__i386__) && !defined(__x86_64__)
14*12c85518Srobert #error "This header is only meant to be used on x86 and x64 architecture"
15*12c85518Srobert #endif
16*12c85518Srobert 
17e5dd7070Spatrick typedef long long __m64 __attribute__((__vector_size__(8), __aligned__(8)));
18e5dd7070Spatrick 
19e5dd7070Spatrick typedef long long __v1di __attribute__((__vector_size__(8)));
20e5dd7070Spatrick typedef int __v2si __attribute__((__vector_size__(8)));
21e5dd7070Spatrick typedef short __v4hi __attribute__((__vector_size__(8)));
22e5dd7070Spatrick typedef char __v8qi __attribute__((__vector_size__(8)));
23e5dd7070Spatrick 
24e5dd7070Spatrick /* Define the default attributes for the functions in this file. */
25e5dd7070Spatrick #define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("mmx"), __min_vector_width__(64)))
26e5dd7070Spatrick 
27e5dd7070Spatrick /// Clears the MMX state by setting the state of the x87 stack registers
28e5dd7070Spatrick ///    to empty.
29e5dd7070Spatrick ///
30e5dd7070Spatrick /// \headerfile <x86intrin.h>
31e5dd7070Spatrick ///
32e5dd7070Spatrick /// This intrinsic corresponds to the <c> EMMS </c> instruction.
33e5dd7070Spatrick ///
34e5dd7070Spatrick static __inline__ void  __attribute__((__always_inline__, __nodebug__, __target__("mmx")))
_mm_empty(void)35e5dd7070Spatrick _mm_empty(void)
36e5dd7070Spatrick {
37e5dd7070Spatrick     __builtin_ia32_emms();
38e5dd7070Spatrick }
39e5dd7070Spatrick 
40e5dd7070Spatrick /// Constructs a 64-bit integer vector, setting the lower 32 bits to the
41e5dd7070Spatrick ///    value of the 32-bit integer parameter and setting the upper 32 bits to 0.
42e5dd7070Spatrick ///
43e5dd7070Spatrick /// \headerfile <x86intrin.h>
44e5dd7070Spatrick ///
45e5dd7070Spatrick /// This intrinsic corresponds to the <c> MOVD </c> instruction.
46e5dd7070Spatrick ///
47e5dd7070Spatrick /// \param __i
48e5dd7070Spatrick ///    A 32-bit integer value.
49e5dd7070Spatrick /// \returns A 64-bit integer vector. The lower 32 bits contain the value of the
50e5dd7070Spatrick ///    parameter. The upper 32 bits are set to 0.
51e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cvtsi32_si64(int __i)52e5dd7070Spatrick _mm_cvtsi32_si64(int __i)
53e5dd7070Spatrick {
54e5dd7070Spatrick     return (__m64)__builtin_ia32_vec_init_v2si(__i, 0);
55e5dd7070Spatrick }
56e5dd7070Spatrick 
57e5dd7070Spatrick /// Returns the lower 32 bits of a 64-bit integer vector as a 32-bit
58e5dd7070Spatrick ///    signed integer.
59e5dd7070Spatrick ///
60e5dd7070Spatrick /// \headerfile <x86intrin.h>
61e5dd7070Spatrick ///
62e5dd7070Spatrick /// This intrinsic corresponds to the <c> MOVD </c> instruction.
63e5dd7070Spatrick ///
64e5dd7070Spatrick /// \param __m
65e5dd7070Spatrick ///    A 64-bit integer vector.
66e5dd7070Spatrick /// \returns A 32-bit signed integer value containing the lower 32 bits of the
67e5dd7070Spatrick ///    parameter.
68e5dd7070Spatrick static __inline__ int __DEFAULT_FN_ATTRS
_mm_cvtsi64_si32(__m64 __m)69e5dd7070Spatrick _mm_cvtsi64_si32(__m64 __m)
70e5dd7070Spatrick {
71e5dd7070Spatrick     return __builtin_ia32_vec_ext_v2si((__v2si)__m, 0);
72e5dd7070Spatrick }
73e5dd7070Spatrick 
74e5dd7070Spatrick /// Casts a 64-bit signed integer value into a 64-bit integer vector.
75e5dd7070Spatrick ///
76e5dd7070Spatrick /// \headerfile <x86intrin.h>
77e5dd7070Spatrick ///
78e5dd7070Spatrick /// This intrinsic corresponds to the <c> MOVQ </c> instruction.
79e5dd7070Spatrick ///
80e5dd7070Spatrick /// \param __i
81e5dd7070Spatrick ///    A 64-bit signed integer.
82e5dd7070Spatrick /// \returns A 64-bit integer vector containing the same bitwise pattern as the
83e5dd7070Spatrick ///    parameter.
84e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cvtsi64_m64(long long __i)85e5dd7070Spatrick _mm_cvtsi64_m64(long long __i)
86e5dd7070Spatrick {
87e5dd7070Spatrick     return (__m64)__i;
88e5dd7070Spatrick }
89e5dd7070Spatrick 
90e5dd7070Spatrick /// Casts a 64-bit integer vector into a 64-bit signed integer value.
91e5dd7070Spatrick ///
92e5dd7070Spatrick /// \headerfile <x86intrin.h>
93e5dd7070Spatrick ///
94e5dd7070Spatrick /// This intrinsic corresponds to the <c> MOVQ </c> instruction.
95e5dd7070Spatrick ///
96e5dd7070Spatrick /// \param __m
97e5dd7070Spatrick ///    A 64-bit integer vector.
98e5dd7070Spatrick /// \returns A 64-bit signed integer containing the same bitwise pattern as the
99e5dd7070Spatrick ///    parameter.
100e5dd7070Spatrick static __inline__ long long __DEFAULT_FN_ATTRS
_mm_cvtm64_si64(__m64 __m)101e5dd7070Spatrick _mm_cvtm64_si64(__m64 __m)
102e5dd7070Spatrick {
103e5dd7070Spatrick     return (long long)__m;
104e5dd7070Spatrick }
105e5dd7070Spatrick 
106e5dd7070Spatrick /// Converts 16-bit signed integers from both 64-bit integer vector
107e5dd7070Spatrick ///    parameters of [4 x i16] into 8-bit signed integer values, and constructs
108e5dd7070Spatrick ///    a 64-bit integer vector of [8 x i8] as the result. Positive values
109e5dd7070Spatrick ///    greater than 0x7F are saturated to 0x7F. Negative values less than 0x80
110e5dd7070Spatrick ///    are saturated to 0x80.
111e5dd7070Spatrick ///
112e5dd7070Spatrick /// \headerfile <x86intrin.h>
113e5dd7070Spatrick ///
114e5dd7070Spatrick /// This intrinsic corresponds to the <c> PACKSSWB </c> instruction.
115e5dd7070Spatrick ///
116e5dd7070Spatrick /// \param __m1
117e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16]. Each 16-bit element is treated as a
118e5dd7070Spatrick ///    16-bit signed integer and is converted to an 8-bit signed integer with
119e5dd7070Spatrick ///    saturation. Positive values greater than 0x7F are saturated to 0x7F.
120e5dd7070Spatrick ///    Negative values less than 0x80 are saturated to 0x80. The converted
121e5dd7070Spatrick ///    [4 x i8] values are written to the lower 32 bits of the result.
122e5dd7070Spatrick /// \param __m2
123e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16]. Each 16-bit element is treated as a
124e5dd7070Spatrick ///    16-bit signed integer and is converted to an 8-bit signed integer with
125e5dd7070Spatrick ///    saturation. Positive values greater than 0x7F are saturated to 0x7F.
126e5dd7070Spatrick ///    Negative values less than 0x80 are saturated to 0x80. The converted
127e5dd7070Spatrick ///    [4 x i8] values are written to the upper 32 bits of the result.
128e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the converted
129e5dd7070Spatrick ///    values.
130e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_packs_pi16(__m64 __m1,__m64 __m2)131e5dd7070Spatrick _mm_packs_pi16(__m64 __m1, __m64 __m2)
132e5dd7070Spatrick {
133e5dd7070Spatrick     return (__m64)__builtin_ia32_packsswb((__v4hi)__m1, (__v4hi)__m2);
134e5dd7070Spatrick }
135e5dd7070Spatrick 
136e5dd7070Spatrick /// Converts 32-bit signed integers from both 64-bit integer vector
137e5dd7070Spatrick ///    parameters of [2 x i32] into 16-bit signed integer values, and constructs
138e5dd7070Spatrick ///    a 64-bit integer vector of [4 x i16] as the result. Positive values
139e5dd7070Spatrick ///    greater than 0x7FFF are saturated to 0x7FFF. Negative values less than
140e5dd7070Spatrick ///    0x8000 are saturated to 0x8000.
141e5dd7070Spatrick ///
142e5dd7070Spatrick /// \headerfile <x86intrin.h>
143e5dd7070Spatrick ///
144e5dd7070Spatrick /// This intrinsic corresponds to the <c> PACKSSDW </c> instruction.
145e5dd7070Spatrick ///
146e5dd7070Spatrick /// \param __m1
147e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32]. Each 32-bit element is treated as a
148e5dd7070Spatrick ///    32-bit signed integer and is converted to a 16-bit signed integer with
149e5dd7070Spatrick ///    saturation. Positive values greater than 0x7FFF are saturated to 0x7FFF.
150e5dd7070Spatrick ///    Negative values less than 0x8000 are saturated to 0x8000. The converted
151e5dd7070Spatrick ///    [2 x i16] values are written to the lower 32 bits of the result.
152e5dd7070Spatrick /// \param __m2
153e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32]. Each 32-bit element is treated as a
154e5dd7070Spatrick ///    32-bit signed integer and is converted to a 16-bit signed integer with
155e5dd7070Spatrick ///    saturation. Positive values greater than 0x7FFF are saturated to 0x7FFF.
156e5dd7070Spatrick ///    Negative values less than 0x8000 are saturated to 0x8000. The converted
157e5dd7070Spatrick ///    [2 x i16] values are written to the upper 32 bits of the result.
158e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the converted
159e5dd7070Spatrick ///    values.
160e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_packs_pi32(__m64 __m1,__m64 __m2)161e5dd7070Spatrick _mm_packs_pi32(__m64 __m1, __m64 __m2)
162e5dd7070Spatrick {
163e5dd7070Spatrick     return (__m64)__builtin_ia32_packssdw((__v2si)__m1, (__v2si)__m2);
164e5dd7070Spatrick }
165e5dd7070Spatrick 
166e5dd7070Spatrick /// Converts 16-bit signed integers from both 64-bit integer vector
167e5dd7070Spatrick ///    parameters of [4 x i16] into 8-bit unsigned integer values, and
168e5dd7070Spatrick ///    constructs a 64-bit integer vector of [8 x i8] as the result. Values
169e5dd7070Spatrick ///    greater than 0xFF are saturated to 0xFF. Values less than 0 are saturated
170e5dd7070Spatrick ///    to 0.
171e5dd7070Spatrick ///
172e5dd7070Spatrick /// \headerfile <x86intrin.h>
173e5dd7070Spatrick ///
174e5dd7070Spatrick /// This intrinsic corresponds to the <c> PACKUSWB </c> instruction.
175e5dd7070Spatrick ///
176e5dd7070Spatrick /// \param __m1
177e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16]. Each 16-bit element is treated as a
178e5dd7070Spatrick ///    16-bit signed integer and is converted to an 8-bit unsigned integer with
179e5dd7070Spatrick ///    saturation. Values greater than 0xFF are saturated to 0xFF. Values less
180e5dd7070Spatrick ///    than 0 are saturated to 0. The converted [4 x i8] values are written to
181e5dd7070Spatrick ///    the lower 32 bits of the result.
182e5dd7070Spatrick /// \param __m2
183e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16]. Each 16-bit element is treated as a
184e5dd7070Spatrick ///    16-bit signed integer and is converted to an 8-bit unsigned integer with
185e5dd7070Spatrick ///    saturation. Values greater than 0xFF are saturated to 0xFF. Values less
186e5dd7070Spatrick ///    than 0 are saturated to 0. The converted [4 x i8] values are written to
187e5dd7070Spatrick ///    the upper 32 bits of the result.
188e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the converted
189e5dd7070Spatrick ///    values.
190e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_packs_pu16(__m64 __m1,__m64 __m2)191e5dd7070Spatrick _mm_packs_pu16(__m64 __m1, __m64 __m2)
192e5dd7070Spatrick {
193e5dd7070Spatrick     return (__m64)__builtin_ia32_packuswb((__v4hi)__m1, (__v4hi)__m2);
194e5dd7070Spatrick }
195e5dd7070Spatrick 
196e5dd7070Spatrick /// Unpacks the upper 32 bits from two 64-bit integer vectors of [8 x i8]
197e5dd7070Spatrick ///    and interleaves them into a 64-bit integer vector of [8 x i8].
198e5dd7070Spatrick ///
199e5dd7070Spatrick /// \headerfile <x86intrin.h>
200e5dd7070Spatrick ///
201e5dd7070Spatrick /// This intrinsic corresponds to the <c> PUNPCKHBW </c> instruction.
202e5dd7070Spatrick ///
203e5dd7070Spatrick /// \param __m1
204e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8]. \n
205e5dd7070Spatrick ///    Bits [39:32] are written to bits [7:0] of the result. \n
206e5dd7070Spatrick ///    Bits [47:40] are written to bits [23:16] of the result. \n
207e5dd7070Spatrick ///    Bits [55:48] are written to bits [39:32] of the result. \n
208e5dd7070Spatrick ///    Bits [63:56] are written to bits [55:48] of the result.
209e5dd7070Spatrick /// \param __m2
210e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
211e5dd7070Spatrick ///    Bits [39:32] are written to bits [15:8] of the result. \n
212e5dd7070Spatrick ///    Bits [47:40] are written to bits [31:24] of the result. \n
213e5dd7070Spatrick ///    Bits [55:48] are written to bits [47:40] of the result. \n
214e5dd7070Spatrick ///    Bits [63:56] are written to bits [63:56] of the result.
215e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the interleaved
216e5dd7070Spatrick ///    values.
217e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_unpackhi_pi8(__m64 __m1,__m64 __m2)218e5dd7070Spatrick _mm_unpackhi_pi8(__m64 __m1, __m64 __m2)
219e5dd7070Spatrick {
220e5dd7070Spatrick     return (__m64)__builtin_ia32_punpckhbw((__v8qi)__m1, (__v8qi)__m2);
221e5dd7070Spatrick }
222e5dd7070Spatrick 
223e5dd7070Spatrick /// Unpacks the upper 32 bits from two 64-bit integer vectors of
224e5dd7070Spatrick ///    [4 x i16] and interleaves them into a 64-bit integer vector of [4 x i16].
225e5dd7070Spatrick ///
226e5dd7070Spatrick /// \headerfile <x86intrin.h>
227e5dd7070Spatrick ///
228e5dd7070Spatrick /// This intrinsic corresponds to the <c> PUNPCKHWD </c> instruction.
229e5dd7070Spatrick ///
230e5dd7070Spatrick /// \param __m1
231e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
232e5dd7070Spatrick ///    Bits [47:32] are written to bits [15:0] of the result. \n
233e5dd7070Spatrick ///    Bits [63:48] are written to bits [47:32] of the result.
234e5dd7070Spatrick /// \param __m2
235e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
236e5dd7070Spatrick ///    Bits [47:32] are written to bits [31:16] of the result. \n
237e5dd7070Spatrick ///    Bits [63:48] are written to bits [63:48] of the result.
238e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the interleaved
239e5dd7070Spatrick ///    values.
240e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_unpackhi_pi16(__m64 __m1,__m64 __m2)241e5dd7070Spatrick _mm_unpackhi_pi16(__m64 __m1, __m64 __m2)
242e5dd7070Spatrick {
243e5dd7070Spatrick     return (__m64)__builtin_ia32_punpckhwd((__v4hi)__m1, (__v4hi)__m2);
244e5dd7070Spatrick }
245e5dd7070Spatrick 
246e5dd7070Spatrick /// Unpacks the upper 32 bits from two 64-bit integer vectors of
247e5dd7070Spatrick ///    [2 x i32] and interleaves them into a 64-bit integer vector of [2 x i32].
248e5dd7070Spatrick ///
249e5dd7070Spatrick /// \headerfile <x86intrin.h>
250e5dd7070Spatrick ///
251e5dd7070Spatrick /// This intrinsic corresponds to the <c> PUNPCKHDQ </c> instruction.
252e5dd7070Spatrick ///
253e5dd7070Spatrick /// \param __m1
254e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32]. The upper 32 bits are written to
255e5dd7070Spatrick ///    the lower 32 bits of the result.
256e5dd7070Spatrick /// \param __m2
257e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32]. The upper 32 bits are written to
258e5dd7070Spatrick ///    the upper 32 bits of the result.
259e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the interleaved
260e5dd7070Spatrick ///    values.
261e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_unpackhi_pi32(__m64 __m1,__m64 __m2)262e5dd7070Spatrick _mm_unpackhi_pi32(__m64 __m1, __m64 __m2)
263e5dd7070Spatrick {
264e5dd7070Spatrick     return (__m64)__builtin_ia32_punpckhdq((__v2si)__m1, (__v2si)__m2);
265e5dd7070Spatrick }
266e5dd7070Spatrick 
267e5dd7070Spatrick /// Unpacks the lower 32 bits from two 64-bit integer vectors of [8 x i8]
268e5dd7070Spatrick ///    and interleaves them into a 64-bit integer vector of [8 x i8].
269e5dd7070Spatrick ///
270e5dd7070Spatrick /// \headerfile <x86intrin.h>
271e5dd7070Spatrick ///
272e5dd7070Spatrick /// This intrinsic corresponds to the <c> PUNPCKLBW </c> instruction.
273e5dd7070Spatrick ///
274e5dd7070Spatrick /// \param __m1
275e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
276e5dd7070Spatrick ///    Bits [7:0] are written to bits [7:0] of the result. \n
277e5dd7070Spatrick ///    Bits [15:8] are written to bits [23:16] of the result. \n
278e5dd7070Spatrick ///    Bits [23:16] are written to bits [39:32] of the result. \n
279e5dd7070Spatrick ///    Bits [31:24] are written to bits [55:48] of the result.
280e5dd7070Spatrick /// \param __m2
281e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
282e5dd7070Spatrick ///    Bits [7:0] are written to bits [15:8] of the result. \n
283e5dd7070Spatrick ///    Bits [15:8] are written to bits [31:24] of the result. \n
284e5dd7070Spatrick ///    Bits [23:16] are written to bits [47:40] of the result. \n
285e5dd7070Spatrick ///    Bits [31:24] are written to bits [63:56] of the result.
286e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the interleaved
287e5dd7070Spatrick ///    values.
288e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_unpacklo_pi8(__m64 __m1,__m64 __m2)289e5dd7070Spatrick _mm_unpacklo_pi8(__m64 __m1, __m64 __m2)
290e5dd7070Spatrick {
291e5dd7070Spatrick     return (__m64)__builtin_ia32_punpcklbw((__v8qi)__m1, (__v8qi)__m2);
292e5dd7070Spatrick }
293e5dd7070Spatrick 
294e5dd7070Spatrick /// Unpacks the lower 32 bits from two 64-bit integer vectors of
295e5dd7070Spatrick ///    [4 x i16] and interleaves them into a 64-bit integer vector of [4 x i16].
296e5dd7070Spatrick ///
297e5dd7070Spatrick /// \headerfile <x86intrin.h>
298e5dd7070Spatrick ///
299e5dd7070Spatrick /// This intrinsic corresponds to the <c> PUNPCKLWD </c> instruction.
300e5dd7070Spatrick ///
301e5dd7070Spatrick /// \param __m1
302e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
303e5dd7070Spatrick ///    Bits [15:0] are written to bits [15:0] of the result. \n
304e5dd7070Spatrick ///    Bits [31:16] are written to bits [47:32] of the result.
305e5dd7070Spatrick /// \param __m2
306e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
307e5dd7070Spatrick ///    Bits [15:0] are written to bits [31:16] of the result. \n
308e5dd7070Spatrick ///    Bits [31:16] are written to bits [63:48] of the result.
309e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the interleaved
310e5dd7070Spatrick ///    values.
311e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_unpacklo_pi16(__m64 __m1,__m64 __m2)312e5dd7070Spatrick _mm_unpacklo_pi16(__m64 __m1, __m64 __m2)
313e5dd7070Spatrick {
314e5dd7070Spatrick     return (__m64)__builtin_ia32_punpcklwd((__v4hi)__m1, (__v4hi)__m2);
315e5dd7070Spatrick }
316e5dd7070Spatrick 
317e5dd7070Spatrick /// Unpacks the lower 32 bits from two 64-bit integer vectors of
318e5dd7070Spatrick ///    [2 x i32] and interleaves them into a 64-bit integer vector of [2 x i32].
319e5dd7070Spatrick ///
320e5dd7070Spatrick /// \headerfile <x86intrin.h>
321e5dd7070Spatrick ///
322e5dd7070Spatrick /// This intrinsic corresponds to the <c> PUNPCKLDQ </c> instruction.
323e5dd7070Spatrick ///
324e5dd7070Spatrick /// \param __m1
325e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32]. The lower 32 bits are written to
326e5dd7070Spatrick ///    the lower 32 bits of the result.
327e5dd7070Spatrick /// \param __m2
328e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32]. The lower 32 bits are written to
329e5dd7070Spatrick ///    the upper 32 bits of the result.
330e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the interleaved
331e5dd7070Spatrick ///    values.
332e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_unpacklo_pi32(__m64 __m1,__m64 __m2)333e5dd7070Spatrick _mm_unpacklo_pi32(__m64 __m1, __m64 __m2)
334e5dd7070Spatrick {
335e5dd7070Spatrick     return (__m64)__builtin_ia32_punpckldq((__v2si)__m1, (__v2si)__m2);
336e5dd7070Spatrick }
337e5dd7070Spatrick 
338e5dd7070Spatrick /// Adds each 8-bit integer element of the first 64-bit integer vector
339e5dd7070Spatrick ///    of [8 x i8] to the corresponding 8-bit integer element of the second
340e5dd7070Spatrick ///    64-bit integer vector of [8 x i8]. The lower 8 bits of the results are
341e5dd7070Spatrick ///    packed into a 64-bit integer vector of [8 x i8].
342e5dd7070Spatrick ///
343e5dd7070Spatrick /// \headerfile <x86intrin.h>
344e5dd7070Spatrick ///
345e5dd7070Spatrick /// This intrinsic corresponds to the <c> PADDB </c> instruction.
346e5dd7070Spatrick ///
347e5dd7070Spatrick /// \param __m1
348e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
349e5dd7070Spatrick /// \param __m2
350e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
351e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the sums of both
352e5dd7070Spatrick ///    parameters.
353e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_add_pi8(__m64 __m1,__m64 __m2)354e5dd7070Spatrick _mm_add_pi8(__m64 __m1, __m64 __m2)
355e5dd7070Spatrick {
356e5dd7070Spatrick     return (__m64)__builtin_ia32_paddb((__v8qi)__m1, (__v8qi)__m2);
357e5dd7070Spatrick }
358e5dd7070Spatrick 
359e5dd7070Spatrick /// Adds each 16-bit integer element of the first 64-bit integer vector
360e5dd7070Spatrick ///    of [4 x i16] to the corresponding 16-bit integer element of the second
361e5dd7070Spatrick ///    64-bit integer vector of [4 x i16]. The lower 16 bits of the results are
362e5dd7070Spatrick ///    packed into a 64-bit integer vector of [4 x i16].
363e5dd7070Spatrick ///
364e5dd7070Spatrick /// \headerfile <x86intrin.h>
365e5dd7070Spatrick ///
366e5dd7070Spatrick /// This intrinsic corresponds to the <c> PADDW </c> instruction.
367e5dd7070Spatrick ///
368e5dd7070Spatrick /// \param __m1
369e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
370e5dd7070Spatrick /// \param __m2
371e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
372e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the sums of both
373e5dd7070Spatrick ///    parameters.
374e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_add_pi16(__m64 __m1,__m64 __m2)375e5dd7070Spatrick _mm_add_pi16(__m64 __m1, __m64 __m2)
376e5dd7070Spatrick {
377e5dd7070Spatrick     return (__m64)__builtin_ia32_paddw((__v4hi)__m1, (__v4hi)__m2);
378e5dd7070Spatrick }
379e5dd7070Spatrick 
380e5dd7070Spatrick /// Adds each 32-bit integer element of the first 64-bit integer vector
381e5dd7070Spatrick ///    of [2 x i32] to the corresponding 32-bit integer element of the second
382e5dd7070Spatrick ///    64-bit integer vector of [2 x i32]. The lower 32 bits of the results are
383e5dd7070Spatrick ///    packed into a 64-bit integer vector of [2 x i32].
384e5dd7070Spatrick ///
385e5dd7070Spatrick /// \headerfile <x86intrin.h>
386e5dd7070Spatrick ///
387e5dd7070Spatrick /// This intrinsic corresponds to the <c> PADDD </c> instruction.
388e5dd7070Spatrick ///
389e5dd7070Spatrick /// \param __m1
390e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
391e5dd7070Spatrick /// \param __m2
392e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
393e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the sums of both
394e5dd7070Spatrick ///    parameters.
395e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_add_pi32(__m64 __m1,__m64 __m2)396e5dd7070Spatrick _mm_add_pi32(__m64 __m1, __m64 __m2)
397e5dd7070Spatrick {
398e5dd7070Spatrick     return (__m64)__builtin_ia32_paddd((__v2si)__m1, (__v2si)__m2);
399e5dd7070Spatrick }
400e5dd7070Spatrick 
401e5dd7070Spatrick /// Adds each 8-bit signed integer element of the first 64-bit integer
402e5dd7070Spatrick ///    vector of [8 x i8] to the corresponding 8-bit signed integer element of
403e5dd7070Spatrick ///    the second 64-bit integer vector of [8 x i8]. Positive sums greater than
404e5dd7070Spatrick ///    0x7F are saturated to 0x7F. Negative sums less than 0x80 are saturated to
405e5dd7070Spatrick ///    0x80. The results are packed into a 64-bit integer vector of [8 x i8].
406e5dd7070Spatrick ///
407e5dd7070Spatrick /// \headerfile <x86intrin.h>
408e5dd7070Spatrick ///
409e5dd7070Spatrick /// This intrinsic corresponds to the <c> PADDSB </c> instruction.
410e5dd7070Spatrick ///
411e5dd7070Spatrick /// \param __m1
412e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
413e5dd7070Spatrick /// \param __m2
414e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
415e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the saturated sums
416e5dd7070Spatrick ///    of both parameters.
417e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_adds_pi8(__m64 __m1,__m64 __m2)418e5dd7070Spatrick _mm_adds_pi8(__m64 __m1, __m64 __m2)
419e5dd7070Spatrick {
420e5dd7070Spatrick     return (__m64)__builtin_ia32_paddsb((__v8qi)__m1, (__v8qi)__m2);
421e5dd7070Spatrick }
422e5dd7070Spatrick 
423e5dd7070Spatrick /// Adds each 16-bit signed integer element of the first 64-bit integer
424e5dd7070Spatrick ///    vector of [4 x i16] to the corresponding 16-bit signed integer element of
425e5dd7070Spatrick ///    the second 64-bit integer vector of [4 x i16]. Positive sums greater than
426e5dd7070Spatrick ///    0x7FFF are saturated to 0x7FFF. Negative sums less than 0x8000 are
427e5dd7070Spatrick ///    saturated to 0x8000. The results are packed into a 64-bit integer vector
428e5dd7070Spatrick ///    of [4 x i16].
429e5dd7070Spatrick ///
430e5dd7070Spatrick /// \headerfile <x86intrin.h>
431e5dd7070Spatrick ///
432e5dd7070Spatrick /// This intrinsic corresponds to the <c> PADDSW </c> instruction.
433e5dd7070Spatrick ///
434e5dd7070Spatrick /// \param __m1
435e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
436e5dd7070Spatrick /// \param __m2
437e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
438e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the saturated sums
439e5dd7070Spatrick ///    of both parameters.
440e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_adds_pi16(__m64 __m1,__m64 __m2)441e5dd7070Spatrick _mm_adds_pi16(__m64 __m1, __m64 __m2)
442e5dd7070Spatrick {
443e5dd7070Spatrick     return (__m64)__builtin_ia32_paddsw((__v4hi)__m1, (__v4hi)__m2);
444e5dd7070Spatrick }
445e5dd7070Spatrick 
446e5dd7070Spatrick /// Adds each 8-bit unsigned integer element of the first 64-bit integer
447e5dd7070Spatrick ///    vector of [8 x i8] to the corresponding 8-bit unsigned integer element of
448e5dd7070Spatrick ///    the second 64-bit integer vector of [8 x i8]. Sums greater than 0xFF are
449e5dd7070Spatrick ///    saturated to 0xFF. The results are packed into a 64-bit integer vector of
450e5dd7070Spatrick ///    [8 x i8].
451e5dd7070Spatrick ///
452e5dd7070Spatrick /// \headerfile <x86intrin.h>
453e5dd7070Spatrick ///
454e5dd7070Spatrick /// This intrinsic corresponds to the <c> PADDUSB </c> instruction.
455e5dd7070Spatrick ///
456e5dd7070Spatrick /// \param __m1
457e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
458e5dd7070Spatrick /// \param __m2
459e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
460e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the saturated
461e5dd7070Spatrick ///    unsigned sums of both parameters.
462e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_adds_pu8(__m64 __m1,__m64 __m2)463e5dd7070Spatrick _mm_adds_pu8(__m64 __m1, __m64 __m2)
464e5dd7070Spatrick {
465e5dd7070Spatrick     return (__m64)__builtin_ia32_paddusb((__v8qi)__m1, (__v8qi)__m2);
466e5dd7070Spatrick }
467e5dd7070Spatrick 
468e5dd7070Spatrick /// Adds each 16-bit unsigned integer element of the first 64-bit integer
469e5dd7070Spatrick ///    vector of [4 x i16] to the corresponding 16-bit unsigned integer element
470e5dd7070Spatrick ///    of the second 64-bit integer vector of [4 x i16]. Sums greater than
471e5dd7070Spatrick ///    0xFFFF are saturated to 0xFFFF. The results are packed into a 64-bit
472e5dd7070Spatrick ///    integer vector of [4 x i16].
473e5dd7070Spatrick ///
474e5dd7070Spatrick /// \headerfile <x86intrin.h>
475e5dd7070Spatrick ///
476e5dd7070Spatrick /// This intrinsic corresponds to the <c> PADDUSW </c> instruction.
477e5dd7070Spatrick ///
478e5dd7070Spatrick /// \param __m1
479e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
480e5dd7070Spatrick /// \param __m2
481e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
482e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the saturated
483e5dd7070Spatrick ///    unsigned sums of both parameters.
484e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_adds_pu16(__m64 __m1,__m64 __m2)485e5dd7070Spatrick _mm_adds_pu16(__m64 __m1, __m64 __m2)
486e5dd7070Spatrick {
487e5dd7070Spatrick     return (__m64)__builtin_ia32_paddusw((__v4hi)__m1, (__v4hi)__m2);
488e5dd7070Spatrick }
489e5dd7070Spatrick 
490e5dd7070Spatrick /// Subtracts each 8-bit integer element of the second 64-bit integer
491e5dd7070Spatrick ///    vector of [8 x i8] from the corresponding 8-bit integer element of the
492e5dd7070Spatrick ///    first 64-bit integer vector of [8 x i8]. The lower 8 bits of the results
493e5dd7070Spatrick ///    are packed into a 64-bit integer vector of [8 x i8].
494e5dd7070Spatrick ///
495e5dd7070Spatrick /// \headerfile <x86intrin.h>
496e5dd7070Spatrick ///
497e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSUBB </c> instruction.
498e5dd7070Spatrick ///
499e5dd7070Spatrick /// \param __m1
500e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8] containing the minuends.
501e5dd7070Spatrick /// \param __m2
502e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8] containing the subtrahends.
503e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the differences of
504e5dd7070Spatrick ///    both parameters.
505e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sub_pi8(__m64 __m1,__m64 __m2)506e5dd7070Spatrick _mm_sub_pi8(__m64 __m1, __m64 __m2)
507e5dd7070Spatrick {
508e5dd7070Spatrick     return (__m64)__builtin_ia32_psubb((__v8qi)__m1, (__v8qi)__m2);
509e5dd7070Spatrick }
510e5dd7070Spatrick 
511e5dd7070Spatrick /// Subtracts each 16-bit integer element of the second 64-bit integer
512e5dd7070Spatrick ///    vector of [4 x i16] from the corresponding 16-bit integer element of the
513e5dd7070Spatrick ///    first 64-bit integer vector of [4 x i16]. The lower 16 bits of the
514e5dd7070Spatrick ///    results are packed into a 64-bit integer vector of [4 x i16].
515e5dd7070Spatrick ///
516e5dd7070Spatrick /// \headerfile <x86intrin.h>
517e5dd7070Spatrick ///
518e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSUBW </c> instruction.
519e5dd7070Spatrick ///
520e5dd7070Spatrick /// \param __m1
521e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16] containing the minuends.
522e5dd7070Spatrick /// \param __m2
523e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16] containing the subtrahends.
524e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the differences of
525e5dd7070Spatrick ///    both parameters.
526e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sub_pi16(__m64 __m1,__m64 __m2)527e5dd7070Spatrick _mm_sub_pi16(__m64 __m1, __m64 __m2)
528e5dd7070Spatrick {
529e5dd7070Spatrick     return (__m64)__builtin_ia32_psubw((__v4hi)__m1, (__v4hi)__m2);
530e5dd7070Spatrick }
531e5dd7070Spatrick 
532e5dd7070Spatrick /// Subtracts each 32-bit integer element of the second 64-bit integer
533e5dd7070Spatrick ///    vector of [2 x i32] from the corresponding 32-bit integer element of the
534e5dd7070Spatrick ///    first 64-bit integer vector of [2 x i32]. The lower 32 bits of the
535e5dd7070Spatrick ///    results are packed into a 64-bit integer vector of [2 x i32].
536e5dd7070Spatrick ///
537e5dd7070Spatrick /// \headerfile <x86intrin.h>
538e5dd7070Spatrick ///
539e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSUBD </c> instruction.
540e5dd7070Spatrick ///
541e5dd7070Spatrick /// \param __m1
542e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32] containing the minuends.
543e5dd7070Spatrick /// \param __m2
544e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32] containing the subtrahends.
545e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the differences of
546e5dd7070Spatrick ///    both parameters.
547e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sub_pi32(__m64 __m1,__m64 __m2)548e5dd7070Spatrick _mm_sub_pi32(__m64 __m1, __m64 __m2)
549e5dd7070Spatrick {
550e5dd7070Spatrick     return (__m64)__builtin_ia32_psubd((__v2si)__m1, (__v2si)__m2);
551e5dd7070Spatrick }
552e5dd7070Spatrick 
553e5dd7070Spatrick /// Subtracts each 8-bit signed integer element of the second 64-bit
554e5dd7070Spatrick ///    integer vector of [8 x i8] from the corresponding 8-bit signed integer
555e5dd7070Spatrick ///    element of the first 64-bit integer vector of [8 x i8]. Positive results
556e5dd7070Spatrick ///    greater than 0x7F are saturated to 0x7F. Negative results less than 0x80
557e5dd7070Spatrick ///    are saturated to 0x80. The results are packed into a 64-bit integer
558e5dd7070Spatrick ///    vector of [8 x i8].
559e5dd7070Spatrick ///
560e5dd7070Spatrick /// \headerfile <x86intrin.h>
561e5dd7070Spatrick ///
562e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSUBSB </c> instruction.
563e5dd7070Spatrick ///
564e5dd7070Spatrick /// \param __m1
565e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8] containing the minuends.
566e5dd7070Spatrick /// \param __m2
567e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8] containing the subtrahends.
568e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the saturated
569e5dd7070Spatrick ///    differences of both parameters.
570e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_subs_pi8(__m64 __m1,__m64 __m2)571e5dd7070Spatrick _mm_subs_pi8(__m64 __m1, __m64 __m2)
572e5dd7070Spatrick {
573e5dd7070Spatrick     return (__m64)__builtin_ia32_psubsb((__v8qi)__m1, (__v8qi)__m2);
574e5dd7070Spatrick }
575e5dd7070Spatrick 
576e5dd7070Spatrick /// Subtracts each 16-bit signed integer element of the second 64-bit
577e5dd7070Spatrick ///    integer vector of [4 x i16] from the corresponding 16-bit signed integer
578e5dd7070Spatrick ///    element of the first 64-bit integer vector of [4 x i16]. Positive results
579e5dd7070Spatrick ///    greater than 0x7FFF are saturated to 0x7FFF. Negative results less than
580e5dd7070Spatrick ///    0x8000 are saturated to 0x8000. The results are packed into a 64-bit
581e5dd7070Spatrick ///    integer vector of [4 x i16].
582e5dd7070Spatrick ///
583e5dd7070Spatrick /// \headerfile <x86intrin.h>
584e5dd7070Spatrick ///
585e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSUBSW </c> instruction.
586e5dd7070Spatrick ///
587e5dd7070Spatrick /// \param __m1
588e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16] containing the minuends.
589e5dd7070Spatrick /// \param __m2
590e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16] containing the subtrahends.
591e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the saturated
592e5dd7070Spatrick ///    differences of both parameters.
593e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_subs_pi16(__m64 __m1,__m64 __m2)594e5dd7070Spatrick _mm_subs_pi16(__m64 __m1, __m64 __m2)
595e5dd7070Spatrick {
596e5dd7070Spatrick     return (__m64)__builtin_ia32_psubsw((__v4hi)__m1, (__v4hi)__m2);
597e5dd7070Spatrick }
598e5dd7070Spatrick 
599e5dd7070Spatrick /// Subtracts each 8-bit unsigned integer element of the second 64-bit
600e5dd7070Spatrick ///    integer vector of [8 x i8] from the corresponding 8-bit unsigned integer
601e5dd7070Spatrick ///    element of the first 64-bit integer vector of [8 x i8].
602e5dd7070Spatrick ///
603e5dd7070Spatrick ///    If an element of the first vector is less than the corresponding element
604e5dd7070Spatrick ///    of the second vector, the result is saturated to 0. The results are
605e5dd7070Spatrick ///    packed into a 64-bit integer vector of [8 x i8].
606e5dd7070Spatrick ///
607e5dd7070Spatrick /// \headerfile <x86intrin.h>
608e5dd7070Spatrick ///
609e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSUBUSB </c> instruction.
610e5dd7070Spatrick ///
611e5dd7070Spatrick /// \param __m1
612e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8] containing the minuends.
613e5dd7070Spatrick /// \param __m2
614e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8] containing the subtrahends.
615e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the saturated
616e5dd7070Spatrick ///    differences of both parameters.
617e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_subs_pu8(__m64 __m1,__m64 __m2)618e5dd7070Spatrick _mm_subs_pu8(__m64 __m1, __m64 __m2)
619e5dd7070Spatrick {
620e5dd7070Spatrick     return (__m64)__builtin_ia32_psubusb((__v8qi)__m1, (__v8qi)__m2);
621e5dd7070Spatrick }
622e5dd7070Spatrick 
623e5dd7070Spatrick /// Subtracts each 16-bit unsigned integer element of the second 64-bit
624e5dd7070Spatrick ///    integer vector of [4 x i16] from the corresponding 16-bit unsigned
625e5dd7070Spatrick ///    integer element of the first 64-bit integer vector of [4 x i16].
626e5dd7070Spatrick ///
627e5dd7070Spatrick ///    If an element of the first vector is less than the corresponding element
628e5dd7070Spatrick ///    of the second vector, the result is saturated to 0. The results are
629e5dd7070Spatrick ///    packed into a 64-bit integer vector of [4 x i16].
630e5dd7070Spatrick ///
631e5dd7070Spatrick /// \headerfile <x86intrin.h>
632e5dd7070Spatrick ///
633e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSUBUSW </c> instruction.
634e5dd7070Spatrick ///
635e5dd7070Spatrick /// \param __m1
636e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16] containing the minuends.
637e5dd7070Spatrick /// \param __m2
638e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16] containing the subtrahends.
639e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the saturated
640e5dd7070Spatrick ///    differences of both parameters.
641e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_subs_pu16(__m64 __m1,__m64 __m2)642e5dd7070Spatrick _mm_subs_pu16(__m64 __m1, __m64 __m2)
643e5dd7070Spatrick {
644e5dd7070Spatrick     return (__m64)__builtin_ia32_psubusw((__v4hi)__m1, (__v4hi)__m2);
645e5dd7070Spatrick }
646e5dd7070Spatrick 
647e5dd7070Spatrick /// Multiplies each 16-bit signed integer element of the first 64-bit
648e5dd7070Spatrick ///    integer vector of [4 x i16] by the corresponding 16-bit signed integer
649e5dd7070Spatrick ///    element of the second 64-bit integer vector of [4 x i16] and get four
650e5dd7070Spatrick ///    32-bit products. Adds adjacent pairs of products to get two 32-bit sums.
651e5dd7070Spatrick ///    The lower 32 bits of these two sums are packed into a 64-bit integer
652e5dd7070Spatrick ///    vector of [2 x i32].
653e5dd7070Spatrick ///
654e5dd7070Spatrick ///    For example, bits [15:0] of both parameters are multiplied, bits [31:16]
655e5dd7070Spatrick ///    of both parameters are multiplied, and the sum of both results is written
656e5dd7070Spatrick ///    to bits [31:0] of the result.
657e5dd7070Spatrick ///
658e5dd7070Spatrick /// \headerfile <x86intrin.h>
659e5dd7070Spatrick ///
660e5dd7070Spatrick /// This intrinsic corresponds to the <c> PMADDWD </c> instruction.
661e5dd7070Spatrick ///
662e5dd7070Spatrick /// \param __m1
663e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
664e5dd7070Spatrick /// \param __m2
665e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
666e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the sums of
667e5dd7070Spatrick ///    products of both parameters.
668e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_madd_pi16(__m64 __m1,__m64 __m2)669e5dd7070Spatrick _mm_madd_pi16(__m64 __m1, __m64 __m2)
670e5dd7070Spatrick {
671e5dd7070Spatrick     return (__m64)__builtin_ia32_pmaddwd((__v4hi)__m1, (__v4hi)__m2);
672e5dd7070Spatrick }
673e5dd7070Spatrick 
674e5dd7070Spatrick /// Multiplies each 16-bit signed integer element of the first 64-bit
675e5dd7070Spatrick ///    integer vector of [4 x i16] by the corresponding 16-bit signed integer
676e5dd7070Spatrick ///    element of the second 64-bit integer vector of [4 x i16]. Packs the upper
677e5dd7070Spatrick ///    16 bits of the 32-bit products into a 64-bit integer vector of [4 x i16].
678e5dd7070Spatrick ///
679e5dd7070Spatrick /// \headerfile <x86intrin.h>
680e5dd7070Spatrick ///
681e5dd7070Spatrick /// This intrinsic corresponds to the <c> PMULHW </c> instruction.
682e5dd7070Spatrick ///
683e5dd7070Spatrick /// \param __m1
684e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
685e5dd7070Spatrick /// \param __m2
686e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
687e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the upper 16 bits
688e5dd7070Spatrick ///    of the products of both parameters.
689e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_mulhi_pi16(__m64 __m1,__m64 __m2)690e5dd7070Spatrick _mm_mulhi_pi16(__m64 __m1, __m64 __m2)
691e5dd7070Spatrick {
692e5dd7070Spatrick     return (__m64)__builtin_ia32_pmulhw((__v4hi)__m1, (__v4hi)__m2);
693e5dd7070Spatrick }
694e5dd7070Spatrick 
695e5dd7070Spatrick /// Multiplies each 16-bit signed integer element of the first 64-bit
696e5dd7070Spatrick ///    integer vector of [4 x i16] by the corresponding 16-bit signed integer
697e5dd7070Spatrick ///    element of the second 64-bit integer vector of [4 x i16]. Packs the lower
698e5dd7070Spatrick ///    16 bits of the 32-bit products into a 64-bit integer vector of [4 x i16].
699e5dd7070Spatrick ///
700e5dd7070Spatrick /// \headerfile <x86intrin.h>
701e5dd7070Spatrick ///
702e5dd7070Spatrick /// This intrinsic corresponds to the <c> PMULLW </c> instruction.
703e5dd7070Spatrick ///
704e5dd7070Spatrick /// \param __m1
705e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
706e5dd7070Spatrick /// \param __m2
707e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
708e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the lower 16 bits
709e5dd7070Spatrick ///    of the products of both parameters.
710e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_mullo_pi16(__m64 __m1,__m64 __m2)711e5dd7070Spatrick _mm_mullo_pi16(__m64 __m1, __m64 __m2)
712e5dd7070Spatrick {
713e5dd7070Spatrick     return (__m64)__builtin_ia32_pmullw((__v4hi)__m1, (__v4hi)__m2);
714e5dd7070Spatrick }
715e5dd7070Spatrick 
716e5dd7070Spatrick /// Left-shifts each 16-bit signed integer element of the first
717e5dd7070Spatrick ///    parameter, which is a 64-bit integer vector of [4 x i16], by the number
718e5dd7070Spatrick ///    of bits specified by the second parameter, which is a 64-bit integer. The
719e5dd7070Spatrick ///    lower 16 bits of the results are packed into a 64-bit integer vector of
720e5dd7070Spatrick ///    [4 x i16].
721e5dd7070Spatrick ///
722e5dd7070Spatrick /// \headerfile <x86intrin.h>
723e5dd7070Spatrick ///
724e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSLLW </c> instruction.
725e5dd7070Spatrick ///
726e5dd7070Spatrick /// \param __m
727e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
728e5dd7070Spatrick /// \param __count
729e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
730e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the left-shifted
731e5dd7070Spatrick ///    values. If \a __count is greater or equal to 16, the result is set to all
732e5dd7070Spatrick ///    0.
733e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sll_pi16(__m64 __m,__m64 __count)734e5dd7070Spatrick _mm_sll_pi16(__m64 __m, __m64 __count)
735e5dd7070Spatrick {
736e5dd7070Spatrick     return (__m64)__builtin_ia32_psllw((__v4hi)__m, __count);
737e5dd7070Spatrick }
738e5dd7070Spatrick 
739e5dd7070Spatrick /// Left-shifts each 16-bit signed integer element of a 64-bit integer
740e5dd7070Spatrick ///    vector of [4 x i16] by the number of bits specified by a 32-bit integer.
741e5dd7070Spatrick ///    The lower 16 bits of the results are packed into a 64-bit integer vector
742e5dd7070Spatrick ///    of [4 x i16].
743e5dd7070Spatrick ///
744e5dd7070Spatrick /// \headerfile <x86intrin.h>
745e5dd7070Spatrick ///
746e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSLLW </c> instruction.
747e5dd7070Spatrick ///
748e5dd7070Spatrick /// \param __m
749e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
750e5dd7070Spatrick /// \param __count
751e5dd7070Spatrick ///    A 32-bit integer value.
752e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the left-shifted
753e5dd7070Spatrick ///    values. If \a __count is greater or equal to 16, the result is set to all
754e5dd7070Spatrick ///    0.
755e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_slli_pi16(__m64 __m,int __count)756e5dd7070Spatrick _mm_slli_pi16(__m64 __m, int __count)
757e5dd7070Spatrick {
758e5dd7070Spatrick     return (__m64)__builtin_ia32_psllwi((__v4hi)__m, __count);
759e5dd7070Spatrick }
760e5dd7070Spatrick 
761e5dd7070Spatrick /// Left-shifts each 32-bit signed integer element of the first
762e5dd7070Spatrick ///    parameter, which is a 64-bit integer vector of [2 x i32], by the number
763e5dd7070Spatrick ///    of bits specified by the second parameter, which is a 64-bit integer. The
764e5dd7070Spatrick ///    lower 32 bits of the results are packed into a 64-bit integer vector of
765e5dd7070Spatrick ///    [2 x i32].
766e5dd7070Spatrick ///
767e5dd7070Spatrick /// \headerfile <x86intrin.h>
768e5dd7070Spatrick ///
769e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSLLD </c> instruction.
770e5dd7070Spatrick ///
771e5dd7070Spatrick /// \param __m
772e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
773e5dd7070Spatrick /// \param __count
774e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
775e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the left-shifted
776e5dd7070Spatrick ///    values. If \a __count is greater or equal to 32, the result is set to all
777e5dd7070Spatrick ///    0.
778e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sll_pi32(__m64 __m,__m64 __count)779e5dd7070Spatrick _mm_sll_pi32(__m64 __m, __m64 __count)
780e5dd7070Spatrick {
781e5dd7070Spatrick     return (__m64)__builtin_ia32_pslld((__v2si)__m, __count);
782e5dd7070Spatrick }
783e5dd7070Spatrick 
784e5dd7070Spatrick /// Left-shifts each 32-bit signed integer element of a 64-bit integer
785e5dd7070Spatrick ///    vector of [2 x i32] by the number of bits specified by a 32-bit integer.
786e5dd7070Spatrick ///    The lower 32 bits of the results are packed into a 64-bit integer vector
787e5dd7070Spatrick ///    of [2 x i32].
788e5dd7070Spatrick ///
789e5dd7070Spatrick /// \headerfile <x86intrin.h>
790e5dd7070Spatrick ///
791e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSLLD </c> instruction.
792e5dd7070Spatrick ///
793e5dd7070Spatrick /// \param __m
794e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
795e5dd7070Spatrick /// \param __count
796e5dd7070Spatrick ///    A 32-bit integer value.
797e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the left-shifted
798e5dd7070Spatrick ///    values. If \a __count is greater or equal to 32, the result is set to all
799e5dd7070Spatrick ///    0.
800e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_slli_pi32(__m64 __m,int __count)801e5dd7070Spatrick _mm_slli_pi32(__m64 __m, int __count)
802e5dd7070Spatrick {
803e5dd7070Spatrick     return (__m64)__builtin_ia32_pslldi((__v2si)__m, __count);
804e5dd7070Spatrick }
805e5dd7070Spatrick 
806e5dd7070Spatrick /// Left-shifts the first 64-bit integer parameter by the number of bits
807e5dd7070Spatrick ///    specified by the second 64-bit integer parameter. The lower 64 bits of
808e5dd7070Spatrick ///    result are returned.
809e5dd7070Spatrick ///
810e5dd7070Spatrick /// \headerfile <x86intrin.h>
811e5dd7070Spatrick ///
812e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSLLQ </c> instruction.
813e5dd7070Spatrick ///
814e5dd7070Spatrick /// \param __m
815e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
816e5dd7070Spatrick /// \param __count
817e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
818e5dd7070Spatrick /// \returns A 64-bit integer vector containing the left-shifted value. If
819e5dd7070Spatrick ///     \a __count is greater or equal to 64, the result is set to 0.
820e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sll_si64(__m64 __m,__m64 __count)821e5dd7070Spatrick _mm_sll_si64(__m64 __m, __m64 __count)
822e5dd7070Spatrick {
823e5dd7070Spatrick     return (__m64)__builtin_ia32_psllq((__v1di)__m, __count);
824e5dd7070Spatrick }
825e5dd7070Spatrick 
826e5dd7070Spatrick /// Left-shifts the first parameter, which is a 64-bit integer, by the
827e5dd7070Spatrick ///    number of bits specified by the second parameter, which is a 32-bit
828e5dd7070Spatrick ///    integer. The lower 64 bits of result are returned.
829e5dd7070Spatrick ///
830e5dd7070Spatrick /// \headerfile <x86intrin.h>
831e5dd7070Spatrick ///
832e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSLLQ </c> instruction.
833e5dd7070Spatrick ///
834e5dd7070Spatrick /// \param __m
835e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
836e5dd7070Spatrick /// \param __count
837e5dd7070Spatrick ///    A 32-bit integer value.
838e5dd7070Spatrick /// \returns A 64-bit integer vector containing the left-shifted value. If
839e5dd7070Spatrick ///     \a __count is greater or equal to 64, the result is set to 0.
840e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_slli_si64(__m64 __m,int __count)841e5dd7070Spatrick _mm_slli_si64(__m64 __m, int __count)
842e5dd7070Spatrick {
843e5dd7070Spatrick     return (__m64)__builtin_ia32_psllqi((__v1di)__m, __count);
844e5dd7070Spatrick }
845e5dd7070Spatrick 
846e5dd7070Spatrick /// Right-shifts each 16-bit integer element of the first parameter,
847e5dd7070Spatrick ///    which is a 64-bit integer vector of [4 x i16], by the number of bits
848e5dd7070Spatrick ///    specified by the second parameter, which is a 64-bit integer.
849e5dd7070Spatrick ///
850e5dd7070Spatrick ///    High-order bits are filled with the sign bit of the initial value of each
851e5dd7070Spatrick ///    16-bit element. The 16-bit results are packed into a 64-bit integer
852e5dd7070Spatrick ///    vector of [4 x i16].
853e5dd7070Spatrick ///
854e5dd7070Spatrick /// \headerfile <x86intrin.h>
855e5dd7070Spatrick ///
856e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRAW </c> instruction.
857e5dd7070Spatrick ///
858e5dd7070Spatrick /// \param __m
859e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
860e5dd7070Spatrick /// \param __count
861e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
862e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the right-shifted
863e5dd7070Spatrick ///    values.
864e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sra_pi16(__m64 __m,__m64 __count)865e5dd7070Spatrick _mm_sra_pi16(__m64 __m, __m64 __count)
866e5dd7070Spatrick {
867e5dd7070Spatrick     return (__m64)__builtin_ia32_psraw((__v4hi)__m, __count);
868e5dd7070Spatrick }
869e5dd7070Spatrick 
870e5dd7070Spatrick /// Right-shifts each 16-bit integer element of a 64-bit integer vector
871e5dd7070Spatrick ///    of [4 x i16] by the number of bits specified by a 32-bit integer.
872e5dd7070Spatrick ///
873e5dd7070Spatrick ///    High-order bits are filled with the sign bit of the initial value of each
874e5dd7070Spatrick ///    16-bit element. The 16-bit results are packed into a 64-bit integer
875e5dd7070Spatrick ///    vector of [4 x i16].
876e5dd7070Spatrick ///
877e5dd7070Spatrick /// \headerfile <x86intrin.h>
878e5dd7070Spatrick ///
879e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRAW </c> instruction.
880e5dd7070Spatrick ///
881e5dd7070Spatrick /// \param __m
882e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
883e5dd7070Spatrick /// \param __count
884e5dd7070Spatrick ///    A 32-bit integer value.
885e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the right-shifted
886e5dd7070Spatrick ///    values.
887e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srai_pi16(__m64 __m,int __count)888e5dd7070Spatrick _mm_srai_pi16(__m64 __m, int __count)
889e5dd7070Spatrick {
890e5dd7070Spatrick     return (__m64)__builtin_ia32_psrawi((__v4hi)__m, __count);
891e5dd7070Spatrick }
892e5dd7070Spatrick 
893e5dd7070Spatrick /// Right-shifts each 32-bit integer element of the first parameter,
894e5dd7070Spatrick ///    which is a 64-bit integer vector of [2 x i32], by the number of bits
895e5dd7070Spatrick ///    specified by the second parameter, which is a 64-bit integer.
896e5dd7070Spatrick ///
897e5dd7070Spatrick ///    High-order bits are filled with the sign bit of the initial value of each
898e5dd7070Spatrick ///    32-bit element. The 32-bit results are packed into a 64-bit integer
899e5dd7070Spatrick ///    vector of [2 x i32].
900e5dd7070Spatrick ///
901e5dd7070Spatrick /// \headerfile <x86intrin.h>
902e5dd7070Spatrick ///
903e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRAD </c> instruction.
904e5dd7070Spatrick ///
905e5dd7070Spatrick /// \param __m
906e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
907e5dd7070Spatrick /// \param __count
908e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
909e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the right-shifted
910e5dd7070Spatrick ///    values.
911e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_sra_pi32(__m64 __m,__m64 __count)912e5dd7070Spatrick _mm_sra_pi32(__m64 __m, __m64 __count)
913e5dd7070Spatrick {
914e5dd7070Spatrick     return (__m64)__builtin_ia32_psrad((__v2si)__m, __count);
915e5dd7070Spatrick }
916e5dd7070Spatrick 
917e5dd7070Spatrick /// Right-shifts each 32-bit integer element of a 64-bit integer vector
918e5dd7070Spatrick ///    of [2 x i32] by the number of bits specified by a 32-bit integer.
919e5dd7070Spatrick ///
920e5dd7070Spatrick ///    High-order bits are filled with the sign bit of the initial value of each
921e5dd7070Spatrick ///    32-bit element. The 32-bit results are packed into a 64-bit integer
922e5dd7070Spatrick ///    vector of [2 x i32].
923e5dd7070Spatrick ///
924e5dd7070Spatrick /// \headerfile <x86intrin.h>
925e5dd7070Spatrick ///
926e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRAD </c> instruction.
927e5dd7070Spatrick ///
928e5dd7070Spatrick /// \param __m
929e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
930e5dd7070Spatrick /// \param __count
931e5dd7070Spatrick ///    A 32-bit integer value.
932e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the right-shifted
933e5dd7070Spatrick ///    values.
934e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srai_pi32(__m64 __m,int __count)935e5dd7070Spatrick _mm_srai_pi32(__m64 __m, int __count)
936e5dd7070Spatrick {
937e5dd7070Spatrick     return (__m64)__builtin_ia32_psradi((__v2si)__m, __count);
938e5dd7070Spatrick }
939e5dd7070Spatrick 
940e5dd7070Spatrick /// Right-shifts each 16-bit integer element of the first parameter,
941e5dd7070Spatrick ///    which is a 64-bit integer vector of [4 x i16], by the number of bits
942e5dd7070Spatrick ///    specified by the second parameter, which is a 64-bit integer.
943e5dd7070Spatrick ///
944e5dd7070Spatrick ///    High-order bits are cleared. The 16-bit results are packed into a 64-bit
945e5dd7070Spatrick ///    integer vector of [4 x i16].
946e5dd7070Spatrick ///
947e5dd7070Spatrick /// \headerfile <x86intrin.h>
948e5dd7070Spatrick ///
949e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRLW </c> instruction.
950e5dd7070Spatrick ///
951e5dd7070Spatrick /// \param __m
952e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
953e5dd7070Spatrick /// \param __count
954e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
955e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the right-shifted
956e5dd7070Spatrick ///    values.
957e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srl_pi16(__m64 __m,__m64 __count)958e5dd7070Spatrick _mm_srl_pi16(__m64 __m, __m64 __count)
959e5dd7070Spatrick {
960e5dd7070Spatrick     return (__m64)__builtin_ia32_psrlw((__v4hi)__m, __count);
961e5dd7070Spatrick }
962e5dd7070Spatrick 
963e5dd7070Spatrick /// Right-shifts each 16-bit integer element of a 64-bit integer vector
964e5dd7070Spatrick ///    of [4 x i16] by the number of bits specified by a 32-bit integer.
965e5dd7070Spatrick ///
966e5dd7070Spatrick ///    High-order bits are cleared. The 16-bit results are packed into a 64-bit
967e5dd7070Spatrick ///    integer vector of [4 x i16].
968e5dd7070Spatrick ///
969e5dd7070Spatrick /// \headerfile <x86intrin.h>
970e5dd7070Spatrick ///
971e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRLW </c> instruction.
972e5dd7070Spatrick ///
973e5dd7070Spatrick /// \param __m
974e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
975e5dd7070Spatrick /// \param __count
976e5dd7070Spatrick ///    A 32-bit integer value.
977e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the right-shifted
978e5dd7070Spatrick ///    values.
979e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srli_pi16(__m64 __m,int __count)980e5dd7070Spatrick _mm_srli_pi16(__m64 __m, int __count)
981e5dd7070Spatrick {
982e5dd7070Spatrick     return (__m64)__builtin_ia32_psrlwi((__v4hi)__m, __count);
983e5dd7070Spatrick }
984e5dd7070Spatrick 
985e5dd7070Spatrick /// Right-shifts each 32-bit integer element of the first parameter,
986e5dd7070Spatrick ///    which is a 64-bit integer vector of [2 x i32], by the number of bits
987e5dd7070Spatrick ///    specified by the second parameter, which is a 64-bit integer.
988e5dd7070Spatrick ///
989e5dd7070Spatrick ///    High-order bits are cleared. The 32-bit results are packed into a 64-bit
990e5dd7070Spatrick ///    integer vector of [2 x i32].
991e5dd7070Spatrick ///
992e5dd7070Spatrick /// \headerfile <x86intrin.h>
993e5dd7070Spatrick ///
994e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRLD </c> instruction.
995e5dd7070Spatrick ///
996e5dd7070Spatrick /// \param __m
997e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
998e5dd7070Spatrick /// \param __count
999e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
1000e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the right-shifted
1001e5dd7070Spatrick ///    values.
1002e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srl_pi32(__m64 __m,__m64 __count)1003e5dd7070Spatrick _mm_srl_pi32(__m64 __m, __m64 __count)
1004e5dd7070Spatrick {
1005e5dd7070Spatrick     return (__m64)__builtin_ia32_psrld((__v2si)__m, __count);
1006e5dd7070Spatrick }
1007e5dd7070Spatrick 
1008e5dd7070Spatrick /// Right-shifts each 32-bit integer element of a 64-bit integer vector
1009e5dd7070Spatrick ///    of [2 x i32] by the number of bits specified by a 32-bit integer.
1010e5dd7070Spatrick ///
1011e5dd7070Spatrick ///    High-order bits are cleared. The 32-bit results are packed into a 64-bit
1012e5dd7070Spatrick ///    integer vector of [2 x i32].
1013e5dd7070Spatrick ///
1014e5dd7070Spatrick /// \headerfile <x86intrin.h>
1015e5dd7070Spatrick ///
1016e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRLD </c> instruction.
1017e5dd7070Spatrick ///
1018e5dd7070Spatrick /// \param __m
1019e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
1020e5dd7070Spatrick /// \param __count
1021e5dd7070Spatrick ///    A 32-bit integer value.
1022e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the right-shifted
1023e5dd7070Spatrick ///    values.
1024e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srli_pi32(__m64 __m,int __count)1025e5dd7070Spatrick _mm_srli_pi32(__m64 __m, int __count)
1026e5dd7070Spatrick {
1027e5dd7070Spatrick     return (__m64)__builtin_ia32_psrldi((__v2si)__m, __count);
1028e5dd7070Spatrick }
1029e5dd7070Spatrick 
1030e5dd7070Spatrick /// Right-shifts the first 64-bit integer parameter by the number of bits
1031e5dd7070Spatrick ///    specified by the second 64-bit integer parameter.
1032e5dd7070Spatrick ///
1033e5dd7070Spatrick ///    High-order bits are cleared.
1034e5dd7070Spatrick ///
1035e5dd7070Spatrick /// \headerfile <x86intrin.h>
1036e5dd7070Spatrick ///
1037e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRLQ </c> instruction.
1038e5dd7070Spatrick ///
1039e5dd7070Spatrick /// \param __m
1040e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
1041e5dd7070Spatrick /// \param __count
1042e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
1043e5dd7070Spatrick /// \returns A 64-bit integer vector containing the right-shifted value.
1044e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srl_si64(__m64 __m,__m64 __count)1045e5dd7070Spatrick _mm_srl_si64(__m64 __m, __m64 __count)
1046e5dd7070Spatrick {
1047e5dd7070Spatrick     return (__m64)__builtin_ia32_psrlq((__v1di)__m, __count);
1048e5dd7070Spatrick }
1049e5dd7070Spatrick 
1050e5dd7070Spatrick /// Right-shifts the first parameter, which is a 64-bit integer, by the
1051e5dd7070Spatrick ///    number of bits specified by the second parameter, which is a 32-bit
1052e5dd7070Spatrick ///    integer.
1053e5dd7070Spatrick ///
1054e5dd7070Spatrick ///    High-order bits are cleared.
1055e5dd7070Spatrick ///
1056e5dd7070Spatrick /// \headerfile <x86intrin.h>
1057e5dd7070Spatrick ///
1058e5dd7070Spatrick /// This intrinsic corresponds to the <c> PSRLQ </c> instruction.
1059e5dd7070Spatrick ///
1060e5dd7070Spatrick /// \param __m
1061e5dd7070Spatrick ///    A 64-bit integer vector interpreted as a single 64-bit integer.
1062e5dd7070Spatrick /// \param __count
1063e5dd7070Spatrick ///    A 32-bit integer value.
1064e5dd7070Spatrick /// \returns A 64-bit integer vector containing the right-shifted value.
1065e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_srli_si64(__m64 __m,int __count)1066e5dd7070Spatrick _mm_srli_si64(__m64 __m, int __count)
1067e5dd7070Spatrick {
1068e5dd7070Spatrick     return (__m64)__builtin_ia32_psrlqi((__v1di)__m, __count);
1069e5dd7070Spatrick }
1070e5dd7070Spatrick 
1071e5dd7070Spatrick /// Performs a bitwise AND of two 64-bit integer vectors.
1072e5dd7070Spatrick ///
1073e5dd7070Spatrick /// \headerfile <x86intrin.h>
1074e5dd7070Spatrick ///
1075e5dd7070Spatrick /// This intrinsic corresponds to the <c> PAND </c> instruction.
1076e5dd7070Spatrick ///
1077e5dd7070Spatrick /// \param __m1
1078e5dd7070Spatrick ///    A 64-bit integer vector.
1079e5dd7070Spatrick /// \param __m2
1080e5dd7070Spatrick ///    A 64-bit integer vector.
1081e5dd7070Spatrick /// \returns A 64-bit integer vector containing the bitwise AND of both
1082e5dd7070Spatrick ///    parameters.
1083e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_and_si64(__m64 __m1,__m64 __m2)1084e5dd7070Spatrick _mm_and_si64(__m64 __m1, __m64 __m2)
1085e5dd7070Spatrick {
1086e5dd7070Spatrick     return __builtin_ia32_pand((__v1di)__m1, (__v1di)__m2);
1087e5dd7070Spatrick }
1088e5dd7070Spatrick 
1089e5dd7070Spatrick /// Performs a bitwise NOT of the first 64-bit integer vector, and then
1090e5dd7070Spatrick ///    performs a bitwise AND of the intermediate result and the second 64-bit
1091e5dd7070Spatrick ///    integer vector.
1092e5dd7070Spatrick ///
1093e5dd7070Spatrick /// \headerfile <x86intrin.h>
1094e5dd7070Spatrick ///
1095e5dd7070Spatrick /// This intrinsic corresponds to the <c> PANDN </c> instruction.
1096e5dd7070Spatrick ///
1097e5dd7070Spatrick /// \param __m1
1098e5dd7070Spatrick ///    A 64-bit integer vector. The one's complement of this parameter is used
1099e5dd7070Spatrick ///    in the bitwise AND.
1100e5dd7070Spatrick /// \param __m2
1101e5dd7070Spatrick ///    A 64-bit integer vector.
1102e5dd7070Spatrick /// \returns A 64-bit integer vector containing the bitwise AND of the second
1103e5dd7070Spatrick ///    parameter and the one's complement of the first parameter.
1104e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_andnot_si64(__m64 __m1,__m64 __m2)1105e5dd7070Spatrick _mm_andnot_si64(__m64 __m1, __m64 __m2)
1106e5dd7070Spatrick {
1107e5dd7070Spatrick     return __builtin_ia32_pandn((__v1di)__m1, (__v1di)__m2);
1108e5dd7070Spatrick }
1109e5dd7070Spatrick 
1110e5dd7070Spatrick /// Performs a bitwise OR of two 64-bit integer vectors.
1111e5dd7070Spatrick ///
1112e5dd7070Spatrick /// \headerfile <x86intrin.h>
1113e5dd7070Spatrick ///
1114e5dd7070Spatrick /// This intrinsic corresponds to the <c> POR </c> instruction.
1115e5dd7070Spatrick ///
1116e5dd7070Spatrick /// \param __m1
1117e5dd7070Spatrick ///    A 64-bit integer vector.
1118e5dd7070Spatrick /// \param __m2
1119e5dd7070Spatrick ///    A 64-bit integer vector.
1120e5dd7070Spatrick /// \returns A 64-bit integer vector containing the bitwise OR of both
1121e5dd7070Spatrick ///    parameters.
1122e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_or_si64(__m64 __m1,__m64 __m2)1123e5dd7070Spatrick _mm_or_si64(__m64 __m1, __m64 __m2)
1124e5dd7070Spatrick {
1125e5dd7070Spatrick     return __builtin_ia32_por((__v1di)__m1, (__v1di)__m2);
1126e5dd7070Spatrick }
1127e5dd7070Spatrick 
1128e5dd7070Spatrick /// Performs a bitwise exclusive OR of two 64-bit integer vectors.
1129e5dd7070Spatrick ///
1130e5dd7070Spatrick /// \headerfile <x86intrin.h>
1131e5dd7070Spatrick ///
1132e5dd7070Spatrick /// This intrinsic corresponds to the <c> PXOR </c> instruction.
1133e5dd7070Spatrick ///
1134e5dd7070Spatrick /// \param __m1
1135e5dd7070Spatrick ///    A 64-bit integer vector.
1136e5dd7070Spatrick /// \param __m2
1137e5dd7070Spatrick ///    A 64-bit integer vector.
1138e5dd7070Spatrick /// \returns A 64-bit integer vector containing the bitwise exclusive OR of both
1139e5dd7070Spatrick ///    parameters.
1140e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_xor_si64(__m64 __m1,__m64 __m2)1141e5dd7070Spatrick _mm_xor_si64(__m64 __m1, __m64 __m2)
1142e5dd7070Spatrick {
1143e5dd7070Spatrick     return __builtin_ia32_pxor((__v1di)__m1, (__v1di)__m2);
1144e5dd7070Spatrick }
1145e5dd7070Spatrick 
1146e5dd7070Spatrick /// Compares the 8-bit integer elements of two 64-bit integer vectors of
1147e5dd7070Spatrick ///    [8 x i8] to determine if the element of the first vector is equal to the
1148e5dd7070Spatrick ///    corresponding element of the second vector.
1149e5dd7070Spatrick ///
1150e5dd7070Spatrick ///    The comparison yields 0 for false, 0xFF for true.
1151e5dd7070Spatrick ///
1152e5dd7070Spatrick /// \headerfile <x86intrin.h>
1153e5dd7070Spatrick ///
1154e5dd7070Spatrick /// This intrinsic corresponds to the <c> PCMPEQB </c> instruction.
1155e5dd7070Spatrick ///
1156e5dd7070Spatrick /// \param __m1
1157e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
1158e5dd7070Spatrick /// \param __m2
1159e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
1160e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the comparison
1161e5dd7070Spatrick ///    results.
1162e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cmpeq_pi8(__m64 __m1,__m64 __m2)1163e5dd7070Spatrick _mm_cmpeq_pi8(__m64 __m1, __m64 __m2)
1164e5dd7070Spatrick {
1165e5dd7070Spatrick     return (__m64)__builtin_ia32_pcmpeqb((__v8qi)__m1, (__v8qi)__m2);
1166e5dd7070Spatrick }
1167e5dd7070Spatrick 
1168e5dd7070Spatrick /// Compares the 16-bit integer elements of two 64-bit integer vectors of
1169e5dd7070Spatrick ///    [4 x i16] to determine if the element of the first vector is equal to the
1170e5dd7070Spatrick ///    corresponding element of the second vector.
1171e5dd7070Spatrick ///
1172e5dd7070Spatrick ///    The comparison yields 0 for false, 0xFFFF for true.
1173e5dd7070Spatrick ///
1174e5dd7070Spatrick /// \headerfile <x86intrin.h>
1175e5dd7070Spatrick ///
1176e5dd7070Spatrick /// This intrinsic corresponds to the <c> PCMPEQW </c> instruction.
1177e5dd7070Spatrick ///
1178e5dd7070Spatrick /// \param __m1
1179e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
1180e5dd7070Spatrick /// \param __m2
1181e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
1182e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the comparison
1183e5dd7070Spatrick ///    results.
1184e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cmpeq_pi16(__m64 __m1,__m64 __m2)1185e5dd7070Spatrick _mm_cmpeq_pi16(__m64 __m1, __m64 __m2)
1186e5dd7070Spatrick {
1187e5dd7070Spatrick     return (__m64)__builtin_ia32_pcmpeqw((__v4hi)__m1, (__v4hi)__m2);
1188e5dd7070Spatrick }
1189e5dd7070Spatrick 
1190e5dd7070Spatrick /// Compares the 32-bit integer elements of two 64-bit integer vectors of
1191e5dd7070Spatrick ///    [2 x i32] to determine if the element of the first vector is equal to the
1192e5dd7070Spatrick ///    corresponding element of the second vector.
1193e5dd7070Spatrick ///
1194e5dd7070Spatrick ///    The comparison yields 0 for false, 0xFFFFFFFF for true.
1195e5dd7070Spatrick ///
1196e5dd7070Spatrick /// \headerfile <x86intrin.h>
1197e5dd7070Spatrick ///
1198e5dd7070Spatrick /// This intrinsic corresponds to the <c> PCMPEQD </c> instruction.
1199e5dd7070Spatrick ///
1200e5dd7070Spatrick /// \param __m1
1201e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
1202e5dd7070Spatrick /// \param __m2
1203e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
1204e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the comparison
1205e5dd7070Spatrick ///    results.
1206e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cmpeq_pi32(__m64 __m1,__m64 __m2)1207e5dd7070Spatrick _mm_cmpeq_pi32(__m64 __m1, __m64 __m2)
1208e5dd7070Spatrick {
1209e5dd7070Spatrick     return (__m64)__builtin_ia32_pcmpeqd((__v2si)__m1, (__v2si)__m2);
1210e5dd7070Spatrick }
1211e5dd7070Spatrick 
1212e5dd7070Spatrick /// Compares the 8-bit integer elements of two 64-bit integer vectors of
1213e5dd7070Spatrick ///    [8 x i8] to determine if the element of the first vector is greater than
1214e5dd7070Spatrick ///    the corresponding element of the second vector.
1215e5dd7070Spatrick ///
1216e5dd7070Spatrick ///    The comparison yields 0 for false, 0xFF for true.
1217e5dd7070Spatrick ///
1218e5dd7070Spatrick /// \headerfile <x86intrin.h>
1219e5dd7070Spatrick ///
1220e5dd7070Spatrick /// This intrinsic corresponds to the <c> PCMPGTB </c> instruction.
1221e5dd7070Spatrick ///
1222e5dd7070Spatrick /// \param __m1
1223e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
1224e5dd7070Spatrick /// \param __m2
1225e5dd7070Spatrick ///    A 64-bit integer vector of [8 x i8].
1226e5dd7070Spatrick /// \returns A 64-bit integer vector of [8 x i8] containing the comparison
1227e5dd7070Spatrick ///    results.
1228e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cmpgt_pi8(__m64 __m1,__m64 __m2)1229e5dd7070Spatrick _mm_cmpgt_pi8(__m64 __m1, __m64 __m2)
1230e5dd7070Spatrick {
1231e5dd7070Spatrick     return (__m64)__builtin_ia32_pcmpgtb((__v8qi)__m1, (__v8qi)__m2);
1232e5dd7070Spatrick }
1233e5dd7070Spatrick 
1234e5dd7070Spatrick /// Compares the 16-bit integer elements of two 64-bit integer vectors of
1235e5dd7070Spatrick ///    [4 x i16] to determine if the element of the first vector is greater than
1236e5dd7070Spatrick ///    the corresponding element of the second vector.
1237e5dd7070Spatrick ///
1238e5dd7070Spatrick ///    The comparison yields 0 for false, 0xFFFF for true.
1239e5dd7070Spatrick ///
1240e5dd7070Spatrick /// \headerfile <x86intrin.h>
1241e5dd7070Spatrick ///
1242e5dd7070Spatrick /// This intrinsic corresponds to the <c> PCMPGTW </c> instruction.
1243e5dd7070Spatrick ///
1244e5dd7070Spatrick /// \param __m1
1245e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
1246e5dd7070Spatrick /// \param __m2
1247e5dd7070Spatrick ///    A 64-bit integer vector of [4 x i16].
1248e5dd7070Spatrick /// \returns A 64-bit integer vector of [4 x i16] containing the comparison
1249e5dd7070Spatrick ///    results.
1250e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cmpgt_pi16(__m64 __m1,__m64 __m2)1251e5dd7070Spatrick _mm_cmpgt_pi16(__m64 __m1, __m64 __m2)
1252e5dd7070Spatrick {
1253e5dd7070Spatrick     return (__m64)__builtin_ia32_pcmpgtw((__v4hi)__m1, (__v4hi)__m2);
1254e5dd7070Spatrick }
1255e5dd7070Spatrick 
1256e5dd7070Spatrick /// Compares the 32-bit integer elements of two 64-bit integer vectors of
1257e5dd7070Spatrick ///    [2 x i32] to determine if the element of the first vector is greater than
1258e5dd7070Spatrick ///    the corresponding element of the second vector.
1259e5dd7070Spatrick ///
1260e5dd7070Spatrick ///    The comparison yields 0 for false, 0xFFFFFFFF for true.
1261e5dd7070Spatrick ///
1262e5dd7070Spatrick /// \headerfile <x86intrin.h>
1263e5dd7070Spatrick ///
1264e5dd7070Spatrick /// This intrinsic corresponds to the <c> PCMPGTD </c> instruction.
1265e5dd7070Spatrick ///
1266e5dd7070Spatrick /// \param __m1
1267e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
1268e5dd7070Spatrick /// \param __m2
1269e5dd7070Spatrick ///    A 64-bit integer vector of [2 x i32].
1270e5dd7070Spatrick /// \returns A 64-bit integer vector of [2 x i32] containing the comparison
1271e5dd7070Spatrick ///    results.
1272e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_cmpgt_pi32(__m64 __m1,__m64 __m2)1273e5dd7070Spatrick _mm_cmpgt_pi32(__m64 __m1, __m64 __m2)
1274e5dd7070Spatrick {
1275e5dd7070Spatrick     return (__m64)__builtin_ia32_pcmpgtd((__v2si)__m1, (__v2si)__m2);
1276e5dd7070Spatrick }
1277e5dd7070Spatrick 
1278e5dd7070Spatrick /// Constructs a 64-bit integer vector initialized to zero.
1279e5dd7070Spatrick ///
1280e5dd7070Spatrick /// \headerfile <x86intrin.h>
1281e5dd7070Spatrick ///
1282e5dd7070Spatrick /// This intrinsic corresponds to the <c> PXOR </c> instruction.
1283e5dd7070Spatrick ///
1284e5dd7070Spatrick /// \returns An initialized 64-bit integer vector with all elements set to zero.
1285e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_setzero_si64(void)1286e5dd7070Spatrick _mm_setzero_si64(void)
1287e5dd7070Spatrick {
1288e5dd7070Spatrick     return __extension__ (__m64){ 0LL };
1289e5dd7070Spatrick }
1290e5dd7070Spatrick 
1291e5dd7070Spatrick /// Constructs a 64-bit integer vector initialized with the specified
1292e5dd7070Spatrick ///    32-bit integer values.
1293e5dd7070Spatrick ///
1294e5dd7070Spatrick /// \headerfile <x86intrin.h>
1295e5dd7070Spatrick ///
1296e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1297e5dd7070Spatrick ///    instruction.
1298e5dd7070Spatrick ///
1299e5dd7070Spatrick /// \param __i1
1300e5dd7070Spatrick ///    A 32-bit integer value used to initialize the upper 32 bits of the
1301e5dd7070Spatrick ///    result.
1302e5dd7070Spatrick /// \param __i0
1303e5dd7070Spatrick ///    A 32-bit integer value used to initialize the lower 32 bits of the
1304e5dd7070Spatrick ///    result.
1305e5dd7070Spatrick /// \returns An initialized 64-bit integer vector.
1306e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_set_pi32(int __i1,int __i0)1307e5dd7070Spatrick _mm_set_pi32(int __i1, int __i0)
1308e5dd7070Spatrick {
1309e5dd7070Spatrick     return (__m64)__builtin_ia32_vec_init_v2si(__i0, __i1);
1310e5dd7070Spatrick }
1311e5dd7070Spatrick 
1312e5dd7070Spatrick /// Constructs a 64-bit integer vector initialized with the specified
1313e5dd7070Spatrick ///    16-bit integer values.
1314e5dd7070Spatrick ///
1315e5dd7070Spatrick /// \headerfile <x86intrin.h>
1316e5dd7070Spatrick ///
1317e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1318e5dd7070Spatrick ///    instruction.
1319e5dd7070Spatrick ///
1320e5dd7070Spatrick /// \param __s3
1321e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [63:48] of the result.
1322e5dd7070Spatrick /// \param __s2
1323e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [47:32] of the result.
1324e5dd7070Spatrick /// \param __s1
1325e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [31:16] of the result.
1326e5dd7070Spatrick /// \param __s0
1327e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [15:0] of the result.
1328e5dd7070Spatrick /// \returns An initialized 64-bit integer vector.
1329e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_set_pi16(short __s3,short __s2,short __s1,short __s0)1330e5dd7070Spatrick _mm_set_pi16(short __s3, short __s2, short __s1, short __s0)
1331e5dd7070Spatrick {
1332e5dd7070Spatrick     return (__m64)__builtin_ia32_vec_init_v4hi(__s0, __s1, __s2, __s3);
1333e5dd7070Spatrick }
1334e5dd7070Spatrick 
1335e5dd7070Spatrick /// Constructs a 64-bit integer vector initialized with the specified
1336e5dd7070Spatrick ///    8-bit integer values.
1337e5dd7070Spatrick ///
1338e5dd7070Spatrick /// \headerfile <x86intrin.h>
1339e5dd7070Spatrick ///
1340e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1341e5dd7070Spatrick ///    instruction.
1342e5dd7070Spatrick ///
1343e5dd7070Spatrick /// \param __b7
1344e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [63:56] of the result.
1345e5dd7070Spatrick /// \param __b6
1346e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [55:48] of the result.
1347e5dd7070Spatrick /// \param __b5
1348e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [47:40] of the result.
1349e5dd7070Spatrick /// \param __b4
1350e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [39:32] of the result.
1351e5dd7070Spatrick /// \param __b3
1352e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [31:24] of the result.
1353e5dd7070Spatrick /// \param __b2
1354e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [23:16] of the result.
1355e5dd7070Spatrick /// \param __b1
1356e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [15:8] of the result.
1357e5dd7070Spatrick /// \param __b0
1358e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [7:0] of the result.
1359e5dd7070Spatrick /// \returns An initialized 64-bit integer vector.
1360e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_set_pi8(char __b7,char __b6,char __b5,char __b4,char __b3,char __b2,char __b1,char __b0)1361e5dd7070Spatrick _mm_set_pi8(char __b7, char __b6, char __b5, char __b4, char __b3, char __b2,
1362e5dd7070Spatrick             char __b1, char __b0)
1363e5dd7070Spatrick {
1364e5dd7070Spatrick     return (__m64)__builtin_ia32_vec_init_v8qi(__b0, __b1, __b2, __b3,
1365e5dd7070Spatrick                                                __b4, __b5, __b6, __b7);
1366e5dd7070Spatrick }
1367e5dd7070Spatrick 
1368e5dd7070Spatrick /// Constructs a 64-bit integer vector of [2 x i32], with each of the
1369e5dd7070Spatrick ///    32-bit integer vector elements set to the specified 32-bit integer
1370e5dd7070Spatrick ///    value.
1371e5dd7070Spatrick ///
1372e5dd7070Spatrick /// \headerfile <x86intrin.h>
1373e5dd7070Spatrick ///
1374e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1375e5dd7070Spatrick ///    instruction.
1376e5dd7070Spatrick ///
1377e5dd7070Spatrick /// \param __i
1378e5dd7070Spatrick ///    A 32-bit integer value used to initialize each vector element of the
1379e5dd7070Spatrick ///    result.
1380e5dd7070Spatrick /// \returns An initialized 64-bit integer vector of [2 x i32].
1381e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_set1_pi32(int __i)1382e5dd7070Spatrick _mm_set1_pi32(int __i)
1383e5dd7070Spatrick {
1384e5dd7070Spatrick     return _mm_set_pi32(__i, __i);
1385e5dd7070Spatrick }
1386e5dd7070Spatrick 
1387e5dd7070Spatrick /// Constructs a 64-bit integer vector of [4 x i16], with each of the
1388e5dd7070Spatrick ///    16-bit integer vector elements set to the specified 16-bit integer
1389e5dd7070Spatrick ///    value.
1390e5dd7070Spatrick ///
1391e5dd7070Spatrick /// \headerfile <x86intrin.h>
1392e5dd7070Spatrick ///
1393e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1394e5dd7070Spatrick ///    instruction.
1395e5dd7070Spatrick ///
1396e5dd7070Spatrick /// \param __w
1397e5dd7070Spatrick ///    A 16-bit integer value used to initialize each vector element of the
1398e5dd7070Spatrick ///    result.
1399e5dd7070Spatrick /// \returns An initialized 64-bit integer vector of [4 x i16].
1400e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_set1_pi16(short __w)1401e5dd7070Spatrick _mm_set1_pi16(short __w)
1402e5dd7070Spatrick {
1403e5dd7070Spatrick     return _mm_set_pi16(__w, __w, __w, __w);
1404e5dd7070Spatrick }
1405e5dd7070Spatrick 
1406e5dd7070Spatrick /// Constructs a 64-bit integer vector of [8 x i8], with each of the
1407e5dd7070Spatrick ///    8-bit integer vector elements set to the specified 8-bit integer value.
1408e5dd7070Spatrick ///
1409e5dd7070Spatrick /// \headerfile <x86intrin.h>
1410e5dd7070Spatrick ///
1411e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1412e5dd7070Spatrick ///    instruction.
1413e5dd7070Spatrick ///
1414e5dd7070Spatrick /// \param __b
1415e5dd7070Spatrick ///    An 8-bit integer value used to initialize each vector element of the
1416e5dd7070Spatrick ///    result.
1417e5dd7070Spatrick /// \returns An initialized 64-bit integer vector of [8 x i8].
1418e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_set1_pi8(char __b)1419e5dd7070Spatrick _mm_set1_pi8(char __b)
1420e5dd7070Spatrick {
1421e5dd7070Spatrick     return _mm_set_pi8(__b, __b, __b, __b, __b, __b, __b, __b);
1422e5dd7070Spatrick }
1423e5dd7070Spatrick 
1424e5dd7070Spatrick /// Constructs a 64-bit integer vector, initialized in reverse order with
1425e5dd7070Spatrick ///    the specified 32-bit integer values.
1426e5dd7070Spatrick ///
1427e5dd7070Spatrick /// \headerfile <x86intrin.h>
1428e5dd7070Spatrick ///
1429e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1430e5dd7070Spatrick ///    instruction.
1431e5dd7070Spatrick ///
1432e5dd7070Spatrick /// \param __i0
1433e5dd7070Spatrick ///    A 32-bit integer value used to initialize the lower 32 bits of the
1434e5dd7070Spatrick ///    result.
1435e5dd7070Spatrick /// \param __i1
1436e5dd7070Spatrick ///    A 32-bit integer value used to initialize the upper 32 bits of the
1437e5dd7070Spatrick ///    result.
1438e5dd7070Spatrick /// \returns An initialized 64-bit integer vector.
1439e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_setr_pi32(int __i0,int __i1)1440e5dd7070Spatrick _mm_setr_pi32(int __i0, int __i1)
1441e5dd7070Spatrick {
1442e5dd7070Spatrick     return _mm_set_pi32(__i1, __i0);
1443e5dd7070Spatrick }
1444e5dd7070Spatrick 
1445e5dd7070Spatrick /// Constructs a 64-bit integer vector, initialized in reverse order with
1446e5dd7070Spatrick ///    the specified 16-bit integer values.
1447e5dd7070Spatrick ///
1448e5dd7070Spatrick /// \headerfile <x86intrin.h>
1449e5dd7070Spatrick ///
1450e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1451e5dd7070Spatrick ///    instruction.
1452e5dd7070Spatrick ///
1453e5dd7070Spatrick /// \param __w0
1454e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [15:0] of the result.
1455e5dd7070Spatrick /// \param __w1
1456e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [31:16] of the result.
1457e5dd7070Spatrick /// \param __w2
1458e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [47:32] of the result.
1459e5dd7070Spatrick /// \param __w3
1460e5dd7070Spatrick ///    A 16-bit integer value used to initialize bits [63:48] of the result.
1461e5dd7070Spatrick /// \returns An initialized 64-bit integer vector.
1462e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_setr_pi16(short __w0,short __w1,short __w2,short __w3)1463e5dd7070Spatrick _mm_setr_pi16(short __w0, short __w1, short __w2, short __w3)
1464e5dd7070Spatrick {
1465e5dd7070Spatrick     return _mm_set_pi16(__w3, __w2, __w1, __w0);
1466e5dd7070Spatrick }
1467e5dd7070Spatrick 
1468e5dd7070Spatrick /// Constructs a 64-bit integer vector, initialized in reverse order with
1469e5dd7070Spatrick ///    the specified 8-bit integer values.
1470e5dd7070Spatrick ///
1471e5dd7070Spatrick /// \headerfile <x86intrin.h>
1472e5dd7070Spatrick ///
1473e5dd7070Spatrick /// This intrinsic is a utility function and does not correspond to a specific
1474e5dd7070Spatrick ///    instruction.
1475e5dd7070Spatrick ///
1476e5dd7070Spatrick /// \param __b0
1477e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [7:0] of the result.
1478e5dd7070Spatrick /// \param __b1
1479e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [15:8] of the result.
1480e5dd7070Spatrick /// \param __b2
1481e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [23:16] of the result.
1482e5dd7070Spatrick /// \param __b3
1483e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [31:24] of the result.
1484e5dd7070Spatrick /// \param __b4
1485e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [39:32] of the result.
1486e5dd7070Spatrick /// \param __b5
1487e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [47:40] of the result.
1488e5dd7070Spatrick /// \param __b6
1489e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [55:48] of the result.
1490e5dd7070Spatrick /// \param __b7
1491e5dd7070Spatrick ///    An 8-bit integer value used to initialize bits [63:56] of the result.
1492e5dd7070Spatrick /// \returns An initialized 64-bit integer vector.
1493e5dd7070Spatrick static __inline__ __m64 __DEFAULT_FN_ATTRS
_mm_setr_pi8(char __b0,char __b1,char __b2,char __b3,char __b4,char __b5,char __b6,char __b7)1494e5dd7070Spatrick _mm_setr_pi8(char __b0, char __b1, char __b2, char __b3, char __b4, char __b5,
1495e5dd7070Spatrick              char __b6, char __b7)
1496e5dd7070Spatrick {
1497e5dd7070Spatrick     return _mm_set_pi8(__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0);
1498e5dd7070Spatrick }
1499e5dd7070Spatrick 
1500e5dd7070Spatrick #undef __DEFAULT_FN_ATTRS
1501e5dd7070Spatrick 
1502e5dd7070Spatrick /* Aliases for compatibility. */
1503e5dd7070Spatrick #define _m_empty _mm_empty
1504e5dd7070Spatrick #define _m_from_int _mm_cvtsi32_si64
1505e5dd7070Spatrick #define _m_from_int64 _mm_cvtsi64_m64
1506e5dd7070Spatrick #define _m_to_int _mm_cvtsi64_si32
1507e5dd7070Spatrick #define _m_to_int64 _mm_cvtm64_si64
1508e5dd7070Spatrick #define _m_packsswb _mm_packs_pi16
1509e5dd7070Spatrick #define _m_packssdw _mm_packs_pi32
1510e5dd7070Spatrick #define _m_packuswb _mm_packs_pu16
1511e5dd7070Spatrick #define _m_punpckhbw _mm_unpackhi_pi8
1512e5dd7070Spatrick #define _m_punpckhwd _mm_unpackhi_pi16
1513e5dd7070Spatrick #define _m_punpckhdq _mm_unpackhi_pi32
1514e5dd7070Spatrick #define _m_punpcklbw _mm_unpacklo_pi8
1515e5dd7070Spatrick #define _m_punpcklwd _mm_unpacklo_pi16
1516e5dd7070Spatrick #define _m_punpckldq _mm_unpacklo_pi32
1517e5dd7070Spatrick #define _m_paddb _mm_add_pi8
1518e5dd7070Spatrick #define _m_paddw _mm_add_pi16
1519e5dd7070Spatrick #define _m_paddd _mm_add_pi32
1520e5dd7070Spatrick #define _m_paddsb _mm_adds_pi8
1521e5dd7070Spatrick #define _m_paddsw _mm_adds_pi16
1522e5dd7070Spatrick #define _m_paddusb _mm_adds_pu8
1523e5dd7070Spatrick #define _m_paddusw _mm_adds_pu16
1524e5dd7070Spatrick #define _m_psubb _mm_sub_pi8
1525e5dd7070Spatrick #define _m_psubw _mm_sub_pi16
1526e5dd7070Spatrick #define _m_psubd _mm_sub_pi32
1527e5dd7070Spatrick #define _m_psubsb _mm_subs_pi8
1528e5dd7070Spatrick #define _m_psubsw _mm_subs_pi16
1529e5dd7070Spatrick #define _m_psubusb _mm_subs_pu8
1530e5dd7070Spatrick #define _m_psubusw _mm_subs_pu16
1531e5dd7070Spatrick #define _m_pmaddwd _mm_madd_pi16
1532e5dd7070Spatrick #define _m_pmulhw _mm_mulhi_pi16
1533e5dd7070Spatrick #define _m_pmullw _mm_mullo_pi16
1534e5dd7070Spatrick #define _m_psllw _mm_sll_pi16
1535e5dd7070Spatrick #define _m_psllwi _mm_slli_pi16
1536e5dd7070Spatrick #define _m_pslld _mm_sll_pi32
1537e5dd7070Spatrick #define _m_pslldi _mm_slli_pi32
1538e5dd7070Spatrick #define _m_psllq _mm_sll_si64
1539e5dd7070Spatrick #define _m_psllqi _mm_slli_si64
1540e5dd7070Spatrick #define _m_psraw _mm_sra_pi16
1541e5dd7070Spatrick #define _m_psrawi _mm_srai_pi16
1542e5dd7070Spatrick #define _m_psrad _mm_sra_pi32
1543e5dd7070Spatrick #define _m_psradi _mm_srai_pi32
1544e5dd7070Spatrick #define _m_psrlw _mm_srl_pi16
1545e5dd7070Spatrick #define _m_psrlwi _mm_srli_pi16
1546e5dd7070Spatrick #define _m_psrld _mm_srl_pi32
1547e5dd7070Spatrick #define _m_psrldi _mm_srli_pi32
1548e5dd7070Spatrick #define _m_psrlq _mm_srl_si64
1549e5dd7070Spatrick #define _m_psrlqi _mm_srli_si64
1550e5dd7070Spatrick #define _m_pand _mm_and_si64
1551e5dd7070Spatrick #define _m_pandn _mm_andnot_si64
1552e5dd7070Spatrick #define _m_por _mm_or_si64
1553e5dd7070Spatrick #define _m_pxor _mm_xor_si64
1554e5dd7070Spatrick #define _m_pcmpeqb _mm_cmpeq_pi8
1555e5dd7070Spatrick #define _m_pcmpeqw _mm_cmpeq_pi16
1556e5dd7070Spatrick #define _m_pcmpeqd _mm_cmpeq_pi32
1557e5dd7070Spatrick #define _m_pcmpgtb _mm_cmpgt_pi8
1558e5dd7070Spatrick #define _m_pcmpgtw _mm_cmpgt_pi16
1559e5dd7070Spatrick #define _m_pcmpgtd _mm_cmpgt_pi32
1560e5dd7070Spatrick 
1561e5dd7070Spatrick #endif /* __MMINTRIN_H */
1562e5dd7070Spatrick 
1563