1221339Sdim/*===---- mm3dnow.h - 3DNow! intrinsics ------------------------------------===
2221339Sdim *
3221339Sdim * Permission is hereby granted, free of charge, to any person obtaining a copy
4221339Sdim * of this software and associated documentation files (the "Software"), to deal
5221339Sdim * in the Software without restriction, including without limitation the rights
6221339Sdim * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7221339Sdim * copies of the Software, and to permit persons to whom the Software is
8221339Sdim * furnished to do so, subject to the following conditions:
9221339Sdim *
10221339Sdim * The above copyright notice and this permission notice shall be included in
11221339Sdim * all copies or substantial portions of the Software.
12221339Sdim *
13221339Sdim * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14221339Sdim * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15221339Sdim * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16221339Sdim * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17221339Sdim * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18221339Sdim * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19221339Sdim * THE SOFTWARE.
20221339Sdim *
21221339Sdim *===-----------------------------------------------------------------------===
22221339Sdim */
23221339Sdim
24221339Sdim#ifndef _MM3DNOW_H_INCLUDED
25221339Sdim#define _MM3DNOW_H_INCLUDED
26221339Sdim
27221339Sdim#include <mmintrin.h>
28249423Sdim#include <prfchwintrin.h>
29221339Sdim
30221339Sdimtypedef float __v2sf __attribute__((__vector_size__(8)));
31221339Sdim
32288943Sdim/* Define the default attributes for the functions in this file. */
33296417Sdim#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("3dnow")))
34288943Sdim
35288943Sdimstatic __inline__ void __DEFAULT_FN_ATTRS
36221339Sdim_m_femms() {
37221339Sdim  __builtin_ia32_femms();
38221339Sdim}
39221339Sdim
40288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
41221339Sdim_m_pavgusb(__m64 __m1, __m64 __m2) {
42221339Sdim  return (__m64)__builtin_ia32_pavgusb((__v8qi)__m1, (__v8qi)__m2);
43221339Sdim}
44221339Sdim
45288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
46221339Sdim_m_pf2id(__m64 __m) {
47221339Sdim  return (__m64)__builtin_ia32_pf2id((__v2sf)__m);
48221339Sdim}
49221339Sdim
50288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
51221339Sdim_m_pfacc(__m64 __m1, __m64 __m2) {
52221339Sdim  return (__m64)__builtin_ia32_pfacc((__v2sf)__m1, (__v2sf)__m2);
53221339Sdim}
54221339Sdim
55288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
56221339Sdim_m_pfadd(__m64 __m1, __m64 __m2) {
57221339Sdim  return (__m64)__builtin_ia32_pfadd((__v2sf)__m1, (__v2sf)__m2);
58221339Sdim}
59221339Sdim
60288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
61221339Sdim_m_pfcmpeq(__m64 __m1, __m64 __m2) {
62221339Sdim  return (__m64)__builtin_ia32_pfcmpeq((__v2sf)__m1, (__v2sf)__m2);
63221339Sdim}
64221339Sdim
65288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
66221339Sdim_m_pfcmpge(__m64 __m1, __m64 __m2) {
67221339Sdim  return (__m64)__builtin_ia32_pfcmpge((__v2sf)__m1, (__v2sf)__m2);
68221339Sdim}
69221339Sdim
70288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
71221339Sdim_m_pfcmpgt(__m64 __m1, __m64 __m2) {
72221339Sdim  return (__m64)__builtin_ia32_pfcmpgt((__v2sf)__m1, (__v2sf)__m2);
73221339Sdim}
74221339Sdim
75288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
76221339Sdim_m_pfmax(__m64 __m1, __m64 __m2) {
77221339Sdim  return (__m64)__builtin_ia32_pfmax((__v2sf)__m1, (__v2sf)__m2);
78221339Sdim}
79221339Sdim
80288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
81221339Sdim_m_pfmin(__m64 __m1, __m64 __m2) {
82221339Sdim  return (__m64)__builtin_ia32_pfmin((__v2sf)__m1, (__v2sf)__m2);
83221339Sdim}
84221339Sdim
85288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
86221339Sdim_m_pfmul(__m64 __m1, __m64 __m2) {
87221339Sdim  return (__m64)__builtin_ia32_pfmul((__v2sf)__m1, (__v2sf)__m2);
88221339Sdim}
89221339Sdim
90288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
91221339Sdim_m_pfrcp(__m64 __m) {
92221339Sdim  return (__m64)__builtin_ia32_pfrcp((__v2sf)__m);
93221339Sdim}
94221339Sdim
95288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
96221339Sdim_m_pfrcpit1(__m64 __m1, __m64 __m2) {
97221339Sdim  return (__m64)__builtin_ia32_pfrcpit1((__v2sf)__m1, (__v2sf)__m2);
98221339Sdim}
99221339Sdim
100288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
101221339Sdim_m_pfrcpit2(__m64 __m1, __m64 __m2) {
102221339Sdim  return (__m64)__builtin_ia32_pfrcpit2((__v2sf)__m1, (__v2sf)__m2);
103221339Sdim}
104221339Sdim
105288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
106221339Sdim_m_pfrsqrt(__m64 __m) {
107221339Sdim  return (__m64)__builtin_ia32_pfrsqrt((__v2sf)__m);
108221339Sdim}
109221339Sdim
110288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
111221339Sdim_m_pfrsqrtit1(__m64 __m1, __m64 __m2) {
112234353Sdim  return (__m64)__builtin_ia32_pfrsqit1((__v2sf)__m1, (__v2sf)__m2);
113221339Sdim}
114221339Sdim
115288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
116221339Sdim_m_pfsub(__m64 __m1, __m64 __m2) {
117221339Sdim  return (__m64)__builtin_ia32_pfsub((__v2sf)__m1, (__v2sf)__m2);
118221339Sdim}
119221339Sdim
120288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
121221339Sdim_m_pfsubr(__m64 __m1, __m64 __m2) {
122221339Sdim  return (__m64)__builtin_ia32_pfsubr((__v2sf)__m1, (__v2sf)__m2);
123221339Sdim}
124221339Sdim
125288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
126221339Sdim_m_pi2fd(__m64 __m) {
127221339Sdim  return (__m64)__builtin_ia32_pi2fd((__v2si)__m);
128221339Sdim}
129221339Sdim
130288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
131221339Sdim_m_pmulhrw(__m64 __m1, __m64 __m2) {
132221339Sdim  return (__m64)__builtin_ia32_pmulhrw((__v4hi)__m1, (__v4hi)__m2);
133221339Sdim}
134221339Sdim
135296417Sdim/* Handle the 3dnowa instructions here. */
136296417Sdim#undef __DEFAULT_FN_ATTRS
137296417Sdim#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("3dnowa")))
138296417Sdim
139288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
140221339Sdim_m_pf2iw(__m64 __m) {
141221339Sdim  return (__m64)__builtin_ia32_pf2iw((__v2sf)__m);
142221339Sdim}
143221339Sdim
144288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
145221339Sdim_m_pfnacc(__m64 __m1, __m64 __m2) {
146221339Sdim  return (__m64)__builtin_ia32_pfnacc((__v2sf)__m1, (__v2sf)__m2);
147221339Sdim}
148221339Sdim
149288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
150221339Sdim_m_pfpnacc(__m64 __m1, __m64 __m2) {
151221339Sdim  return (__m64)__builtin_ia32_pfpnacc((__v2sf)__m1, (__v2sf)__m2);
152221339Sdim}
153221339Sdim
154288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
155221339Sdim_m_pi2fw(__m64 __m) {
156221339Sdim  return (__m64)__builtin_ia32_pi2fw((__v2si)__m);
157221339Sdim}
158221339Sdim
159288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
160221339Sdim_m_pswapdsf(__m64 __m) {
161221339Sdim  return (__m64)__builtin_ia32_pswapdsf((__v2sf)__m);
162221339Sdim}
163221339Sdim
164288943Sdimstatic __inline__ __m64 __DEFAULT_FN_ATTRS
165221339Sdim_m_pswapdsi(__m64 __m) {
166221339Sdim  return (__m64)__builtin_ia32_pswapdsi((__v2si)__m);
167221339Sdim}
168221339Sdim
169288943Sdim#undef __DEFAULT_FN_ATTRS
170288943Sdim
171221339Sdim#endif
172