1251212Spfg/* Copyright (C) 2006, 2007 Free Software Foundation, Inc.
2219639Smm
3219639Smm   This file is part of GCC.
4219639Smm
5219639Smm   GCC is free software; you can redistribute it and/or modify
6219639Smm   it under the terms of the GNU General Public License as published by
7219639Smm   the Free Software Foundation; either version 2, or (at your option)
8219639Smm   any later version.
9219639Smm
10219639Smm   GCC is distributed in the hope that it will be useful,
11219639Smm   but WITHOUT ANY WARRANTY; without even the implied warranty of
12219639Smm   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13219639Smm   GNU General Public License for more details.
14219639Smm
15219639Smm   You should have received a copy of the GNU General Public License
16219639Smm   along with GCC; see the file COPYING.  If not, write to
17219639Smm   the Free Software Foundation, 59 Temple Place - Suite 330,
18219639Smm   Boston, MA 02111-1307, USA.  */
19219639Smm
20219639Smm/* As a special exception, if you include this header file into source
21219639Smm   files compiled by GCC, this header file does not by itself cause
22219639Smm   the resulting executable to be covered by the GNU General Public
23219639Smm   License.  This exception does not however invalidate any other
24219639Smm   reasons why the executable file might be covered by the GNU General
25219639Smm   Public License.  */
26219639Smm
27219639Smm/* Implemented from the specification included in the Intel C++ Compiler
28219639Smm   User Guide and Reference, version 9.1.  */
29219639Smm
30219639Smm#ifndef _TMMINTRIN_H_INCLUDED
31219639Smm#define _TMMINTRIN_H_INCLUDED
32219639Smm
33251212Spfg#ifndef __SSSE3__
34251212Spfg# error "SSSE3 instruction set not enabled"
35251212Spfg#else
36251212Spfg
37251212Spfg/* We need definitions from the SSE3, SSE2 and SSE header files*/
38237021Spfg#include <pmmintrin.h>
39219639Smm
40237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
41237021Spfg_mm_hadd_epi16 (__m128i __X, __m128i __Y)
42237021Spfg{
43237021Spfg  return (__m128i) __builtin_ia32_phaddw128 ((__v8hi)__X, (__v8hi)__Y);
44237021Spfg}
45237021Spfg
46237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
47237021Spfg_mm_hadd_epi32 (__m128i __X, __m128i __Y)
48237021Spfg{
49237021Spfg  return (__m128i) __builtin_ia32_phaddd128 ((__v4si)__X, (__v4si)__Y);
50237021Spfg}
51237021Spfg
52237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
53237021Spfg_mm_hadds_epi16 (__m128i __X, __m128i __Y)
54237021Spfg{
55237021Spfg  return (__m128i) __builtin_ia32_phaddsw128 ((__v8hi)__X, (__v8hi)__Y);
56237021Spfg}
57237021Spfg
58237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
59237021Spfg_mm_hadd_pi16 (__m64 __X, __m64 __Y)
60237021Spfg{
61237021Spfg  return (__m64) __builtin_ia32_phaddw ((__v4hi)__X, (__v4hi)__Y);
62237021Spfg}
63237021Spfg
64237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
65237021Spfg_mm_hadd_pi32 (__m64 __X, __m64 __Y)
66237021Spfg{
67237021Spfg  return (__m64) __builtin_ia32_phaddd ((__v2si)__X, (__v2si)__Y);
68237021Spfg}
69237021Spfg
70237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
71237021Spfg_mm_hadds_pi16 (__m64 __X, __m64 __Y)
72237021Spfg{
73237021Spfg  return (__m64) __builtin_ia32_phaddsw ((__v4hi)__X, (__v4hi)__Y);
74237021Spfg}
75237021Spfg
76237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
77237021Spfg_mm_hsub_epi16 (__m128i __X, __m128i __Y)
78237021Spfg{
79237021Spfg  return (__m128i) __builtin_ia32_phsubw128 ((__v8hi)__X, (__v8hi)__Y);
80237021Spfg}
81237021Spfg
82237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
83237021Spfg_mm_hsub_epi32 (__m128i __X, __m128i __Y)
84237021Spfg{
85237021Spfg  return (__m128i) __builtin_ia32_phsubd128 ((__v4si)__X, (__v4si)__Y);
86237021Spfg}
87237021Spfg
88237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
89237021Spfg_mm_hsubs_epi16 (__m128i __X, __m128i __Y)
90237021Spfg{
91237021Spfg  return (__m128i) __builtin_ia32_phsubsw128 ((__v8hi)__X, (__v8hi)__Y);
92237021Spfg}
93237021Spfg
94237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
95237021Spfg_mm_hsub_pi16 (__m64 __X, __m64 __Y)
96237021Spfg{
97237021Spfg  return (__m64) __builtin_ia32_phsubw ((__v4hi)__X, (__v4hi)__Y);
98237021Spfg}
99237021Spfg
100237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
101237021Spfg_mm_hsub_pi32 (__m64 __X, __m64 __Y)
102237021Spfg{
103237021Spfg  return (__m64) __builtin_ia32_phsubd ((__v2si)__X, (__v2si)__Y);
104237021Spfg}
105237021Spfg
106237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
107237021Spfg_mm_hsubs_pi16 (__m64 __X, __m64 __Y)
108237021Spfg{
109237021Spfg  return (__m64) __builtin_ia32_phsubsw ((__v4hi)__X, (__v4hi)__Y);
110237021Spfg}
111237021Spfg
112237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
113237021Spfg_mm_maddubs_epi16 (__m128i __X, __m128i __Y)
114237021Spfg{
115237021Spfg  return (__m128i) __builtin_ia32_pmaddubsw128 ((__v16qi)__X, (__v16qi)__Y);
116237021Spfg}
117237021Spfg
118237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
119237021Spfg_mm_maddubs_pi16 (__m64 __X, __m64 __Y)
120237021Spfg{
121237021Spfg  return (__m64) __builtin_ia32_pmaddubsw ((__v8qi)__X, (__v8qi)__Y);
122237021Spfg}
123237021Spfg
124237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
125237021Spfg_mm_mulhrs_epi16 (__m128i __X, __m128i __Y)
126237021Spfg{
127237021Spfg  return (__m128i) __builtin_ia32_pmulhrsw128 ((__v8hi)__X, (__v8hi)__Y);
128237021Spfg}
129237021Spfg
130237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
131237021Spfg_mm_mulhrs_pi16 (__m64 __X, __m64 __Y)
132237021Spfg{
133237021Spfg  return (__m64) __builtin_ia32_pmulhrsw ((__v4hi)__X, (__v4hi)__Y);
134237021Spfg}
135237021Spfg
136237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
137237021Spfg_mm_shuffle_epi8 (__m128i __X, __m128i __Y)
138237021Spfg{
139237021Spfg  return (__m128i) __builtin_ia32_pshufb128 ((__v16qi)__X, (__v16qi)__Y);
140237021Spfg}
141237021Spfg
142237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
143237021Spfg_mm_shuffle_pi8 (__m64 __X, __m64 __Y)
144237021Spfg{
145237021Spfg  return (__m64) __builtin_ia32_pshufb ((__v8qi)__X, (__v8qi)__Y);
146237021Spfg}
147237021Spfg
148237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
149237021Spfg_mm_sign_epi8 (__m128i __X, __m128i __Y)
150237021Spfg{
151237021Spfg  return (__m128i) __builtin_ia32_psignb128 ((__v16qi)__X, (__v16qi)__Y);
152237021Spfg}
153237021Spfg
154237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
155237021Spfg_mm_sign_epi16 (__m128i __X, __m128i __Y)
156237021Spfg{
157237021Spfg  return (__m128i) __builtin_ia32_psignw128 ((__v8hi)__X, (__v8hi)__Y);
158237021Spfg}
159237021Spfg
160237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
161237021Spfg_mm_sign_epi32 (__m128i __X, __m128i __Y)
162237021Spfg{
163237021Spfg  return (__m128i) __builtin_ia32_psignd128 ((__v4si)__X, (__v4si)__Y);
164237021Spfg}
165237021Spfg
166237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
167237021Spfg_mm_sign_pi8 (__m64 __X, __m64 __Y)
168237021Spfg{
169237021Spfg  return (__m64) __builtin_ia32_psignb ((__v8qi)__X, (__v8qi)__Y);
170237021Spfg}
171237021Spfg
172237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
173237021Spfg_mm_sign_pi16 (__m64 __X, __m64 __Y)
174237021Spfg{
175237021Spfg  return (__m64) __builtin_ia32_psignw ((__v4hi)__X, (__v4hi)__Y);
176237021Spfg}
177237021Spfg
178237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
179237021Spfg_mm_sign_pi32 (__m64 __X, __m64 __Y)
180237021Spfg{
181237021Spfg  return (__m64) __builtin_ia32_psignd ((__v2si)__X, (__v2si)__Y);
182237021Spfg}
183237021Spfg
184237021Spfg#define _mm_alignr_epi8(__X, __Y, __N) \
185237021Spfg  ((__m128i)__builtin_ia32_palignr128 ((__v2di) __X, (__v2di) __Y, (__N) * 8))
186237021Spfg
187237021Spfg#define _mm_alignr_pi8(__X, __Y, __N) \
188237021Spfg  ((__m64)__builtin_ia32_palignr ((long long) (__X), (long long) (__Y), (__N) * 8))
189237021Spfg
190237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
191237021Spfg_mm_abs_epi8 (__m128i __X)
192237021Spfg{
193237021Spfg  return (__m128i) __builtin_ia32_pabsb128 ((__v16qi)__X);
194237021Spfg}
195237021Spfg
196237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
197237021Spfg_mm_abs_epi16 (__m128i __X)
198237021Spfg{
199237021Spfg  return (__m128i) __builtin_ia32_pabsw128 ((__v8hi)__X);
200237021Spfg}
201237021Spfg
202237021Spfgstatic __inline __m128i __attribute__((__always_inline__))
203237021Spfg_mm_abs_epi32 (__m128i __X)
204237021Spfg{
205237021Spfg  return (__m128i) __builtin_ia32_pabsd128 ((__v4si)__X);
206237021Spfg}
207237021Spfg
208237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
209237021Spfg_mm_abs_pi8 (__m64 __X)
210237021Spfg{
211237021Spfg  return (__m64) __builtin_ia32_pabsb ((__v8qi)__X);
212237021Spfg}
213237021Spfg
214237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
215237021Spfg_mm_abs_pi16 (__m64 __X)
216237021Spfg{
217237021Spfg  return (__m64) __builtin_ia32_pabsw ((__v4hi)__X);
218237021Spfg}
219237021Spfg
220237021Spfgstatic __inline __m64 __attribute__((__always_inline__))
221237021Spfg_mm_abs_pi32 (__m64 __X)
222237021Spfg{
223237021Spfg  return (__m64) __builtin_ia32_pabsd ((__v2si)__X);
224237021Spfg}
225237021Spfg
226237021Spfg#endif /* __SSSE3__ */
227237021Spfg
228237021Spfg#endif /* _TMMINTRIN_H_INCLUDED */
229