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