diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Headers/avxintrin.h')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Headers/avxintrin.h | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/contrib/llvm/tools/clang/lib/Headers/avxintrin.h b/contrib/llvm/tools/clang/lib/Headers/avxintrin.h index 0683a65..141c4d9 100644 --- a/contrib/llvm/tools/clang/lib/Headers/avxintrin.h +++ b/contrib/llvm/tools/clang/lib/Headers/avxintrin.h @@ -25,6 +25,9 @@ #error "Never use <avxintrin.h> directly; include <immintrin.h> instead." #endif +#ifndef __AVXINTRIN_H +#define __AVXINTRIN_H + typedef double __v4df __attribute__ ((__vector_size__ (32))); typedef float __v8sf __attribute__ ((__vector_size__ (32))); typedef long long __v4di __attribute__ ((__vector_size__ (32))); @@ -432,21 +435,21 @@ static __inline int __attribute__((__always_inline__, __nodebug__)) _mm256_extract_epi32(__m256i __a, int const __imm) { __v8si __b = (__v8si)__a; - return __b[__imm]; + return __b[__imm & 7]; } static __inline int __attribute__((__always_inline__, __nodebug__)) _mm256_extract_epi16(__m256i __a, int const __imm) { __v16hi __b = (__v16hi)__a; - return __b[__imm]; + return __b[__imm & 15]; } static __inline int __attribute__((__always_inline__, __nodebug__)) _mm256_extract_epi8(__m256i __a, int const __imm) { __v32qi __b = (__v32qi)__a; - return __b[__imm]; + return __b[__imm & 31]; } #ifdef __x86_64__ @@ -454,7 +457,7 @@ static __inline long long __attribute__((__always_inline__, __nodebug__)) _mm256_extract_epi64(__m256i __a, const int __imm) { __v4di __b = (__v4di)__a; - return __b[__imm]; + return __b[__imm & 3]; } #endif @@ -1134,22 +1137,19 @@ _mm256_castsi256_si128(__m256i __a) static __inline __m256d __attribute__((__always_inline__, __nodebug__)) _mm256_castpd128_pd256(__m128d __a) { - __m128d __zero = _mm_setzero_pd(); - return __builtin_shufflevector(__a, __zero, 0, 1, 2, 2); + return __builtin_shufflevector(__a, __a, 0, 1, -1, -1); } static __inline __m256 __attribute__((__always_inline__, __nodebug__)) _mm256_castps128_ps256(__m128 __a) { - __m128 __zero = _mm_setzero_ps(); - return __builtin_shufflevector(__a, __zero, 0, 1, 2, 3, 4, 4, 4, 4); + return __builtin_shufflevector(__a, __a, 0, 1, 2, 3, -1, -1, -1, -1); } static __inline __m256i __attribute__((__always_inline__, __nodebug__)) _mm256_castsi128_si256(__m128i __a) { - __m128i __zero = _mm_setzero_si128(); - return __builtin_shufflevector(__a, __zero, 0, 1, 2, 2); + return __builtin_shufflevector(__a, __a, 0, 1, -1, -1); } /* SIMD load ops (unaligned) */ @@ -1220,3 +1220,5 @@ _mm256_storeu2_m128i(__m128i *__addr_hi, __m128i *__addr_lo, __m256i __a) __v128 = _mm256_extractf128_si256(__a, 1); __builtin_ia32_storedqu((char *)__addr_hi, (__v16qi)__v128); } + +#endif /* __AVXINTRIN_H */ |