On Fri, Jun 17, 2011 at 01:31:14AM +0200, Jakub Jelinek wrote:
> Not here, those are handled by  ix86_expand_args_builtin
> instead of ix86_expand_multi_arg_builtin.  Furthermore, only
> CODE_FOR_vcvtps2ph and CODE_FOR_vcvtps2ph256 have CONST_INT argument.
> And I believe ix86_expand_args_builtin handles it fine, what's wrong
> is the actual predicates those insns use.

Ok, had a deeper look into this and it seems there are other issues,
some of them even without test coverage regressed since 4.6.
Some problems result in ICEs, other fail to assemble.  Had to revert
the blendbits removal patch, because that removal results in out of
range immediates not to be reported as predicate failures, but instead
as ICEs.

So here is an updated patch that adds test coverage.  Regtested
on x86_64-linux {-m32,-m64}, ok for trunk (and backport for 4.6)?

There are still a couple of things I'm unsure about (not tested
by the testcases, compile fine):
#include <x86intrin.h>
__m128i i1, i2, i3, i4;
__m128 a1, a2, a3, a4;
__m128d d1, d2, d3, d4;
__m256i l1, l2, l3, l4;
__m256 b1, b2, b3, b4;
__m256d e1, e2, e3, e4;
__m64 m1, m2, m3, m4;
int k1, k2, k3, k4;
float f1, f2, f3, f4;
void
foo (void)
{
  /* 8 bit imm only?  This compiles fine, but one ends up with
     number modulo 256 in the insn.  To make it error out
     const_0_to_255_operand would need to be used.  */
  e1 = _mm256_shuffle_pd (e2, e3, 256);
  b1 = _mm256_shuffle_ps (b2, b3, 256);
  i1 = _mm_shuffle_epi32 (i2, 256);
  i1 = _mm_shufflehi_epi16 (i2, 256);
  i1 = _mm_shufflelo_epi16 (i2, 256);
  d1 = _mm_shuffle_pd (d2, d3, 256);
  m1 = _mm_shuffle_pi16 (m2, 256);
  a1 = _mm_shuffle_ps (a2, a3, 256);
  /* What about these?  Similarly to the above, they result
     in imm modulo 16 resp. imm modulo 4.  */
  e1 = _mm256_permute_pd (e2, 16);
  d1 = _mm_permute_pd (d2, 4);
}

2011-06-17  Jakub Jelinek  <ja...@redhat.com>

        PR target/49411
        * config/i386/i386.c (ix86_expand_multi_arg_builtins): If
        last_arg_constant and last argument doesn't match its predicate,
        for xop_vpermil2<mode>3 error out and for xop_rotl<mode>3
        if it is CONST_INT, mask it, otherwise expand using rotl<mode>3.
        (ix86_expand_sse_pcmpestr, ix86_expand_sse_pcmpistr): Fix
        spelling of error message.
        * config/i386/sse.md (sse4a_extrqi, sse4a_insertqi,
        vcvtps2ph, *vcvtps2ph, *vcvtps2ph_store, vcvtps2ph256): Use
        const_0_to_255_operand instead of const_int_operand.

        Revert:
        2011-05-09  Uros Bizjak  <ubiz...@gmail.com>

        * config/i386/sse.md (blendbits): Remove mode attribute.
        (<sse4_1>_blend<ssemodesuffix><avxsizesuffix>): Use const_int_operand
        instead of const_0_to_<blendbits>_operand for operand 3 predicate.
        Check integer value of operand 3 in insn constraint.

        * gcc.target/i386/testimm-1.c: New test.
        * gcc.target/i386/testimm-2.c: New test.
        * gcc.target/i386/testimm-3.c: New test.
        * gcc.target/i386/testimm-4.c: New test.
        * gcc.target/i386/testimm-5.c: New test.
        * gcc.target/i386/testimm-6.c: New test.
        * gcc.target/i386/testimm-7.c: New test.
        * gcc.target/i386/testimm-8.c: New test.
        * gcc.target/i386/xop-vpermil2px-2.c: New test.
        * gcc.target/i386/xop-rotate1-int.c: New test.
        * gcc.target/i386/xop-rotate2-int.c: New test.

