1169689Skan/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc.
2132718Skan
3132718Skan   This file is part of GCC.
4132718Skan
5132718Skan   GCC is free software; you can redistribute it and/or modify it
6132718Skan   under the terms of the GNU General Public License as published
7132718Skan   by the Free Software Foundation; either version 2, or (at your
8132718Skan   option) any later version.
9132718Skan
10132718Skan   GCC is distributed in the hope that it will be useful, but WITHOUT
11132718Skan   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12132718Skan   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
13132718Skan   License for more details.
14132718Skan
15132718Skan   You should have received a copy of the GNU General Public License
16132718Skan   along with GCC; see the file COPYING.  If not, write to the Free
17169689Skan   Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
18169689Skan   02110-1301, USA.  */
19132718Skan
20132718Skan/* As a special exception, if you include this header file into source
21132718Skan   files compiled by GCC, this header file does not by itself cause
22132718Skan   the resulting executable to be covered by the GNU General Public
23132718Skan   License.  This exception does not however invalidate any other
24132718Skan   reasons why the executable file might be covered by the GNU General
25132718Skan   Public License.  */
26132718Skan
27132718Skan#ifndef _MMINTRIN_H_INCLUDED
28132718Skan#define _MMINTRIN_H_INCLUDED
29132718Skan
30132718Skan/* The data type intended for user use.  */
31132718Skantypedef unsigned long long __m64, __int64;
32132718Skan
33132718Skan/* Internal data types for implementing the intrinsics.  */
34169689Skantypedef int __v2si __attribute__ ((vector_size (8)));
35169689Skantypedef short __v4hi __attribute__ ((vector_size (8)));
36169689Skantypedef char __v8qi __attribute__ ((vector_size (8)));
37132718Skan
38132718Skan/* "Convert" __m64 and __int64 into each other.  */
39132718Skanstatic __inline __m64
40132718Skan_mm_cvtsi64_m64 (__int64 __i)
41132718Skan{
42132718Skan  return __i;
43132718Skan}
44132718Skan
45132718Skanstatic __inline __int64
46132718Skan_mm_cvtm64_si64 (__m64 __i)
47132718Skan{
48132718Skan  return __i;
49132718Skan}
50132718Skan
51132718Skanstatic __inline int
52132718Skan_mm_cvtsi64_si32 (__int64 __i)
53132718Skan{
54132718Skan  return __i;
55132718Skan}
56132718Skan
57132718Skanstatic __inline __int64
58132718Skan_mm_cvtsi32_si64 (int __i)
59132718Skan{
60132718Skan  return __i;
61132718Skan}
62132718Skan
63132718Skan/* Pack the four 16-bit values from M1 into the lower four 8-bit values of
64132718Skan   the result, and the four 16-bit values from M2 into the upper four 8-bit
65132718Skan   values of the result, all with signed saturation.  */
66132718Skanstatic __inline __m64
67132718Skan_mm_packs_pi16 (__m64 __m1, __m64 __m2)
68132718Skan{
69132718Skan  return (__m64) __builtin_arm_wpackhss ((__v4hi)__m1, (__v4hi)__m2);
70132718Skan}
71132718Skan
72132718Skan/* Pack the two 32-bit values from M1 in to the lower two 16-bit values of
73132718Skan   the result, and the two 32-bit values from M2 into the upper two 16-bit
74132718Skan   values of the result, all with signed saturation.  */
75132718Skanstatic __inline __m64
76132718Skan_mm_packs_pi32 (__m64 __m1, __m64 __m2)
77132718Skan{
78132718Skan  return (__m64) __builtin_arm_wpackwss ((__v2si)__m1, (__v2si)__m2);
79132718Skan}
80132718Skan
81132718Skan/* Copy the 64-bit value from M1 into the lower 32-bits of the result, and
82132718Skan   the 64-bit value from M2 into the upper 32-bits of the result, all with
83132718Skan   signed saturation for values that do not fit exactly into 32-bits.  */
84132718Skanstatic __inline __m64
85132718Skan_mm_packs_pi64 (__m64 __m1, __m64 __m2)
86132718Skan{
87132718Skan  return (__m64) __builtin_arm_wpackdss ((long long)__m1, (long long)__m2);
88132718Skan}
89132718Skan
90132718Skan/* Pack the four 16-bit values from M1 into the lower four 8-bit values of
91132718Skan   the result, and the four 16-bit values from M2 into the upper four 8-bit
92132718Skan   values of the result, all with unsigned saturation.  */
93132718Skanstatic __inline __m64
94132718Skan_mm_packs_pu16 (__m64 __m1, __m64 __m2)
95132718Skan{
96132718Skan  return (__m64) __builtin_arm_wpackhus ((__v4hi)__m1, (__v4hi)__m2);
97132718Skan}
98132718Skan
99132718Skan/* Pack the two 32-bit values from M1 into the lower two 16-bit values of
100132718Skan   the result, and the two 32-bit values from M2 into the upper two 16-bit
101132718Skan   values of the result, all with unsigned saturation.  */
102132718Skanstatic __inline __m64
103132718Skan_mm_packs_pu32 (__m64 __m1, __m64 __m2)
104132718Skan{
105132718Skan  return (__m64) __builtin_arm_wpackwus ((__v2si)__m1, (__v2si)__m2);
106132718Skan}
107132718Skan
108132718Skan/* Copy the 64-bit value from M1 into the lower 32-bits of the result, and
109132718Skan   the 64-bit value from M2 into the upper 32-bits of the result, all with
110132718Skan   unsigned saturation for values that do not fit exactly into 32-bits.  */
111132718Skanstatic __inline __m64
112132718Skan_mm_packs_pu64 (__m64 __m1, __m64 __m2)
113132718Skan{
114132718Skan  return (__m64) __builtin_arm_wpackdus ((long long)__m1, (long long)__m2);
115132718Skan}
116132718Skan
117132718Skan/* Interleave the four 8-bit values from the high half of M1 with the four
118132718Skan   8-bit values from the high half of M2.  */
119132718Skanstatic __inline __m64
120132718Skan_mm_unpackhi_pi8 (__m64 __m1, __m64 __m2)
121132718Skan{
122132718Skan  return (__m64) __builtin_arm_wunpckihb ((__v8qi)__m1, (__v8qi)__m2);
123132718Skan}
124132718Skan
125132718Skan/* Interleave the two 16-bit values from the high half of M1 with the two
126132718Skan   16-bit values from the high half of M2.  */
127132718Skanstatic __inline __m64
128132718Skan_mm_unpackhi_pi16 (__m64 __m1, __m64 __m2)
129132718Skan{
130132718Skan  return (__m64) __builtin_arm_wunpckihh ((__v4hi)__m1, (__v4hi)__m2);
131132718Skan}
132132718Skan
133132718Skan/* Interleave the 32-bit value from the high half of M1 with the 32-bit
134132718Skan   value from the high half of M2.  */
135132718Skanstatic __inline __m64
136132718Skan_mm_unpackhi_pi32 (__m64 __m1, __m64 __m2)
137132718Skan{
138132718Skan  return (__m64) __builtin_arm_wunpckihw ((__v2si)__m1, (__v2si)__m2);
139132718Skan}
140132718Skan
141132718Skan/* Interleave the four 8-bit values from the low half of M1 with the four
142132718Skan   8-bit values from the low half of M2.  */
143132718Skanstatic __inline __m64
144132718Skan_mm_unpacklo_pi8 (__m64 __m1, __m64 __m2)
145132718Skan{
146132718Skan  return (__m64) __builtin_arm_wunpckilb ((__v8qi)__m1, (__v8qi)__m2);
147132718Skan}
148132718Skan
149132718Skan/* Interleave the two 16-bit values from the low half of M1 with the two
150132718Skan   16-bit values from the low half of M2.  */
151132718Skanstatic __inline __m64
152132718Skan_mm_unpacklo_pi16 (__m64 __m1, __m64 __m2)
153132718Skan{
154132718Skan  return (__m64) __builtin_arm_wunpckilh ((__v4hi)__m1, (__v4hi)__m2);
155132718Skan}
156132718Skan
157132718Skan/* Interleave the 32-bit value from the low half of M1 with the 32-bit
158132718Skan   value from the low half of M2.  */
159132718Skanstatic __inline __m64
160132718Skan_mm_unpacklo_pi32 (__m64 __m1, __m64 __m2)
161132718Skan{
162132718Skan  return (__m64) __builtin_arm_wunpckilw ((__v2si)__m1, (__v2si)__m2);
163132718Skan}
164132718Skan
165132718Skan/* Take the four 8-bit values from the low half of M1, sign extend them,
166132718Skan   and return the result as a vector of four 16-bit quantities.  */
167132718Skanstatic __inline __m64
168132718Skan_mm_unpackel_pi8 (__m64 __m1)
169132718Skan{
170132718Skan  return (__m64) __builtin_arm_wunpckelsb ((__v8qi)__m1);
171132718Skan}
172132718Skan
173132718Skan/* Take the two 16-bit values from the low half of M1, sign extend them,
174132718Skan   and return the result as a vector of two 32-bit quantities.  */
175132718Skanstatic __inline __m64
176132718Skan_mm_unpackel_pi16 (__m64 __m1)
177132718Skan{
178132718Skan  return (__m64) __builtin_arm_wunpckelsh ((__v4hi)__m1);
179132718Skan}
180132718Skan
181132718Skan/* Take the 32-bit value from the low half of M1, and return it sign extended
182132718Skan  to 64 bits.  */
183132718Skanstatic __inline __m64
184132718Skan_mm_unpackel_pi32 (__m64 __m1)
185132718Skan{
186132718Skan  return (__m64) __builtin_arm_wunpckelsw ((__v2si)__m1);
187132718Skan}
188132718Skan
189132718Skan/* Take the four 8-bit values from the high half of M1, sign extend them,
190132718Skan   and return the result as a vector of four 16-bit quantities.  */
191132718Skanstatic __inline __m64
192132718Skan_mm_unpackeh_pi8 (__m64 __m1)
193132718Skan{
194132718Skan  return (__m64) __builtin_arm_wunpckehsb ((__v8qi)__m1);
195132718Skan}
196132718Skan
197132718Skan/* Take the two 16-bit values from the high half of M1, sign extend them,
198132718Skan   and return the result as a vector of two 32-bit quantities.  */
199132718Skanstatic __inline __m64
200132718Skan_mm_unpackeh_pi16 (__m64 __m1)
201132718Skan{
202132718Skan  return (__m64) __builtin_arm_wunpckehsh ((__v4hi)__m1);
203132718Skan}
204132718Skan
205132718Skan/* Take the 32-bit value from the high half of M1, and return it sign extended
206132718Skan  to 64 bits.  */
207132718Skanstatic __inline __m64
208132718Skan_mm_unpackeh_pi32 (__m64 __m1)
209132718Skan{
210132718Skan  return (__m64) __builtin_arm_wunpckehsw ((__v2si)__m1);
211132718Skan}
212132718Skan
213132718Skan/* Take the four 8-bit values from the low half of M1, zero extend them,
214132718Skan   and return the result as a vector of four 16-bit quantities.  */
215132718Skanstatic __inline __m64
216132718Skan_mm_unpackel_pu8 (__m64 __m1)
217132718Skan{
218132718Skan  return (__m64) __builtin_arm_wunpckelub ((__v8qi)__m1);
219132718Skan}
220132718Skan
221132718Skan/* Take the two 16-bit values from the low half of M1, zero extend them,
222132718Skan   and return the result as a vector of two 32-bit quantities.  */
223132718Skanstatic __inline __m64
224132718Skan_mm_unpackel_pu16 (__m64 __m1)
225132718Skan{
226132718Skan  return (__m64) __builtin_arm_wunpckeluh ((__v4hi)__m1);
227132718Skan}
228132718Skan
229132718Skan/* Take the 32-bit value from the low half of M1, and return it zero extended
230132718Skan  to 64 bits.  */
231132718Skanstatic __inline __m64
232132718Skan_mm_unpackel_pu32 (__m64 __m1)
233132718Skan{
234132718Skan  return (__m64) __builtin_arm_wunpckeluw ((__v2si)__m1);
235132718Skan}
236132718Skan
237132718Skan/* Take the four 8-bit values from the high half of M1, zero extend them,
238132718Skan   and return the result as a vector of four 16-bit quantities.  */
239132718Skanstatic __inline __m64
240132718Skan_mm_unpackeh_pu8 (__m64 __m1)
241132718Skan{
242132718Skan  return (__m64) __builtin_arm_wunpckehub ((__v8qi)__m1);
243132718Skan}
244132718Skan
245132718Skan/* Take the two 16-bit values from the high half of M1, zero extend them,
246132718Skan   and return the result as a vector of two 32-bit quantities.  */
247132718Skanstatic __inline __m64
248132718Skan_mm_unpackeh_pu16 (__m64 __m1)
249132718Skan{
250132718Skan  return (__m64) __builtin_arm_wunpckehuh ((__v4hi)__m1);
251132718Skan}
252132718Skan
253132718Skan/* Take the 32-bit value from the high half of M1, and return it zero extended
254132718Skan  to 64 bits.  */
255132718Skanstatic __inline __m64
256132718Skan_mm_unpackeh_pu32 (__m64 __m1)
257132718Skan{
258132718Skan  return (__m64) __builtin_arm_wunpckehuw ((__v2si)__m1);
259132718Skan}
260132718Skan
261132718Skan/* Add the 8-bit values in M1 to the 8-bit values in M2.  */
262132718Skanstatic __inline __m64
263132718Skan_mm_add_pi8 (__m64 __m1, __m64 __m2)
264132718Skan{
265132718Skan  return (__m64) __builtin_arm_waddb ((__v8qi)__m1, (__v8qi)__m2);
266132718Skan}
267132718Skan
268132718Skan/* Add the 16-bit values in M1 to the 16-bit values in M2.  */
269132718Skanstatic __inline __m64
270132718Skan_mm_add_pi16 (__m64 __m1, __m64 __m2)
271132718Skan{
272132718Skan  return (__m64) __builtin_arm_waddh ((__v4hi)__m1, (__v4hi)__m2);
273132718Skan}
274132718Skan
275132718Skan/* Add the 32-bit values in M1 to the 32-bit values in M2.  */
276132718Skanstatic __inline __m64
277132718Skan_mm_add_pi32 (__m64 __m1, __m64 __m2)
278132718Skan{
279132718Skan  return (__m64) __builtin_arm_waddw ((__v2si)__m1, (__v2si)__m2);
280132718Skan}
281132718Skan
282132718Skan/* Add the 8-bit values in M1 to the 8-bit values in M2 using signed
283132718Skan   saturated arithmetic.  */
284132718Skanstatic __inline __m64
285132718Skan_mm_adds_pi8 (__m64 __m1, __m64 __m2)
286132718Skan{
287132718Skan  return (__m64) __builtin_arm_waddbss ((__v8qi)__m1, (__v8qi)__m2);
288132718Skan}
289132718Skan
290132718Skan/* Add the 16-bit values in M1 to the 16-bit values in M2 using signed
291132718Skan   saturated arithmetic.  */
292132718Skanstatic __inline __m64
293132718Skan_mm_adds_pi16 (__m64 __m1, __m64 __m2)
294132718Skan{
295132718Skan  return (__m64) __builtin_arm_waddhss ((__v4hi)__m1, (__v4hi)__m2);
296132718Skan}
297132718Skan
298132718Skan/* Add the 32-bit values in M1 to the 32-bit values in M2 using signed
299132718Skan   saturated arithmetic.  */
300132718Skanstatic __inline __m64
301132718Skan_mm_adds_pi32 (__m64 __m1, __m64 __m2)
302132718Skan{
303132718Skan  return (__m64) __builtin_arm_waddwss ((__v2si)__m1, (__v2si)__m2);
304132718Skan}
305132718Skan
306132718Skan/* Add the 8-bit values in M1 to the 8-bit values in M2 using unsigned
307132718Skan   saturated arithmetic.  */
308132718Skanstatic __inline __m64
309132718Skan_mm_adds_pu8 (__m64 __m1, __m64 __m2)
310132718Skan{
311132718Skan  return (__m64) __builtin_arm_waddbus ((__v8qi)__m1, (__v8qi)__m2);
312132718Skan}
313132718Skan
314132718Skan/* Add the 16-bit values in M1 to the 16-bit values in M2 using unsigned
315132718Skan   saturated arithmetic.  */
316132718Skanstatic __inline __m64
317132718Skan_mm_adds_pu16 (__m64 __m1, __m64 __m2)
318132718Skan{
319132718Skan  return (__m64) __builtin_arm_waddhus ((__v4hi)__m1, (__v4hi)__m2);
320132718Skan}
321132718Skan
322132718Skan/* Add the 32-bit values in M1 to the 32-bit values in M2 using unsigned
323132718Skan   saturated arithmetic.  */
324132718Skanstatic __inline __m64
325132718Skan_mm_adds_pu32 (__m64 __m1, __m64 __m2)
326132718Skan{
327132718Skan  return (__m64) __builtin_arm_waddwus ((__v2si)__m1, (__v2si)__m2);
328132718Skan}
329132718Skan
330132718Skan/* Subtract the 8-bit values in M2 from the 8-bit values in M1.  */
331132718Skanstatic __inline __m64
332132718Skan_mm_sub_pi8 (__m64 __m1, __m64 __m2)
333132718Skan{
334132718Skan  return (__m64) __builtin_arm_wsubb ((__v8qi)__m1, (__v8qi)__m2);
335132718Skan}
336132718Skan
337132718Skan/* Subtract the 16-bit values in M2 from the 16-bit values in M1.  */
338132718Skanstatic __inline __m64
339132718Skan_mm_sub_pi16 (__m64 __m1, __m64 __m2)
340132718Skan{
341132718Skan  return (__m64) __builtin_arm_wsubh ((__v4hi)__m1, (__v4hi)__m2);
342132718Skan}
343132718Skan
344132718Skan/* Subtract the 32-bit values in M2 from the 32-bit values in M1.  */
345132718Skanstatic __inline __m64
346132718Skan_mm_sub_pi32 (__m64 __m1, __m64 __m2)
347132718Skan{
348132718Skan  return (__m64) __builtin_arm_wsubw ((__v2si)__m1, (__v2si)__m2);
349132718Skan}
350132718Skan
351132718Skan/* Subtract the 8-bit values in M2 from the 8-bit values in M1 using signed
352132718Skan   saturating arithmetic.  */
353132718Skanstatic __inline __m64
354132718Skan_mm_subs_pi8 (__m64 __m1, __m64 __m2)
355132718Skan{
356132718Skan  return (__m64) __builtin_arm_wsubbss ((__v8qi)__m1, (__v8qi)__m2);
357132718Skan}
358132718Skan
359132718Skan/* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
360132718Skan   signed saturating arithmetic.  */
361132718Skanstatic __inline __m64
362132718Skan_mm_subs_pi16 (__m64 __m1, __m64 __m2)
363132718Skan{
364132718Skan  return (__m64) __builtin_arm_wsubhss ((__v4hi)__m1, (__v4hi)__m2);
365132718Skan}
366132718Skan
367132718Skan/* Subtract the 32-bit values in M2 from the 32-bit values in M1 using
368132718Skan   signed saturating arithmetic.  */
369132718Skanstatic __inline __m64
370132718Skan_mm_subs_pi32 (__m64 __m1, __m64 __m2)
371132718Skan{
372132718Skan  return (__m64) __builtin_arm_wsubwss ((__v2si)__m1, (__v2si)__m2);
373132718Skan}
374132718Skan
375132718Skan/* Subtract the 8-bit values in M2 from the 8-bit values in M1 using
376132718Skan   unsigned saturating arithmetic.  */
377132718Skanstatic __inline __m64
378132718Skan_mm_subs_pu8 (__m64 __m1, __m64 __m2)
379132718Skan{
380132718Skan  return (__m64) __builtin_arm_wsubbus ((__v8qi)__m1, (__v8qi)__m2);
381132718Skan}
382132718Skan
383132718Skan/* Subtract the 16-bit values in M2 from the 16-bit values in M1 using
384132718Skan   unsigned saturating arithmetic.  */
385132718Skanstatic __inline __m64
386132718Skan_mm_subs_pu16 (__m64 __m1, __m64 __m2)
387132718Skan{
388132718Skan  return (__m64) __builtin_arm_wsubhus ((__v4hi)__m1, (__v4hi)__m2);
389132718Skan}
390132718Skan
391132718Skan/* Subtract the 32-bit values in M2 from the 32-bit values in M1 using
392132718Skan   unsigned saturating arithmetic.  */
393132718Skanstatic __inline __m64
394132718Skan_mm_subs_pu32 (__m64 __m1, __m64 __m2)
395132718Skan{
396132718Skan  return (__m64) __builtin_arm_wsubwus ((__v2si)__m1, (__v2si)__m2);
397132718Skan}
398132718Skan
399132718Skan/* Multiply four 16-bit values in M1 by four 16-bit values in M2 producing
400132718Skan   four 32-bit intermediate results, which are then summed by pairs to
401132718Skan   produce two 32-bit results.  */
402132718Skanstatic __inline __m64
403132718Skan_mm_madd_pi16 (__m64 __m1, __m64 __m2)
404132718Skan{
405132718Skan  return (__m64) __builtin_arm_wmadds ((__v4hi)__m1, (__v4hi)__m2);
406132718Skan}
407132718Skan
408132718Skan/* Multiply four 16-bit values in M1 by four 16-bit values in M2 producing
409132718Skan   four 32-bit intermediate results, which are then summed by pairs to
410132718Skan   produce two 32-bit results.  */
411132718Skanstatic __inline __m64
412132718Skan_mm_madd_pu16 (__m64 __m1, __m64 __m2)
413132718Skan{
414132718Skan  return (__m64) __builtin_arm_wmaddu ((__v4hi)__m1, (__v4hi)__m2);
415132718Skan}
416132718Skan
417132718Skan/* Multiply four signed 16-bit values in M1 by four signed 16-bit values in
418132718Skan   M2 and produce the high 16 bits of the 32-bit results.  */
419132718Skanstatic __inline __m64
420132718Skan_mm_mulhi_pi16 (__m64 __m1, __m64 __m2)
421132718Skan{
422169689Skan  return (__m64) __builtin_arm_wmulsm ((__v4hi)__m1, (__v4hi)__m2);
423132718Skan}
424132718Skan
425132718Skan/* Multiply four signed 16-bit values in M1 by four signed 16-bit values in
426132718Skan   M2 and produce the high 16 bits of the 32-bit results.  */
427132718Skanstatic __inline __m64
428132718Skan_mm_mulhi_pu16 (__m64 __m1, __m64 __m2)
429132718Skan{
430169689Skan  return (__m64) __builtin_arm_wmulum ((__v4hi)__m1, (__v4hi)__m2);
431132718Skan}
432132718Skan
433132718Skan/* Multiply four 16-bit values in M1 by four 16-bit values in M2 and produce
434132718Skan   the low 16 bits of the results.  */
435132718Skanstatic __inline __m64
436132718Skan_mm_mullo_pi16 (__m64 __m1, __m64 __m2)
437132718Skan{
438132718Skan  return (__m64) __builtin_arm_wmulul ((__v4hi)__m1, (__v4hi)__m2);
439132718Skan}
440132718Skan
441132718Skan/* Shift four 16-bit values in M left by COUNT.  */
442132718Skanstatic __inline __m64
443132718Skan_mm_sll_pi16 (__m64 __m, __m64 __count)
444132718Skan{
445132718Skan  return (__m64) __builtin_arm_wsllh ((__v4hi)__m, __count);
446132718Skan}
447132718Skan
448132718Skanstatic __inline __m64
449132718Skan_mm_slli_pi16 (__m64 __m, int __count)
450132718Skan{
451132718Skan  return (__m64) __builtin_arm_wsllhi ((__v4hi)__m, __count);
452132718Skan}
453132718Skan
454132718Skan/* Shift two 32-bit values in M left by COUNT.  */
455132718Skanstatic __inline __m64
456132718Skan_mm_sll_pi32 (__m64 __m, __m64 __count)
457132718Skan{
458132718Skan  return (__m64) __builtin_arm_wsllw ((__v2si)__m, __count);
459132718Skan}
460132718Skan
461132718Skanstatic __inline __m64
462132718Skan_mm_slli_pi32 (__m64 __m, int __count)
463132718Skan{
464132718Skan  return (__m64) __builtin_arm_wsllwi ((__v2si)__m, __count);
465132718Skan}
466132718Skan
467132718Skan/* Shift the 64-bit value in M left by COUNT.  */
468132718Skanstatic __inline __m64
469132718Skan_mm_sll_si64 (__m64 __m, __m64 __count)
470132718Skan{
471132718Skan  return (__m64) __builtin_arm_wslld (__m, __count);
472132718Skan}
473132718Skan
474132718Skanstatic __inline __m64
475132718Skan_mm_slli_si64 (__m64 __m, int __count)
476132718Skan{
477132718Skan  return (__m64) __builtin_arm_wslldi (__m, __count);
478132718Skan}
479132718Skan
480132718Skan/* Shift four 16-bit values in M right by COUNT; shift in the sign bit.  */
481132718Skanstatic __inline __m64
482132718Skan_mm_sra_pi16 (__m64 __m, __m64 __count)
483132718Skan{
484132718Skan  return (__m64) __builtin_arm_wsrah ((__v4hi)__m, __count);
485132718Skan}
486132718Skan
487132718Skanstatic __inline __m64
488132718Skan_mm_srai_pi16 (__m64 __m, int __count)
489132718Skan{
490132718Skan  return (__m64) __builtin_arm_wsrahi ((__v4hi)__m, __count);
491132718Skan}
492132718Skan
493132718Skan/* Shift two 32-bit values in M right by COUNT; shift in the sign bit.  */
494132718Skanstatic __inline __m64
495132718Skan_mm_sra_pi32 (__m64 __m, __m64 __count)
496132718Skan{
497132718Skan  return (__m64) __builtin_arm_wsraw ((__v2si)__m, __count);
498132718Skan}
499132718Skan
500132718Skanstatic __inline __m64
501132718Skan_mm_srai_pi32 (__m64 __m, int __count)
502132718Skan{
503132718Skan  return (__m64) __builtin_arm_wsrawi ((__v2si)__m, __count);
504132718Skan}
505132718Skan
506132718Skan/* Shift the 64-bit value in M right by COUNT; shift in the sign bit.  */
507132718Skanstatic __inline __m64
508132718Skan_mm_sra_si64 (__m64 __m, __m64 __count)
509132718Skan{
510132718Skan  return (__m64) __builtin_arm_wsrad (__m, __count);
511132718Skan}
512132718Skan
513132718Skanstatic __inline __m64
514132718Skan_mm_srai_si64 (__m64 __m, int __count)
515132718Skan{
516132718Skan  return (__m64) __builtin_arm_wsradi (__m, __count);
517132718Skan}
518132718Skan
519132718Skan/* Shift four 16-bit values in M right by COUNT; shift in zeros.  */
520132718Skanstatic __inline __m64
521132718Skan_mm_srl_pi16 (__m64 __m, __m64 __count)
522132718Skan{
523132718Skan  return (__m64) __builtin_arm_wsrlh ((__v4hi)__m, __count);
524132718Skan}
525132718Skan
526132718Skanstatic __inline __m64
527132718Skan_mm_srli_pi16 (__m64 __m, int __count)
528132718Skan{
529132718Skan  return (__m64) __builtin_arm_wsrlhi ((__v4hi)__m, __count);
530132718Skan}
531132718Skan
532132718Skan/* Shift two 32-bit values in M right by COUNT; shift in zeros.  */
533132718Skanstatic __inline __m64
534132718Skan_mm_srl_pi32 (__m64 __m, __m64 __count)
535132718Skan{
536132718Skan  return (__m64) __builtin_arm_wsrlw ((__v2si)__m, __count);
537132718Skan}
538132718Skan
539132718Skanstatic __inline __m64
540132718Skan_mm_srli_pi32 (__m64 __m, int __count)
541132718Skan{
542132718Skan  return (__m64) __builtin_arm_wsrlwi ((__v2si)__m, __count);
543132718Skan}
544132718Skan
545132718Skan/* Shift the 64-bit value in M left by COUNT; shift in zeros.  */
546132718Skanstatic __inline __m64
547132718Skan_mm_srl_si64 (__m64 __m, __m64 __count)
548132718Skan{
549132718Skan  return (__m64) __builtin_arm_wsrld (__m, __count);
550132718Skan}
551132718Skan
552132718Skanstatic __inline __m64
553132718Skan_mm_srli_si64 (__m64 __m, int __count)
554132718Skan{
555132718Skan  return (__m64) __builtin_arm_wsrldi (__m, __count);
556132718Skan}
557132718Skan
558132718Skan/* Rotate four 16-bit values in M right by COUNT.  */
559132718Skanstatic __inline __m64
560132718Skan_mm_ror_pi16 (__m64 __m, __m64 __count)
561132718Skan{
562132718Skan  return (__m64) __builtin_arm_wrorh ((__v4hi)__m, __count);
563132718Skan}
564132718Skan
565132718Skanstatic __inline __m64
566132718Skan_mm_rori_pi16 (__m64 __m, int __count)
567132718Skan{
568132718Skan  return (__m64) __builtin_arm_wrorhi ((__v4hi)__m, __count);
569132718Skan}
570132718Skan
571132718Skan/* Rotate two 32-bit values in M right by COUNT.  */
572132718Skanstatic __inline __m64
573132718Skan_mm_ror_pi32 (__m64 __m, __m64 __count)
574132718Skan{
575132718Skan  return (__m64) __builtin_arm_wrorw ((__v2si)__m, __count);
576132718Skan}
577132718Skan
578132718Skanstatic __inline __m64
579132718Skan_mm_rori_pi32 (__m64 __m, int __count)
580132718Skan{
581132718Skan  return (__m64) __builtin_arm_wrorwi ((__v2si)__m, __count);
582132718Skan}
583132718Skan
584132718Skan/* Rotate two 64-bit values in M right by COUNT.  */
585132718Skanstatic __inline __m64
586132718Skan_mm_ror_si64 (__m64 __m, __m64 __count)
587132718Skan{
588132718Skan  return (__m64) __builtin_arm_wrord (__m, __count);
589132718Skan}
590132718Skan
591132718Skanstatic __inline __m64
592132718Skan_mm_rori_si64 (__m64 __m, int __count)
593132718Skan{
594132718Skan  return (__m64) __builtin_arm_wrordi (__m, __count);
595132718Skan}
596132718Skan
597132718Skan/* Bit-wise AND the 64-bit values in M1 and M2.  */
598132718Skanstatic __inline __m64
599132718Skan_mm_and_si64 (__m64 __m1, __m64 __m2)
600132718Skan{
601132718Skan  return __builtin_arm_wand (__m1, __m2);
602132718Skan}
603132718Skan
604132718Skan/* Bit-wise complement the 64-bit value in M1 and bit-wise AND it with the
605132718Skan   64-bit value in M2.  */
606132718Skanstatic __inline __m64
607132718Skan_mm_andnot_si64 (__m64 __m1, __m64 __m2)
608132718Skan{
609132718Skan  return __builtin_arm_wandn (__m1, __m2);
610132718Skan}
611132718Skan
612132718Skan/* Bit-wise inclusive OR the 64-bit values in M1 and M2.  */
613132718Skanstatic __inline __m64
614132718Skan_mm_or_si64 (__m64 __m1, __m64 __m2)
615132718Skan{
616132718Skan  return __builtin_arm_wor (__m1, __m2);
617132718Skan}
618132718Skan
619132718Skan/* Bit-wise exclusive OR the 64-bit values in M1 and M2.  */
620132718Skanstatic __inline __m64
621132718Skan_mm_xor_si64 (__m64 __m1, __m64 __m2)
622132718Skan{
623132718Skan  return __builtin_arm_wxor (__m1, __m2);
624132718Skan}
625132718Skan
626132718Skan/* Compare eight 8-bit values.  The result of the comparison is 0xFF if the
627132718Skan   test is true and zero if false.  */
628132718Skanstatic __inline __m64
629132718Skan_mm_cmpeq_pi8 (__m64 __m1, __m64 __m2)
630132718Skan{
631132718Skan  return (__m64) __builtin_arm_wcmpeqb ((__v8qi)__m1, (__v8qi)__m2);
632132718Skan}
633132718Skan
634132718Skanstatic __inline __m64
635132718Skan_mm_cmpgt_pi8 (__m64 __m1, __m64 __m2)
636132718Skan{
637132718Skan  return (__m64) __builtin_arm_wcmpgtsb ((__v8qi)__m1, (__v8qi)__m2);
638132718Skan}
639132718Skan
640132718Skanstatic __inline __m64
641132718Skan_mm_cmpgt_pu8 (__m64 __m1, __m64 __m2)
642132718Skan{
643132718Skan  return (__m64) __builtin_arm_wcmpgtub ((__v8qi)__m1, (__v8qi)__m2);
644132718Skan}
645132718Skan
646132718Skan/* Compare four 16-bit values.  The result of the comparison is 0xFFFF if
647132718Skan   the test is true and zero if false.  */
648132718Skanstatic __inline __m64
649132718Skan_mm_cmpeq_pi16 (__m64 __m1, __m64 __m2)
650132718Skan{
651132718Skan  return (__m64) __builtin_arm_wcmpeqh ((__v4hi)__m1, (__v4hi)__m2);
652132718Skan}
653132718Skan
654132718Skanstatic __inline __m64
655132718Skan_mm_cmpgt_pi16 (__m64 __m1, __m64 __m2)
656132718Skan{
657132718Skan  return (__m64) __builtin_arm_wcmpgtsh ((__v4hi)__m1, (__v4hi)__m2);
658132718Skan}
659132718Skan
660132718Skanstatic __inline __m64
661132718Skan_mm_cmpgt_pu16 (__m64 __m1, __m64 __m2)
662132718Skan{
663132718Skan  return (__m64) __builtin_arm_wcmpgtuh ((__v4hi)__m1, (__v4hi)__m2);
664132718Skan}
665132718Skan
666132718Skan/* Compare two 32-bit values.  The result of the comparison is 0xFFFFFFFF if
667132718Skan   the test is true and zero if false.  */
668132718Skanstatic __inline __m64
669132718Skan_mm_cmpeq_pi32 (__m64 __m1, __m64 __m2)
670132718Skan{
671132718Skan  return (__m64) __builtin_arm_wcmpeqw ((__v2si)__m1, (__v2si)__m2);
672132718Skan}
673132718Skan
674132718Skanstatic __inline __m64
675132718Skan_mm_cmpgt_pi32 (__m64 __m1, __m64 __m2)
676132718Skan{
677132718Skan  return (__m64) __builtin_arm_wcmpgtsw ((__v2si)__m1, (__v2si)__m2);
678132718Skan}
679132718Skan
680132718Skanstatic __inline __m64
681132718Skan_mm_cmpgt_pu32 (__m64 __m1, __m64 __m2)
682132718Skan{
683132718Skan  return (__m64) __builtin_arm_wcmpgtuw ((__v2si)__m1, (__v2si)__m2);
684132718Skan}
685132718Skan
686132718Skan/* Element-wise multiplication of unsigned 16-bit values __B and __C, followed
687132718Skan   by accumulate across all elements and __A.  */
688132718Skanstatic __inline __m64
689132718Skan_mm_mac_pu16 (__m64 __A, __m64 __B, __m64 __C)
690132718Skan{
691132718Skan  return __builtin_arm_wmacu (__A, (__v4hi)__B, (__v4hi)__C);
692132718Skan}
693132718Skan
694132718Skan/* Element-wise multiplication of signed 16-bit values __B and __C, followed
695132718Skan   by accumulate across all elements and __A.  */
696132718Skanstatic __inline __m64
697132718Skan_mm_mac_pi16 (__m64 __A, __m64 __B, __m64 __C)
698132718Skan{
699132718Skan  return __builtin_arm_wmacs (__A, (__v4hi)__B, (__v4hi)__C);
700132718Skan}
701132718Skan
702132718Skan/* Element-wise multiplication of unsigned 16-bit values __B and __C, followed
703132718Skan   by accumulate across all elements.  */
704132718Skanstatic __inline __m64
705132718Skan_mm_macz_pu16 (__m64 __A, __m64 __B)
706132718Skan{
707132718Skan  return __builtin_arm_wmacuz ((__v4hi)__A, (__v4hi)__B);
708132718Skan}
709132718Skan
710132718Skan/* Element-wise multiplication of signed 16-bit values __B and __C, followed
711132718Skan   by accumulate across all elements.  */
712132718Skanstatic __inline __m64
713132718Skan_mm_macz_pi16 (__m64 __A, __m64 __B)
714132718Skan{
715132718Skan  return __builtin_arm_wmacsz ((__v4hi)__A, (__v4hi)__B);
716132718Skan}
717132718Skan
718132718Skan/* Accumulate across all unsigned 8-bit values in __A.  */
719132718Skanstatic __inline __m64
720132718Skan_mm_acc_pu8 (__m64 __A)
721132718Skan{
722132718Skan  return __builtin_arm_waccb ((__v8qi)__A);
723132718Skan}
724132718Skan
725132718Skan/* Accumulate across all unsigned 16-bit values in __A.  */
726132718Skanstatic __inline __m64
727132718Skan_mm_acc_pu16 (__m64 __A)
728132718Skan{
729132718Skan  return __builtin_arm_wacch ((__v4hi)__A);
730132718Skan}
731132718Skan
732132718Skan/* Accumulate across all unsigned 32-bit values in __A.  */
733132718Skanstatic __inline __m64
734132718Skan_mm_acc_pu32 (__m64 __A)
735132718Skan{
736132718Skan  return __builtin_arm_waccw ((__v2si)__A);
737132718Skan}
738132718Skan
739132718Skanstatic __inline __m64
740132718Skan_mm_mia_si64 (__m64 __A, int __B, int __C)
741132718Skan{
742132718Skan  return __builtin_arm_tmia (__A, __B, __C);
743132718Skan}
744132718Skan
745132718Skanstatic __inline __m64
746132718Skan_mm_miaph_si64 (__m64 __A, int __B, int __C)
747132718Skan{
748132718Skan  return __builtin_arm_tmiaph (__A, __B, __C);
749132718Skan}
750132718Skan
751132718Skanstatic __inline __m64
752132718Skan_mm_miabb_si64 (__m64 __A, int __B, int __C)
753132718Skan{
754132718Skan  return __builtin_arm_tmiabb (__A, __B, __C);
755132718Skan}
756132718Skan
757132718Skanstatic __inline __m64
758132718Skan_mm_miabt_si64 (__m64 __A, int __B, int __C)
759132718Skan{
760132718Skan  return __builtin_arm_tmiabt (__A, __B, __C);
761132718Skan}
762132718Skan
763132718Skanstatic __inline __m64
764132718Skan_mm_miatb_si64 (__m64 __A, int __B, int __C)
765132718Skan{
766132718Skan  return __builtin_arm_tmiatb (__A, __B, __C);
767132718Skan}
768132718Skan
769132718Skanstatic __inline __m64
770132718Skan_mm_miatt_si64 (__m64 __A, int __B, int __C)
771132718Skan{
772132718Skan  return __builtin_arm_tmiatt (__A, __B, __C);
773132718Skan}
774132718Skan
775132718Skan/* Extract one of the elements of A and sign extend.  The selector N must
776132718Skan   be immediate.  */
777132718Skan#define _mm_extract_pi8(A, N) __builtin_arm_textrmsb ((__v8qi)(A), (N))
778132718Skan#define _mm_extract_pi16(A, N) __builtin_arm_textrmsh ((__v4hi)(A), (N))
779132718Skan#define _mm_extract_pi32(A, N) __builtin_arm_textrmsw ((__v2si)(A), (N))
780132718Skan
781132718Skan/* Extract one of the elements of A and zero extend.  The selector N must
782132718Skan   be immediate.  */
783132718Skan#define _mm_extract_pu8(A, N) __builtin_arm_textrmub ((__v8qi)(A), (N))
784132718Skan#define _mm_extract_pu16(A, N) __builtin_arm_textrmuh ((__v4hi)(A), (N))
785132718Skan#define _mm_extract_pu32(A, N) __builtin_arm_textrmuw ((__v2si)(A), (N))
786132718Skan
787132718Skan/* Inserts word D into one of the elements of A.  The selector N must be
788132718Skan   immediate.  */
789132718Skan#define _mm_insert_pi8(A, D, N) \
790132718Skan  ((__m64) __builtin_arm_tinsrb ((__v8qi)(A), (D), (N)))
791132718Skan#define _mm_insert_pi16(A, D, N) \
792132718Skan  ((__m64) __builtin_arm_tinsrh ((__v4hi)(A), (D), (N)))
793132718Skan#define _mm_insert_pi32(A, D, N) \
794132718Skan  ((__m64) __builtin_arm_tinsrw ((__v2si)(A), (D), (N)))
795132718Skan
796132718Skan/* Compute the element-wise maximum of signed 8-bit values.  */
797132718Skanstatic __inline __m64
798132718Skan_mm_max_pi8 (__m64 __A, __m64 __B)
799132718Skan{
800132718Skan  return (__m64) __builtin_arm_wmaxsb ((__v8qi)__A, (__v8qi)__B);
801132718Skan}
802132718Skan
803132718Skan/* Compute the element-wise maximum of signed 16-bit values.  */
804132718Skanstatic __inline __m64
805132718Skan_mm_max_pi16 (__m64 __A, __m64 __B)
806132718Skan{
807132718Skan  return (__m64) __builtin_arm_wmaxsh ((__v4hi)__A, (__v4hi)__B);
808132718Skan}
809132718Skan
810132718Skan/* Compute the element-wise maximum of signed 32-bit values.  */
811132718Skanstatic __inline __m64
812132718Skan_mm_max_pi32 (__m64 __A, __m64 __B)
813132718Skan{
814132718Skan  return (__m64) __builtin_arm_wmaxsw ((__v2si)__A, (__v2si)__B);
815132718Skan}
816132718Skan
817132718Skan/* Compute the element-wise maximum of unsigned 8-bit values.  */
818132718Skanstatic __inline __m64
819132718Skan_mm_max_pu8 (__m64 __A, __m64 __B)
820132718Skan{
821132718Skan  return (__m64) __builtin_arm_wmaxub ((__v8qi)__A, (__v8qi)__B);
822132718Skan}
823132718Skan
824132718Skan/* Compute the element-wise maximum of unsigned 16-bit values.  */
825132718Skanstatic __inline __m64
826132718Skan_mm_max_pu16 (__m64 __A, __m64 __B)
827132718Skan{
828132718Skan  return (__m64) __builtin_arm_wmaxuh ((__v4hi)__A, (__v4hi)__B);
829132718Skan}
830132718Skan
831132718Skan/* Compute the element-wise maximum of unsigned 32-bit values.  */
832132718Skanstatic __inline __m64
833132718Skan_mm_max_pu32 (__m64 __A, __m64 __B)
834132718Skan{
835132718Skan  return (__m64) __builtin_arm_wmaxuw ((__v2si)__A, (__v2si)__B);
836132718Skan}
837132718Skan
838132718Skan/* Compute the element-wise minimum of signed 16-bit values.  */
839132718Skanstatic __inline __m64
840132718Skan_mm_min_pi8 (__m64 __A, __m64 __B)
841132718Skan{
842132718Skan  return (__m64) __builtin_arm_wminsb ((__v8qi)__A, (__v8qi)__B);
843132718Skan}
844132718Skan
845132718Skan/* Compute the element-wise minimum of signed 16-bit values.  */
846132718Skanstatic __inline __m64
847132718Skan_mm_min_pi16 (__m64 __A, __m64 __B)
848132718Skan{
849132718Skan  return (__m64) __builtin_arm_wminsh ((__v4hi)__A, (__v4hi)__B);
850132718Skan}
851132718Skan
852132718Skan/* Compute the element-wise minimum of signed 32-bit values.  */
853132718Skanstatic __inline __m64
854132718Skan_mm_min_pi32 (__m64 __A, __m64 __B)
855132718Skan{
856132718Skan  return (__m64) __builtin_arm_wminsw ((__v2si)__A, (__v2si)__B);
857132718Skan}
858132718Skan
859132718Skan/* Compute the element-wise minimum of unsigned 16-bit values.  */
860132718Skanstatic __inline __m64
861132718Skan_mm_min_pu8 (__m64 __A, __m64 __B)
862132718Skan{
863132718Skan  return (__m64) __builtin_arm_wminub ((__v8qi)__A, (__v8qi)__B);
864132718Skan}
865132718Skan
866132718Skan/* Compute the element-wise minimum of unsigned 16-bit values.  */
867132718Skanstatic __inline __m64
868132718Skan_mm_min_pu16 (__m64 __A, __m64 __B)
869132718Skan{
870132718Skan  return (__m64) __builtin_arm_wminuh ((__v4hi)__A, (__v4hi)__B);
871132718Skan}
872132718Skan
873132718Skan/* Compute the element-wise minimum of unsigned 32-bit values.  */
874132718Skanstatic __inline __m64
875132718Skan_mm_min_pu32 (__m64 __A, __m64 __B)
876132718Skan{
877132718Skan  return (__m64) __builtin_arm_wminuw ((__v2si)__A, (__v2si)__B);
878132718Skan}
879132718Skan
880132718Skan/* Create an 8-bit mask of the signs of 8-bit values.  */
881132718Skanstatic __inline int
882132718Skan_mm_movemask_pi8 (__m64 __A)
883132718Skan{
884132718Skan  return __builtin_arm_tmovmskb ((__v8qi)__A);
885132718Skan}
886132718Skan
887132718Skan/* Create an 8-bit mask of the signs of 16-bit values.  */
888132718Skanstatic __inline int
889132718Skan_mm_movemask_pi16 (__m64 __A)
890132718Skan{
891132718Skan  return __builtin_arm_tmovmskh ((__v4hi)__A);
892132718Skan}
893132718Skan
894132718Skan/* Create an 8-bit mask of the signs of 32-bit values.  */
895132718Skanstatic __inline int
896132718Skan_mm_movemask_pi32 (__m64 __A)
897132718Skan{
898132718Skan  return __builtin_arm_tmovmskw ((__v2si)__A);
899132718Skan}
900132718Skan
901132718Skan/* Return a combination of the four 16-bit values in A.  The selector
902132718Skan   must be an immediate.  */
903132718Skan#define _mm_shuffle_pi16(A, N) \
904132718Skan  ((__m64) __builtin_arm_wshufh ((__v4hi)(A), (N)))
905132718Skan
906132718Skan
907132718Skan/* Compute the rounded averages of the unsigned 8-bit values in A and B.  */
908132718Skanstatic __inline __m64
909132718Skan_mm_avg_pu8 (__m64 __A, __m64 __B)
910132718Skan{
911132718Skan  return (__m64) __builtin_arm_wavg2br ((__v8qi)__A, (__v8qi)__B);
912132718Skan}
913132718Skan
914132718Skan/* Compute the rounded averages of the unsigned 16-bit values in A and B.  */
915132718Skanstatic __inline __m64
916132718Skan_mm_avg_pu16 (__m64 __A, __m64 __B)
917132718Skan{
918132718Skan  return (__m64) __builtin_arm_wavg2hr ((__v4hi)__A, (__v4hi)__B);
919132718Skan}
920132718Skan
921132718Skan/* Compute the averages of the unsigned 8-bit values in A and B.  */
922132718Skanstatic __inline __m64
923132718Skan_mm_avg2_pu8 (__m64 __A, __m64 __B)
924132718Skan{
925132718Skan  return (__m64) __builtin_arm_wavg2b ((__v8qi)__A, (__v8qi)__B);
926132718Skan}
927132718Skan
928132718Skan/* Compute the averages of the unsigned 16-bit values in A and B.  */
929132718Skanstatic __inline __m64
930132718Skan_mm_avg2_pu16 (__m64 __A, __m64 __B)
931132718Skan{
932132718Skan  return (__m64) __builtin_arm_wavg2h ((__v4hi)__A, (__v4hi)__B);
933132718Skan}
934132718Skan
935132718Skan/* Compute the sum of the absolute differences of the unsigned 8-bit
936132718Skan   values in A and B.  Return the value in the lower 16-bit word; the
937132718Skan   upper words are cleared.  */
938132718Skanstatic __inline __m64
939132718Skan_mm_sad_pu8 (__m64 __A, __m64 __B)
940132718Skan{
941132718Skan  return (__m64) __builtin_arm_wsadb ((__v8qi)__A, (__v8qi)__B);
942132718Skan}
943132718Skan
944132718Skan/* Compute the sum of the absolute differences of the unsigned 16-bit
945132718Skan   values in A and B.  Return the value in the lower 32-bit word; the
946132718Skan   upper words are cleared.  */
947132718Skanstatic __inline __m64
948132718Skan_mm_sad_pu16 (__m64 __A, __m64 __B)
949132718Skan{
950132718Skan  return (__m64) __builtin_arm_wsadh ((__v4hi)__A, (__v4hi)__B);
951132718Skan}
952132718Skan
953132718Skan/* Compute the sum of the absolute differences of the unsigned 8-bit
954132718Skan   values in A and B.  Return the value in the lower 16-bit word; the
955132718Skan   upper words are cleared.  */
956132718Skanstatic __inline __m64
957132718Skan_mm_sadz_pu8 (__m64 __A, __m64 __B)
958132718Skan{
959132718Skan  return (__m64) __builtin_arm_wsadbz ((__v8qi)__A, (__v8qi)__B);
960132718Skan}
961132718Skan
962132718Skan/* Compute the sum of the absolute differences of the unsigned 16-bit
963132718Skan   values in A and B.  Return the value in the lower 32-bit word; the
964132718Skan   upper words are cleared.  */
965132718Skanstatic __inline __m64
966132718Skan_mm_sadz_pu16 (__m64 __A, __m64 __B)
967132718Skan{
968132718Skan  return (__m64) __builtin_arm_wsadhz ((__v4hi)__A, (__v4hi)__B);
969132718Skan}
970132718Skan
971132718Skanstatic __inline __m64
972132718Skan_mm_align_si64 (__m64 __A, __m64 __B, int __C)
973132718Skan{
974132718Skan  return (__m64) __builtin_arm_walign ((__v8qi)__A, (__v8qi)__B, __C);
975132718Skan}
976132718Skan
977132718Skan/* Creates a 64-bit zero.  */
978132718Skanstatic __inline __m64
979132718Skan_mm_setzero_si64 (void)
980132718Skan{
981132718Skan  return __builtin_arm_wzero ();
982132718Skan}
983132718Skan
984132718Skan/* Set and Get arbitrary iWMMXt Control registers.
985132718Skan   Note only registers 0-3 and 8-11 are currently defined,
986132718Skan   the rest are reserved.  */
987132718Skan
988132718Skanstatic __inline void
989169689Skan_mm_setwcx (const int __value, const int __regno)
990132718Skan{
991132718Skan  switch (__regno)
992132718Skan    {
993169689Skan    case 0:  __builtin_arm_setwcx (__value, 0); break;
994169689Skan    case 1:  __builtin_arm_setwcx (__value, 1); break;
995169689Skan    case 2:  __builtin_arm_setwcx (__value, 2); break;
996169689Skan    case 3:  __builtin_arm_setwcx (__value, 3); break;
997169689Skan    case 8:  __builtin_arm_setwcx (__value, 8); break;
998169689Skan    case 9:  __builtin_arm_setwcx (__value, 9); break;
999169689Skan    case 10: __builtin_arm_setwcx (__value, 10); break;
1000169689Skan    case 11: __builtin_arm_setwcx (__value, 11); break;
1001132718Skan    default: break;
1002132718Skan    }
1003132718Skan}
1004132718Skan
1005132718Skanstatic __inline int
1006132718Skan_mm_getwcx (const int __regno)
1007132718Skan{
1008132718Skan  switch (__regno)
1009132718Skan    {
1010132718Skan    case 0:  return __builtin_arm_getwcx (0);
1011132718Skan    case 1:  return __builtin_arm_getwcx (1);
1012132718Skan    case 2:  return __builtin_arm_getwcx (2);
1013132718Skan    case 3:  return __builtin_arm_getwcx (3);
1014132718Skan    case 8:  return __builtin_arm_getwcx (8);
1015132718Skan    case 9:  return __builtin_arm_getwcx (9);
1016132718Skan    case 10: return __builtin_arm_getwcx (10);
1017132718Skan    case 11: return __builtin_arm_getwcx (11);
1018132718Skan    default: return 0;
1019132718Skan    }
1020132718Skan}
1021132718Skan
1022132718Skan/* Creates a vector of two 32-bit values; I0 is least significant.  */
1023132718Skanstatic __inline __m64
1024132718Skan_mm_set_pi32 (int __i1, int __i0)
1025132718Skan{
1026132718Skan  union {
1027132718Skan    __m64 __q;
1028132718Skan    struct {
1029132718Skan      unsigned int __i0;
1030132718Skan      unsigned int __i1;
1031132718Skan    } __s;
1032132718Skan  } __u;
1033132718Skan
1034132718Skan  __u.__s.__i0 = __i0;
1035132718Skan  __u.__s.__i1 = __i1;
1036132718Skan
1037132718Skan  return __u.__q;
1038132718Skan}
1039132718Skan
1040132718Skan/* Creates a vector of four 16-bit values; W0 is least significant.  */
1041132718Skanstatic __inline __m64
1042132718Skan_mm_set_pi16 (short __w3, short __w2, short __w1, short __w0)
1043132718Skan{
1044132718Skan  unsigned int __i1 = (unsigned short)__w3 << 16 | (unsigned short)__w2;
1045132718Skan  unsigned int __i0 = (unsigned short)__w1 << 16 | (unsigned short)__w0;
1046132718Skan  return _mm_set_pi32 (__i1, __i0);
1047132718Skan
1048132718Skan}
1049132718Skan
1050132718Skan/* Creates a vector of eight 8-bit values; B0 is least significant.  */
1051132718Skanstatic __inline __m64
1052132718Skan_mm_set_pi8 (char __b7, char __b6, char __b5, char __b4,
1053132718Skan	     char __b3, char __b2, char __b1, char __b0)
1054132718Skan{
1055132718Skan  unsigned int __i1, __i0;
1056132718Skan
1057132718Skan  __i1 = (unsigned char)__b7;
1058132718Skan  __i1 = __i1 << 8 | (unsigned char)__b6;
1059132718Skan  __i1 = __i1 << 8 | (unsigned char)__b5;
1060132718Skan  __i1 = __i1 << 8 | (unsigned char)__b4;
1061132718Skan
1062132718Skan  __i0 = (unsigned char)__b3;
1063132718Skan  __i0 = __i0 << 8 | (unsigned char)__b2;
1064132718Skan  __i0 = __i0 << 8 | (unsigned char)__b1;
1065132718Skan  __i0 = __i0 << 8 | (unsigned char)__b0;
1066132718Skan
1067132718Skan  return _mm_set_pi32 (__i1, __i0);
1068132718Skan}
1069132718Skan
1070132718Skan/* Similar, but with the arguments in reverse order.  */
1071132718Skanstatic __inline __m64
1072132718Skan_mm_setr_pi32 (int __i0, int __i1)
1073132718Skan{
1074132718Skan  return _mm_set_pi32 (__i1, __i0);
1075132718Skan}
1076132718Skan
1077132718Skanstatic __inline __m64
1078132718Skan_mm_setr_pi16 (short __w0, short __w1, short __w2, short __w3)
1079132718Skan{
1080132718Skan  return _mm_set_pi16 (__w3, __w2, __w1, __w0);
1081132718Skan}
1082132718Skan
1083132718Skanstatic __inline __m64
1084132718Skan_mm_setr_pi8 (char __b0, char __b1, char __b2, char __b3,
1085132718Skan	      char __b4, char __b5, char __b6, char __b7)
1086132718Skan{
1087132718Skan  return _mm_set_pi8 (__b7, __b6, __b5, __b4, __b3, __b2, __b1, __b0);
1088132718Skan}
1089132718Skan
1090132718Skan/* Creates a vector of two 32-bit values, both elements containing I.  */
1091132718Skanstatic __inline __m64
1092132718Skan_mm_set1_pi32 (int __i)
1093132718Skan{
1094132718Skan  return _mm_set_pi32 (__i, __i);
1095132718Skan}
1096132718Skan
1097132718Skan/* Creates a vector of four 16-bit values, all elements containing W.  */
1098132718Skanstatic __inline __m64
1099132718Skan_mm_set1_pi16 (short __w)
1100132718Skan{
1101132718Skan  unsigned int __i = (unsigned short)__w << 16 | (unsigned short)__w;
1102132718Skan  return _mm_set1_pi32 (__i);
1103132718Skan}
1104132718Skan
1105132718Skan/* Creates a vector of four 16-bit values, all elements containing B.  */
1106132718Skanstatic __inline __m64
1107132718Skan_mm_set1_pi8 (char __b)
1108132718Skan{
1109132718Skan  unsigned int __w = (unsigned char)__b << 8 | (unsigned char)__b;
1110132718Skan  unsigned int __i = __w << 16 | __w;
1111132718Skan  return _mm_set1_pi32 (__i);
1112132718Skan}
1113132718Skan
1114132718Skan/* Convert an integer to a __m64 object.  */
1115132718Skanstatic __inline __m64
1116132718Skan_m_from_int (int __a)
1117132718Skan{
1118132718Skan  return (__m64)__a;
1119132718Skan}
1120132718Skan
1121132718Skan#define _m_packsswb _mm_packs_pi16
1122132718Skan#define _m_packssdw _mm_packs_pi32
1123132718Skan#define _m_packuswb _mm_packs_pu16
1124132718Skan#define _m_packusdw _mm_packs_pu32
1125132718Skan#define _m_packssqd _mm_packs_pi64
1126132718Skan#define _m_packusqd _mm_packs_pu64
1127132718Skan#define _mm_packs_si64 _mm_packs_pi64
1128132718Skan#define _mm_packs_su64 _mm_packs_pu64
1129132718Skan#define _m_punpckhbw _mm_unpackhi_pi8
1130132718Skan#define _m_punpckhwd _mm_unpackhi_pi16
1131132718Skan#define _m_punpckhdq _mm_unpackhi_pi32
1132132718Skan#define _m_punpcklbw _mm_unpacklo_pi8
1133132718Skan#define _m_punpcklwd _mm_unpacklo_pi16
1134132718Skan#define _m_punpckldq _mm_unpacklo_pi32
1135132718Skan#define _m_punpckehsbw _mm_unpackeh_pi8
1136132718Skan#define _m_punpckehswd _mm_unpackeh_pi16
1137132718Skan#define _m_punpckehsdq _mm_unpackeh_pi32
1138132718Skan#define _m_punpckehubw _mm_unpackeh_pu8
1139132718Skan#define _m_punpckehuwd _mm_unpackeh_pu16
1140132718Skan#define _m_punpckehudq _mm_unpackeh_pu32
1141132718Skan#define _m_punpckelsbw _mm_unpackel_pi8
1142132718Skan#define _m_punpckelswd _mm_unpackel_pi16
1143132718Skan#define _m_punpckelsdq _mm_unpackel_pi32
1144132718Skan#define _m_punpckelubw _mm_unpackel_pu8
1145132718Skan#define _m_punpckeluwd _mm_unpackel_pu16
1146132718Skan#define _m_punpckeludq _mm_unpackel_pu32
1147132718Skan#define _m_paddb _mm_add_pi8
1148132718Skan#define _m_paddw _mm_add_pi16
1149132718Skan#define _m_paddd _mm_add_pi32
1150132718Skan#define _m_paddsb _mm_adds_pi8
1151132718Skan#define _m_paddsw _mm_adds_pi16
1152132718Skan#define _m_paddsd _mm_adds_pi32
1153132718Skan#define _m_paddusb _mm_adds_pu8
1154132718Skan#define _m_paddusw _mm_adds_pu16
1155132718Skan#define _m_paddusd _mm_adds_pu32
1156132718Skan#define _m_psubb _mm_sub_pi8
1157132718Skan#define _m_psubw _mm_sub_pi16
1158132718Skan#define _m_psubd _mm_sub_pi32
1159132718Skan#define _m_psubsb _mm_subs_pi8
1160132718Skan#define _m_psubsw _mm_subs_pi16
1161132718Skan#define _m_psubuw _mm_subs_pi32
1162132718Skan#define _m_psubusb _mm_subs_pu8
1163132718Skan#define _m_psubusw _mm_subs_pu16
1164132718Skan#define _m_psubusd _mm_subs_pu32
1165132718Skan#define _m_pmaddwd _mm_madd_pi16
1166132718Skan#define _m_pmadduwd _mm_madd_pu16
1167132718Skan#define _m_pmulhw _mm_mulhi_pi16
1168132718Skan#define _m_pmulhuw _mm_mulhi_pu16
1169132718Skan#define _m_pmullw _mm_mullo_pi16
1170132718Skan#define _m_pmacsw _mm_mac_pi16
1171132718Skan#define _m_pmacuw _mm_mac_pu16
1172132718Skan#define _m_pmacszw _mm_macz_pi16
1173132718Skan#define _m_pmacuzw _mm_macz_pu16
1174132718Skan#define _m_paccb _mm_acc_pu8
1175132718Skan#define _m_paccw _mm_acc_pu16
1176132718Skan#define _m_paccd _mm_acc_pu32
1177132718Skan#define _m_pmia _mm_mia_si64
1178132718Skan#define _m_pmiaph _mm_miaph_si64
1179132718Skan#define _m_pmiabb _mm_miabb_si64
1180132718Skan#define _m_pmiabt _mm_miabt_si64
1181132718Skan#define _m_pmiatb _mm_miatb_si64
1182132718Skan#define _m_pmiatt _mm_miatt_si64
1183132718Skan#define _m_psllw _mm_sll_pi16
1184132718Skan#define _m_psllwi _mm_slli_pi16
1185132718Skan#define _m_pslld _mm_sll_pi32
1186132718Skan#define _m_pslldi _mm_slli_pi32
1187132718Skan#define _m_psllq _mm_sll_si64
1188132718Skan#define _m_psllqi _mm_slli_si64
1189132718Skan#define _m_psraw _mm_sra_pi16
1190132718Skan#define _m_psrawi _mm_srai_pi16
1191132718Skan#define _m_psrad _mm_sra_pi32
1192132718Skan#define _m_psradi _mm_srai_pi32
1193132718Skan#define _m_psraq _mm_sra_si64
1194132718Skan#define _m_psraqi _mm_srai_si64
1195132718Skan#define _m_psrlw _mm_srl_pi16
1196132718Skan#define _m_psrlwi _mm_srli_pi16
1197132718Skan#define _m_psrld _mm_srl_pi32
1198132718Skan#define _m_psrldi _mm_srli_pi32
1199132718Skan#define _m_psrlq _mm_srl_si64
1200132718Skan#define _m_psrlqi _mm_srli_si64
1201132718Skan#define _m_prorw _mm_ror_pi16
1202132718Skan#define _m_prorwi _mm_rori_pi16
1203132718Skan#define _m_prord _mm_ror_pi32
1204132718Skan#define _m_prordi _mm_rori_pi32
1205132718Skan#define _m_prorq _mm_ror_si64
1206132718Skan#define _m_prorqi _mm_rori_si64
1207132718Skan#define _m_pand _mm_and_si64
1208132718Skan#define _m_pandn _mm_andnot_si64
1209132718Skan#define _m_por _mm_or_si64
1210132718Skan#define _m_pxor _mm_xor_si64
1211132718Skan#define _m_pcmpeqb _mm_cmpeq_pi8
1212132718Skan#define _m_pcmpeqw _mm_cmpeq_pi16
1213132718Skan#define _m_pcmpeqd _mm_cmpeq_pi32
1214132718Skan#define _m_pcmpgtb _mm_cmpgt_pi8
1215132718Skan#define _m_pcmpgtub _mm_cmpgt_pu8
1216132718Skan#define _m_pcmpgtw _mm_cmpgt_pi16
1217132718Skan#define _m_pcmpgtuw _mm_cmpgt_pu16
1218132718Skan#define _m_pcmpgtd _mm_cmpgt_pi32
1219132718Skan#define _m_pcmpgtud _mm_cmpgt_pu32
1220132718Skan#define _m_pextrb _mm_extract_pi8
1221132718Skan#define _m_pextrw _mm_extract_pi16
1222132718Skan#define _m_pextrd _mm_extract_pi32
1223132718Skan#define _m_pextrub _mm_extract_pu8
1224132718Skan#define _m_pextruw _mm_extract_pu16
1225132718Skan#define _m_pextrud _mm_extract_pu32
1226132718Skan#define _m_pinsrb _mm_insert_pi8
1227132718Skan#define _m_pinsrw _mm_insert_pi16
1228132718Skan#define _m_pinsrd _mm_insert_pi32
1229132718Skan#define _m_pmaxsb _mm_max_pi8
1230132718Skan#define _m_pmaxsw _mm_max_pi16
1231132718Skan#define _m_pmaxsd _mm_max_pi32
1232132718Skan#define _m_pmaxub _mm_max_pu8
1233132718Skan#define _m_pmaxuw _mm_max_pu16
1234132718Skan#define _m_pmaxud _mm_max_pu32
1235132718Skan#define _m_pminsb _mm_min_pi8
1236132718Skan#define _m_pminsw _mm_min_pi16
1237132718Skan#define _m_pminsd _mm_min_pi32
1238132718Skan#define _m_pminub _mm_min_pu8
1239132718Skan#define _m_pminuw _mm_min_pu16
1240132718Skan#define _m_pminud _mm_min_pu32
1241132718Skan#define _m_pmovmskb _mm_movemask_pi8
1242132718Skan#define _m_pmovmskw _mm_movemask_pi16
1243132718Skan#define _m_pmovmskd _mm_movemask_pi32
1244132718Skan#define _m_pshufw _mm_shuffle_pi16
1245132718Skan#define _m_pavgb _mm_avg_pu8
1246132718Skan#define _m_pavgw _mm_avg_pu16
1247132718Skan#define _m_pavg2b _mm_avg2_pu8
1248132718Skan#define _m_pavg2w _mm_avg2_pu16
1249132718Skan#define _m_psadbw _mm_sad_pu8
1250132718Skan#define _m_psadwd _mm_sad_pu16
1251132718Skan#define _m_psadzbw _mm_sadz_pu8
1252132718Skan#define _m_psadzwd _mm_sadz_pu16
1253132718Skan#define _m_paligniq _mm_align_si64
1254132718Skan#define _m_cvt_si2pi _mm_cvtsi64_m64
1255132718Skan#define _m_cvt_pi2si _mm_cvtm64_si64
1256132718Skan
1257132718Skan#endif /* _MMINTRIN_H_INCLUDED */
1258