1f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson/*===---- pmmintrin.h - SSE3 intrinsics ------------------------------------=== 2f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * 3f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * Permission is hereby granted, free of charge, to any person obtaining a copy 4f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * of this software and associated documentation files (the "Software"), to deal 5f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * in the Software without restriction, including without limitation the rights 6f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * copies of the Software, and to permit persons to whom the Software is 8f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * furnished to do so, subject to the following conditions: 9f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * 10f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * The above copyright notice and this permission notice shall be included in 11f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * all copies or substantial portions of the Software. 12f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * 13f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * THE SOFTWARE. 20f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson * 21f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson *===-----------------------------------------------------------------------=== 22f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson */ 23f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 24f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#ifndef __PMMINTRIN_H 25f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#define __PMMINTRIN_H 26f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 27f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#ifndef __SSE3__ 28f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#error "SSE3 instruction set not enabled" 29f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#else 30f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 31f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#include <emmintrin.h> 32f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 331bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) 34dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_lddqu_si128(__m128i const *p) 35f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 36f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return (__m128i)__builtin_ia32_lddqu((char const *)p); 37f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 38f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 391bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 40dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_addsub_ps(__m128 a, __m128 b) 41f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 42f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_ia32_addsubps(a, b); 43f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 44f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 451bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 46dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_hadd_ps(__m128 a, __m128 b) 47f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 48f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_ia32_haddps(a, b); 49f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 50f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 511bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 52dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_hsub_ps(__m128 a, __m128 b) 53f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 54f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_ia32_hsubps(a, b); 55f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 56f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 571bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 58dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_movehdup_ps(__m128 a) 59f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 60f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_shufflevector(a, a, 1, 1, 3, 3); 61f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 62f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 631bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) 64dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_moveldup_ps(__m128 a) 65f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 66f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_shufflevector(a, a, 0, 0, 2, 2); 67f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 68f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 691bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 70dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_addsub_pd(__m128d a, __m128d b) 71f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 72f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_ia32_addsubpd(a, b); 73f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 74f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 751bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 76dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_hadd_pd(__m128d a, __m128d b) 77f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 78f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_ia32_haddpd(a, b); 79f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 80f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 811bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 82dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_hsub_pd(__m128d a, __m128d b) 83f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 84f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_ia32_hsubpd(a, b); 85f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 86f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 877c06f6b319b272ea9e2df8ef03793c7b89e8dfabEli Friedman#define _mm_loaddup_pd(dp) _mm_load1_pd(dp) 88f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 891bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) 90dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_movedup_pd(__m128d a) 91f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 92f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson return __builtin_shufflevector(a, a, 0, 0); 93f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 94f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 95f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#define _MM_DENORMALS_ZERO_ON (0x0040) 96f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#define _MM_DENORMALS_ZERO_OFF (0x0000) 97f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 98f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#define _MM_DENORMALS_ZERO_MASK (0x0040) 99f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 100f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#define _MM_GET_DENORMALS_ZERO_MODE() (_mm_getcsr() & _MM_DENORMALS_ZERO_MASK) 101f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#define _MM_SET_DENORMALS_ZERO_MODE(x) (_mm_setcsr((_mm_getcsr() & ~_MM_DENORMALS_ZERO_MASK) | (x))) 102f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 1031bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ void __attribute__((__always_inline__, __nodebug__)) 104dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_monitor(void const *p, unsigned extensions, unsigned hints) 105f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 106f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson __builtin_ia32_monitor((void *)p, extensions, hints); 107f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 108f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 1091bddbcbd11de09c7bcb48c3d661c447967db73a7Chris Lattnerstatic __inline__ void __attribute__((__always_inline__, __nodebug__)) 110dae4413d77b3e7599ce81307eb7a7d1dedbac547Mike Stump_mm_mwait(unsigned extensions, unsigned hints) 111f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson{ 112f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson __builtin_ia32_mwait(extensions, hints); 113f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson} 114f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 115f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#endif /* __SSE3__ */ 116f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson 117f29b774a7554e8d48e7a4ba08eb3f86eb5c2b219Anders Carlsson#endif /* __PMMINTRIN_H */ 118