2010-08-21 00:47:17 +08:00
|
|
|
/*===---- emmintrin.h - SSE2 intrinsics ------------------------------------===
|
2008-12-24 09:45:22 +08:00
|
|
|
*
|
|
|
|
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
|
|
* of this software and associated documentation files (the "Software"), to deal
|
|
|
|
* in the Software without restriction, including without limitation the rights
|
|
|
|
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
|
|
* copies of the Software, and to permit persons to whom the Software is
|
|
|
|
* furnished to do so, subject to the following conditions:
|
|
|
|
*
|
|
|
|
* The above copyright notice and this permission notice shall be included in
|
|
|
|
* all copies or substantial portions of the Software.
|
|
|
|
*
|
|
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
|
|
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
|
|
* THE SOFTWARE.
|
|
|
|
*
|
|
|
|
*===-----------------------------------------------------------------------===
|
|
|
|
*/
|
2010-08-21 00:47:17 +08:00
|
|
|
|
2008-12-24 09:45:22 +08:00
|
|
|
#ifndef __EMMINTRIN_H
|
|
|
|
#define __EMMINTRIN_H
|
|
|
|
|
|
|
|
#include <xmmintrin.h>
|
|
|
|
|
|
|
|
typedef double __m128d __attribute__((__vector_size__(16)));
|
|
|
|
typedef long long __m128i __attribute__((__vector_size__(16)));
|
|
|
|
|
2010-08-26 10:09:25 +08:00
|
|
|
/* Type defines. */
|
|
|
|
typedef double __v2df __attribute__ ((__vector_size__ (16)));
|
|
|
|
typedef long long __v2di __attribute__ ((__vector_size__ (16)));
|
2008-12-24 10:41:00 +08:00
|
|
|
typedef short __v8hi __attribute__((__vector_size__(16)));
|
2009-09-19 03:18:19 +08:00
|
|
|
typedef char __v16qi __attribute__((__vector_size__(16)));
|
2008-12-24 09:45:22 +08:00
|
|
|
|
Fix the SSE4 byte sign extension in a cleaner way, and more thoroughly
test that our intrinsics behave the same under -fsigned-char and
-funsigned-char.
This further testing uncovered that AVX-2 has a broken cmpgt for 8-bit
elements, and has for a long time. This is fixed in the same way as
SSE4 handles the case.
The other ISA extensions currently work correctly because they use
specific instruction intrinsics. As soon as they are rewritten in terms
of generic IR, they will need to add these special casts. I've added the
necessary testing to catch this however, so we shouldn't have to chase
it down again.
I considered changing the core typedef to be signed, but that seems like
a bad idea. Notably, it would be an ABI break if anyone is reaching into
the innards of the intrinsic headers and passing __v16qi on an API
boundary. I can't be completely confident that this wouldn't happen due
to a macro expanding in a lambda, etc., so it seems much better to leave
it alone. It also matches GCC's behavior exactly.
A fun side note is that for both GCC and Clang, -funsigned-char really
does change the semantics of __v16qi. To observe this, consider:
% cat x.cc
#include <smmintrin.h>
#include <iostream>
int main() {
__v16qi a = { 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
__v16qi b = _mm_set1_epi8(-1);
std::cout << (int)(a / b)[0] << ", " << (int)(a / b)[1] << '\n';
}
% clang++ -o x x.cc && ./x
-1, 1
% clang++ -funsigned-char -o x x.cc && ./x
0, 1
However, while this may be surprising, both Clang and GCC agree.
Differential Revision: http://reviews.llvm.org/D13324
llvm-svn: 249097
2015-10-02 07:40:12 +08:00
|
|
|
/* We need an explicitly signed variant for char. Note that this shouldn't
|
|
|
|
* appear in the interface though. */
|
|
|
|
typedef signed char __v16qs __attribute__((__vector_size__(16)));
|
|
|
|
|
2015-09-21 21:34:47 +08:00
|
|
|
#include <f16cintrin.h>
|
|
|
|
|
2015-06-17 15:09:20 +08:00
|
|
|
/* Define the default attributes for the functions in this file. */
|
2015-06-30 21:36:19 +08:00
|
|
|
#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("sse2")))
|
2015-06-17 15:09:20 +08:00
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_add_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] += __b[0];
|
|
|
|
return __a;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_add_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a + __b;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sub_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] -= __b[0];
|
|
|
|
return __a;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sub_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a - __b;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_mul_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] *= __b[0];
|
|
|
|
return __a;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_mul_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a * __b;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_div_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] /= __b[0];
|
|
|
|
return __a;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_div_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a / __b;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sqrt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__m128d __c = __builtin_ia32_sqrtsd(__b);
|
|
|
|
return (__m128d) { __c[0], __a[1] };
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sqrt_pd(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_sqrtpd(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_min_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_minsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_min_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_minpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_max_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_maxsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_max_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_maxpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_and_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d)((__v4si)__a & (__v4si)__b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_andnot_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d)(~(__v4si)__a & (__v4si)__b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_or_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d)((__v4si)__a | (__v4si)__b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_xor_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d)((__v4si)__a ^ (__v4si)__b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpeq_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpeqpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmplt_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpltpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmple_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmplepd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpgt_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpltpd(__b, __a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpge_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmplepd(__b, __a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpord_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpordpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpunord_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpunordpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpneq_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpneqpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpnlt_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpnltpd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpnle_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpnlepd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpngt_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpnltpd(__b, __a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpnge_pd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpnlepd(__b, __a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpeq_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpeqsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmplt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpltsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmple_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmplesd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpgt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
__m128d __c = __builtin_ia32_cmpltsd(__b, __a);
|
2013-06-18 03:42:49 +08:00
|
|
|
return (__m128d) { __c[0], __a[1] };
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpge_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
__m128d __c = __builtin_ia32_cmplesd(__b, __a);
|
2013-06-18 03:42:49 +08:00
|
|
|
return (__m128d) { __c[0], __a[1] };
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpord_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpordsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpunord_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpunordsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpneq_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpneqsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpnlt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpnltsd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpnle_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
return (__m128d)__builtin_ia32_cmpnlesd(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpngt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
__m128d __c = __builtin_ia32_cmpnltsd(__b, __a);
|
2013-06-18 03:42:49 +08:00
|
|
|
return (__m128d) { __c[0], __a[1] };
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpnge_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2014-12-27 14:59:57 +08:00
|
|
|
__m128d __c = __builtin_ia32_cmpnlesd(__b, __a);
|
2013-06-18 03:42:49 +08:00
|
|
|
return (__m128d) { __c[0], __a[1] };
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_comieq_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_comisdeq(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_comilt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_comisdlt(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_comile_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_comisdle(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_comigt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_comisdgt(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_comige_sd(__m128d __a, __m128d __b)
|
2011-10-07 04:31:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_comisdge(__a, __b);
|
2011-10-07 04:31:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_comineq_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_comisdneq(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_ucomieq_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_ucomisdeq(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_ucomilt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_ucomisdlt(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_ucomile_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_ucomisdle(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_ucomigt_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_ucomisdgt(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_ucomige_sd(__m128d __a, __m128d __b)
|
2011-08-30 05:26:24 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_ucomisdge(__a, __b);
|
2011-08-30 05:26:24 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_ucomineq_sd(__m128d __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_ucomisdneq(__a, __b);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtpd_ps(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtpd2ps(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtps_pd(__m128 __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtps2pd(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtepi32_pd(__m128i __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtdq2pd((__v4si)__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtpd_epi32(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtpd2dq(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsd_si32(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtsd2si(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsd_ss(__m128 __a, __m128d __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] = __b[0];
|
|
|
|
return __a;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsi32_sd(__m128d __a, int __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] = __b;
|
|
|
|
return __a;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtss_sd(__m128d __a, __m128 __b)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] = __b[0];
|
|
|
|
return __a;
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvttpd_epi32(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_cvttpd2dq(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvttsd_si32(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a[0];
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m64 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtpd_pi32(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m64)__builtin_ia32_cvtpd2pi(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m64 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvttpd_pi32(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m64)__builtin_ia32_cvttpd2pi(__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtpi32_pd(__m64 __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtpi2pd((__v2si)__a);
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ double __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsd_f64(__m128d __a)
|
2008-12-24 09:45:22 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a[0];
|
2008-12-24 09:45:22 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_load_pd(double const *__dp)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return *(__m128d*)__dp;
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_load1_pd(double const *__dp)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_load1_pd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u = ((struct __mm_load1_pd_struct*)__dp)->__u;
|
|
|
|
return (__m128d){ __u, __u };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2009-06-02 13:55:48 +08:00
|
|
|
#define _mm_load_pd1(dp) _mm_load1_pd(dp)
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_loadr_pd(double const *__dp)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__m128d __u = *(__m128d*)__dp;
|
|
|
|
return __builtin_shufflevector(__u, __u, 1, 0);
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_loadu_pd(double const *__dp)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-05-13 08:11:39 +08:00
|
|
|
struct __loadu_pd {
|
2013-01-17 07:08:36 +08:00
|
|
|
__m128d __v;
|
2015-02-04 08:26:10 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
return ((struct __loadu_pd*)__dp)->__v;
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_load_sd(double const *__dp)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_load_sd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u = ((struct __mm_load_sd_struct*)__dp)->__u;
|
|
|
|
return (__m128d){ __u, 0 };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_loadh_pd(__m128d __a, double const *__dp)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_loadh_pd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u = ((struct __mm_loadh_pd_struct*)__dp)->__u;
|
|
|
|
return (__m128d){ __a[0], __u };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_loadl_pd(__m128d __a, double const *__dp)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_loadl_pd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u = ((struct __mm_loadl_pd_struct*)__dp)->__u;
|
|
|
|
return (__m128d){ __u, __a[1] };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-08-27 05:17:12 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
|
|
|
_mm_undefined_pd()
|
|
|
|
{
|
|
|
|
return (__m128d)__builtin_ia32_undef128();
|
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set_sd(double __w)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d){ __w, 0 };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set1_pd(double __w)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d){ __w, __w };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set_pd(double __w, double __x)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d){ __x, __w };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_setr_pd(double __w, double __x)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d){ __w, __x };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2009-02-13 22:24:50 +08:00
|
|
|
_mm_setzero_pd(void)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
|
|
|
return (__m128d){ 0, 0 };
|
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_move_sd(__m128d __a, __m128d __b)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128d){ __b[0], __a[1] };
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_store_sd(double *__dp, __m128d __a)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_store_sd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
((struct __mm_store_sd_struct*)__dp)->__u = __a[0];
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_store1_pd(double *__dp, __m128d __a)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_store1_pd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u[2];
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
((struct __mm_store1_pd_struct*)__dp)->__u[0] = __a[0];
|
|
|
|
((struct __mm_store1_pd_struct*)__dp)->__u[1] = __a[0];
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_store_pd(double *__dp, __m128d __a)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
*(__m128d *)__dp = __a;
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_storeu_pd(double *__dp, __m128d __a)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__builtin_ia32_storeupd(__dp, __a);
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_storer_pd(double *__dp, __m128d __a)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a = __builtin_shufflevector(__a, __a, 1, 0);
|
|
|
|
*(__m128d *)__dp = __a;
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_storeh_pd(double *__dp, __m128d __a)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_storeh_pd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
((struct __mm_storeh_pd_struct*)__dp)->__u = __a[1];
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_storel_pd(double *__dp, __m128d __a)
|
2008-12-24 10:11:54 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_storeh_pd_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
double __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
((struct __mm_storeh_pd_struct*)__dp)->__u = __a[0];
|
2008-12-24 10:11:54 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_add_epi8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v16qi)__a + (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_add_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v8hi)__a + (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_add_epi32(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v4si)__a + (__v4si)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m64 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_add_si64(__m64 __a, __m64 __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2015-11-11 16:00:41 +08:00
|
|
|
return (__m64)__builtin_ia32_paddq(__a, __b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_add_epi64(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a + __b;
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_adds_epi8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_paddsb128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_adds_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_paddsw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_adds_epu8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_paddusb128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_adds_epu16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_paddusw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_avg_epu8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pavgb128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_avg_epu16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pavgw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_madd_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pmaddwd128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_max_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pmaxsw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_max_epu8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pmaxub128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_min_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pminsw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_min_epu8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pminub128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_mulhi_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pmulhw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_mulhi_epu16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pmulhuw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_mullo_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v8hi)__a * (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m64 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_mul_su32(__m64 __a, __m64 __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_pmuludq((__v2si)__a, (__v2si)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_mul_epu32(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_pmuludq128((__v4si)__a, (__v4si)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sad_epu8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_psadbw128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sub_epi8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v16qi)__a - (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sub_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v8hi)__a - (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sub_epi32(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v4si)__a - (__v4si)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m64 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sub_si64(__m64 __a, __m64 __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2015-11-11 16:00:41 +08:00
|
|
|
return (__m64)__builtin_ia32_psubq(__a, __b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sub_epi64(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a - __b;
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_subs_epi8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psubsb128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_subs_epi16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psubsw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_subs_epu8(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psubusb128((__v16qi)__a, (__v16qi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_subs_epu16(__m128i __a, __m128i __b)
|
2008-12-24 10:41:00 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psubusw128((__v8hi)__a, (__v8hi)__b);
|
2008-12-24 10:41:00 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_and_si128(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a & __b;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_andnot_si128(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return ~__a & __b;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_or_si128(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a | __b;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_xor_si128(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a ^ __b;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-02-13 14:04:43 +08:00
|
|
|
#define _mm_slli_si128(a, imm) __extension__ ({ \
|
|
|
|
(__m128i)__builtin_shufflevector((__v16qi)_mm_setzero_si128(), \
|
|
|
|
(__v16qi)(__m128i)(a), \
|
|
|
|
((imm)&0xF0) ? 0 : 16 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 17 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 18 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 19 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 20 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 21 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 22 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 23 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 24 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 25 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 26 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 27 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 28 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 29 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 30 - ((imm)&0xF), \
|
|
|
|
((imm)&0xF0) ? 0 : 31 - ((imm)&0xF)); })
|
2008-12-26 07:48:58 +08:00
|
|
|
|
2015-02-13 14:04:45 +08:00
|
|
|
#define _mm_bslli_si128(a, imm) \
|
|
|
|
_mm_slli_si128((a), (imm))
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_slli_epi16(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psllwi128((__v8hi)__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sll_epi16(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psllw128((__v8hi)__a, (__v8hi)__count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_slli_epi32(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pslldi128((__v4si)__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sll_epi32(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_pslld128((__v4si)__a, (__v4si)__count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_slli_epi64(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_psllqi128(__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sll_epi64(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_psllq128(__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srai_epi16(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psrawi128((__v8hi)__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sra_epi16(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psraw128((__v8hi)__a, (__v8hi)__count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srai_epi32(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psradi128((__v4si)__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_sra_epi32(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psrad128((__v4si)__a, (__v4si)__count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-02-13 14:04:43 +08:00
|
|
|
#define _mm_srli_si128(a, imm) __extension__ ({ \
|
|
|
|
(__m128i)__builtin_shufflevector((__v16qi)(__m128i)(a), \
|
|
|
|
(__v16qi)_mm_setzero_si128(), \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 0, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 1, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 2, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 3, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 4, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 5, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 6, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 7, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 8, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 9, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 10, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 11, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 12, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 13, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 14, \
|
|
|
|
((imm)&0xF0) ? 16 : ((imm)&0xF) + 15); })
|
2008-12-26 07:48:58 +08:00
|
|
|
|
2015-02-13 14:04:45 +08:00
|
|
|
#define _mm_bsrli_si128(a, imm) \
|
|
|
|
_mm_srli_si128((a), (imm))
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srli_epi16(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psrlwi128((__v8hi)__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srl_epi16(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psrlw128((__v8hi)__a, (__v8hi)__count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srli_epi32(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psrldi128((__v4si)__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srl_epi32(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_psrld128((__v4si)__a, (__v4si)__count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srli_epi64(__m128i __a, int __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_psrlqi128(__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_srl_epi64(__m128i __a, __m128i __count)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_psrlq128(__a, __count);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpeq_epi8(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v16qi)__a == (__v16qi)__b);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpeq_epi16(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v8hi)__a == (__v8hi)__b);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpeq_epi32(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v4si)__a == (__v4si)__b);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpgt_epi8(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2012-02-04 10:16:48 +08:00
|
|
|
/* This function always performs a signed comparison, but __v16qi is a char
|
Fix the SSE4 byte sign extension in a cleaner way, and more thoroughly
test that our intrinsics behave the same under -fsigned-char and
-funsigned-char.
This further testing uncovered that AVX-2 has a broken cmpgt for 8-bit
elements, and has for a long time. This is fixed in the same way as
SSE4 handles the case.
The other ISA extensions currently work correctly because they use
specific instruction intrinsics. As soon as they are rewritten in terms
of generic IR, they will need to add these special casts. I've added the
necessary testing to catch this however, so we shouldn't have to chase
it down again.
I considered changing the core typedef to be signed, but that seems like
a bad idea. Notably, it would be an ABI break if anyone is reaching into
the innards of the intrinsic headers and passing __v16qi on an API
boundary. I can't be completely confident that this wouldn't happen due
to a macro expanding in a lambda, etc., so it seems much better to leave
it alone. It also matches GCC's behavior exactly.
A fun side note is that for both GCC and Clang, -funsigned-char really
does change the semantics of __v16qi. To observe this, consider:
% cat x.cc
#include <smmintrin.h>
#include <iostream>
int main() {
__v16qi a = { 1, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
__v16qi b = _mm_set1_epi8(-1);
std::cout << (int)(a / b)[0] << ", " << (int)(a / b)[1] << '\n';
}
% clang++ -o x x.cc && ./x
-1, 1
% clang++ -funsigned-char -o x x.cc && ./x
0, 1
However, while this may be surprising, both Clang and GCC agree.
Differential Revision: http://reviews.llvm.org/D13324
llvm-svn: 249097
2015-10-02 07:40:12 +08:00
|
|
|
which may be signed or unsigned, so use __v16qs. */
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v16qs)__a > (__v16qs)__b);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpgt_epi16(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v8hi)__a > (__v8hi)__b);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmpgt_epi32(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)((__v4si)__a > (__v4si)__b);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmplt_epi8(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return _mm_cmpgt_epi8(__b, __a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmplt_epi16(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return _mm_cmpgt_epi16(__b, __a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cmplt_epi32(__m128i __a, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return _mm_cmpgt_epi32(__b, __a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __x86_64__
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsi64_sd(__m128d __a, long long __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__a[0] = __b;
|
|
|
|
return __a;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ long long __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsd_si64(__m128d __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtsd2si64(__a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ long long __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvttsd_si64(__m128d __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a[0];
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtepi32_ps(__m128i __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_cvtdq2ps((__v4si)__a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtps_epi32(__m128 __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_cvtps2dq(__a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvttps_epi32(__m128 __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_cvttps2dq(__a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsi32_si128(int __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)(__v4si){ __a, 0, 0, 0 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __x86_64__
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsi64_si128(long long __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i){ __a, 0 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsi128_si32(__m128i __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__v4si __b = (__v4si)__a;
|
|
|
|
return __b[0];
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef __x86_64__
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ long long __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_cvtsi128_si64(__m128i __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __a[0];
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_load_si128(__m128i const *__p)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return *__p;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_loadu_si128(__m128i const *__p)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2011-05-13 08:11:39 +08:00
|
|
|
struct __loadu_si128 {
|
2013-01-17 07:08:36 +08:00
|
|
|
__m128i __v;
|
2015-02-04 08:26:10 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
return ((struct __loadu_si128*)__p)->__v;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_loadl_epi64(__m128i const *__p)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2011-09-16 07:15:27 +08:00
|
|
|
struct __mm_loadl_epi64_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
long long __u;
|
2011-09-16 07:15:27 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i) { ((struct __mm_loadl_epi64_struct*)__p)->__u, 0};
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-08-27 05:17:12 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
|
|
|
_mm_undefined_si128()
|
|
|
|
{
|
|
|
|
return (__m128i)__builtin_ia32_undef128();
|
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_mm_set_epi64x(long long __q1, long long __q0)
|
2009-09-19 01:03:55 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i){ __q0, __q1 };
|
2009-09-19 01:03:55 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_mm_set_epi64(__m64 __q1, __m64 __q0)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i){ (long long)__q0, (long long)__q1 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_mm_set_epi32(int __i3, int __i2, int __i1, int __i0)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i)(__v4si){ __i0, __i1, __i2, __i3};
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_mm_set_epi16(short __w7, short __w6, short __w5, short __w4, short __w3, short __w2, short __w1, short __w0)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i)(__v8hi){ __w0, __w1, __w2, __w3, __w4, __w5, __w6, __w7 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_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)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i)(__v16qi){ __b0, __b1, __b2, __b3, __b4, __b5, __b6, __b7, __b8, __b9, __b10, __b11, __b12, __b13, __b14, __b15 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set1_epi64x(long long __q)
|
2009-09-19 01:03:55 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i){ __q, __q };
|
2009-09-19 01:03:55 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set1_epi64(__m64 __q)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i){ (long long)__q, (long long)__q };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set1_epi32(int __i)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)(__v4si){ __i, __i, __i, __i };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set1_epi16(short __w)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)(__v8hi){ __w, __w, __w, __w, __w, __w, __w, __w };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_set1_epi8(char __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)(__v16qi){ __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b, __b };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_mm_setr_epi64(__m64 __q0, __m64 __q1)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i){ (long long)__q0, (long long)__q1 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_mm_setr_epi32(int __i0, int __i1, int __i2, int __i3)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i)(__v4si){ __i0, __i1, __i2, __i3};
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_mm_setr_epi16(short __w0, short __w1, short __w2, short __w3, short __w4, short __w5, short __w6, short __w7)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i)(__v8hi){ __w0, __w1, __w2, __w3, __w4, __w5, __w6, __w7 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2015-09-21 19:45:27 +08:00
|
|
|
_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)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2015-09-21 19:45:27 +08:00
|
|
|
return (__m128i)(__v16qi){ __b0, __b1, __b2, __b3, __b4, __b5, __b6, __b7, __b8, __b9, __b10, __b11, __b12, __b13, __b14, __b15 };
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2009-02-13 22:24:50 +08:00
|
|
|
_mm_setzero_si128(void)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
|
|
|
return (__m128i){ 0LL, 0LL };
|
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_store_si128(__m128i *__p, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
*__p = __b;
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_storeu_si128(__m128i *__p, __m128i __b)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__builtin_ia32_storedqu((char *)__p, (__v16qi)__b);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_maskmoveu_si128(__m128i __d, __m128i __n, char *__p)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__builtin_ia32_maskmovdqu((__v16qi)__d, (__v16qi)__n, __p);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_storel_epi64(__m128i *__p, __m128i __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2012-05-02 02:11:51 +08:00
|
|
|
struct __mm_storel_epi64_struct {
|
2013-01-17 07:08:36 +08:00
|
|
|
long long __u;
|
2012-05-02 02:11:51 +08:00
|
|
|
} __attribute__((__packed__, __may_alias__));
|
2013-01-17 07:08:36 +08:00
|
|
|
((struct __mm_storel_epi64_struct*)__p)->__u = __a[0];
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_stream_pd(double *__p, __m128d __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__builtin_ia32_movntpd(__p, __a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_stream_si128(__m128i *__p, __m128i __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__builtin_ia32_movntdq(__p, __a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_stream_si32(int *__p, int __a)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__builtin_ia32_movnti(__p, __a);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2013-09-24 07:38:39 +08:00
|
|
|
#ifdef __x86_64__
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-09-24 07:38:39 +08:00
|
|
|
_mm_stream_si64(long long *__p, long long __a)
|
|
|
|
{
|
|
|
|
__builtin_ia32_movnti64(__p, __a);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_clflush(void const *__p)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__builtin_ia32_clflush(__p);
|
2008-12-26 07:48:58 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2009-02-13 22:24:50 +08:00
|
|
|
_mm_lfence(void)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
|
|
|
__builtin_ia32_lfence();
|
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2009-02-13 22:24:50 +08:00
|
|
|
_mm_mfence(void)
|
2008-12-26 07:48:58 +08:00
|
|
|
{
|
|
|
|
__builtin_ia32_mfence();
|
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_packs_epi16(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_packsswb128((__v8hi)__a, (__v8hi)__b);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_packs_epi32(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_packssdw128((__v4si)__a, (__v4si)__b);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_packus_epi16(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_ia32_packuswb128((__v8hi)__a, (__v8hi)__b);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_extract_epi16(__m128i __a, int __imm)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__v8hi __b = (__v8hi)__a;
|
2013-10-23 03:24:42 +08:00
|
|
|
return (unsigned short)__b[__imm & 7];
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_insert_epi16(__m128i __a, int __b, int __imm)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
__v8hi __c = (__v8hi)__a;
|
|
|
|
__c[__imm & 7] = __b;
|
|
|
|
return (__m128i)__c;
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_movemask_epi8(__m128i __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_pmovmskb128((__v16qi)__a);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2011-11-05 14:08:06 +08:00
|
|
|
#define _mm_shuffle_epi32(a, imm) __extension__ ({ \
|
2015-02-13 14:04:43 +08:00
|
|
|
(__m128i)__builtin_shufflevector((__v4si)(__m128i)(a), \
|
2015-11-10 13:08:08 +08:00
|
|
|
(__v4si)_mm_setzero_si128(), \
|
2011-11-05 14:08:06 +08:00
|
|
|
(imm) & 0x3, ((imm) & 0xc) >> 2, \
|
|
|
|
((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6); })
|
2011-04-26 04:42:40 +08:00
|
|
|
|
2011-11-05 14:08:06 +08:00
|
|
|
#define _mm_shufflelo_epi16(a, imm) __extension__ ({ \
|
2015-02-13 14:04:43 +08:00
|
|
|
(__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \
|
2015-11-10 13:08:08 +08:00
|
|
|
(__v8hi)_mm_setzero_si128(), \
|
2011-11-05 14:08:06 +08:00
|
|
|
(imm) & 0x3, ((imm) & 0xc) >> 2, \
|
|
|
|
((imm) & 0x30) >> 4, ((imm) & 0xc0) >> 6, \
|
|
|
|
4, 5, 6, 7); })
|
2011-04-26 04:42:40 +08:00
|
|
|
|
2011-11-05 14:08:06 +08:00
|
|
|
#define _mm_shufflehi_epi16(a, imm) __extension__ ({ \
|
2015-02-13 14:04:43 +08:00
|
|
|
(__m128i)__builtin_shufflevector((__v8hi)(__m128i)(a), \
|
2015-11-10 13:08:08 +08:00
|
|
|
(__v8hi)_mm_setzero_si128(), \
|
2011-11-05 14:08:06 +08:00
|
|
|
0, 1, 2, 3, \
|
|
|
|
4 + (((imm) & 0x03) >> 0), \
|
|
|
|
4 + (((imm) & 0x0c) >> 2), \
|
|
|
|
4 + (((imm) & 0x30) >> 4), \
|
|
|
|
4 + (((imm) & 0xc0) >> 6)); })
|
2008-12-26 08:45:50 +08:00
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpackhi_epi8(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
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);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpackhi_epi16(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 4, 8+4, 5, 8+5, 6, 8+6, 7, 8+7);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpackhi_epi32(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 2, 4+2, 3, 4+3);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpackhi_epi64(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_shufflevector(__a, __b, 1, 2+1);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpacklo_epi8(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
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);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpacklo_epi16(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_shufflevector((__v8hi)__a, (__v8hi)__b, 0, 8+0, 1, 8+1, 2, 8+2, 3, 8+3);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpacklo_epi32(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_shufflevector((__v4si)__a, (__v4si)__b, 0, 4+0, 1, 4+1);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpacklo_epi64(__m128i __a, __m128i __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i)__builtin_shufflevector(__a, __b, 0, 2+0);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m64 __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_movepi64_pi64(__m128i __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m64)__a[0];
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-11-24 06:11:57 +08:00
|
|
|
_mm_movpi64_epi64(__m64 __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return (__m128i){ (long long)__a, 0 };
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_move_epi64(__m128i __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_shufflevector(__a, (__m128i){ 0 }, 0, 2);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpackhi_pd(__m128d __a, __m128d __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_shufflevector(__a, __b, 1, 2+1);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_unpacklo_pd(__m128d __a, __m128d __b)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_shufflevector(__a, __b, 0, 2+0);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ int __DEFAULT_FN_ATTRS
|
2013-01-17 07:08:36 +08:00
|
|
|
_mm_movemask_pd(__m128d __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-01-17 07:08:36 +08:00
|
|
|
return __builtin_ia32_movmskpd(__a);
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2011-11-05 14:08:06 +08:00
|
|
|
#define _mm_shuffle_pd(a, b, i) __extension__ ({ \
|
2015-11-11 11:47:10 +08:00
|
|
|
(__m128d)__builtin_shufflevector((__v2df)(__m128d)(a), (__v2df)(__m128d)(b), \
|
|
|
|
(i) & 1, (((i) & 2) >> 1) + 2); })
|
2008-12-26 08:45:50 +08:00
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
2013-04-20 01:00:14 +08:00
|
|
|
_mm_castpd_ps(__m128d __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-04-20 01:00:14 +08:00
|
|
|
return (__m128)__a;
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-04-20 01:00:14 +08:00
|
|
|
_mm_castpd_si128(__m128d __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-04-20 01:00:14 +08:00
|
|
|
return (__m128i)__a;
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-04-20 01:00:14 +08:00
|
|
|
_mm_castps_pd(__m128 __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-04-20 01:00:14 +08:00
|
|
|
return (__m128d)__a;
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128i __DEFAULT_FN_ATTRS
|
2013-04-20 01:00:14 +08:00
|
|
|
_mm_castps_si128(__m128 __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-04-20 01:00:14 +08:00
|
|
|
return (__m128i)__a;
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128 __DEFAULT_FN_ATTRS
|
2013-04-20 01:00:14 +08:00
|
|
|
_mm_castsi128_ps(__m128i __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-04-20 01:00:14 +08:00
|
|
|
return (__m128)__a;
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ __m128d __DEFAULT_FN_ATTRS
|
2013-04-20 01:00:14 +08:00
|
|
|
_mm_castsi128_pd(__m128i __a)
|
2008-12-26 08:45:50 +08:00
|
|
|
{
|
2013-04-20 01:00:14 +08:00
|
|
|
return (__m128d)__a;
|
2008-12-26 08:45:50 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
static __inline__ void __DEFAULT_FN_ATTRS
|
2009-02-13 22:24:50 +08:00
|
|
|
_mm_pause(void)
|
2008-12-26 08:49:43 +08:00
|
|
|
{
|
2008-12-26 10:22:10 +08:00
|
|
|
__asm__ volatile ("pause");
|
2008-12-26 08:49:43 +08:00
|
|
|
}
|
|
|
|
|
2015-06-30 21:36:19 +08:00
|
|
|
#undef __DEFAULT_FN_ATTRS
|
2015-06-17 15:09:20 +08:00
|
|
|
|
2009-01-21 09:49:39 +08:00
|
|
|
#define _MM_SHUFFLE2(x, y) (((x) << 1) | (y))
|
2008-12-26 08:49:43 +08:00
|
|
|
|
2008-12-24 09:45:22 +08:00
|
|
|
#endif /* __EMMINTRIN_H */
|