Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1 | /*===---- emmintrin.h - SSE2 intrinsics ------------------------------------=== |
| 2 | * |
| 3 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
| 4 | * of this software and associated documentation files (the "Software"), to deal |
| 5 | * in the Software without restriction, including without limitation the rights |
| 6 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
| 7 | * copies of the Software, and to permit persons to whom the Software is |
| 8 | * furnished to do so, subject to the following conditions: |
| 9 | * |
| 10 | * The above copyright notice and this permission notice shall be included in |
| 11 | * all copies or substantial portions of the Software. |
| 12 | * |
| 13 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
| 14 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| 15 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
| 16 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
| 17 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
| 18 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
| 19 | * THE SOFTWARE. |
| 20 | * |
| 21 | *===-----------------------------------------------------------------------=== |
| 22 | */ |
| 23 | |
| 24 | #ifndef __EMMINTRIN_H |
| 25 | #define __EMMINTRIN_H |
| 26 | |
| 27 | #ifndef __SSE2__ |
| 28 | #error "SSE2 instruction set not enabled" |
| 29 | #else |
| 30 | |
| 31 | #include <xmmintrin.h> |
| 32 | |
| 33 | typedef double __m128d __attribute__((__vector_size__(16))); |
| 34 | typedef long long __m128i __attribute__((__vector_size__(16))); |
| 35 | |
| 36 | /* Type defines. */ |
| 37 | typedef double __v2df __attribute__ ((__vector_size__ (16))); |
| 38 | typedef long long __v2di __attribute__ ((__vector_size__ (16))); |
| 39 | typedef short __v8hi __attribute__((__vector_size__(16))); |
| 40 | typedef char __v16qi __attribute__((__vector_size__(16))); |
| 41 | |
| 42 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 43 | _mm_add_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 44 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 45 | __a[0] += __b[0]; |
| 46 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 47 | } |
| 48 | |
| 49 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 50 | _mm_add_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 51 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 52 | return __a + __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 53 | } |
| 54 | |
| 55 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 56 | _mm_sub_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 57 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 58 | __a[0] -= __b[0]; |
| 59 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 60 | } |
| 61 | |
| 62 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 63 | _mm_sub_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 64 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 65 | return __a - __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 66 | } |
| 67 | |
| 68 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 69 | _mm_mul_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 70 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 71 | __a[0] *= __b[0]; |
| 72 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 73 | } |
| 74 | |
| 75 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 76 | _mm_mul_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 77 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 78 | return __a * __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 79 | } |
| 80 | |
| 81 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 82 | _mm_div_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 83 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 84 | __a[0] /= __b[0]; |
| 85 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 86 | } |
| 87 | |
| 88 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 89 | _mm_div_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 90 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 91 | return __a / __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 92 | } |
| 93 | |
| 94 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 95 | _mm_sqrt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 96 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 97 | __m128d __c = __builtin_ia32_sqrtsd(__b); |
| 98 | return (__m128d) { __c[0], __a[1] }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 99 | } |
| 100 | |
| 101 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 102 | _mm_sqrt_pd(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 103 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 104 | return __builtin_ia32_sqrtpd(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 105 | } |
| 106 | |
| 107 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 108 | _mm_min_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 109 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 110 | return __builtin_ia32_minsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 111 | } |
| 112 | |
| 113 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 114 | _mm_min_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 115 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 116 | return __builtin_ia32_minpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 117 | } |
| 118 | |
| 119 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 120 | _mm_max_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 121 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 122 | return __builtin_ia32_maxsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 123 | } |
| 124 | |
| 125 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 126 | _mm_max_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 127 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 128 | return __builtin_ia32_maxpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 129 | } |
| 130 | |
| 131 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 132 | _mm_and_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 133 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 134 | return (__m128d)((__v4si)__a & (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 135 | } |
| 136 | |
| 137 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 138 | _mm_andnot_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 139 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 140 | return (__m128d)(~(__v4si)__a & (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 141 | } |
| 142 | |
| 143 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 144 | _mm_or_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 145 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 146 | return (__m128d)((__v4si)__a | (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 147 | } |
| 148 | |
| 149 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 150 | _mm_xor_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 151 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 152 | return (__m128d)((__v4si)__a ^ (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 153 | } |
| 154 | |
| 155 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 156 | _mm_cmpeq_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 157 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 158 | return (__m128d)__builtin_ia32_cmpeqpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 159 | } |
| 160 | |
| 161 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 162 | _mm_cmplt_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 163 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 164 | return (__m128d)__builtin_ia32_cmpltpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 165 | } |
| 166 | |
| 167 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 168 | _mm_cmple_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 169 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 170 | return (__m128d)__builtin_ia32_cmplepd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 171 | } |
| 172 | |
| 173 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 174 | _mm_cmpgt_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 175 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 176 | return (__m128d)__builtin_ia32_cmpltpd(__b, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 177 | } |
| 178 | |
| 179 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 180 | _mm_cmpge_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 181 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 182 | return (__m128d)__builtin_ia32_cmplepd(__b, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 183 | } |
| 184 | |
| 185 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 186 | _mm_cmpord_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 187 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 188 | return (__m128d)__builtin_ia32_cmpordpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 189 | } |
| 190 | |
| 191 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 192 | _mm_cmpunord_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 193 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 194 | return (__m128d)__builtin_ia32_cmpunordpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 195 | } |
| 196 | |
| 197 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 198 | _mm_cmpneq_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 199 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 200 | return (__m128d)__builtin_ia32_cmpneqpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 201 | } |
| 202 | |
| 203 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 204 | _mm_cmpnlt_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 205 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 206 | return (__m128d)__builtin_ia32_cmpnltpd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 207 | } |
| 208 | |
| 209 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 210 | _mm_cmpnle_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 211 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 212 | return (__m128d)__builtin_ia32_cmpnlepd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 213 | } |
| 214 | |
| 215 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 216 | _mm_cmpngt_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 217 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 218 | return (__m128d)__builtin_ia32_cmpnltpd(__b, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 219 | } |
| 220 | |
| 221 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 222 | _mm_cmpnge_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 223 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 224 | return (__m128d)__builtin_ia32_cmpnlepd(__b, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 225 | } |
| 226 | |
| 227 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 228 | _mm_cmpeq_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 229 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 230 | return (__m128d)__builtin_ia32_cmpeqsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 231 | } |
| 232 | |
| 233 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 234 | _mm_cmplt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 235 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 236 | return (__m128d)__builtin_ia32_cmpltsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 237 | } |
| 238 | |
| 239 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 240 | _mm_cmple_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 241 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 242 | return (__m128d)__builtin_ia32_cmplesd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 243 | } |
| 244 | |
| 245 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 246 | _mm_cmpgt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 247 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 248 | __m128d __c = __builtin_ia32_cmpltsd(__b, __a); |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 249 | return (__m128d) { __c[0], __a[1] }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 250 | } |
| 251 | |
| 252 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 253 | _mm_cmpge_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 254 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 255 | __m128d __c = __builtin_ia32_cmplesd(__b, __a); |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 256 | return (__m128d) { __c[0], __a[1] }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 257 | } |
| 258 | |
| 259 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 260 | _mm_cmpord_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 261 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 262 | return (__m128d)__builtin_ia32_cmpordsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 263 | } |
| 264 | |
| 265 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 266 | _mm_cmpunord_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 267 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 268 | return (__m128d)__builtin_ia32_cmpunordsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 269 | } |
| 270 | |
| 271 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 272 | _mm_cmpneq_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 273 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 274 | return (__m128d)__builtin_ia32_cmpneqsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 275 | } |
| 276 | |
| 277 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 278 | _mm_cmpnlt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 279 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 280 | return (__m128d)__builtin_ia32_cmpnltsd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 281 | } |
| 282 | |
| 283 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 284 | _mm_cmpnle_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 285 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 286 | return (__m128d)__builtin_ia32_cmpnlesd(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 287 | } |
| 288 | |
| 289 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 290 | _mm_cmpngt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 291 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 292 | __m128d __c = __builtin_ia32_cmpnltsd(__b, __a); |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 293 | return (__m128d) { __c[0], __a[1] }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 294 | } |
| 295 | |
| 296 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 297 | _mm_cmpnge_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 298 | { |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 299 | __m128d __c = __builtin_ia32_cmpnlesd(__b, __a); |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 300 | return (__m128d) { __c[0], __a[1] }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 301 | } |
| 302 | |
| 303 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 304 | _mm_comieq_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 305 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 306 | return __builtin_ia32_comisdeq(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 307 | } |
| 308 | |
| 309 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 310 | _mm_comilt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 311 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 312 | return __builtin_ia32_comisdlt(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 313 | } |
| 314 | |
| 315 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 316 | _mm_comile_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 317 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 318 | return __builtin_ia32_comisdle(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 319 | } |
| 320 | |
| 321 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 322 | _mm_comigt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 323 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 324 | return __builtin_ia32_comisdgt(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 325 | } |
| 326 | |
| 327 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 328 | _mm_comige_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 329 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 330 | return __builtin_ia32_comisdge(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 331 | } |
| 332 | |
| 333 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 334 | _mm_comineq_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 335 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 336 | return __builtin_ia32_comisdneq(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 337 | } |
| 338 | |
| 339 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 340 | _mm_ucomieq_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 341 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 342 | return __builtin_ia32_ucomisdeq(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 343 | } |
| 344 | |
| 345 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 346 | _mm_ucomilt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 347 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 348 | return __builtin_ia32_ucomisdlt(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 349 | } |
| 350 | |
| 351 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 352 | _mm_ucomile_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 353 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 354 | return __builtin_ia32_ucomisdle(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 355 | } |
| 356 | |
| 357 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 358 | _mm_ucomigt_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 359 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 360 | return __builtin_ia32_ucomisdgt(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 361 | } |
| 362 | |
| 363 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 364 | _mm_ucomige_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 365 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 366 | return __builtin_ia32_ucomisdge(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 367 | } |
| 368 | |
| 369 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 370 | _mm_ucomineq_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 371 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 372 | return __builtin_ia32_ucomisdneq(__a, __b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 373 | } |
| 374 | |
| 375 | static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 376 | _mm_cvtpd_ps(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 377 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 378 | return __builtin_ia32_cvtpd2ps(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 379 | } |
| 380 | |
| 381 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 382 | _mm_cvtps_pd(__m128 __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 383 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 384 | return __builtin_ia32_cvtps2pd(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 385 | } |
| 386 | |
| 387 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 388 | _mm_cvtepi32_pd(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 389 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 390 | return __builtin_ia32_cvtdq2pd((__v4si)__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 391 | } |
| 392 | |
| 393 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 394 | _mm_cvtpd_epi32(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 395 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 396 | return __builtin_ia32_cvtpd2dq(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 397 | } |
| 398 | |
| 399 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 400 | _mm_cvtsd_si32(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 401 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 402 | return __builtin_ia32_cvtsd2si(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 403 | } |
| 404 | |
| 405 | static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 406 | _mm_cvtsd_ss(__m128 __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 407 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 408 | __a[0] = __b[0]; |
| 409 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 410 | } |
| 411 | |
| 412 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 413 | _mm_cvtsi32_sd(__m128d __a, int __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 414 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 415 | __a[0] = __b; |
| 416 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 417 | } |
| 418 | |
| 419 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 420 | _mm_cvtss_sd(__m128d __a, __m128 __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 421 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 422 | __a[0] = __b[0]; |
| 423 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 424 | } |
| 425 | |
| 426 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 427 | _mm_cvttpd_epi32(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 428 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 429 | return (__m128i)__builtin_ia32_cvttpd2dq(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 430 | } |
| 431 | |
| 432 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 433 | _mm_cvttsd_si32(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 434 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 435 | return __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 436 | } |
| 437 | |
| 438 | static __inline__ __m64 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 439 | _mm_cvtpd_pi32(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 440 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 441 | return (__m64)__builtin_ia32_cvtpd2pi(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 442 | } |
| 443 | |
| 444 | static __inline__ __m64 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 445 | _mm_cvttpd_pi32(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 446 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 447 | return (__m64)__builtin_ia32_cvttpd2pi(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 448 | } |
| 449 | |
| 450 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 451 | _mm_cvtpi32_pd(__m64 __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 452 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 453 | return __builtin_ia32_cvtpi2pd((__v2si)__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 454 | } |
| 455 | |
| 456 | static __inline__ double __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 457 | _mm_cvtsd_f64(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 458 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 459 | return __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 460 | } |
| 461 | |
| 462 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 463 | _mm_load_pd(double const *__dp) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 464 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 465 | return *(__m128d*)__dp; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 466 | } |
| 467 | |
| 468 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 469 | _mm_load1_pd(double const *__dp) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 470 | { |
| 471 | struct __mm_load1_pd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 472 | double __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 473 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 474 | double __u = ((struct __mm_load1_pd_struct*)__dp)->__u; |
| 475 | return (__m128d){ __u, __u }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 476 | } |
| 477 | |
| 478 | #define _mm_load_pd1(dp) _mm_load1_pd(dp) |
| 479 | |
| 480 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 481 | _mm_loadr_pd(double const *__dp) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 482 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 483 | __m128d __u = *(__m128d*)__dp; |
| 484 | return __builtin_shufflevector(__u, __u, 1, 0); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 485 | } |
| 486 | |
| 487 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 488 | _mm_loadu_pd(double const *__dp) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 489 | { |
| 490 | struct __loadu_pd { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 491 | __m128d __v; |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 492 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 493 | return ((struct __loadu_pd*)__dp)->__v; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 494 | } |
| 495 | |
| 496 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 497 | _mm_load_sd(double const *__dp) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 498 | { |
| 499 | struct __mm_load_sd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 500 | double __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 501 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 502 | double __u = ((struct __mm_load_sd_struct*)__dp)->__u; |
| 503 | return (__m128d){ __u, 0 }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 504 | } |
| 505 | |
| 506 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 507 | _mm_loadh_pd(__m128d __a, double const *__dp) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 508 | { |
| 509 | struct __mm_loadh_pd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 510 | double __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 511 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 512 | double __u = ((struct __mm_loadh_pd_struct*)__dp)->__u; |
| 513 | return (__m128d){ __a[0], __u }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 514 | } |
| 515 | |
| 516 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 517 | _mm_loadl_pd(__m128d __a, double const *__dp) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 518 | { |
| 519 | struct __mm_loadl_pd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 520 | double __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 521 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 522 | double __u = ((struct __mm_loadl_pd_struct*)__dp)->__u; |
| 523 | return (__m128d){ __u, __a[1] }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 524 | } |
| 525 | |
| 526 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 527 | _mm_set_sd(double __w) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 528 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 529 | return (__m128d){ __w, 0 }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 530 | } |
| 531 | |
| 532 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 533 | _mm_set1_pd(double __w) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 534 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 535 | return (__m128d){ __w, __w }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 536 | } |
| 537 | |
| 538 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 539 | _mm_set_pd(double __w, double __x) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 540 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 541 | return (__m128d){ __x, __w }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 542 | } |
| 543 | |
| 544 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 545 | _mm_setr_pd(double __w, double __x) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 546 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 547 | return (__m128d){ __w, __x }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 548 | } |
| 549 | |
| 550 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
| 551 | _mm_setzero_pd(void) |
| 552 | { |
| 553 | return (__m128d){ 0, 0 }; |
| 554 | } |
| 555 | |
| 556 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 557 | _mm_move_sd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 558 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 559 | return (__m128d){ __b[0], __a[1] }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 560 | } |
| 561 | |
| 562 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 563 | _mm_store_sd(double *__dp, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 564 | { |
| 565 | struct __mm_store_sd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 566 | double __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 567 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 568 | ((struct __mm_store_sd_struct*)__dp)->__u = __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 569 | } |
| 570 | |
| 571 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 572 | _mm_store1_pd(double *__dp, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 573 | { |
| 574 | struct __mm_store1_pd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 575 | double __u[2]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 576 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 577 | ((struct __mm_store1_pd_struct*)__dp)->__u[0] = __a[0]; |
| 578 | ((struct __mm_store1_pd_struct*)__dp)->__u[1] = __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 579 | } |
| 580 | |
| 581 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 582 | _mm_store_pd(double *__dp, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 583 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 584 | *(__m128d *)__dp = __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 585 | } |
| 586 | |
| 587 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 588 | _mm_storeu_pd(double *__dp, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 589 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 590 | __builtin_ia32_storeupd(__dp, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 591 | } |
| 592 | |
| 593 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 594 | _mm_storer_pd(double *__dp, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 595 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 596 | __a = __builtin_shufflevector(__a, __a, 1, 0); |
| 597 | *(__m128d *)__dp = __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 598 | } |
| 599 | |
| 600 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 601 | _mm_storeh_pd(double *__dp, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 602 | { |
| 603 | struct __mm_storeh_pd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 604 | double __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 605 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 606 | ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[1]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 607 | } |
| 608 | |
| 609 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 610 | _mm_storel_pd(double *__dp, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 611 | { |
| 612 | struct __mm_storeh_pd_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 613 | double __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 614 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 615 | ((struct __mm_storeh_pd_struct*)__dp)->__u = __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 616 | } |
| 617 | |
| 618 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 619 | _mm_add_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 620 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 621 | return (__m128i)((__v16qi)__a + (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 622 | } |
| 623 | |
| 624 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 625 | _mm_add_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 626 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 627 | return (__m128i)((__v8hi)__a + (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 628 | } |
| 629 | |
| 630 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 631 | _mm_add_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 632 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 633 | return (__m128i)((__v4si)__a + (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 634 | } |
| 635 | |
| 636 | static __inline__ __m64 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 637 | _mm_add_si64(__m64 __a, __m64 __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 638 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 639 | return __a + __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 640 | } |
| 641 | |
| 642 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 643 | _mm_add_epi64(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 644 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 645 | return __a + __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 646 | } |
| 647 | |
| 648 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 649 | _mm_adds_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 650 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 651 | return (__m128i)__builtin_ia32_paddsb128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 652 | } |
| 653 | |
| 654 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 655 | _mm_adds_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 656 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 657 | return (__m128i)__builtin_ia32_paddsw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 658 | } |
| 659 | |
| 660 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 661 | _mm_adds_epu8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 662 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 663 | return (__m128i)__builtin_ia32_paddusb128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 664 | } |
| 665 | |
| 666 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 667 | _mm_adds_epu16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 668 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 669 | return (__m128i)__builtin_ia32_paddusw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 670 | } |
| 671 | |
| 672 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 673 | _mm_avg_epu8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 674 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 675 | return (__m128i)__builtin_ia32_pavgb128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 676 | } |
| 677 | |
| 678 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 679 | _mm_avg_epu16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 680 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 681 | return (__m128i)__builtin_ia32_pavgw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 682 | } |
| 683 | |
| 684 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 685 | _mm_madd_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 686 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 687 | return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 688 | } |
| 689 | |
| 690 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 691 | _mm_max_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 692 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 693 | return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 694 | } |
| 695 | |
| 696 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 697 | _mm_max_epu8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 698 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 699 | return (__m128i)__builtin_ia32_pmaxub128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 700 | } |
| 701 | |
| 702 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 703 | _mm_min_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 704 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 705 | return (__m128i)__builtin_ia32_pminsw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 706 | } |
| 707 | |
| 708 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 709 | _mm_min_epu8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 710 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 711 | return (__m128i)__builtin_ia32_pminub128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 712 | } |
| 713 | |
| 714 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 715 | _mm_mulhi_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 716 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 717 | return (__m128i)__builtin_ia32_pmulhw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 718 | } |
| 719 | |
| 720 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 721 | _mm_mulhi_epu16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 722 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 723 | return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 724 | } |
| 725 | |
| 726 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 727 | _mm_mullo_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 728 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 729 | return (__m128i)((__v8hi)__a * (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 730 | } |
| 731 | |
| 732 | static __inline__ __m64 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 733 | _mm_mul_su32(__m64 __a, __m64 __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 734 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 735 | return __builtin_ia32_pmuludq((__v2si)__a, (__v2si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 736 | } |
| 737 | |
| 738 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 739 | _mm_mul_epu32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 740 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 741 | return __builtin_ia32_pmuludq128((__v4si)__a, (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 742 | } |
| 743 | |
| 744 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 745 | _mm_sad_epu8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 746 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 747 | return __builtin_ia32_psadbw128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 748 | } |
| 749 | |
| 750 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 751 | _mm_sub_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 752 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 753 | return (__m128i)((__v16qi)__a - (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 754 | } |
| 755 | |
| 756 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 757 | _mm_sub_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 758 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 759 | return (__m128i)((__v8hi)__a - (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 760 | } |
| 761 | |
| 762 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 763 | _mm_sub_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 764 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 765 | return (__m128i)((__v4si)__a - (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 766 | } |
| 767 | |
| 768 | static __inline__ __m64 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 769 | _mm_sub_si64(__m64 __a, __m64 __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 770 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 771 | return __a - __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 772 | } |
| 773 | |
| 774 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 775 | _mm_sub_epi64(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 776 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 777 | return __a - __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 778 | } |
| 779 | |
| 780 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 781 | _mm_subs_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 782 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 783 | return (__m128i)__builtin_ia32_psubsb128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 784 | } |
| 785 | |
| 786 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 787 | _mm_subs_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 788 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 789 | return (__m128i)__builtin_ia32_psubsw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 790 | } |
| 791 | |
| 792 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 793 | _mm_subs_epu8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 794 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 795 | return (__m128i)__builtin_ia32_psubusb128((__v16qi)__a, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 796 | } |
| 797 | |
| 798 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 799 | _mm_subs_epu16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 800 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 801 | return (__m128i)__builtin_ia32_psubusw128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 802 | } |
| 803 | |
| 804 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 805 | _mm_and_si128(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 806 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 807 | return __a & __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 808 | } |
| 809 | |
| 810 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 811 | _mm_andnot_si128(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 812 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 813 | return ~__a & __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 814 | } |
| 815 | |
| 816 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 817 | _mm_or_si128(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 818 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 819 | return __a | __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 820 | } |
| 821 | |
| 822 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 823 | _mm_xor_si128(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 824 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 825 | return __a ^ __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 826 | } |
| 827 | |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 828 | #define _mm_slli_si128(a, imm) __extension__ ({ \ |
| 829 | (__m128i)__builtin_shufflevector((__v16qi)_mm_setzero_si128(), \ |
| 830 | (__v16qi)(__m128i)(a), \ |
| 831 | ((imm)&0xF0) ? 0 : 16 - ((imm)&0xF), \ |
| 832 | ((imm)&0xF0) ? 0 : 17 - ((imm)&0xF), \ |
| 833 | ((imm)&0xF0) ? 0 : 18 - ((imm)&0xF), \ |
| 834 | ((imm)&0xF0) ? 0 : 19 - ((imm)&0xF), \ |
| 835 | ((imm)&0xF0) ? 0 : 20 - ((imm)&0xF), \ |
| 836 | ((imm)&0xF0) ? 0 : 21 - ((imm)&0xF), \ |
| 837 | ((imm)&0xF0) ? 0 : 22 - ((imm)&0xF), \ |
| 838 | ((imm)&0xF0) ? 0 : 23 - ((imm)&0xF), \ |
| 839 | ((imm)&0xF0) ? 0 : 24 - ((imm)&0xF), \ |
| 840 | ((imm)&0xF0) ? 0 : 25 - ((imm)&0xF), \ |
| 841 | ((imm)&0xF0) ? 0 : 26 - ((imm)&0xF), \ |
| 842 | ((imm)&0xF0) ? 0 : 27 - ((imm)&0xF), \ |
| 843 | ((imm)&0xF0) ? 0 : 28 - ((imm)&0xF), \ |
| 844 | ((imm)&0xF0) ? 0 : 29 - ((imm)&0xF), \ |
| 845 | ((imm)&0xF0) ? 0 : 30 - ((imm)&0xF), \ |
| 846 | ((imm)&0xF0) ? 0 : 31 - ((imm)&0xF)); }) |
| 847 | |
| 848 | #define _mm_bslli_si128(a, imm) \ |
| 849 | _mm_slli_si128((a), (imm)) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 850 | |
| 851 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 852 | _mm_slli_epi16(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 853 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 854 | return (__m128i)__builtin_ia32_psllwi128((__v8hi)__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 855 | } |
| 856 | |
| 857 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 858 | _mm_sll_epi16(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 859 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 860 | return (__m128i)__builtin_ia32_psllw128((__v8hi)__a, (__v8hi)__count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 861 | } |
| 862 | |
| 863 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 864 | _mm_slli_epi32(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 865 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 866 | return (__m128i)__builtin_ia32_pslldi128((__v4si)__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 867 | } |
| 868 | |
| 869 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 870 | _mm_sll_epi32(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 871 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 872 | return (__m128i)__builtin_ia32_pslld128((__v4si)__a, (__v4si)__count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 873 | } |
| 874 | |
| 875 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 876 | _mm_slli_epi64(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 877 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 878 | return __builtin_ia32_psllqi128(__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 879 | } |
| 880 | |
| 881 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 882 | _mm_sll_epi64(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 883 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 884 | return __builtin_ia32_psllq128(__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 885 | } |
| 886 | |
| 887 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 888 | _mm_srai_epi16(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 889 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 890 | return (__m128i)__builtin_ia32_psrawi128((__v8hi)__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 891 | } |
| 892 | |
| 893 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 894 | _mm_sra_epi16(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 895 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 896 | return (__m128i)__builtin_ia32_psraw128((__v8hi)__a, (__v8hi)__count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 897 | } |
| 898 | |
| 899 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 900 | _mm_srai_epi32(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 901 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 902 | return (__m128i)__builtin_ia32_psradi128((__v4si)__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 903 | } |
| 904 | |
| 905 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 906 | _mm_sra_epi32(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 907 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 908 | return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 909 | } |
| 910 | |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 911 | #define _mm_srli_si128(a, imm) __extension__ ({ \ |
| 912 | (__m128i)__builtin_shufflevector((__v16qi)(__m128i)(a), \ |
| 913 | (__v16qi)_mm_setzero_si128(), \ |
| 914 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 0, \ |
| 915 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 1, \ |
| 916 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 2, \ |
| 917 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 3, \ |
| 918 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 4, \ |
| 919 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 5, \ |
| 920 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 6, \ |
| 921 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 7, \ |
| 922 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 8, \ |
| 923 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 9, \ |
| 924 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 10, \ |
| 925 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 11, \ |
| 926 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 12, \ |
| 927 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 13, \ |
| 928 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 14, \ |
| 929 | ((imm)&0xF0) ? 16 : ((imm)&0xF) + 15); }) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 930 | |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 931 | #define _mm_bsrli_si128(a, imm) \ |
| 932 | _mm_srli_si128((a), (imm)) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 933 | |
| 934 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 935 | _mm_srli_epi16(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 936 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 937 | return (__m128i)__builtin_ia32_psrlwi128((__v8hi)__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 938 | } |
| 939 | |
| 940 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 941 | _mm_srl_epi16(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 942 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 943 | return (__m128i)__builtin_ia32_psrlw128((__v8hi)__a, (__v8hi)__count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 944 | } |
| 945 | |
| 946 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 947 | _mm_srli_epi32(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 948 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 949 | return (__m128i)__builtin_ia32_psrldi128((__v4si)__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 950 | } |
| 951 | |
| 952 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 953 | _mm_srl_epi32(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 954 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 955 | return (__m128i)__builtin_ia32_psrld128((__v4si)__a, (__v4si)__count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 956 | } |
| 957 | |
| 958 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 959 | _mm_srli_epi64(__m128i __a, int __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 960 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 961 | return __builtin_ia32_psrlqi128(__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 962 | } |
| 963 | |
| 964 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 965 | _mm_srl_epi64(__m128i __a, __m128i __count) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 966 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 967 | return __builtin_ia32_psrlq128(__a, __count); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 968 | } |
| 969 | |
| 970 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 971 | _mm_cmpeq_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 972 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 973 | return (__m128i)((__v16qi)__a == (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 974 | } |
| 975 | |
| 976 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 977 | _mm_cmpeq_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 978 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 979 | return (__m128i)((__v8hi)__a == (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 980 | } |
| 981 | |
| 982 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 983 | _mm_cmpeq_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 984 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 985 | return (__m128i)((__v4si)__a == (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 986 | } |
| 987 | |
| 988 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 989 | _mm_cmpgt_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 990 | { |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 991 | /* This function always performs a signed comparison, but __v16qi is a char |
| 992 | which may be signed or unsigned. */ |
| 993 | typedef signed char __v16qs __attribute__((__vector_size__(16))); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 994 | return (__m128i)((__v16qs)__a > (__v16qs)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 995 | } |
| 996 | |
| 997 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 998 | _mm_cmpgt_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 999 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1000 | return (__m128i)((__v8hi)__a > (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1001 | } |
| 1002 | |
| 1003 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1004 | _mm_cmpgt_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1005 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1006 | return (__m128i)((__v4si)__a > (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1007 | } |
| 1008 | |
| 1009 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1010 | _mm_cmplt_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1011 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1012 | return _mm_cmpgt_epi8(__b, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1013 | } |
| 1014 | |
| 1015 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1016 | _mm_cmplt_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1017 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1018 | return _mm_cmpgt_epi16(__b, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1019 | } |
| 1020 | |
| 1021 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1022 | _mm_cmplt_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1023 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1024 | return _mm_cmpgt_epi32(__b, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1025 | } |
| 1026 | |
| 1027 | #ifdef __x86_64__ |
| 1028 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1029 | _mm_cvtsi64_sd(__m128d __a, long long __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1030 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1031 | __a[0] = __b; |
| 1032 | return __a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1033 | } |
| 1034 | |
| 1035 | static __inline__ long long __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1036 | _mm_cvtsd_si64(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1037 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1038 | return __builtin_ia32_cvtsd2si64(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1039 | } |
| 1040 | |
| 1041 | static __inline__ long long __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1042 | _mm_cvttsd_si64(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1043 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1044 | return __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1045 | } |
| 1046 | #endif |
| 1047 | |
| 1048 | static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1049 | _mm_cvtepi32_ps(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1050 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1051 | return __builtin_ia32_cvtdq2ps((__v4si)__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1052 | } |
| 1053 | |
| 1054 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1055 | _mm_cvtps_epi32(__m128 __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1056 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1057 | return (__m128i)__builtin_ia32_cvtps2dq(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1058 | } |
| 1059 | |
| 1060 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1061 | _mm_cvttps_epi32(__m128 __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1062 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1063 | return (__m128i)__builtin_ia32_cvttps2dq(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1064 | } |
| 1065 | |
| 1066 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1067 | _mm_cvtsi32_si128(int __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1068 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1069 | return (__m128i)(__v4si){ __a, 0, 0, 0 }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1070 | } |
| 1071 | |
| 1072 | #ifdef __x86_64__ |
| 1073 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1074 | _mm_cvtsi64_si128(long long __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1075 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1076 | return (__m128i){ __a, 0 }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1077 | } |
| 1078 | #endif |
| 1079 | |
| 1080 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1081 | _mm_cvtsi128_si32(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1082 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1083 | __v4si __b = (__v4si)__a; |
| 1084 | return __b[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1085 | } |
| 1086 | |
| 1087 | #ifdef __x86_64__ |
| 1088 | static __inline__ long long __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1089 | _mm_cvtsi128_si64(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1090 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1091 | return __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1092 | } |
| 1093 | #endif |
| 1094 | |
| 1095 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1096 | _mm_load_si128(__m128i const *__p) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1097 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1098 | return *__p; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1099 | } |
| 1100 | |
| 1101 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1102 | _mm_loadu_si128(__m128i const *__p) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1103 | { |
| 1104 | struct __loadu_si128 { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1105 | __m128i __v; |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 1106 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1107 | return ((struct __loadu_si128*)__p)->__v; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1108 | } |
| 1109 | |
| 1110 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1111 | _mm_loadl_epi64(__m128i const *__p) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1112 | { |
| 1113 | struct __mm_loadl_epi64_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1114 | long long __u; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1115 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1116 | return (__m128i) { ((struct __mm_loadl_epi64_struct*)__p)->__u, 0}; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1117 | } |
| 1118 | |
| 1119 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1120 | _mm_set_epi64x(long long q1, long long q0) |
| 1121 | { |
| 1122 | return (__m128i){ q0, q1 }; |
| 1123 | } |
| 1124 | |
| 1125 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1126 | _mm_set_epi64(__m64 q1, __m64 q0) |
| 1127 | { |
| 1128 | return (__m128i){ (long long)q0, (long long)q1 }; |
| 1129 | } |
| 1130 | |
| 1131 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1132 | _mm_set_epi32(int i3, int i2, int i1, int i0) |
| 1133 | { |
| 1134 | return (__m128i)(__v4si){ i0, i1, i2, i3}; |
| 1135 | } |
| 1136 | |
| 1137 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1138 | _mm_set_epi16(short w7, short w6, short w5, short w4, short w3, short w2, short w1, short w0) |
| 1139 | { |
| 1140 | return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 }; |
| 1141 | } |
| 1142 | |
| 1143 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1144 | _mm_set_epi8(char b15, char b14, char b13, char b12, char b11, char b10, char b9, char b8, char b7, char b6, char b5, char b4, char b3, char b2, char b1, char b0) |
| 1145 | { |
| 1146 | return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 }; |
| 1147 | } |
| 1148 | |
| 1149 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1150 | _mm_set1_epi64x(long long __q) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1151 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1152 | return (__m128i){ __q, __q }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1153 | } |
| 1154 | |
| 1155 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1156 | _mm_set1_epi64(__m64 __q) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1157 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1158 | return (__m128i){ (long long)__q, (long long)__q }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1159 | } |
| 1160 | |
| 1161 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1162 | _mm_set1_epi32(int __i) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1163 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1164 | return (__m128i)(__v4si){ __i, __i, __i, __i }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1165 | } |
| 1166 | |
| 1167 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1168 | _mm_set1_epi16(short __w) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1169 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1170 | return (__m128i)(__v8hi){ __w, __w, __w, __w, __w, __w, __w, __w }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1171 | } |
| 1172 | |
| 1173 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1174 | _mm_set1_epi8(char __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1175 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1176 | return (__m128i)(__v16qi){ __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1177 | } |
| 1178 | |
| 1179 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1180 | _mm_setr_epi64(__m64 q0, __m64 q1) |
| 1181 | { |
| 1182 | return (__m128i){ (long long)q0, (long long)q1 }; |
| 1183 | } |
| 1184 | |
| 1185 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1186 | _mm_setr_epi32(int i0, int i1, int i2, int i3) |
| 1187 | { |
| 1188 | return (__m128i)(__v4si){ i0, i1, i2, i3}; |
| 1189 | } |
| 1190 | |
| 1191 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1192 | _mm_setr_epi16(short w0, short w1, short w2, short w3, short w4, short w5, short w6, short w7) |
| 1193 | { |
| 1194 | return (__m128i)(__v8hi){ w0, w1, w2, w3, w4, w5, w6, w7 }; |
| 1195 | } |
| 1196 | |
| 1197 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1198 | _mm_setr_epi8(char b0, char b1, char b2, char b3, char b4, char b5, char b6, char b7, char b8, char b9, char b10, char b11, char b12, char b13, char b14, char b15) |
| 1199 | { |
| 1200 | return (__m128i)(__v16qi){ b0, b1, b2, b3, b4, b5, b6, b7, b8, b9, b10, b11, b12, b13, b14, b15 }; |
| 1201 | } |
| 1202 | |
| 1203 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
| 1204 | _mm_setzero_si128(void) |
| 1205 | { |
| 1206 | return (__m128i){ 0LL, 0LL }; |
| 1207 | } |
| 1208 | |
| 1209 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1210 | _mm_store_si128(__m128i *__p, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1211 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1212 | *__p = __b; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1213 | } |
| 1214 | |
| 1215 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1216 | _mm_storeu_si128(__m128i *__p, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1217 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1218 | __builtin_ia32_storedqu((char *)__p, (__v16qi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1219 | } |
| 1220 | |
| 1221 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1222 | _mm_maskmoveu_si128(__m128i __d, __m128i __n, char *__p) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1223 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1224 | __builtin_ia32_maskmovdqu((__v16qi)__d, (__v16qi)__n, __p); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1225 | } |
| 1226 | |
| 1227 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1228 | _mm_storel_epi64(__m128i *__p, __m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1229 | { |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1230 | struct __mm_storel_epi64_struct { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1231 | long long __u; |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1232 | } __attribute__((__packed__, __may_alias__)); |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1233 | ((struct __mm_storel_epi64_struct*)__p)->__u = __a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1234 | } |
| 1235 | |
| 1236 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1237 | _mm_stream_pd(double *__p, __m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1238 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1239 | __builtin_ia32_movntpd(__p, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1240 | } |
| 1241 | |
| 1242 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1243 | _mm_stream_si128(__m128i *__p, __m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1244 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1245 | __builtin_ia32_movntdq(__p, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1246 | } |
| 1247 | |
| 1248 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1249 | _mm_stream_si32(int *__p, int __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1250 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1251 | __builtin_ia32_movnti(__p, __a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1252 | } |
| 1253 | |
Stephen Hines | 73a7658 | 2014-02-13 02:55:05 -0800 | [diff] [blame] | 1254 | #ifdef __x86_64__ |
| 1255 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
| 1256 | _mm_stream_si64(long long *__p, long long __a) |
| 1257 | { |
| 1258 | __builtin_ia32_movnti64(__p, __a); |
| 1259 | } |
| 1260 | #endif |
| 1261 | |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1262 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1263 | _mm_clflush(void const *__p) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1264 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1265 | __builtin_ia32_clflush(__p); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1266 | } |
| 1267 | |
| 1268 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
| 1269 | _mm_lfence(void) |
| 1270 | { |
| 1271 | __builtin_ia32_lfence(); |
| 1272 | } |
| 1273 | |
| 1274 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
| 1275 | _mm_mfence(void) |
| 1276 | { |
| 1277 | __builtin_ia32_mfence(); |
| 1278 | } |
| 1279 | |
| 1280 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1281 | _mm_packs_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1282 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1283 | return (__m128i)__builtin_ia32_packsswb128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1284 | } |
| 1285 | |
| 1286 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1287 | _mm_packs_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1288 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1289 | return (__m128i)__builtin_ia32_packssdw128((__v4si)__a, (__v4si)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1290 | } |
| 1291 | |
| 1292 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1293 | _mm_packus_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1294 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1295 | return (__m128i)__builtin_ia32_packuswb128((__v8hi)__a, (__v8hi)__b); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1296 | } |
| 1297 | |
| 1298 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1299 | _mm_extract_epi16(__m128i __a, int __imm) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1300 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1301 | __v8hi __b = (__v8hi)__a; |
Stephen Hines | 73a7658 | 2014-02-13 02:55:05 -0800 | [diff] [blame] | 1302 | return (unsigned short)__b[__imm & 7]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1303 | } |
| 1304 | |
| 1305 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1306 | _mm_insert_epi16(__m128i __a, int __b, int __imm) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1307 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1308 | __v8hi __c = (__v8hi)__a; |
| 1309 | __c[__imm & 7] = __b; |
| 1310 | return (__m128i)__c; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1311 | } |
| 1312 | |
| 1313 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1314 | _mm_movemask_epi8(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1315 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1316 | return __builtin_ia32_pmovmskb128((__v16qi)__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1317 | } |
| 1318 | |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1319 | #define _mm_shuffle_epi32(a, imm) __extension__ ({ \ |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 1320 | (__m128i)__builtin_shufflevector((__v4si)(__m128i)(a), \ |
| 1321 | (__v4si)_mm_set1_epi32(0), \ |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1322 | (imm) & 0x3, ((imm) & 0xc) >> 2, \ |
| 1323 | ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6); }) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1324 | |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1325 | #define _mm_shufflelo_epi16(a, imm) __extension__ ({ \ |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 1326 | (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \ |
| 1327 | (__v8hi)_mm_set1_epi16(0), \ |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1328 | (imm) & 0x3, ((imm) & 0xc) >> 2, \ |
| 1329 | ((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \ |
| 1330 | 4, 5, 6, 7); }) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1331 | |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1332 | #define _mm_shufflehi_epi16(a, imm) __extension__ ({ \ |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 1333 | (__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \ |
| 1334 | (__v8hi)_mm_set1_epi16(0), \ |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1335 | 0, 1, 2, 3, \ |
| 1336 | 4 + (((imm) & 0x03) >> 0), \ |
| 1337 | 4 + (((imm) & 0x0c) >> 2), \ |
| 1338 | 4 + (((imm) & 0x30) >> 4), \ |
| 1339 | 4 + (((imm) & 0xc0) >> 6)); }) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1340 | |
| 1341 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1342 | _mm_unpackhi_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1343 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1344 | return (__m128i)__builtin_shufflevector((__v16qi)__a, (__v16qi)__b, 8, 16+8, 9, 16+9, 10, 16+10, 11, 16+11, 12, 16+12, 13, 16+13, 14, 16+14, 15, 16+15); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1345 | } |
| 1346 | |
| 1347 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1348 | _mm_unpackhi_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1349 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1350 | return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1351 | } |
| 1352 | |
| 1353 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1354 | _mm_unpackhi_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1355 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1356 | return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 2, 4+2, 3, 4+3); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1357 | } |
| 1358 | |
| 1359 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1360 | _mm_unpackhi_epi64(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1361 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1362 | return (__m128i)__builtin_shufflevector(__a, __b, 1, 2+1); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1363 | } |
| 1364 | |
| 1365 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1366 | _mm_unpacklo_epi8(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1367 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1368 | return (__m128i)__builtin_shufflevector((__v16qi)__a, (__v16qi)__b, 0, 16+0, 1, 16+1, 2, 16+2, 3, 16+3, 4, 16+4, 5, 16+5, 6, 16+6, 7, 16+7); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1369 | } |
| 1370 | |
| 1371 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1372 | _mm_unpacklo_epi16(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1373 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1374 | return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1375 | } |
| 1376 | |
| 1377 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1378 | _mm_unpacklo_epi32(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1379 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1380 | return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 0, 4+0, 1, 4+1); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1381 | } |
| 1382 | |
| 1383 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1384 | _mm_unpacklo_epi64(__m128i __a, __m128i __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1385 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1386 | return (__m128i)__builtin_shufflevector(__a, __b, 0, 2+0); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1387 | } |
| 1388 | |
| 1389 | static __inline__ __m64 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1390 | _mm_movepi64_pi64(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1391 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1392 | return (__m64)__a[0]; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1393 | } |
| 1394 | |
| 1395 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | 73a7658 | 2014-02-13 02:55:05 -0800 | [diff] [blame] | 1396 | _mm_movpi64_epi64(__m64 __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1397 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1398 | return (__m128i){ (long long)__a, 0 }; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1399 | } |
| 1400 | |
| 1401 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1402 | _mm_move_epi64(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1403 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1404 | return __builtin_shufflevector(__a, (__m128i){ 0 }, 0, 2); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1405 | } |
| 1406 | |
| 1407 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1408 | _mm_unpackhi_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1409 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1410 | return __builtin_shufflevector(__a, __b, 1, 2+1); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1411 | } |
| 1412 | |
| 1413 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1414 | _mm_unpacklo_pd(__m128d __a, __m128d __b) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1415 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1416 | return __builtin_shufflevector(__a, __b, 0, 2+0); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1417 | } |
| 1418 | |
| 1419 | static __inline__ int __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1420 | _mm_movemask_pd(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1421 | { |
Stephen Hines | c6ee7df | 2013-04-02 18:41:57 -0700 | [diff] [blame] | 1422 | return __builtin_ia32_movmskpd(__a); |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1423 | } |
| 1424 | |
Ying Wang | 6099914 | 2013-01-07 13:59:36 -0800 | [diff] [blame] | 1425 | #define _mm_shuffle_pd(a, b, i) __extension__ ({ \ |
Stephen Hines | b4d9c8b | 2015-03-30 16:04:04 -0700 | [diff] [blame] | 1426 | __builtin_shufflevector((__m128d)(a), (__m128d)(b), \ |
| 1427 | (i) & 1, (((i) & 2) >> 1) + 2); }) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1428 | |
| 1429 | static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1430 | _mm_castpd_ps(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1431 | { |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1432 | return (__m128)__a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1433 | } |
| 1434 | |
| 1435 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1436 | _mm_castpd_si128(__m128d __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1437 | { |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1438 | return (__m128i)__a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1439 | } |
| 1440 | |
| 1441 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1442 | _mm_castps_pd(__m128 __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1443 | { |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1444 | return (__m128d)__a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1445 | } |
| 1446 | |
| 1447 | static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1448 | _mm_castps_si128(__m128 __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1449 | { |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1450 | return (__m128i)__a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1451 | } |
| 1452 | |
| 1453 | static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1454 | _mm_castsi128_ps(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1455 | { |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1456 | return (__m128)__a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1457 | } |
| 1458 | |
| 1459 | static __inline__ __m128d __attribute__((__always_inline__, __nodebug__)) |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1460 | _mm_castsi128_pd(__m128i __a) |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1461 | { |
Stephen Hines | 996e4dc | 2013-08-13 01:04:14 -0700 | [diff] [blame] | 1462 | return (__m128d)__a; |
Ying Wang | a672014 | 2011-12-20 14:43:20 -0800 | [diff] [blame] | 1463 | } |
| 1464 | |
| 1465 | static __inline__ void __attribute__((__always_inline__, __nodebug__)) |
| 1466 | _mm_pause(void) |
| 1467 | { |
| 1468 | __asm__ volatile ("pause"); |
| 1469 | } |
| 1470 | |
| 1471 | #define _MM_SHUFFLE2(x, y) (((x) << 1) | (y)) |
| 1472 | |
| 1473 | #endif /* __SSE2__ */ |
| 1474 | |
| 1475 | #endif /* __EMMINTRIN_H */ |