summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--clang/lib/Headers/emmintrin.h2
-rw-r--r--clang/test/CodeGen/sse-builtins.c7
2 files changed, 8 insertions, 1 deletions
diff --git a/clang/lib/Headers/emmintrin.h b/clang/lib/Headers/emmintrin.h
index 9ab0a73aad6..a78eb54c45a 100644
--- a/clang/lib/Headers/emmintrin.h
+++ b/clang/lib/Headers/emmintrin.h
@@ -1266,7 +1266,7 @@ static __inline__ int __attribute__((__always_inline__, __nodebug__))
_mm_extract_epi16(__m128i __a, int __imm)
{
__v8hi __b = (__v8hi)__a;
- return (unsigned short)__b[__imm];
+ return (unsigned short)__b[__imm & 7];
}
static __inline__ __m128i __attribute__((__always_inline__, __nodebug__))
diff --git a/clang/test/CodeGen/sse-builtins.c b/clang/test/CodeGen/sse-builtins.c
index 559d855547b..cee9b3c2a5d 100644
--- a/clang/test/CodeGen/sse-builtins.c
+++ b/clang/test/CodeGen/sse-builtins.c
@@ -206,3 +206,10 @@ void test_stream_si128(__m128i x, void *y) {
// CHECK: store {{.*}} <2 x i64>* {{.*}}, align 16, !nontemporal
_mm_stream_si128(y, x);
}
+
+void test_extract_epi16(__m128i __a) {
+ // CHECK-LABEL: define void @test_extract_epi16
+ // CHECK: [[x:%.*]] = and i32 %{{.*}}, 7
+ // CHECK: extractelement <8 x i16> %{{.*}}, i32 [[x]]
+ _mm_extract_epi16(__a, 8);
+}
OpenPOWER on IntegriCloud