aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Headers/avxintrin.h15
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/Headers/avxintrin.h b/lib/Headers/avxintrin.h
index 6c1e32d240..b7bd1787e0 100644
--- a/lib/Headers/avxintrin.h
+++ b/lib/Headers/avxintrin.h
@@ -1122,37 +1122,40 @@ _mm256_castsi256_pd(__m256i in)
static __inline __m128d __attribute__((__always_inline__, __nodebug__))
_mm256_castpd256_pd128(__m256d in)
{
- return (__m128d)__builtin_ia32_pd_pd256((__v4df)in);
+ return __builtin_shufflevector(in, in, 0, 1);
}
static __inline __m128 __attribute__((__always_inline__, __nodebug__))
_mm256_castps256_ps128(__m256 in)
{
- return (__m128)__builtin_ia32_ps_ps256((__v8sf)in);
+ return __builtin_shufflevector(in, in, 0, 1, 2, 3);
}
static __inline __m128i __attribute__((__always_inline__, __nodebug__))
_mm256_castsi256_si128(__m256i in)
{
- return (__m128i)__builtin_ia32_si_si256((__v8si)in);
+ return __builtin_shufflevector(in, in, 0, 1);
}
static __inline __m256d __attribute__((__always_inline__, __nodebug__))
_mm256_castpd128_pd256(__m128d in)
{
- return (__m256d)__builtin_ia32_pd256_pd((__v2df)in);
+ __m128d zero = _mm_setzero_pd();
+ return __builtin_shufflevector(in, zero, 0, 1, 2, 2);
}
static __inline __m256 __attribute__((__always_inline__, __nodebug__))
_mm256_castps128_ps256(__m128 in)
{
- return (__m256)__builtin_ia32_ps256_ps((__v4sf)in);
+ __m128 zero = _mm_setzero_ps();
+ return __builtin_shufflevector(in, zero, 0, 1, 2, 3, 4, 4, 4, 4);
}
static __inline __m256i __attribute__((__always_inline__, __nodebug__))
_mm256_castsi128_si256(__m128i in)
{
- return (__m256i)__builtin_ia32_si256_si((__v4si)in);
+ __m128i zero = _mm_setzero_si128();
+ return __builtin_shufflevector(in, zero, 0, 1, 2, 2);
}
#endif /* __AVX__ */