--- gcc/config/i386/i386.c.jj   2011-06-17 11:02:11.000000000 +0200
+++ gcc/config/i386/i386.c      2011-06-17 13:35:26.000000000 +0200
@@ -25566,16 +25566,61 @@ ix86_expand_multi_arg_builtin (enum insn
       int adjust = (comparison_p) ? 1 : 0;
       enum machine_mode mode = insn_data[icode].operand[i+adjust+1].mode;
 
-      if (last_arg_constant && i == nargs-1)
+      if (last_arg_constant && i == nargs - 1)
        {
-         if (!CONST_INT_P (op))
+         if (!insn_data[icode].operand[i + 1].predicate (op, mode))
            {
-             error ("last argument must be an immediate");
-             return gen_reg_rtx (tmode);
+             enum insn_code new_icode = icode;
+             switch (icode)
+               {
+               case CODE_FOR_xop_vpermil2v2df3:
+               case CODE_FOR_xop_vpermil2v4sf3:
+               case CODE_FOR_xop_vpermil2v4df3:
+               case CODE_FOR_xop_vpermil2v8sf3:
+                 error ("the last argument must be a 2-bit immediate");
+                 return gen_reg_rtx (tmode);
+               case CODE_FOR_xop_rotlv2di3:
+                 new_icode = CODE_FOR_rotlv2di3;
+                 goto xop_rotl;
+               case CODE_FOR_xop_rotlv4si3:
+                 new_icode = CODE_FOR_rotlv4si3;
+                 goto xop_rotl;
+               case CODE_FOR_xop_rotlv8hi3:
+                 new_icode = CODE_FOR_rotlv8hi3;
+                 goto xop_rotl;
+               case CODE_FOR_xop_rotlv16qi3:
+                 new_icode = CODE_FOR_rotlv16qi3;
+               xop_rotl:
+                 if (CONST_INT_P (op))
+                   {
+                     int mask = GET_MODE_BITSIZE (GET_MODE_INNER (tmode)) - 1;
+                     op = GEN_INT (INTVAL (op) & mask);
+                     gcc_checking_assert
+                       (insn_data[icode].operand[i + 1].predicate (op, mode));
+                   }
+                 else
+                   {
+                     gcc_checking_assert
+                       (nargs == 2
+                        && insn_data[new_icode].operand[0].mode == tmode
+                        && insn_data[new_icode].operand[1].mode == tmode
+                        && insn_data[new_icode].operand[2].mode == mode
+                        && insn_data[new_icode].operand[0].predicate
+                           == insn_data[icode].operand[0].predicate
+                        && insn_data[new_icode].operand[1].predicate
+                           == insn_data[icode].operand[1].predicate);
+                     icode = new_icode;
+                     goto non_constant;
+                   }
+                 break;
+               default:
+                 gcc_unreachable ();
+               }
            }
        }
       else
        {
+       non_constant:
          if (VECTOR_MODE_P (mode))
            op = safe_vector_operand (op, mode);
 
@@ -25900,7 +25945,7 @@ ix86_expand_sse_pcmpestr (const struct b
 
   if (!insn_data[d->icode].operand[6].predicate (op4, modeimm))
     {
-      error ("the fifth argument must be a 8-bit immediate");
+      error ("the fifth argument must be an 8-bit immediate");
       return const0_rtx;
     }
 
@@ -25995,7 +26040,7 @@ ix86_expand_sse_pcmpistr (const struct b
 
   if (!insn_data[d->icode].operand[4].predicate (op2, modeimm))
     {
-      error ("the third argument must be a 8-bit immediate");
+      error ("the third argument must be an 8-bit immediate");
       return const0_rtx;
     }
 
--- gcc/config/i386/sse.md.jj   2011-06-17 11:02:11.000000000 +0200
+++ gcc/config/i386/sse.md      2011-06-17 14:14:09.000000000 +0200
@@ -188,6 +188,10 @@ (define_mode_iterator AVX256MODE2P [V8SI
 
 (define_mode_iterator FMAMODE [SF DF V4SF V2DF V8SF V4DF])
 
+;; Mapping of immediate bits for blend instructions
+(define_mode_attr blendbits
+  [(V8SF "255") (V4SF "15") (V4DF "15") (V2DF "3")])
+
 ;; Patterns whose name begins with "sse{,2,3}_" are invoked by intrinsics.
 
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@@ -7707,8 +7711,8 @@ (define_insn "sse4a_vmmovnt<mode>"
 (define_insn "sse4a_extrqi"
   [(set (match_operand:V2DI 0 "register_operand" "=x")
         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
-                      (match_operand 2 "const_int_operand" "")
-                      (match_operand 3 "const_int_operand" "")]
+                      (match_operand 2 "const_0_to_255_operand" "")
+                      (match_operand 3 "const_0_to_255_operand" "")]
                      UNSPEC_EXTRQI))]
   "TARGET_SSE4A"
   "extrq\t{%3, %2, %0|%0, %2, %3}"
@@ -7732,8 +7736,8 @@ (define_insn "sse4a_insertqi"
   [(set (match_operand:V2DI 0 "register_operand" "=x")
         (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "0")
                      (match_operand:V2DI 2 "register_operand" "x")
-                      (match_operand 3 "const_int_operand" "")
-                      (match_operand 4 "const_int_operand" "")]
+                      (match_operand 3 "const_0_to_255_operand" "")
+                      (match_operand 4 "const_0_to_255_operand" "")]
                      UNSPEC_INSERTQI))]
   "TARGET_SSE4A"
   "insertq\t{%4, %3, %2, %0|%0, %2, %3, %4}"
@@ -7766,9 +7770,8 @@ (define_insn "<sse4_1>_blend<ssemodesuff
        (vec_merge:VF
          (match_operand:VF 2 "nonimmediate_operand" "xm,xm")
          (match_operand:VF 1 "register_operand" "0,x")
-         (match_operand:SI 3 "const_int_operand" "")))]
-  "TARGET_SSE4_1
-   && IN_RANGE (INTVAL (operands[3]), 0, (1 << GET_MODE_NUNITS 
(<MODE>mode))-1)"
+         (match_operand:SI 3 "const_0_to_<blendbits>_operand" "")))]
+  "TARGET_SSE4_1"
   "@
    blend<ssemodesuffix>\t{%3, %2, %0|%0, %2, %3}
    vblend<ssemodesuffix>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
