+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).
return (__m128i)__builtin_ia32_pmuludq128 ((__v4si)__A, (__v4si)__B);
}
-#if 0
static __inline __m128i __attribute__((__always_inline__))
_mm_slli_epi16 (__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)
{
{
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__))
((__m128i)__builtin_ia32_pslldqi128 (__A, (__B) * 8))
#endif
-#if 0
static __inline __m128i __attribute__((__always_inline__))
_mm_srli_epi16 (__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)
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));
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);