From 6316b9663a9883c0e44764a47c1f1c7fdc05fced Mon Sep 17 00:00:00 2001 From: Simon Pilgrim <llvm-dev@redking.me.uk> Date: Sat, 21 May 2016 21:14:35 +0000 Subject: [PATCH] [X86][AVX] Ensure zero-extension of _mm256_extract_epi8 and _mm256_extract_epi16 Ensure _mm256_extract_epi8 and _mm256_extract_epi16 zero extend their i8/i16 result to i32. This matches _mm_extract_epi8 and _mm_extract_epi16. Fix for PR27594 Differential Revision: http://reviews.llvm.org/D20468 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@270330 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Headers/avxintrin.h | 10 +++++----- test/CodeGen/avx-builtins.c | 6 ++---- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/lib/Headers/avxintrin.h b/lib/Headers/avxintrin.h index 20e9ef4e576..a71bd7a9934 100644 --- a/lib/Headers/avxintrin.h +++ b/lib/Headers/avxintrin.h @@ -1875,13 +1875,13 @@ _mm256_extract_epi32(__m256i __a, const int __imm) /// \param __imm /// An immediate integer operand with bits [3:0] determining which vector /// element is extracted and returned. -/// \returns A 32-bit integer containing the extracted 16 bits of extended +/// \returns A 32-bit integer containing the extracted 16 bits of zero extended /// packed data. static __inline int __DEFAULT_FN_ATTRS _mm256_extract_epi16(__m256i __a, const int __imm) { __v16hi __b = (__v16hi)__a; - return __b[__imm & 15]; + return (unsigned short)__b[__imm & 15]; } /// \brief Takes a [32 x i8] vector and returns the vector element value @@ -1897,13 +1897,13 @@ _mm256_extract_epi16(__m256i __a, const int __imm) /// \param __imm /// An immediate integer operand with bits [4:0] determining which vector /// element is extracted and returned. -/// \returns A 32-bit integer containing the extracted 8 bits of extended packed -/// data. +/// \returns A 32-bit integer containing the extracted 8 bits of zero extended +/// packed data. static __inline int __DEFAULT_FN_ATTRS _mm256_extract_epi8(__m256i __a, const int __imm) { __v32qi __b = (__v32qi)__a; - return __b[__imm & 31]; + return (unsigned char)__b[__imm & 31]; } #ifdef __x86_64__ diff --git a/test/CodeGen/avx-builtins.c b/test/CodeGen/avx-builtins.c index 23bc6544808..ad187e805ca 100644 --- a/test/CodeGen/avx-builtins.c +++ b/test/CodeGen/avx-builtins.c @@ -314,21 +314,19 @@ __m256 test_mm256_dp_ps(__m256 A, __m256 B) { return _mm256_dp_ps(A, B, 7); } -// FIXME: ZEXT instead of SEXT int test_mm256_extract_epi8(__m256i A) { // CHECK-LABEL: test_mm256_extract_epi8 // CHECK: and i32 %{{.*}}, 31 // CHECK: extractelement <32 x i8> %{{.*}}, i32 %{{.*}} - // CHECK: ext i8 %{{.*}} to i32 + // CHECK: zext i8 %{{.*}} to i32 return _mm256_extract_epi8(A, 32); } -// FIXME: ZEXT instead of SEXT int test_mm256_extract_epi16(__m256i A) { // CHECK-LABEL: test_mm256_extract_epi16 // CHECK: and i32 %{{.*}}, 15 // CHECK: extractelement <16 x i16> %{{.*}}, i32 %{{.*}} - // CHECK: ext i16 %{{.*}} to i32 + // CHECK: zext i16 %{{.*}} to i32 return _mm256_extract_epi16(A, 16); } -- GitLab