1169689Skan/* Copyright (C) 2004 Free Software Foundation, Inc. 2169689Skan 3169689Skan This file is part of GCC. 4169689Skan 5169689Skan GCC is free software; you can redistribute it and/or modify 6169689Skan it under the terms of the GNU General Public License as published by 7169689Skan the Free Software Foundation; either version 2, or (at your option) 8169689Skan any later version. 9169689Skan 10169689Skan GCC is distributed in the hope that it will be useful, 11169689Skan but WITHOUT ANY WARRANTY; without even the implied warranty of 12169689Skan MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13169689Skan GNU General Public License for more details. 14169689Skan 15169689Skan You should have received a copy of the GNU General Public License 16169689Skan along with GCC; see the file COPYING. If not, write to 17169689Skan the Free Software Foundation, 51 Franklin Street, Fifth Floor, 18169689Skan Boston, MA 02110-1301, USA. */ 19169689Skan 20169689Skan/* As a special exception, if you include this header file into source 21169689Skan files compiled by GCC, this header file does not by itself cause 22169689Skan the resulting executable to be covered by the GNU General Public 23169689Skan License. This exception does not however invalidate any other 24169689Skan reasons why the executable file might be covered by the GNU General 25169689Skan Public License. */ 26169689Skan 27169689Skan/* Implemented from the mm3dnow.h (of supposedly AMD origin) included with 28169689Skan MSVC 7.1. */ 29169689Skan 30169689Skan#ifndef _MM3DNOW_H_INCLUDED 31169689Skan#define _MM3DNOW_H_INCLUDED 32169689Skan 33169689Skan#ifdef __3dNOW__ 34169689Skan 35169689Skan#include <mmintrin.h> 36169689Skan 37169689Skan/* Internal data types for implementing the intrinsics. */ 38169689Skantypedef float __v2sf __attribute__ ((__vector_size__ (8))); 39169689Skan 40169689Skanstatic __inline void 41169689Skan_m_femms (void) 42169689Skan{ 43169689Skan __builtin_ia32_femms(); 44169689Skan} 45169689Skan 46169689Skanstatic __inline __m64 47169689Skan_m_pavgusb (__m64 __A, __m64 __B) 48169689Skan{ 49169689Skan return (__m64)__builtin_ia32_pavgusb ((__v8qi)__A, (__v8qi)__B); 50169689Skan} 51169689Skan 52169689Skanstatic __inline __m64 53169689Skan_m_pf2id (__m64 __A) 54169689Skan{ 55169689Skan return (__m64)__builtin_ia32_pf2id ((__v2sf)__A); 56169689Skan} 57169689Skan 58169689Skanstatic __inline __m64 59169689Skan_m_pfacc (__m64 __A, __m64 __B) 60169689Skan{ 61169689Skan return (__m64)__builtin_ia32_pfacc ((__v2sf)__A, (__v2sf)__B); 62169689Skan} 63169689Skan 64169689Skanstatic __inline __m64 65169689Skan_m_pfadd (__m64 __A, __m64 __B) 66169689Skan{ 67169689Skan return (__m64)__builtin_ia32_pfadd ((__v2sf)__A, (__v2sf)__B); 68169689Skan} 69169689Skan 70169689Skanstatic __inline __m64 71169689Skan_m_pfcmpeq (__m64 __A, __m64 __B) 72169689Skan{ 73169689Skan return (__m64)__builtin_ia32_pfcmpeq ((__v2sf)__A, (__v2sf)__B); 74169689Skan} 75169689Skan 76169689Skanstatic __inline __m64 77169689Skan_m_pfcmpge (__m64 __A, __m64 __B) 78169689Skan{ 79169689Skan return (__m64)__builtin_ia32_pfcmpge ((__v2sf)__A, (__v2sf)__B); 80169689Skan} 81169689Skan 82169689Skanstatic __inline __m64 83169689Skan_m_pfcmpgt (__m64 __A, __m64 __B) 84169689Skan{ 85169689Skan return (__m64)__builtin_ia32_pfcmpgt ((__v2sf)__A, (__v2sf)__B); 86169689Skan} 87169689Skan 88169689Skanstatic __inline __m64 89169689Skan_m_pfmax (__m64 __A, __m64 __B) 90169689Skan{ 91169689Skan return (__m64)__builtin_ia32_pfmax ((__v2sf)__A, (__v2sf)__B); 92169689Skan} 93169689Skan 94169689Skanstatic __inline __m64 95169689Skan_m_pfmin (__m64 __A, __m64 __B) 96169689Skan{ 97169689Skan return (__m64)__builtin_ia32_pfmin ((__v2sf)__A, (__v2sf)__B); 98169689Skan} 99169689Skan 100169689Skanstatic __inline __m64 101169689Skan_m_pfmul (__m64 __A, __m64 __B) 102169689Skan{ 103169689Skan return (__m64)__builtin_ia32_pfmul ((__v2sf)__A, (__v2sf)__B); 104169689Skan} 105169689Skan 106169689Skanstatic __inline __m64 107169689Skan_m_pfrcp (__m64 __A) 108169689Skan{ 109169689Skan return (__m64)__builtin_ia32_pfrcp ((__v2sf)__A); 110169689Skan} 111169689Skan 112169689Skanstatic __inline __m64 113169689Skan_m_pfrcpit1 (__m64 __A, __m64 __B) 114169689Skan{ 115169689Skan return (__m64)__builtin_ia32_pfrcpit1 ((__v2sf)__A, (__v2sf)__B); 116169689Skan} 117169689Skan 118169689Skanstatic __inline __m64 119169689Skan_m_pfrcpit2 (__m64 __A, __m64 __B) 120169689Skan{ 121169689Skan return (__m64)__builtin_ia32_pfrcpit2 ((__v2sf)__A, (__v2sf)__B); 122169689Skan} 123169689Skan 124169689Skanstatic __inline __m64 125169689Skan_m_pfrsqrt (__m64 __A) 126169689Skan{ 127169689Skan return (__m64)__builtin_ia32_pfrsqrt ((__v2sf)__A); 128169689Skan} 129169689Skan 130169689Skanstatic __inline __m64 131169689Skan_m_pfrsqit1 (__m64 __A, __m64 __B) 132169689Skan{ 133169689Skan return (__m64)__builtin_ia32_pfrsqit1 ((__v2sf)__A, (__v2sf)__B); 134169689Skan} 135169689Skan 136169689Skanstatic __inline __m64 137169689Skan_m_pfsub (__m64 __A, __m64 __B) 138169689Skan{ 139169689Skan return (__m64)__builtin_ia32_pfsub ((__v2sf)__A, (__v2sf)__B); 140169689Skan} 141169689Skan 142169689Skanstatic __inline __m64 143169689Skan_m_pfsubr (__m64 __A, __m64 __B) 144169689Skan{ 145169689Skan return (__m64)__builtin_ia32_pfsubr ((__v2sf)__A, (__v2sf)__B); 146169689Skan} 147169689Skan 148169689Skanstatic __inline __m64 149169689Skan_m_pi2fd (__m64 __A) 150169689Skan{ 151169689Skan return (__m64)__builtin_ia32_pi2fd ((__v2si)__A); 152169689Skan} 153169689Skan 154169689Skanstatic __inline __m64 155169689Skan_m_pmulhrw (__m64 __A, __m64 __B) 156169689Skan{ 157169689Skan return (__m64)__builtin_ia32_pmulhrw ((__v4hi)__A, (__v4hi)__B); 158169689Skan} 159169689Skan 160169689Skanstatic __inline void 161169689Skan_m_prefetch (void *__P) 162169689Skan{ 163169689Skan __builtin_prefetch (__P, 0, 3 /* _MM_HINT_T0 */); 164169689Skan} 165169689Skan 166169689Skanstatic __inline void 167169689Skan_m_prefetchw (void *__P) 168169689Skan{ 169169689Skan __builtin_prefetch (__P, 1, 3 /* _MM_HINT_T0 */); 170169689Skan} 171169689Skan 172169689Skanstatic __inline __m64 173169689Skan_m_from_float (float __A) 174169689Skan{ 175169689Skan return (__m64)(__v2sf){ __A, 0 }; 176169689Skan} 177169689Skan 178169689Skanstatic __inline float 179169689Skan_m_to_float (__m64 __A) 180169689Skan{ 181169689Skan union { __v2sf v; float a[2]; } __tmp = { (__v2sf)__A }; 182169689Skan return __tmp.a[0]; 183169689Skan} 184169689Skan 185169689Skan#ifdef __3dNOW_A__ 186169689Skan 187169689Skanstatic __inline __m64 188169689Skan_m_pf2iw (__m64 __A) 189169689Skan{ 190169689Skan return (__m64)__builtin_ia32_pf2iw ((__v2sf)__A); 191169689Skan} 192169689Skan 193169689Skanstatic __inline __m64 194169689Skan_m_pfnacc (__m64 __A, __m64 __B) 195169689Skan{ 196169689Skan return (__m64)__builtin_ia32_pfnacc ((__v2sf)__A, (__v2sf)__B); 197169689Skan} 198169689Skan 199169689Skanstatic __inline __m64 200169689Skan_m_pfpnacc (__m64 __A, __m64 __B) 201169689Skan{ 202169689Skan return (__m64)__builtin_ia32_pfpnacc ((__v2sf)__A, (__v2sf)__B); 203169689Skan} 204169689Skan 205169689Skanstatic __inline __m64 206169689Skan_m_pi2fw (__m64 __A) 207169689Skan{ 208169689Skan return (__m64)__builtin_ia32_pi2fw ((__v2si)__A); 209169689Skan} 210169689Skan 211169689Skanstatic __inline __m64 212169689Skan_m_pswapd (__m64 __A) 213169689Skan{ 214169689Skan return (__m64)__builtin_ia32_pswapdsf ((__v2sf)__A); 215169689Skan} 216169689Skan 217169689Skan#endif /* __3dNOW_A__ */ 218169689Skan#endif /* __3dNOW__ */ 219169689Skan 220169689Skan#endif /* _MM3DNOW_H_INCLUDED */ 221