@@ -10327,7 +10330,7 @@ (define_expand "vcvtps2ph"
   [(set (match_operand:V8HI 0 "register_operand" "")
        (vec_concat:V8HI
          (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "")
-                       (match_operand:SI 2 "immediate_operand" "")]
+                       (match_operand:SI 2 "const_0_to_255_operand" "")]
                       UNSPEC_VCVTPS2PH)
          (match_dup 3)))]
   "TARGET_F16C"
@@ -10337,7 +10340,7 @@ (define_insn "*vcvtps2ph"
   [(set (match_operand:V8HI 0 "register_operand" "=x")
        (vec_concat:V8HI
          (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "x")
-                       (match_operand:SI 2 "immediate_operand" "N")]
+                       (match_operand:SI 2 "const_0_to_255_operand" "N")]
                       UNSPEC_VCVTPS2PH)
          (match_operand:V4HI 3 "const0_operand" "")))]
   "TARGET_F16C"
@@ -10349,7 +10352,7 @@ (define_insn "*vcvtps2ph"
 (define_insn "*vcvtps2ph_store"
   [(set (match_operand:V4HI 0 "memory_operand" "=m")
        (unspec:V4HI [(match_operand:V4SF 1 "register_operand" "x")
-                     (match_operand:SI 2 "immediate_operand" "N")]
+                     (match_operand:SI 2 "const_0_to_255_operand" "N")]
                     UNSPEC_VCVTPS2PH))]
   "TARGET_F16C"
   "vcvtps2ph\t{%2, %1, %0|%0, %1, %2}"
@@ -10360,7 +10363,7 @@ (define_insn "*vcvtps2ph_store"
 (define_insn "vcvtps2ph256"
   [(set (match_operand:V8HI 0 "nonimmediate_operand" "=xm")
        (unspec:V8HI [(match_operand:V8SF 1 "register_operand" "x")
-                     (match_operand:SI 2 "immediate_operand" "N")]
+                     (match_operand:SI 2 "const_0_to_255_operand" "N")]
                     UNSPEC_VCVTPS2PH))]
   "TARGET_F16C"
   "vcvtps2ph\t{%2, %1, %0|%0, %1, %2}"
--- gcc/testsuite/gcc.target/i386/testimm-1.c.jj        2011-06-17 
13:37:44.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-1.c   2011-06-17 14:01:34.000000000 
+0200
@@ -0,0 +1,94 @@
+/* PR target/49411 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -mf16c -maes -mpclmul" } */
+
+#include <x86intrin.h>
+
+__m128i i1, i2, i3, i4;
+__m128 a1, a2, a3, a4;
+__m128d d1, d2, d3, d4;
+__m256i l1, l2, l3, l4;
+__m256 b1, b2, b3, b4;
+__m256d e1, e2, e3, e4;
+__m64 m1, m2, m3, m4;
+int k1, k2, k3, k4;
+float f1, f2, f3, f4;
+
+void
+test8bit (void)
+{
+  i1 = _mm_cmpistrm (i2, i3, 256);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistri (i2, i3, 256);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistra (i2, i3, 256);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrc (i2, i3, 256);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistro (i2, i3, 256);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrs (i2, i3, 256);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrz (i2, i3, 256);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  i1 = _mm_cmpestrm (i2, k2, i3, k3, 256);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestri (i2, k2, i3, k3, 256);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestra (i2, k2, i3, k3, 256);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrc (i2, k2, i3, k3, 256);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestro (i2, k2, i3, k3, 256);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrs (i2, k2, i3, k3, 256);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrz (i2, k2, i3, k3, 256);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  b1 = _mm256_blend_ps (b2, b3, 256);    /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  k1 = _cvtss_sh (f1, 256);              /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm256_cvtps_ph (b2, 256);        /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  b1 = _mm256_dp_ps (b2, b3, 256);       /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  e1 = _mm256_permute2f128_pd (e2, e3, 256);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  b1 = _mm256_permute2f128_ps (b2, b3, 256);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  l1 = _mm256_permute2f128_si256 (l2, l3, 256);/* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  b1 = _mm256_permute_ps (b2, 256);      /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_aeskeygenassist_si128 (i2, 256);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  i1 = _mm_blend_epi16 (i2, i3, 256);    /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_clmulepi64_si128 (i2, i3, 256);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  i1 = _mm_cvtps_ph (a1, 256);           /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  d1 = _mm_dp_pd (d2, d3, 256);                  /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  a1 = _mm_dp_ps (a2, a3, 256);                  /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  a1 = _mm_insert_ps (a2, a3, 256);      /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_mpsadbw_epu8 (i2, i3, 256);   /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  a1 = _mm_permute_ps (a2, 256);         /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_slli_si128 (i2, 256);         /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_srli_si128 (i2, 256);         /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+}
+
+void
+test5bit (void)
+{
+  d1 = _mm_cmp_sd (d2, d3, 32);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  a1 = _mm_cmp_ss (a2, a3, 32);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  d1 = _mm_cmp_pd (d2, d3, 32);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  a1 = _mm_cmp_ps (a2, a3, 32);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  e1 = _mm256_cmp_pd (e2, e3, 32);       /* { dg-error "the last argument must 
be a 5-bit immediate" } */
+  b1 = _mm256_cmp_ps (b2, b3, 32);       /* { dg-error "the last argument must 
be a 5-bit immediate" } */
+}
+
+void
+test4bit (void)
+{
+  d1 = _mm_round_pd (d2, 16);            /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  d1 = _mm_round_sd (d2, d3, 16);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_round_ps (a2, 16);            /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_round_ss (a2, a2, 16);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_blend_ps (a2, a3, 16);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  e1 = _mm256_blend_pd (e2, e3, 16);     /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  e1 = _mm256_round_pd (e2, 16);         /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  b1 = _mm256_round_ps (b2, 16);         /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+}
+
+void
+test2bit (void)
+{
+  d1 = _mm_blend_pd (d2, d3, 4);         /* { dg-error "the last argument must 
be a 2-bit immediate" } */
+}
+
+void
+test1bit (void)
+{
+  d1 = _mm256_extractf128_pd (e2, 2);    /* { dg-error "the last argument must 
be a 1-bit immediate" } */
+  a1 = _mm256_extractf128_ps (b2, 2);    /* { dg-error "the last argument must 
be a 1-bit immediate" } */
+  i1 = _mm256_extractf128_si256 (l2, 2);  /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  e1 = _mm256_insertf128_pd (e2, d1, 2);  /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  b1 = _mm256_insertf128_ps (b2, a1, 2);  /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  l1 = _mm256_insertf128_si256 (l2, i1, 2);/* { dg-error "the last argument 
must be a 1-bit immediate" } */
+}
--- gcc/testsuite/gcc.target/i386/testimm-2.c.jj        2011-06-17 
13:37:52.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-2.c   2011-06-17 14:01:38.000000000 
+0200
@@ -0,0 +1,94 @@
+/* PR target/49411 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -mf16c -maes -mpclmul" } */
+
+#include <x86intrin.h>
+
+__m128i i1, i2, i3, i4;
+__m128 a1, a2, a3, a4;
+__m128d d1, d2, d3, d4;
+__m256i l1, l2, l3, l4;
+__m256 b1, b2, b3, b4;
+__m256d e1, e2, e3, e4;
+__m64 m1, m2, m3, m4;
+int k1, k2, k3, k4;
+float f1, f2, f3, f4;
+
+void
+test8bit (void)
+{
+  i1 = _mm_cmpistrm (i2, i3, -10);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistri (i2, i3, -10);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistra (i2, i3, -10);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrc (i2, i3, -10);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistro (i2, i3, -10);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrs (i2, i3, -10);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrz (i2, i3, -10);       /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  i1 = _mm_cmpestrm (i2, k2, i3, k3, -10);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestri (i2, k2, i3, k3, -10);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestra (i2, k2, i3, k3, -10);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrc (i2, k2, i3, k3, -10);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestro (i2, k2, i3, k3, -10);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrs (i2, k2, i3, k3, -10);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrz (i2, k2, i3, k3, -10);/* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  b1 = _mm256_blend_ps (b2, b3, -10);    /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  k1 = _cvtss_sh (f1, -10);              /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm256_cvtps_ph (b2, -10);        /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  b1 = _mm256_dp_ps (b2, b3, -10);       /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  e1 = _mm256_permute2f128_pd (e2, e3, -10);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  b1 = _mm256_permute2f128_ps (b2, b3, -10);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  l1 = _mm256_permute2f128_si256 (l2, l3, -10);/* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  b1 = _mm256_permute_ps (b2, -10);      /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_aeskeygenassist_si128 (i2, -10);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  i1 = _mm_blend_epi16 (i2, i3, -10);    /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_clmulepi64_si128 (i2, i3, -10);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  i1 = _mm_cvtps_ph (a1, -10);           /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  d1 = _mm_dp_pd (d2, d3, -10);                  /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  a1 = _mm_dp_ps (a2, a3, -10);                  /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  a1 = _mm_insert_ps (a2, a3, -10);      /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_mpsadbw_epu8 (i2, i3, -10);   /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  a1 = _mm_permute_ps (a2, -10);         /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_slli_si128 (i2, -10);         /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_srli_si128 (i2, -10);         /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+}
+
+void
+test5bit (void)
+{
+  d1 = _mm_cmp_sd (d2, d3, -7);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  a1 = _mm_cmp_ss (a2, a3, -7);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  d1 = _mm_cmp_pd (d2, d3, -7);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  a1 = _mm_cmp_ps (a2, a3, -7);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  e1 = _mm256_cmp_pd (e2, e3, -7);       /* { dg-error "the last argument must 
be a 5-bit immediate" } */
+  b1 = _mm256_cmp_ps (b2, b3, -7);       /* { dg-error "the last argument must 
be a 5-bit immediate" } */
+}
+
+void
+test4bit (void)
+{
+  d1 = _mm_round_pd (d2, -7);            /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  d1 = _mm_round_sd (d2, d3, -7);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_round_ps (a2, -7);            /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_round_ss (a2, a2, -7);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_blend_ps (a2, a3, -7);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  e1 = _mm256_blend_pd (e2, e3, -7);     /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  e1 = _mm256_round_pd (e2, -7);         /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  b1 = _mm256_round_ps (b2, -7);         /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+}
+
+void
+test2bit (void)
+{
+  d1 = _mm_blend_pd (d2, d3, -1);        /* { dg-error "the last argument must 
be a 2-bit immediate" } */
+}
+
+void
+test1bit (void)
+{
+  d1 = _mm256_extractf128_pd (e2, -1);   /* { dg-error "the last argument must 
be a 1-bit immediate" } */
+  a1 = _mm256_extractf128_ps (b2, -1);   /* { dg-error "the last argument must 
be a 1-bit immediate" } */
+  i1 = _mm256_extractf128_si256 (l2, -1); /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  e1 = _mm256_insertf128_pd (e2, d1, -1); /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  b1 = _mm256_insertf128_ps (b2, a1, -1); /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  l1 = _mm256_insertf128_si256 (l2, i1, -1);/* { dg-error "the last argument 
must be a 1-bit immediate" } */
+}
--- gcc/testsuite/gcc.target/i386/testimm-3.c.jj        2011-06-17 
13:57:41.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-3.c   2011-06-17 14:01:42.000000000 
+0200
@@ -0,0 +1,94 @@
+/* PR target/49411 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -mf16c -maes -mpclmul" } */
+
+#include <x86intrin.h>
+
+__m128i i1, i2, i3, i4;
+__m128 a1, a2, a3, a4;
+__m128d d1, d2, d3, d4;
+__m256i l1, l2, l3, l4;
+__m256 b1, b2, b3, b4;
+__m256d e1, e2, e3, e4;
+__m64 m1, m2, m3, m4;
+int k1, k2, k3, k4;
+float f1, f2, f3, f4;
+
+void
+test8bit (void)
+{
+  i1 = _mm_cmpistrm (i2, i3, k4);        /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistri (i2, i3, k4);        /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistra (i2, i3, k4);        /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrc (i2, i3, k4);        /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistro (i2, i3, k4);        /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrs (i2, i3, k4);        /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpistrz (i2, i3, k4);        /* { dg-error "the third argument 
must be an 8-bit immediate" } */
+  i1 = _mm_cmpestrm (i2, k2, i3, k3, k4); /* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestri (i2, k2, i3, k3, k4); /* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestra (i2, k2, i3, k3, k4); /* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrc (i2, k2, i3, k3, k4); /* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestro (i2, k2, i3, k3, k4); /* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrs (i2, k2, i3, k3, k4); /* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  k1 = _mm_cmpestrz (i2, k2, i3, k3, k4); /* { dg-error "the fifth argument 
must be an 8-bit immediate" } */
+  b1 = _mm256_blend_ps (b2, b3, k4);     /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  k1 = _cvtss_sh (f1, k4);               /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm256_cvtps_ph (b2, k4);         /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  b1 = _mm256_dp_ps (b2, b3, k4);        /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  e1 = _mm256_permute2f128_pd (e2, e3, k4);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  b1 = _mm256_permute2f128_ps (b2, b3, k4);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  l1 = _mm256_permute2f128_si256 (l2, l3, k4);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  b1 = _mm256_permute_ps (b2, k4);       /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_aeskeygenassist_si128 (i2, k4);/* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  i1 = _mm_blend_epi16 (i2, i3, k4);     /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_clmulepi64_si128 (i2, i3, k4); /* { dg-error "the last argument 
must be an 8-bit immediate" } */
+  i1 = _mm_cvtps_ph (a1, k4);            /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  d1 = _mm_dp_pd (d2, d3, k4);           /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  a1 = _mm_dp_ps (a2, a3, k4);           /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  a1 = _mm_insert_ps (a2, a3, k4);       /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  i1 = _mm_mpsadbw_epu8 (i2, i3, k4);    /* { dg-error "the last argument must 
be an 8-bit immediate" } */
+  a1 = _mm_permute_ps (a2, k4);                  /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  i1 = _mm_slli_si128 (i2, k4);                  /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  i1 = _mm_srli_si128 (i2, k4);                  /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+}
+
+void
+test5bit (void)
+{
+  d1 = _mm_cmp_sd (d2, d3, k4);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  a1 = _mm_cmp_ss (a2, a3, k4);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  d1 = _mm_cmp_pd (d2, d3, k4);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  a1 = _mm_cmp_ps (a2, a3, k4);                  /* { dg-error "the last 
argument must be a 5-bit immediate" } */
+  e1 = _mm256_cmp_pd (e2, e3, k4);       /* { dg-error "the last argument must 
be a 5-bit immediate" } */
+  b1 = _mm256_cmp_ps (b2, b3, k4);       /* { dg-error "the last argument must 
be a 5-bit immediate" } */
+}
+
+void
+test4bit (void)
+{
+  d1 = _mm_round_pd (d2, k4);            /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  d1 = _mm_round_sd (d2, d3, k4);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_round_ps (a2, k4);            /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_round_ss (a2, a2, k4);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  a1 = _mm_blend_ps (a2, a3, k4);        /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  e1 = _mm256_blend_pd (e2, e3, k4);     /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  e1 = _mm256_round_pd (e2, k4);         /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+  b1 = _mm256_round_ps (b2, k4);         /* { dg-error "the last argument must 
be a 4-bit immediate" } */
+}
+
+void
+test2bit (void)
+{
+  d1 = _mm_blend_pd (d2, d3, k4);        /* { dg-error "the last argument must 
be a 2-bit immediate" } */
+}
+
+void
+test1bit (void)
+{
+  d1 = _mm256_extractf128_pd (e2, k4);   /* { dg-error "the last argument must 
be a 1-bit immediate" } */
+  a1 = _mm256_extractf128_ps (b2, k4);   /* { dg-error "the last argument must 
be a 1-bit immediate" } */
+  i1 = _mm256_extractf128_si256 (l2, k4); /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  e1 = _mm256_insertf128_pd (e2, d1, k4); /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  b1 = _mm256_insertf128_ps (b2, a1, k4); /* { dg-error "the last argument 
must be a 1-bit immediate" } */
+  l1 = _mm256_insertf128_si256 (l2, i1, k4);/* { dg-error "the last argument 
must be a 1-bit immediate" } */
+}
--- gcc/testsuite/gcc.target/i386/testimm-4.c.jj        2011-06-17 
13:57:49.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-4.c   2011-06-17 14:19:23.000000000 
+0200
@@ -0,0 +1,97 @@
+/* PR target/49411 */
+/* { dg-do assemble } */
+/* { dg-options "-O0 -mf16c -maes -mpclmul" } */
+/* { dg-require-effective-target f16c } */
+/* { dg-require-effective-target vaes } */
+/* { dg-require-effective-target vpclmul } */
+
+#include <x86intrin.h>
+
+__m128i i1, i2, i3, i4;
+__m128 a1, a2, a3, a4;
+__m128d d1, d2, d3, d4;
+__m256i l1, l2, l3, l4;
+__m256 b1, b2, b3, b4;
+__m256d e1, e2, e3, e4;
+__m64 m1, m2, m3, m4;
+int k1, k2, k3, k4;
+float f1, f2, f3, f4;
+
+void
+test8bit (void)
+{
+  i1 = _mm_cmpistrm (i2, i3, 255);
+  k1 = _mm_cmpistri (i2, i3, 255);
+  k1 = _mm_cmpistra (i2, i3, 255);
+  k1 = _mm_cmpistrc (i2, i3, 255);
+  k1 = _mm_cmpistro (i2, i3, 255);
+  k1 = _mm_cmpistrs (i2, i3, 255);
+  k1 = _mm_cmpistrz (i2, i3, 255);
+  i1 = _mm_cmpestrm (i2, k2, i3, k3, 255);
+  k1 = _mm_cmpestri (i2, k2, i3, k3, 255);
+  k1 = _mm_cmpestra (i2, k2, i3, k3, 255);
+  k1 = _mm_cmpestrc (i2, k2, i3, k3, 255);
+  k1 = _mm_cmpestro (i2, k2, i3, k3, 255);
+  k1 = _mm_cmpestrs (i2, k2, i3, k3, 255);
+  k1 = _mm_cmpestrz (i2, k2, i3, k3, 255);
+  b1 = _mm256_blend_ps (b2, b3, 255);
+  k1 = _cvtss_sh (f1, 255);
+  i1 = _mm256_cvtps_ph (b2, 255);
+  b1 = _mm256_dp_ps (b2, b3, 255);
+  e1 = _mm256_permute2f128_pd (e2, e3, 255);
+  b1 = _mm256_permute2f128_ps (b2, b3, 255);
+  l1 = _mm256_permute2f128_si256 (l2, l3, 255);
+  b1 = _mm256_permute_ps (b2, 255);
+  i1 = _mm_aeskeygenassist_si128 (i2, 255);
+  i1 = _mm_blend_epi16 (i2, i3, 255);
+  i1 = _mm_clmulepi64_si128 (i2, i3, 255);
+  i1 = _mm_cvtps_ph (a1, 255);
+  d1 = _mm_dp_pd (d2, d3, 255);
+  a1 = _mm_dp_ps (a2, a3, 255);
+  a1 = _mm_insert_ps (a2, a3, 255);
+  i1 = _mm_mpsadbw_epu8 (i2, i3, 255);
+  a1 = _mm_permute_ps (a2, 255);
+  i1 = _mm_slli_si128 (i2, 255);
+  i1 = _mm_srli_si128 (i2, 255);
+}
+
+void
+test5bit (void)
+{
+  d1 = _mm_cmp_sd (d2, d3, 31);
+  a1 = _mm_cmp_ss (a2, a3, 31);
+  d1 = _mm_cmp_pd (d2, d3, 31);
+  a1 = _mm_cmp_ps (a2, a3, 31);
+  e1 = _mm256_cmp_pd (e2, e3, 31);
+  b1 = _mm256_cmp_ps (b2, b3, 31);
+}
+
+void
+test4bit (void)
+{
+  d1 = _mm_round_pd (d2, 15);
+  d1 = _mm_round_sd (d2, d3, 15);
+  a1 = _mm_round_ps (a2, 15);
+  a1 = _mm_round_ss (a2, a2, 15);
+  a1 = _mm_blend_ps (a2, a3, 15);
+  e1 = _mm256_blend_pd (e2, e3, 15);
+  e1 = _mm256_round_pd (e2, 15);
+  b1 = _mm256_round_ps (b2, 15);
+}
+
+void
+test2bit (void)
+{
+  d1 = _mm_blend_pd (d2, d3, 3);
+}
+
+void
+test1bit (void)
+{
+  d1 = _mm256_extractf128_pd (e2, 1);
+  a1 = _mm256_extractf128_ps (b2, 1);
+  i1 = _mm256_extractf128_si256 (l2, 1);
+  e1 = _mm256_insertf128_pd (e2, d1, 1);
+  b1 = _mm256_insertf128_ps (b2, a1, 1);
+  l1 = _mm256_insertf128_si256 (l2, i1, 1);
+}
--- gcc/testsuite/gcc.target/i386/testimm-5.c.jj        2011-06-17 
13:59:08.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-5.c   2011-06-17 14:19:27.000000000 
+0200
@@ -0,0 +1,8 @@
+/* PR target/49411 */
+/* { dg-do assemble } */
+/* { dg-options "-O2 -mf16c -maes -mpclmul" } */
+/* { dg-require-effective-target f16c } */
+/* { dg-require-effective-target vaes } */
+/* { dg-require-effective-target vpclmul } */
+
+#include "testimm-4.c"
--- gcc/testsuite/gcc.target/i386/testimm-6.c.jj        2011-06-17 
14:00:40.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-6.c   2011-06-17 14:17:18.000000000 
+0200
@@ -0,0 +1,41 @@
+/* PR target/49411 */
+/* { dg-do compile } */
+/* { dg-options "-O0 -mxop" } */
+
+#include <x86intrin.h>
+
+__m128i i1, i2, i3, i4;
+__m128 a1, a2, a3, a4;
+__m128d d1, d2, d3, d4;
+__m256i l1, l2, l3, l4;
+__m256 b1, b2, b3, b4;
+__m256d e1, e2, e3, e4;
+__m64 m1, m2, m3, m4;
+int k1, k2, k3, k4;
+float f1, f2, f3, f4;
+
+void
+test2bit (void)
+{
+  d1 = _mm_permute2_pd (d2, d3, i1, 17);       /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+  e1 = _mm256_permute2_pd (e2, e3, l1, 17);    /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+  a1 = _mm_permute2_ps (a2, a3, i1, 17);       /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+  b1 = _mm256_permute2_ps (b2, b3, l1, 17);    /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+  d1 = _mm_permute2_pd (d2, d3, i1, k4);       /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+  e1 = _mm256_permute2_pd (e2, e3, l1, k4);    /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+  a1 = _mm_permute2_ps (a2, a3, i1, k4);       /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+  b1 = _mm256_permute2_ps (b2, b3, l1, k4);    /* { dg-error "the last 
argument must be a 2-bit immediate" } */
+}
+
+void
+test2args (void)
+{
+  i1 = _mm_extracti_si64 (i2, 256, 0);         /* { dg-error "the next to last 
argument must be an 8-bit immediate" } */
+  i1 = _mm_extracti_si64 (i2, 0, 256);         /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  i1 = _mm_inserti_si64 (i2, i3, 256, 0);      /* { dg-error "the next to last 
argument must be an 8-bit immediate" } */
+  i2 = _mm_inserti_si64 (i2, i3, 0, 256);      /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  i1 = _mm_extracti_si64 (i2, k4, 0);          /* { dg-error "the next to last 
argument must be an 8-bit immediate" } */
+  i1 = _mm_extracti_si64 (i2, 0, k4);          /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+  i1 = _mm_inserti_si64 (i2, i3, k4, 0);       /* { dg-error "the next to last 
argument must be an 8-bit immediate" } */
+  i2 = _mm_inserti_si64 (i2, i3, 0, k4);       /* { dg-error "the last 
argument must be an 8-bit immediate" } */
+}
--- gcc/testsuite/gcc.target/i386/testimm-7.c.jj        2011-06-17 
14:17:04.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-7.c   2011-06-17 14:20:02.000000000 
+0200
@@ -0,0 +1,46 @@
+/* PR target/49411 */
+/* { dg-do assemble } */
+/* { dg-options "-O0 -mxop" } */
+/* { dg-require-effective-target xop } */
+
+#include <x86intrin.h>
+
+__m128i i1, i2, i3, i4;
+__m128 a1, a2, a3, a4;
+__m128d d1, d2, d3, d4;
+__m256i l1, l2, l3, l4;
+__m256 b1, b2, b3, b4;
+__m256d e1, e2, e3, e4;
+__m64 m1, m2, m3, m4;
+int k1, k2, k3, k4;
+float f1, f2, f3, f4;
+
+void
+test2bit (void)
+{
+  d1 = _mm_permute2_pd (d2, d3, i1, 3);
+  e1 = _mm256_permute2_pd (e2, e3, l1, 3);
+  a1 = _mm_permute2_ps (a2, a3, i1, 3);
+  b1 = _mm256_permute2_ps (b2, b3, l1, 3);
+  d1 = _mm_permute2_pd (d2, d3, i1, 0);
+  e1 = _mm256_permute2_pd (e2, e3, l1, 0);
+  a1 = _mm_permute2_ps (a2, a3, i1, 0);
+  b1 = _mm256_permute2_ps (b2, b3, l1, 0);
+}
+
+void
+test2args (void)
+{
+  i1 = _mm_extracti_si64 (i2, 255, 0);
+  i1 = _mm_extracti_si64 (i2, 0, 255);
+  i1 = _mm_inserti_si64 (i2, i3, 255, 0);
+  i2 = _mm_inserti_si64 (i2, i3, 0, 255);
+  i1 = _mm_extracti_si64 (i2, 255, 255);
+  i1 = _mm_extracti_si64 (i2, 255, 255);
+  i1 = _mm_inserti_si64 (i2, i3, 255, 255);
+  i2 = _mm_inserti_si64 (i2, i3, 255, 255);
+  i1 = _mm_extracti_si64 (i2, 0, 0);
+  i1 = _mm_extracti_si64 (i2, 0, 0);
+  i1 = _mm_inserti_si64 (i2, i3, 0, 0);
+  i2 = _mm_inserti_si64 (i2, i3, 0, 0);
+}
--- gcc/testsuite/gcc.target/i386/testimm-8.c.jj        2011-06-17 
14:20:07.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/testimm-8.c   2011-06-17 14:20:12.000000000 
+0200
@@ -0,0 +1,6 @@
+/* PR target/49411 */
+/* { dg-do assemble } */
+/* { dg-options "-O2 -mxop" } */
+/* { dg-require-effective-target xop } */
+
+#include "testimm-7.c"
--- gcc/testsuite/gcc.target/i386/xop-rotate1-int.c.jj  2011-06-17 
11:08:15.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/xop-rotate1-int.c     2011-06-17 
11:08:15.000000000 +0200
@@ -0,0 +1,63 @@
+/* PR target/49411 */
+/* { dg-do run } */
+/* { dg-require-effective-target xop } */
+/* { dg-options "-O2 -mxop" } */
+
+#include "xop-check.h"
+
+#include <x86intrin.h>
+
+extern void abort (void);
+
+union
+{
+  __m128i v;
+  unsigned char c[16];
+  unsigned short s[8];
+  unsigned int i[4];
+  unsigned long long l[2];
+} a, b, c, d;
+
+#define TEST1(F, N, S, SS) \
+do {                                                   \
+  for (i = 0; i < sizeof (a.F) / sizeof (a.F[0]); i++) \
+    a.F[i] = i * 17;                                   \
+  s = _mm_set1_epi##SS (N);                            \
+  b.v = _mm_roti_epi##S (a.v, N);                      \
+  c.v = _mm_rot_epi##S (a.v, s);                       \
+  for (i = 0; i < sizeof (a.F) / sizeof (a.F[0]); i++) \
+    {                                                  \
+      int mask = __CHAR_BIT__ * sizeof (a.F[i]) - 1;   \
+      d.F[i] = a.F[i] << (N & mask);                   \
+      if (N & mask)                                    \
+       d.F[i] |= a.F[i] >> (mask + 1 - (N & mask));    \
+      if (b.F[i] != c.F[i] || b.F[i] != d.F[i])                \
+       abort ();                                       \
+    }                                                  \
+} while (0)
+#define TEST(N) \
+  TEST1 (c, N, 8, 8);                                  \
+  TEST1 (s, N, 16, 16);                                        \
+  TEST1 (i, N, 32, 32);                                        \
+  TEST1 (l, N, 64, 64x)
+
+volatile int n;
+
+static void
+xop_test (void)
+{
+  unsigned int i;
+  __m128i s;
+
+#ifndef NON_CONST
+  TEST (5);
+  TEST (-5);
+  TEST (0);
+  TEST (31);
+#else
+  n = 5; TEST (n);
+  n = -5; TEST (n);
+  n = 0; TEST (n);
+  n = 31; TEST (n);
+#endif
+}
--- gcc/testsuite/gcc.target/i386/xop-rotate2-int.c.jj  2011-06-17 
11:08:15.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/xop-rotate2-int.c     2011-06-17 
11:08:15.000000000 +0200
@@ -0,0 +1,7 @@
+/* PR target/49411 */
+/* { dg-do run } */
+/* { dg-require-effective-target xop } */
+/* { dg-options "-O2 -mxop" } */
+
+#define NON_CONST 1
+#include "xop-rotate1-int.c"

        Jakub

Reply via email to