From 410841c6d58b3d96245b564d1af8449164543956 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 20 Aug 2010 20:57:56 +0000 Subject: [PATCH] Cast to unsigned short/char first for _mm_extract_epi16/_mm_extract_epi8. gcc/ 2010-08-20 H.J. Lu PR target/45336 * config/i386/emmintrin.h (_mm_extract_epi16): Cast to unsigned short first. * config/i386/smmintrin.h (_mm_extract_epi8): Cast to unsigned char first. gcc/testsuite/ 2010-08-20 H.J. Lu PR target/45336 * gcc.target/i386/pr45336-1.c: New. * gcc.target/i386/pr45336-2.c: Likewise. * gcc.target/i386/pr45336-3.c: Likewise. * gcc.target/i386/pr45336-4.c: Likewise. From-SVN: r163421 --- gcc/ChangeLog | 9 +++++++++ gcc/config/i386/emmintrin.h | 4 ++-- gcc/config/i386/smmintrin.h | 4 ++-- gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/gcc.target/i386/pr45336-1.c | 16 ++++++++++++++++ gcc/testsuite/gcc.target/i386/pr45336-2.c | 21 +++++++++++++++++++++ gcc/testsuite/gcc.target/i386/pr45336-3.c | 13 +++++++++++++ gcc/testsuite/gcc.target/i386/pr45336-4.c | 15 +++++++++++++++ 8 files changed, 86 insertions(+), 4 deletions(-) create mode 100644 gcc/testsuite/gcc.target/i386/pr45336-1.c create mode 100644 gcc/testsuite/gcc.target/i386/pr45336-2.c create mode 100644 gcc/testsuite/gcc.target/i386/pr45336-3.c create mode 100644 gcc/testsuite/gcc.target/i386/pr45336-4.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6ccc0a185be..9f7a8c58791 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2010-08-20 H.J. Lu + + PR target/45336 + * config/i386/emmintrin.h (_mm_extract_epi16): Cast to unsigned + short first. + + * config/i386/smmintrin.h (_mm_extract_epi8): Cast to unsigned + char first. + 2010-08-20 Jakub Jelinek PR target/45336 diff --git a/gcc/config/i386/emmintrin.h b/gcc/config/i386/emmintrin.h index 9467fe0f925..596d28ff8e8 100644 --- a/gcc/config/i386/emmintrin.h +++ b/gcc/config/i386/emmintrin.h @@ -1309,7 +1309,7 @@ _mm_cmpgt_epi32 (__m128i __A, __m128i __B) extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_extract_epi16 (__m128i const __A, int const __N) { - return __builtin_ia32_vec_ext_v8hi ((__v8hi)__A, __N); + return (unsigned short) __builtin_ia32_vec_ext_v8hi ((__v8hi)__A, __N); } extern __inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) @@ -1319,7 +1319,7 @@ _mm_insert_epi16 (__m128i const __A, int const __D, int const __N) } #else #define _mm_extract_epi16(A, N) \ - ((int) __builtin_ia32_vec_ext_v8hi ((__v8hi)(__m128i)(A), (int)(N))) + ((int) (unsigned short) __builtin_ia32_vec_ext_v8hi ((__v8hi)(__m128i)(A), (int)(N))) #define _mm_insert_epi16(A, D, N) \ ((__m128i) __builtin_ia32_vec_set_v8hi ((__v8hi)(__m128i)(A), \ (int)(D), (int)(N))) diff --git a/gcc/config/i386/smmintrin.h b/gcc/config/i386/smmintrin.h index 170fae589b9..357b527367c 100644 --- a/gcc/config/i386/smmintrin.h +++ b/gcc/config/i386/smmintrin.h @@ -439,7 +439,7 @@ _mm_insert_epi64 (__m128i __D, long long __S, const int __N) extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _mm_extract_epi8 (__m128i __X, const int __N) { - return __builtin_ia32_vec_ext_v16qi ((__v16qi)__X, __N); + return (unsigned char) __builtin_ia32_vec_ext_v16qi ((__v16qi)__X, __N); } extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) @@ -457,7 +457,7 @@ _mm_extract_epi64 (__m128i __X, const int __N) #endif #else #define _mm_extract_epi8(X, N) \ - ((int) __builtin_ia32_vec_ext_v16qi ((__v16qi)(__m128i)(X), (int)(N))) + ((int) (unsigned char) __builtin_ia32_vec_ext_v16qi ((__v16qi)(__m128i)(X), (int)(N))) #define _mm_extract_epi32(X, N) \ ((int) __builtin_ia32_vec_ext_v4si ((__v4si)(__m128i)(X), (int)(N))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 022db4c40a3..878b6aa242e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2010-08-20 H.J. Lu + + PR target/45336 + * gcc.target/i386/pr45336-1.c: New. + * gcc.target/i386/pr45336-2.c: Likewise. + * gcc.target/i386/pr45336-3.c: Likewise. + * gcc.target/i386/pr45336-4.c: Likewise. + 2010-08-20 Uros Bizjak PR testsuite/45361 diff --git a/gcc/testsuite/gcc.target/i386/pr45336-1.c b/gcc/testsuite/gcc.target/i386/pr45336-1.c new file mode 100644 index 00000000000..e2b4f658a3f --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr45336-1.c @@ -0,0 +1,16 @@ +/* PR target/45336 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -msse4 -mtune=generic" } */ +/* { dg-final { scan-assembler-not "movsbl" } } */ +/* { dg-final { scan-assembler-not "movswl" } } */ +/* { dg-final { scan-assembler-not "movzbl" } } */ +/* { dg-final { scan-assembler-not "movzwl" } } */ +/* { dg-final { scan-assembler-not "cwtl" } } */ +/* { dg-final { scan-assembler "pextrb" } } */ +/* { dg-final { scan-assembler "pextrw" } } */ +/* { dg-final { scan-assembler "pextrd" } } */ + +#include +unsigned int foo8(__m128i x) { return _mm_extract_epi8(x, 4); } +unsigned int foo16(__m128i x) { return _mm_extract_epi16(x, 3); } +unsigned int foo32(__m128i x) { return _mm_extract_epi32(x, 2); } diff --git a/gcc/testsuite/gcc.target/i386/pr45336-2.c b/gcc/testsuite/gcc.target/i386/pr45336-2.c new file mode 100644 index 00000000000..83470021660 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr45336-2.c @@ -0,0 +1,21 @@ +/* PR target/45336 */ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -msse4 -mtune=generic" } */ +/* { dg-final { scan-assembler-not "movsbl" } } */ +/* { dg-final { scan-assembler-not "movswl" } } */ +/* { dg-final { scan-assembler-not "movzbl" } } */ +/* { dg-final { scan-assembler-not "movzwl" } } */ +/* { dg-final { scan-assembler-not "cwtl" } } */ +/* { dg-final { scan-assembler-not "cltq" } } */ +/* { dg-final { scan-assembler "pextrb" } } */ +/* { dg-final { scan-assembler "pextrw" } } */ +/* { dg-final { scan-assembler "pextrd" } } */ + +#include +unsigned long long int foo8(__m128i x) { return _mm_extract_epi8(x, 4); } +unsigned long long int foo16(__m128i x) { return _mm_extract_epi16(x, 3); } +unsigned long long int foo32(__m128i x) +{ + return (unsigned int) _mm_extract_epi32(x, 2); +} diff --git a/gcc/testsuite/gcc.target/i386/pr45336-3.c b/gcc/testsuite/gcc.target/i386/pr45336-3.c new file mode 100644 index 00000000000..055e3148703 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr45336-3.c @@ -0,0 +1,13 @@ +/* PR target/45336 */ +/* { dg-do compile } */ +/* { dg-options "-O2 -msse4 -mtune=generic" } */ +/* { dg-final { scan-assembler "movsbl" } } */ +/* { dg-final { scan-assembler "(movswl|cwtl)" } } */ +/* { dg-final { scan-assembler "pextrb" } } */ +/* { dg-final { scan-assembler "pextrw" } } */ +/* { dg-final { scan-assembler "pextrd" } } */ + +#include +int foo8(__m128i x) { return (char) _mm_extract_epi8(x, 4); } +int foo16(__m128i x) { return (short) _mm_extract_epi16(x, 3); } +int foo32(__m128i x) { return _mm_extract_epi32(x, 2); } diff --git a/gcc/testsuite/gcc.target/i386/pr45336-4.c b/gcc/testsuite/gcc.target/i386/pr45336-4.c new file mode 100644 index 00000000000..00c93191627 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr45336-4.c @@ -0,0 +1,15 @@ +/* PR target/45336 */ +/* { dg-do compile } */ +/* { dg-require-effective-target lp64 } */ +/* { dg-options "-O2 -msse4 -mtune=generic" } */ +/* { dg-final { scan-assembler "movsbq" } } */ +/* { dg-final { scan-assembler "movswq" } } */ +/* { dg-final { scan-assembler "(cltq|movslq)" } } */ +/* { dg-final { scan-assembler "pextrb" } } */ +/* { dg-final { scan-assembler "pextrw" } } */ +/* { dg-final { scan-assembler "pextrd" } } */ + +#include +long long int foo8(__m128i x) { return (char) _mm_extract_epi8(x, 4); } +long long int foo16(__m128i x) { return (short) _mm_extract_epi16(x, 3); } +long long int foo32(__m128i x) { return (int) _mm_extract_epi32(x, 2); } -- 2.30.2