1251212Spfg/* Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. 2122180Skan 3132718Skan This file is part of GCC. 4122180Skan 5132718Skan GCC is free software; you can redistribute it and/or modify 6122180Skan it under the terms of the GNU General Public License as published by 7122180Skan the Free Software Foundation; either version 2, or (at your option) 8122180Skan any later version. 9122180Skan 10132718Skan GCC is distributed in the hope that it will be useful, 11122180Skan but WITHOUT ANY WARRANTY; without even the implied warranty of 12122180Skan MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13122180Skan GNU General Public License for more details. 14122180Skan 15122180Skan You should have received a copy of the GNU General Public License 16132718Skan 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. */ 19122180Skan 20122180Skan/* As a special exception, if you include this header file into source 21122180Skan files compiled by GCC, this header file does not by itself cause 22122180Skan the resulting executable to be covered by the GNU General Public 23122180Skan License. This exception does not however invalidate any other 24122180Skan reasons why the executable file might be covered by the GNU General 25122180Skan Public License. */ 26122180Skan 27122180Skan/* Implemented from the specification included in the Intel C++ Compiler 28169689Skan User Guide and Reference, version 9.0. */ 29122180Skan 30122180Skan#ifndef _PMMINTRIN_H_INCLUDED 31122180Skan#define _PMMINTRIN_H_INCLUDED 32122180Skan 33251212Spfg#ifndef __SSE3__ 34251212Spfg# error "SSE3 instruction set not enabled" 35251212Spfg#else 36251212Spfg 37251212Spfg/* We need definitions from the SSE2 and SSE header files*/ 38122180Skan#include <xmmintrin.h> 39122180Skan#include <emmintrin.h> 40122180Skan 41122180Skan/* Additional bits in the MXCSR. */ 42122180Skan#define _MM_DENORMALS_ZERO_MASK 0x0040 43122180Skan#define _MM_DENORMALS_ZERO_ON 0x0040 44122180Skan#define _MM_DENORMALS_ZERO_OFF 0x0000 45122180Skan 46122180Skan#define _MM_SET_DENORMALS_ZERO_MODE(mode) \ 47122180Skan _mm_setcsr ((_mm_getcsr () & ~_MM_DENORMALS_ZERO_MASK) | (mode)) 48122180Skan#define _MM_GET_DENORMALS_ZERO_MODE() \ 49122180Skan (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK) 50122180Skan 51169689Skanstatic __inline __m128 __attribute__((__always_inline__)) 52122180Skan_mm_addsub_ps (__m128 __X, __m128 __Y) 53122180Skan{ 54122180Skan return (__m128) __builtin_ia32_addsubps ((__v4sf)__X, (__v4sf)__Y); 55122180Skan} 56122180Skan 57169689Skanstatic __inline __m128 __attribute__((__always_inline__)) 58122180Skan_mm_hadd_ps (__m128 __X, __m128 __Y) 59122180Skan{ 60122180Skan return (__m128) __builtin_ia32_haddps ((__v4sf)__X, (__v4sf)__Y); 61122180Skan} 62122180Skan 63169689Skanstatic __inline __m128 __attribute__((__always_inline__)) 64122180Skan_mm_hsub_ps (__m128 __X, __m128 __Y) 65122180Skan{ 66122180Skan return (__m128) __builtin_ia32_hsubps ((__v4sf)__X, (__v4sf)__Y); 67122180Skan} 68122180Skan 69169689Skanstatic __inline __m128 __attribute__((__always_inline__)) 70122180Skan_mm_movehdup_ps (__m128 __X) 71122180Skan{ 72122180Skan return (__m128) __builtin_ia32_movshdup ((__v4sf)__X); 73122180Skan} 74122180Skan 75169689Skanstatic __inline __m128 __attribute__((__always_inline__)) 76122180Skan_mm_moveldup_ps (__m128 __X) 77122180Skan{ 78122180Skan return (__m128) __builtin_ia32_movsldup ((__v4sf)__X); 79122180Skan} 80122180Skan 81169689Skanstatic __inline __m128d __attribute__((__always_inline__)) 82122180Skan_mm_addsub_pd (__m128d __X, __m128d __Y) 83122180Skan{ 84122180Skan return (__m128d) __builtin_ia32_addsubpd ((__v2df)__X, (__v2df)__Y); 85122180Skan} 86122180Skan 87169689Skanstatic __inline __m128d __attribute__((__always_inline__)) 88122180Skan_mm_hadd_pd (__m128d __X, __m128d __Y) 89122180Skan{ 90122180Skan return (__m128d) __builtin_ia32_haddpd ((__v2df)__X, (__v2df)__Y); 91122180Skan} 92122180Skan 93169689Skanstatic __inline __m128d __attribute__((__always_inline__)) 94122180Skan_mm_hsub_pd (__m128d __X, __m128d __Y) 95122180Skan{ 96122180Skan return (__m128d) __builtin_ia32_hsubpd ((__v2df)__X, (__v2df)__Y); 97122180Skan} 98122180Skan 99169689Skanstatic __inline __m128d __attribute__((__always_inline__)) 100122180Skan_mm_loaddup_pd (double const *__P) 101122180Skan{ 102169689Skan return _mm_load1_pd (__P); 103122180Skan} 104122180Skan 105169689Skanstatic __inline __m128d __attribute__((__always_inline__)) 106122180Skan_mm_movedup_pd (__m128d __X) 107122180Skan{ 108169689Skan return _mm_shuffle_pd (__X, __X, _MM_SHUFFLE2 (0,0)); 109122180Skan} 110122180Skan 111169689Skanstatic __inline __m128i __attribute__((__always_inline__)) 112122180Skan_mm_lddqu_si128 (__m128i const *__P) 113122180Skan{ 114122180Skan return (__m128i) __builtin_ia32_lddqu ((char const *)__P); 115122180Skan} 116122180Skan 117169689Skanstatic __inline void __attribute__((__always_inline__)) 118122180Skan_mm_monitor (void const * __P, unsigned int __E, unsigned int __H) 119122180Skan{ 120122180Skan __builtin_ia32_monitor (__P, __E, __H); 121122180Skan} 122122180Skan 123169689Skanstatic __inline void __attribute__((__always_inline__)) 124122180Skan_mm_mwait (unsigned int __E, unsigned int __H) 125122180Skan{ 126122180Skan __builtin_ia32_mwait (__E, __H); 127122180Skan} 128122180Skan 129132718Skan#endif /* __SSE3__ */ 130122180Skan 131122180Skan#endif /* _PMMINTRIN_H_INCLUDED */ 132