pmmintrin.h revision 226633
117721Speter/*===---- pmmintrin.h - SSE3 intrinsics ------------------------------------=== 217721Speter * 317721Speter * Permission is hereby granted, free of charge, to any person obtaining a copy 417721Speter * of this software and associated documentation files (the "Software"), to deal 532785Speter * in the Software without restriction, including without limitation the rights 617721Speter * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 717721Speter * copies of the Software, and to permit persons to whom the Software is 817721Speter * furnished to do so, subject to the following conditions: 917721Speter * 1017721Speter * The above copyright notice and this permission notice shall be included in 1117721Speter * all copies or substantial portions of the Software. 1217721Speter * 1325839Speter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1417721Speter * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1581404Speter * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 1625839Speter * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 1725839Speter * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 1825839Speter * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 1981404Speter * THE SOFTWARE. 2025839Speter * 2125839Speter *===-----------------------------------------------------------------------=== 2225839Speter */ 2325839Speter 2417721Speter#ifndef __PMMINTRIN_H 2532785Speter#define __PMMINTRIN_H 2632785Speter 2732785Speter#ifndef __SSE3__ 2817721Speter#error "SSE3 instruction set not enabled" 2917721Speter#else 3017721Speter 3125839Speter#include <emmintrin.h> 3225839Speter 3325839Speterstatic __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 3425839Speter_mm_lddqu_si128(__m128i const *p) 3517721Speter{ 3617721Speter return (__m128i)__builtin_ia32_lddqu((char const *)p); 3717721Speter} 3817721Speter 3917721Speterstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 4017721Speter_mm_addsub_ps(__m128 a, __m128 b) 4117721Speter{ 4217721Speter return __builtin_ia32_addsubps(a, b); 4317721Speter} 4425839Speter 4517721Speterstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 4625839Speter_mm_hadd_ps(__m128 a, __m128 b) 4717721Speter{ 4817721Speter return __builtin_ia32_haddps(a, b); 4917721Speter} 5017721Speter 5125839Speterstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 5225839Speter_mm_hsub_ps(__m128 a, __m128 b) 5317721Speter{ 5417721Speter return __builtin_ia32_hsubps(a, b); 5517721Speter} 5617721Speter 5717721Speterstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 5817721Speter_mm_movehdup_ps(__m128 a) 5917721Speter{ 6017721Speter return __builtin_shufflevector(a, a, 1, 1, 3, 3); 6117721Speter} 6225839Speter 6317721Speterstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 6417721Speter_mm_moveldup_ps(__m128 a) 6525839Speter{ 6625839Speter return __builtin_shufflevector(a, a, 0, 0, 2, 2); 6717721Speter} 6817721Speter 6917721Speterstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 7017721Speter_mm_addsub_pd(__m128d a, __m128d b) 7117721Speter{ 7217721Speter return __builtin_ia32_addsubpd(a, b); 7317721Speter} 7417721Speter 7525839Speterstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 7617721Speter_mm_hadd_pd(__m128d a, __m128d b) 7725839Speter{ 7825839Speter return __builtin_ia32_haddpd(a, b); 7917721Speter} 8017721Speter 8117721Speterstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 8225839Speter_mm_hsub_pd(__m128d a, __m128d b) 8325839Speter{ 8417721Speter return __builtin_ia32_hsubpd(a, b); 8517721Speter} 8617721Speter 8717721Speter#define _mm_loaddup_pd(dp) _mm_load1_pd(dp) 8817721Speter 8917721Speterstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 9017721Speter_mm_movedup_pd(__m128d a) 9125839Speter{ 9217721Speter return __builtin_shufflevector(a, a, 0, 0); 9317721Speter} 9425839Speter 9517721Speter#define _MM_DENORMALS_ZERO_ON (0x0040) 9625839Speter#define _MM_DENORMALS_ZERO_OFF (0x0000) 9725839Speter 9825839Speter#define _MM_DENORMALS_ZERO_MASK (0x0040) 9917721Speter 10017721Speter#define _MM_GET_DENORMALS_ZERO_MODE() (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK) 10117721Speter#define _MM_SET_DENORMALS_ZERO_MODE(x) (_mm_setcsr((_mm_getcsr() & ~_MM_DENORMALS_ZERO_MASK) | (x))) 10217721Speter 10317721Speterstatic __inline__ void __attribute__((__always_inline__, __nodebug__)) 10425839Speter_mm_monitor(void const *p, unsigned extensions, unsigned hints) 10525839Speter{ 10617721Speter __builtin_ia32_monitor((void *)p, extensions, hints); 10717721Speter} 10817721Speter 10917721Speterstatic __inline__ void __attribute__((__always_inline__, __nodebug__)) 11017721Speter_mm_mwait(unsigned extensions, unsigned hints) 11117721Speter{ 11217721Speter __builtin_ia32_mwait(extensions, hints); 11317721Speter} 11417721Speter 11517721Speter#endif /* __SSE3__ */ 11617721Speter 11717721Speter#endif /* __PMMINTRIN_H */ 11825839Speter