mirror of
https://gcc.gnu.org/git/gcc.git
synced 2026-02-22 03:46:53 -05:00
re PR target/32961 (Gcc has different requirements for x86 shift xmm intrinsics)
PR target/32961 * config/i386/i386.c (ix86_expand_builtin) [IX86_BUILTIN_PSLLWI128, IX86_BUILTIN_PSLLDI128, BUILTIN_PSLLQI128, IX86_BUILTIN_PSRAWI128, IX86_BUILTIN_PSRADI128, IX86_BUILTIN_PSRLWI128, IX86_BUILTIN_PSRLDI128, IX86_BUILTIN_PSRLQI128]: Do not require immediate shift value. * config/i386/emmintrin.h (_mm_slli_epi16, _mm_slli_epi32, _mm_slli_epi64, _mm_srai_epi16, _mm_srai_epi32, _mm_srli_epi16, _mm_srli_epi32, _mm_srli_epi64): Enable disabled functions and remove equivalent macro definitions. testsuite/ChangeLog: PR target/32961 * gcc.target/i386/pr32961.c: New testcase. From-SVN: r129433
This commit is contained in:
@@ -1,3 +1,16 @@
|
||||
2007-10-18 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR target/32961
|
||||
* config/i386/i386.c (ix86_expand_builtin) [IX86_BUILTIN_PSLLWI128,
|
||||
IX86_BUILTIN_PSLLDI128, BUILTIN_PSLLQI128, IX86_BUILTIN_PSRAWI128,
|
||||
IX86_BUILTIN_PSRADI128, IX86_BUILTIN_PSRLWI128,
|
||||
IX86_BUILTIN_PSRLDI128, IX86_BUILTIN_PSRLQI128]: Do not require
|
||||
immediate shift value.
|
||||
* config/i386/emmintrin.h (_mm_slli_epi16, _mm_slli_epi32,
|
||||
_mm_slli_epi64, _mm_srai_epi16, _mm_srai_epi32, _mm_srli_epi16,
|
||||
_mm_srli_epi32, _mm_srli_epi64): Enable disabled functions and
|
||||
remove equivalent macro definitions.
|
||||
|
||||
2007-10-18 Chen liqin <liqin@sunnorth.com.cn>
|
||||
|
||||
* config.gcc : update score-*-elf(extra_objs).
|
||||
|
||||
@@ -1100,7 +1100,6 @@ _mm_mul_epu32 (__m128i __A, __m128i __B)
|
||||
return (__m128i)__builtin_ia32_pmuludq128 ((__v4si)__A, (__v4si)__B);
|
||||
}
|
||||
|
||||
#if 0
|
||||
static __inline __m128i __attribute__((__always_inline__))
|
||||
_mm_slli_epi16 (__m128i __A, int __B)
|
||||
{
|
||||
@@ -1118,16 +1117,7 @@ _mm_slli_epi64 (__m128i __A, int __B)
|
||||
{
|
||||
return (__m128i)__builtin_ia32_psllqi128 ((__v2di)__A, __B);
|
||||
}
|
||||
#else
|
||||
#define _mm_slli_epi16(__A, __B) \
|
||||
((__m128i)__builtin_ia32_psllwi128 ((__v8hi)(__A), __B))
|
||||
#define _mm_slli_epi32(__A, __B) \
|
||||
((__m128i)__builtin_ia32_pslldi128 ((__v8hi)(__A), __B))
|
||||
#define _mm_slli_epi64(__A, __B) \
|
||||
((__m128i)__builtin_ia32_psllqi128 ((__v8hi)(__A), __B))
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
static __inline __m128i __attribute__((__always_inline__))
|
||||
_mm_srai_epi16 (__m128i __A, int __B)
|
||||
{
|
||||
@@ -1139,12 +1129,6 @@ _mm_srai_epi32 (__m128i __A, int __B)
|
||||
{
|
||||
return (__m128i)__builtin_ia32_psradi128 ((__v4si)__A, __B);
|
||||
}
|
||||
#else
|
||||
#define _mm_srai_epi16(__A, __B) \
|
||||
((__m128i)__builtin_ia32_psrawi128 ((__v8hi)(__A), __B))
|
||||
#define _mm_srai_epi32(__A, __B) \
|
||||
((__m128i)__builtin_ia32_psradi128 ((__v8hi)(__A), __B))
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
static __m128i __attribute__((__always_inline__))
|
||||
@@ -1165,7 +1149,6 @@ _mm_srli_si128 (__m128i __A, int __B)
|
||||
((__m128i)__builtin_ia32_pslldqi128 (__A, (__B) * 8))
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
static __inline __m128i __attribute__((__always_inline__))
|
||||
_mm_srli_epi16 (__m128i __A, int __B)
|
||||
{
|
||||
@@ -1183,14 +1166,6 @@ _mm_srli_epi64 (__m128i __A, int __B)
|
||||
{
|
||||
return (__m128i)__builtin_ia32_psrlqi128 ((__v2di)__A, __B);
|
||||
}
|
||||
#else
|
||||
#define _mm_srli_epi16(__A, __B) \
|
||||
((__m128i)__builtin_ia32_psrlwi128 ((__v8hi)(__A), __B))
|
||||
#define _mm_srli_epi32(__A, __B) \
|
||||
((__m128i)__builtin_ia32_psrldi128 ((__v4si)(__A), __B))
|
||||
#define _mm_srli_epi64(__A, __B) \
|
||||
((__m128i)__builtin_ia32_psrlqi128 ((__v4si)(__A), __B))
|
||||
#endif
|
||||
|
||||
static __inline __m128i __attribute__((__always_inline__))
|
||||
_mm_sll_epi16 (__m128i __A, __m128i __B)
|
||||
|
||||
@@ -16209,80 +16209,38 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
|
||||
emit_insn (pat);
|
||||
return target;
|
||||
|
||||
case IX86_BUILTIN_PSLLWI128:
|
||||
icode = CODE_FOR_ashlv8hi3;
|
||||
goto do_pshifti;
|
||||
case IX86_BUILTIN_PSLLDI128:
|
||||
icode = CODE_FOR_ashlv4si3;
|
||||
goto do_pshifti;
|
||||
case IX86_BUILTIN_PSLLQI128:
|
||||
icode = CODE_FOR_ashlv2di3;
|
||||
goto do_pshifti;
|
||||
case IX86_BUILTIN_PSRAWI128:
|
||||
icode = CODE_FOR_ashrv8hi3;
|
||||
goto do_pshifti;
|
||||
case IX86_BUILTIN_PSRADI128:
|
||||
icode = CODE_FOR_ashrv4si3;
|
||||
goto do_pshifti;
|
||||
case IX86_BUILTIN_PSRLWI128:
|
||||
icode = CODE_FOR_lshrv8hi3;
|
||||
goto do_pshifti;
|
||||
case IX86_BUILTIN_PSRLDI128:
|
||||
icode = CODE_FOR_lshrv4si3;
|
||||
goto do_pshifti;
|
||||
case IX86_BUILTIN_PSRLQI128:
|
||||
icode = CODE_FOR_lshrv2di3;
|
||||
goto do_pshifti;
|
||||
do_pshifti:
|
||||
arg0 = TREE_VALUE (arglist);
|
||||
arg1 = TREE_VALUE (TREE_CHAIN (arglist));
|
||||
op0 = expand_expr (arg0, NULL_RTX, VOIDmode, 0);
|
||||
op1 = expand_expr (arg1, NULL_RTX, VOIDmode, 0);
|
||||
|
||||
if (GET_CODE (op1) != CONST_INT)
|
||||
{
|
||||
error ("shift must be an immediate");
|
||||
return const0_rtx;
|
||||
}
|
||||
if (INTVAL (op1) < 0 || INTVAL (op1) > 255)
|
||||
op1 = GEN_INT (255);
|
||||
|
||||
tmode = insn_data[icode].operand[0].mode;
|
||||
mode1 = insn_data[icode].operand[1].mode;
|
||||
if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
|
||||
op0 = copy_to_reg (op0);
|
||||
|
||||
target = gen_reg_rtx (tmode);
|
||||
pat = GEN_FCN (icode) (target, op0, op1);
|
||||
if (!pat)
|
||||
return 0;
|
||||
emit_insn (pat);
|
||||
return target;
|
||||
|
||||
case IX86_BUILTIN_PSLLW128:
|
||||
case IX86_BUILTIN_PSLLWI128:
|
||||
icode = CODE_FOR_ashlv8hi3;
|
||||
goto do_pshift;
|
||||
case IX86_BUILTIN_PSLLD128:
|
||||
case IX86_BUILTIN_PSLLDI128:
|
||||
icode = CODE_FOR_ashlv4si3;
|
||||
goto do_pshift;
|
||||
case IX86_BUILTIN_PSLLQ128:
|
||||
case IX86_BUILTIN_PSLLQI128:
|
||||
icode = CODE_FOR_ashlv2di3;
|
||||
goto do_pshift;
|
||||
case IX86_BUILTIN_PSRAW128:
|
||||
case IX86_BUILTIN_PSRAWI128:
|
||||
icode = CODE_FOR_ashrv8hi3;
|
||||
goto do_pshift;
|
||||
case IX86_BUILTIN_PSRAD128:
|
||||
case IX86_BUILTIN_PSRADI128:
|
||||
icode = CODE_FOR_ashrv4si3;
|
||||
goto do_pshift;
|
||||
case IX86_BUILTIN_PSRLW128:
|
||||
case IX86_BUILTIN_PSRLWI128:
|
||||
icode = CODE_FOR_lshrv8hi3;
|
||||
goto do_pshift;
|
||||
case IX86_BUILTIN_PSRLD128:
|
||||
case IX86_BUILTIN_PSRLDI128:
|
||||
icode = CODE_FOR_lshrv4si3;
|
||||
goto do_pshift;
|
||||
case IX86_BUILTIN_PSRLQ128:
|
||||
case IX86_BUILTIN_PSRLQI128:
|
||||
icode = CODE_FOR_lshrv2di3;
|
||||
goto do_pshift;
|
||||
|
||||
do_pshift:
|
||||
arg0 = TREE_VALUE (arglist);
|
||||
arg1 = TREE_VALUE (TREE_CHAIN (arglist));
|
||||
@@ -16295,7 +16253,9 @@ ix86_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED,
|
||||
if (! (*insn_data[icode].operand[1].predicate) (op0, mode1))
|
||||
op0 = copy_to_reg (op0);
|
||||
|
||||
op1 = simplify_gen_subreg (SImode, op1, GET_MODE (op1), 0);
|
||||
if (!CONST_INT_P (op1))
|
||||
op1 = simplify_gen_subreg (SImode, op1, GET_MODE (op1), 0);
|
||||
|
||||
if (! (*insn_data[icode].operand[2].predicate) (op1, SImode))
|
||||
op1 = copy_to_reg (op1);
|
||||
|
||||
|
||||
@@ -1,3 +1,8 @@
|
||||
2007-10-18 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR target/32961
|
||||
* gcc.target/i386/pr32961.c: New testcase.
|
||||
|
||||
2007-10-18 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* gcc.target/i386/pr31167.c: Add i?86-*-* to target selector.
|
||||
|
||||
10
gcc/testsuite/gcc.target/i386/pr32961.c
Normal file
10
gcc/testsuite/gcc.target/i386/pr32961.c
Normal file
@@ -0,0 +1,10 @@
|
||||
/* { dg-do compile } */
|
||||
/* { dg-options "-O0 -msse2" } */
|
||||
|
||||
#include <xmmintrin.h>
|
||||
|
||||
void x (int n)
|
||||
{
|
||||
__m128i a;
|
||||
a = _mm_slli_epi32 (a, n);
|
||||
}
|
||||
Reference in New Issue
Block a user