1/* Copyright (C) 2004, 2007, 2008, 2009 Free Software Foundation, Inc.
2
3   This file is part of GCC.
4
5   GCC is free software; you can redistribute it and/or modify
6   it under the terms of the GNU General Public License as published by
7   the Free Software Foundation; either version 3, or (at your option)
8   any later version.
9
10   GCC is distributed in the hope that it will be useful,
11   but WITHOUT ANY WARRANTY; without even the implied warranty of
12   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13   GNU General Public License for more details.
14
15   Under Section 7 of GPL version 3, you are granted additional
16   permissions described in the GCC Runtime Library Exception, version
17   3.1, as published by the Free Software Foundation.
18
19   You should have received a copy of the GNU General Public License and
20   a copy of the GCC Runtime Library Exception along with this program;
21   see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
22   <http://www.gnu.org/licenses/>.  */
23
24/* Implemented from the mm3dnow.h (of supposedly AMD origin) included with
25   MSVC 7.1.  */
26
27#ifndef _MM3DNOW_H_INCLUDED
28#define _MM3DNOW_H_INCLUDED
29
30#ifdef __3dNOW__
31
32#include <mmintrin.h>
33
34extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
35_m_femms (void)
36{
37  __builtin_ia32_femms();
38}
39
40extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
41_m_pavgusb (__m64 __A, __m64 __B)
42{
43  return (__m64)__builtin_ia32_pavgusb ((__v8qi)__A, (__v8qi)__B);
44}
45
46extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
47_m_pf2id (__m64 __A)
48{
49  return (__m64)__builtin_ia32_pf2id ((__v2sf)__A);
50}
51
52extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
53_m_pfacc (__m64 __A, __m64 __B)
54{
55  return (__m64)__builtin_ia32_pfacc ((__v2sf)__A, (__v2sf)__B);
56}
57
58extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
59_m_pfadd (__m64 __A, __m64 __B)
60{
61  return (__m64)__builtin_ia32_pfadd ((__v2sf)__A, (__v2sf)__B);
62}
63
64extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
65_m_pfcmpeq (__m64 __A, __m64 __B)
66{
67  return (__m64)__builtin_ia32_pfcmpeq ((__v2sf)__A, (__v2sf)__B);
68}
69
70extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
71_m_pfcmpge (__m64 __A, __m64 __B)
72{
73  return (__m64)__builtin_ia32_pfcmpge ((__v2sf)__A, (__v2sf)__B);
74}
75
76extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
77_m_pfcmpgt (__m64 __A, __m64 __B)
78{
79  return (__m64)__builtin_ia32_pfcmpgt ((__v2sf)__A, (__v2sf)__B);
80}
81
82extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
83_m_pfmax (__m64 __A, __m64 __B)
84{
85  return (__m64)__builtin_ia32_pfmax ((__v2sf)__A, (__v2sf)__B);
86}
87
88extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
89_m_pfmin (__m64 __A, __m64 __B)
90{
91  return (__m64)__builtin_ia32_pfmin ((__v2sf)__A, (__v2sf)__B);
92}
93
94extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
95_m_pfmul (__m64 __A, __m64 __B)
96{
97  return (__m64)__builtin_ia32_pfmul ((__v2sf)__A, (__v2sf)__B);
98}
99
100extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
101_m_pfrcp (__m64 __A)
102{
103  return (__m64)__builtin_ia32_pfrcp ((__v2sf)__A);
104}
105
106extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
107_m_pfrcpit1 (__m64 __A, __m64 __B)
108{
109  return (__m64)__builtin_ia32_pfrcpit1 ((__v2sf)__A, (__v2sf)__B);
110}
111
112extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
113_m_pfrcpit2 (__m64 __A, __m64 __B)
114{
115  return (__m64)__builtin_ia32_pfrcpit2 ((__v2sf)__A, (__v2sf)__B);
116}
117
118extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
119_m_pfrsqrt (__m64 __A)
120{
121  return (__m64)__builtin_ia32_pfrsqrt ((__v2sf)__A);
122}
123
124extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
125_m_pfrsqit1 (__m64 __A, __m64 __B)
126{
127  return (__m64)__builtin_ia32_pfrsqit1 ((__v2sf)__A, (__v2sf)__B);
128}
129
130extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
131_m_pfsub (__m64 __A, __m64 __B)
132{
133  return (__m64)__builtin_ia32_pfsub ((__v2sf)__A, (__v2sf)__B);
134}
135
136extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
137_m_pfsubr (__m64 __A, __m64 __B)
138{
139  return (__m64)__builtin_ia32_pfsubr ((__v2sf)__A, (__v2sf)__B);
140}
141
142extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
143_m_pi2fd (__m64 __A)
144{
145  return (__m64)__builtin_ia32_pi2fd ((__v2si)__A);
146}
147
148extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
149_m_pmulhrw (__m64 __A, __m64 __B)
150{
151  return (__m64)__builtin_ia32_pmulhrw ((__v4hi)__A, (__v4hi)__B);
152}
153
154extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
155_m_prefetch (void *__P)
156{
157  __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */);
158}
159
160extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
161_m_prefetchw (void *__P)
162{
163  __builtin_prefetch (__P, 1, 3 /* _MM_HINT_T0 */);
164}
165
166extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
167_m_from_float (float __A)
168{
169  return __extension__ (__m64)(__v2sf){ __A, 0.0f };
170}
171
172extern __inline float __attribute__((__gnu_inline__, __always_inline__, __artificial__))
173_m_to_float (__m64 __A)
174{
175  union { __v2sf v; float a[2]; } __tmp;
176  __tmp.v = (__v2sf)__A;
177  return __tmp.a[0];
178}
179
180#ifdef __3dNOW_A__
181
182extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
183_m_pf2iw (__m64 __A)
184{
185  return (__m64)__builtin_ia32_pf2iw ((__v2sf)__A);
186}
187
188extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
189_m_pfnacc (__m64 __A, __m64 __B)
190{
191  return (__m64)__builtin_ia32_pfnacc ((__v2sf)__A, (__v2sf)__B);
192}
193
194extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
195_m_pfpnacc (__m64 __A, __m64 __B)
196{
197  return (__m64)__builtin_ia32_pfpnacc ((__v2sf)__A, (__v2sf)__B);
198}
199
200extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
201_m_pi2fw (__m64 __A)
202{
203  return (__m64)__builtin_ia32_pi2fw ((__v2si)__A);
204}
205
206extern __inline __m64 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
207_m_pswapd (__m64 __A)
208{
209  return (__m64)__builtin_ia32_pswapdsf ((__v2sf)__A);
210}
211
212#endif /* __3dNOW_A__ */
213#endif /* __3dNOW__ */
214
215#endif /* _MM3DNOW_H_INCLUDED */
216