sse.md (V16): New mode iterator.
authorUros Bizjak <uros@gcc.gnu.org>
Sat, 16 Apr 2011 08:34:30 +0000 (10:34 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Sat, 16 Apr 2011 08:34:30 +0000 (10:34 +0200)
* config/i386/sse.md (V16): New mode iterator.
(VI1, VI8): Ditto.
(AVXMODEQI, AVXMODEDI): Remove.
(sse2, sse3): New mode attribute.
(mov<mode>): Use V16 mode iterator.
(*mov<mode>_internal): Merge with *avx_mov<mode>_internal.
(push<mode>1): Use V16 mode iterator.
(movmisalign<mode>): Ditto.
(<sse>_movu<ssemodesuffix><avxmodesuffix>): Merge from
<sse>_movu<ssemodesuffix> and avx_movu<ssemodesuffix><avxmodesuffix>.
(*<sse>_movu<ssemodesuffix><avxmodesuffix>): Merge from
*<sse>_movu<ssemodesuffix> and *avx_movu<ssemodesuffix><avxmodesuffix>.
(<sse2>_movdqu<avxmodesuffix>): Merge from sse2_movdqu and
avx_movdqu<avxmodesuffix>.
(*<sse2>_movdqu<avxmodesuffix>): Merge from *sse2_movdqu and
*avx_movdqu<avxmodesuffix>.
(<sse3>_lddqu<avxmodesuffix>) Merge from sse3_lddqu and
avx_lddqu<avxmodesuffix>.
(<sse>_movnt<mode>): Merge with avx_movnt<AVXMODEF2P:mode>.
(<sse2>_movnt<mode>): Merge from sse2_movntv2di and
avx_movnt<AVXMODEDI:mode>.
* config/i386/i386.c (ix86_expand_vector_move_misalign): Update for
renamed sse_movups, sse2_movupd and sse2_movdqu patterns.

testsuite/ChangeLog:

* gcc.target/i386/avx256-unaligned-load-1.c: Update scan patterns.
* gcc.target/i386/avx256-unaligned-load-2.c: Ditto.
* gcc.target/i386/avx256-unaligned-load-3.c: Ditto.
* gcc.target/i386/avx256-unaligned-store-1.c: Ditto.
* gcc.target/i386/avx256-unaligned-store-2.c: Ditto.
* gcc.target/i386/avx256-unaligned-store-3.c: Ditto.

From-SVN: r172580

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/config/i386/sse.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/avx256-unaligned-load-1.c
gcc/testsuite/gcc.target/i386/avx256-unaligned-load-2.c
gcc/testsuite/gcc.target/i386/avx256-unaligned-load-3.c
gcc/testsuite/gcc.target/i386/avx256-unaligned-store-1.c
gcc/testsuite/gcc.target/i386/avx256-unaligned-store-2.c
gcc/testsuite/gcc.target/i386/avx256-unaligned-store-3.c

index 99e1193a6b53441523b8f18143ad08bf1253ed81..e3a583af770ec0826ad9e9d52db0aa095da1ddef 100644 (file)
@@ -1,3 +1,29 @@
+2011-04-16  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/sse.md (V16): New mode iterator.
+       (VI1, VI8): Ditto.
+       (AVXMODEQI, AVXMODEDI): Remove.
+       (sse2, sse3): New mode attribute.
+       (mov<mode>): Use V16 mode iterator.
+       (*mov<mode>_internal): Merge with *avx_mov<mode>_internal.
+       (push<mode>1): Use V16 mode iterator.
+       (movmisalign<mode>): Ditto.
+       (<sse>_movu<ssemodesuffix><avxmodesuffix>): Merge from
+       <sse>_movu<ssemodesuffix> and avx_movu<ssemodesuffix><avxmodesuffix>.
+       (*<sse>_movu<ssemodesuffix><avxmodesuffix>): Merge from
+       *<sse>_movu<ssemodesuffix> and *avx_movu<ssemodesuffix><avxmodesuffix>.
+       (<sse2>_movdqu<avxmodesuffix>): Merge from sse2_movdqu and
+       avx_movdqu<avxmodesuffix>.
+       (*<sse2>_movdqu<avxmodesuffix>): Merge from *sse2_movdqu and
+       *avx_movdqu<avxmodesuffix>.
+       (<sse3>_lddqu<avxmodesuffix>) Merge from sse3_lddqu and
+       avx_lddqu<avxmodesuffix>.
+       (<sse>_movnt<mode>): Merge with avx_movnt<AVXMODEF2P:mode>.
+       (<sse2>_movnt<mode>): Merge from sse2_movntv2di and
+       avx_movnt<AVXMODEDI:mode>.
+       * config/i386/i386.c (ix86_expand_vector_move_misalign): Update for
+       renamed sse_movups, sse2_movupd and sse2_movdqu patterns.
+
 2011-04-16  Bernd Schmidt  <bernds@codesourcery.com>
 
        PR target/48629
@@ -24,8 +50,8 @@
        * gimple.h (enum gf_mask): Add GF_CALL_ALLOCA_FOR_VAR.
        (gimple_call_set_alloca_for_var): New inline function.
        (gimple_call_alloca_for_var_p): Ditto.
-       * gimple.c (gimple_build_call_from_tree): Remember CALL_ALLOCA_FOR_VAR_P
-       state.
+       * gimple.c (gimple_build_call_from_tree): Remember
+       CALL_ALLOCA_FOR_VAR_P state.
        * cfgexpand.c (expand_call_stmt): Restore CALL_ALLOCA_FOR_VAR_P state.
 
        * tree-inline.c (inline_forbidden_p_stmt): Don't reject alloca
        -fsched-pressure.
 
 2011-04-15  Georg-Johann Lay  <avr@gjlay.de>
-       
+
        * config/avr/avr.md ("rotl<mode>3",mode=HIDI): Use match_dup
        instead of match_operand for operand 3.
 
index 62187021e8aeb967db2d7228cea9e45d19acd370..36320d8434e2e83db948df3869c61905f6bd2c9e 100644 (file)
@@ -15769,12 +15769,12 @@ ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
                {
                  op0 = gen_lowpart (V4SFmode, op0);
                  op1 = gen_lowpart (V4SFmode, op1);
-                 emit_insn (gen_avx_movups (op0, op1));
+                 emit_insn (gen_sse_movups (op0, op1));
                  return;
                }
              op0 = gen_lowpart (V16QImode, op0);
              op1 = gen_lowpart (V16QImode, op1);
-             emit_insn (gen_avx_movdqu (op0, op1));
+             emit_insn (gen_sse2_movdqu (op0, op1));
              break;
            case 32:
              op0 = gen_lowpart (V32QImode, op0);
@@ -15792,7 +15792,7 @@ ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
          switch (mode)
            {
            case V4SFmode:
-             emit_insn (gen_avx_movups (op0, op1));
+             emit_insn (gen_sse_movups (op0, op1));
              break;
            case V8SFmode:
              ix86_avx256_split_vector_move_misalign (op0, op1);
@@ -15802,10 +15802,10 @@ ix86_expand_vector_move_misalign (enum machine_mode mode, rtx operands[])
                {
                  op0 = gen_lowpart (V4SFmode, op0);
                  op1 = gen_lowpart (V4SFmode, op1);
-                 emit_insn (gen_avx_movups (op0, op1));
+                 emit_insn (gen_sse_movups (op0, op1));
                  return;
                }
-             emit_insn (gen_avx_movupd (op0, op1));
+             emit_insn (gen_sse2_movupd (op0, op1));
              break;
            case V4DFmode:
              ix86_avx256_split_vector_move_misalign (op0, op1);
index fabd35b184eda1952670a5edce50922742443c34..40e39725af56d1fe52ddbd1091d6cecb44536be3 100644 (file)
 ;; along with GCC; see the file COPYING3.  If not see
 ;; <http://www.gnu.org/licenses/>.
 
+;; All vector modes including V1TImode.
+(define_mode_iterator V16
+  [(V32QI "TARGET_AVX") V16QI
+   (V16HI "TARGET_AVX") V8HI
+   (V8SI "TARGET_AVX") V4SI
+   (V4DI "TARGET_AVX") V2DI
+   V1TI
+   (V8SF "TARGET_AVX") V4SF
+   (V4DF "TARGET_AVX") V2DF])
 
 ;; All vector float modes
 (define_mode_iterator VF
    (V8SI "TARGET_AVX") V4SI
    (V4DI "TARGET_AVX") V2DI])
 
+;; All QImode vector integer modes
+(define_mode_iterator VI1
+  [(V32QI "TARGET_AVX") V16QI])
+
+;; All DImode vector integer modes
+(define_mode_iterator VI8
+  [(V4DI "TARGET_AVX") V2DI])
+
 ;; All 128bit vector integer modes
 (define_mode_iterator VI_128 [V16QI V8HI V4SI V2DI])
 
 
 ;; All 16-byte vector modes handled by SSE
 (define_mode_iterator SSEMODE [V16QI V8HI V4SI V2DI V4SF V2DF])
-(define_mode_iterator SSEMODE16 [V16QI V8HI V4SI V2DI V1TI V4SF V2DF])
 
 ;; All 32-byte vector modes handled by AVX
 (define_mode_iterator AVX256MODE [V32QI V16HI V8SI V4DI V8SF V4DF])
 
-;; All QI vector modes handled by AVX
-(define_mode_iterator AVXMODEQI [V32QI V16QI])
-
-;; All DI vector modes handled by AVX
-(define_mode_iterator AVXMODEDI [V4DI V2DI])
-
 ;; All vector modes handled by AVX
 (define_mode_iterator AVXMODE
   [V16QI V8HI V4SI V2DI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
-(define_mode_iterator AVXMODE16
-  [V16QI V8HI V4SI V2DI V1TI V4SF V2DF V32QI V16HI V8SI V4DI V8SF V4DF])
 
 ;; Mix-n-match
 (define_mode_iterator SSEMODE124 [V16QI V8HI V4SI])
 ;; Modes handled by storent patterns.
 (define_mode_iterator STORENT_MODE
   [(SF "TARGET_SSE4A") (DF "TARGET_SSE4A")
-   (SI "TARGET_SSE2") (V2DI "TARGET_SSE2") (V2DF "TARGET_SSE2")
-   (V4SF "TARGET_SSE")
+   (SI "TARGET_SSE2") (V2DI "TARGET_SSE2")
+   (V4SF "TARGET_SSE") (V2DF "TARGET_SSE2")
    (V4DF "TARGET_AVX") (V8SF "TARGET_AVX")])
 
 ;; Modes handled by vector extract patterns.
    (V4SF "sse") (V2DF "sse2")
    (V8SF "avx") (V4DF "avx")])
 
+(define_mode_attr sse2
+  [(V16QI "sse2") (V32QI "avx")
+   (V2DI "sse2") (V4DI "avx")])
+
+(define_mode_attr sse3
+  [(V16QI "sse3") (V32QI "avx")])
+
 (define_mode_attr sse4_1
   [(V4SF "sse4_1") (V2DF "sse4_1")
    (V8SF "avx") (V4DF "avx")])
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
+;; All of these patterns are enabled for SSE1 as well as SSE2.
+;; This is essential for maintaining stable calling conventions.
+
 (define_expand "mov<mode>"
-  [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
-       (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
-  "TARGET_AVX"
+  [(set (match_operand:V16 0 "nonimmediate_operand" "")
+       (match_operand:V16 1 "nonimmediate_operand" ""))]
+  "TARGET_SSE"
 {
   ix86_expand_vector_move (<MODE>mode, operands);
   DONE;
 })
 
-(define_insn "*avx_mov<mode>_internal"
-  [(set (match_operand:AVXMODE16 0 "nonimmediate_operand" "=x,x ,m")
-       (match_operand:AVXMODE16 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
-  "TARGET_AVX
+(define_insn "*mov<mode>_internal"
+  [(set (match_operand:V16 0 "nonimmediate_operand" "=x,x ,m")
+       (match_operand:V16 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
+  "TARGET_SSE
    && (register_operand (operands[0], <MODE>mode)
        || register_operand (operands[1], <MODE>mode))"
 {
         {
        case MODE_V8SF:
        case MODE_V4SF:
-         if (misaligned_operand (operands[0], <MODE>mode)
-             || misaligned_operand (operands[1], <MODE>mode))
+         if (TARGET_AVX
+             && (misaligned_operand (operands[0], <MODE>mode)
+                 || misaligned_operand (operands[1], <MODE>mode)))
            return "vmovups\t{%1, %0|%0, %1}";
          else
-           return "vmovaps\t{%1, %0|%0, %1}";
+           return "%vmovaps\t{%1, %0|%0, %1}";
+
        case MODE_V4DF:
        case MODE_V2DF:
-         if (misaligned_operand (operands[0], <MODE>mode)
-             || misaligned_operand (operands[1], <MODE>mode))
+         if (TARGET_AVX
+             && (misaligned_operand (operands[0], <MODE>mode)
+                 || misaligned_operand (operands[1], <MODE>mode)))
            return "vmovupd\t{%1, %0|%0, %1}";
          else if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
-           return "vmovaps\t{%1, %0|%0, %1}";
+           return "%vmovaps\t{%1, %0|%0, %1}";
          else
-           return "vmovapd\t{%1, %0|%0, %1}";
-       default:
-         if (misaligned_operand (operands[0], <MODE>mode)
-             || misaligned_operand (operands[1], <MODE>mode))
+           return "%vmovapd\t{%1, %0|%0, %1}";
+
+       case MODE_OI:
+       case MODE_TI:
+         if (TARGET_AVX
+             && (misaligned_operand (operands[0], <MODE>mode)
+                 || misaligned_operand (operands[1], <MODE>mode)))
            return "vmovdqu\t{%1, %0|%0, %1}";
          else if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
-           return "vmovaps\t{%1, %0|%0, %1}";
+           return "%vmovaps\t{%1, %0|%0, %1}";
          else
-           return "vmovdqa\t{%1, %0|%0, %1}";
-       }
-    default:
-      gcc_unreachable ();
-    }
-}
-  [(set_attr "type" "sselog1,ssemov,ssemov")
-   (set_attr "prefix" "vex")
-   (set_attr "mode" "<avxvecmode>")])
-
-;; All of these patterns are enabled for SSE1 as well as SSE2.
-;; This is essential for maintaining stable calling conventions.
-
-(define_expand "mov<mode>"
-  [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
-       (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
-  "TARGET_SSE"
-{
-  ix86_expand_vector_move (<MODE>mode, operands);
-  DONE;
-})
+           return "%vmovdqa\t{%1, %0|%0, %1}";
 
-(define_insn "*mov<mode>_internal"
-  [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "=x,x ,m")
-       (match_operand:SSEMODE16 1 "nonimmediate_or_sse_const_operand"  "C ,xm,x"))]
-  "TARGET_SSE
-   && (register_operand (operands[0], <MODE>mode)
-       || register_operand (operands[1], <MODE>mode))"
-{
-  switch (which_alternative)
-    {
-    case 0:
-      return standard_sse_constant_opcode (insn, operands[1]);
-    case 1:
-    case 2:
-      switch (get_attr_mode (insn))
-       {
-       case MODE_V4SF:
-         return "movaps\t{%1, %0|%0, %1}";
-       case MODE_V2DF:
-         if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
-           return "movaps\t{%1, %0|%0, %1}";
-         else
-           return "movapd\t{%1, %0|%0, %1}";
        default:
-         if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL)
-           return "movaps\t{%1, %0|%0, %1}";
-         else
-           return "movdqa\t{%1, %0|%0, %1}";
+         gcc_unreachable ();
        }
     default:
       gcc_unreachable ();
     }
 }
   [(set_attr "type" "sselog1,ssemov,ssemov")
+   (set_attr "prefix" "maybe_vex")
    (set (attr "mode")
-       (cond [(ior (ior (ne (symbol_ref "optimize_function_for_size_p (cfun)") (const_int 0))
-                        (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
+       (cond [(ne (symbol_ref "TARGET_AVX") (const_int 0))
+                (const_string "<avxvecmode>")
+              (ior (ior
+                     (ne (symbol_ref "optimize_function_for_size_p (cfun)")
+                         (const_int 0))
+                     (eq (symbol_ref "TARGET_SSE2") (const_int 0)))
                    (and (eq_attr "alternative" "2")
                         (ne (symbol_ref "TARGET_SSE_TYPELESS_STORES")
                             (const_int 0))))
              ]
          (const_string "TI")))])
 
+(define_insn "sse2_movq128"
+  [(set (match_operand:V2DI 0 "register_operand" "=x")
+       (vec_concat:V2DI
+         (vec_select:DI
+           (match_operand:V2DI 1 "nonimmediate_operand" "xm")
+           (parallel [(const_int 0)]))
+         (const_int 0)))]
+  "TARGET_SSE2"
+  "%vmovq\t{%1, %0|%0, %1}"
+  [(set_attr "type" "ssemov")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "TI")])
+
 ;; Move a DI from a 32-bit register pair (e.g. %edx:%eax) to an xmm.
 ;; We'd rather avoid this entirely; if the 32-bit reg pair was loaded
 ;; from memory, we'd prefer to load the memory directly into the %xmm
 })
 
 (define_expand "push<mode>1"
-  [(match_operand:AVX256MODE 0 "register_operand" "")]
-  "TARGET_AVX"
-{
-  ix86_expand_push (<MODE>mode, operands[0]);
-  DONE;
-})
-
-(define_expand "push<mode>1"
-  [(match_operand:SSEMODE16 0 "register_operand" "")]
+  [(match_operand:V16 0 "register_operand" "")]
   "TARGET_SSE"
 {
   ix86_expand_push (<MODE>mode, operands[0]);
 })
 
 (define_expand "movmisalign<mode>"
-  [(set (match_operand:AVX256MODE 0 "nonimmediate_operand" "")
-       (match_operand:AVX256MODE 1 "nonimmediate_operand" ""))]
-  "TARGET_AVX"
-{
-  ix86_expand_vector_move_misalign (<MODE>mode, operands);
-  DONE;
-})
-
-(define_expand "movmisalign<mode>"
-  [(set (match_operand:SSEMODE16 0 "nonimmediate_operand" "")
-       (match_operand:SSEMODE16 1 "nonimmediate_operand" ""))]
+  [(set (match_operand:V16 0 "nonimmediate_operand" "")
+       (match_operand:V16 1 "nonimmediate_operand" ""))]
   "TARGET_SSE"
 {
   ix86_expand_vector_move_misalign (<MODE>mode, operands);
   DONE;
 })
 
-(define_expand "avx_movu<ssemodesuffix><avxmodesuffix>"
-  [(set (match_operand:AVXMODEF2P 0 "nonimmediate_operand" "")
-       (unspec:AVXMODEF2P
-         [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "")]
+(define_expand "<sse>_movu<ssemodesuffix><avxmodesuffix>"
+  [(set (match_operand:VF 0 "nonimmediate_operand" "")
+       (unspec:VF
+         [(match_operand:VF 1 "nonimmediate_operand" "")]
          UNSPEC_MOVU))]
-  "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
+  ""
 {
   if (MEM_P (operands[0]) && MEM_P (operands[1]))
     operands[1] = force_reg (<MODE>mode, operands[1]);
 })
 
-(define_insn "*avx_movu<ssemodesuffix><avxmodesuffix>"
-  [(set (match_operand:AVXMODEF2P 0 "nonimmediate_operand" "=x,m")
-       (unspec:AVXMODEF2P
-         [(match_operand:AVXMODEF2P 1 "nonimmediate_operand" "xm,x")]
+(define_insn "*<sse>_movu<ssemodesuffix><avxmodesuffix>"
+  [(set (match_operand:VF 0 "nonimmediate_operand" "=x,m")
+       (unspec:VF
+         [(match_operand:VF 1 "nonimmediate_operand" "xm,x")]
          UNSPEC_MOVU))]
-  "AVX_VEC_FLOAT_MODE_P (<MODE>mode)
-   && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
-  "vmovu<ssemodesuffix>\t{%1, %0|%0, %1}"
+  "!(MEM_P (operands[0]) && MEM_P (operands[1]))"
+  "%vmovu<ssemodesuffix>\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssemov")
    (set_attr "movu" "1")
-   (set_attr "prefix" "vex")
-   (set_attr "mode" "<MODE>")])
-
-(define_insn "sse2_movq128"
-  [(set (match_operand:V2DI 0 "register_operand" "=x")
-       (vec_concat:V2DI
-         (vec_select:DI
-           (match_operand:V2DI 1 "nonimmediate_operand" "xm")
-           (parallel [(const_int 0)]))
-         (const_int 0)))]
-  "TARGET_SSE2"
-  "%vmovq\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
    (set_attr "prefix" "maybe_vex")
-   (set_attr "mode" "TI")])
-
-(define_expand "<sse>_movu<ssemodesuffix>"
-  [(set (match_operand:SSEMODEF2P 0 "nonimmediate_operand" "")
-       (unspec:SSEMODEF2P
-         [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "")]
-         UNSPEC_MOVU))]
-  "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
-{
-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
-    operands[1] = force_reg (<MODE>mode, operands[1]);
-})
-
-(define_insn "*<sse>_movu<ssemodesuffix>"
-  [(set (match_operand:SSEMODEF2P 0 "nonimmediate_operand" "=x,m")
-       (unspec:SSEMODEF2P
-         [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "xm,x")]
-         UNSPEC_MOVU))]
-  "SSE_VEC_FLOAT_MODE_P (<MODE>mode)
-   && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
-  "movu<ssemodesuffix>\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "movu" "1")
    (set_attr "mode" "<MODE>")])
 
-(define_expand "avx_movdqu<avxmodesuffix>"
-  [(set (match_operand:AVXMODEQI 0 "nonimmediate_operand" "")
-       (unspec:AVXMODEQI
-         [(match_operand:AVXMODEQI 1 "nonimmediate_operand" "")]
-         UNSPEC_MOVU))]
-  "TARGET_AVX"
+(define_expand "<sse2>_movdqu<avxmodesuffix>"
+  [(set (match_operand:VI1 0 "nonimmediate_operand" "")
+       (unspec:VI1 [(match_operand:VI1 1 "nonimmediate_operand" "")]
+                   UNSPEC_MOVU))]
+  "TARGET_SSE2"
 {
   if (MEM_P (operands[0]) && MEM_P (operands[1]))
     operands[1] = force_reg (<MODE>mode, operands[1]);
 })
 
-(define_insn "*avx_movdqu<avxmodesuffix>"
-  [(set (match_operand:AVXMODEQI 0 "nonimmediate_operand" "=x,m")
-       (unspec:AVXMODEQI
-         [(match_operand:AVXMODEQI 1 "nonimmediate_operand" "xm,x")]
-         UNSPEC_MOVU))]
-  "TARGET_AVX && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
-  "vmovdqu\t{%1, %0|%0, %1}"
+(define_insn "*<sse2>_movdqu<avxmodesuffix>"
+  [(set (match_operand:VI1 0 "nonimmediate_operand" "=x,m")
+       (unspec:VI1 [(match_operand:VI1 1 "nonimmediate_operand" "xm,x")]
+                   UNSPEC_MOVU))]
+  "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
+  "%vmovdqu\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssemov")
    (set_attr "movu" "1")
-   (set_attr "prefix" "vex")
+   (set (attr "prefix_data16")
+     (if_then_else
+       (ne (symbol_ref "TARGET_AVX") (const_int 0))
+     (const_string "*")
+     (const_string "1")))
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<avxvecmode>")])
 
-(define_expand "sse2_movdqu"
-  [(set (match_operand:V16QI 0 "nonimmediate_operand" "")
-       (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "")]
-                     UNSPEC_MOVU))]
-  "TARGET_SSE2"
-{
-  if (MEM_P (operands[0]) && MEM_P (operands[1]))
-    operands[1] = force_reg (V16QImode, operands[1]);
-})
-
-(define_insn "*sse2_movdqu"
-  [(set (match_operand:V16QI 0 "nonimmediate_operand" "=x,m")
-       (unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "xm,x")]
-                     UNSPEC_MOVU))]
-  "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
-  "movdqu\t{%1, %0|%0, %1}"
+(define_insn "<sse3>_lddqu<avxmodesuffix>"
+  [(set (match_operand:VI1 0 "register_operand" "=x")
+       (unspec:VI1 [(match_operand:VI1 1 "memory_operand" "m")]
+                   UNSPEC_LDDQU))]
+  "TARGET_SSE3"
+  "%vlddqu\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssemov")
    (set_attr "movu" "1")
-   (set_attr "prefix_data16" "1")
-   (set_attr "mode" "TI")])
-
-(define_insn "avx_movnt<mode>"
-  [(set (match_operand:AVXMODEF2P 0 "memory_operand" "=m")
-       (unspec:AVXMODEF2P
-         [(match_operand:AVXMODEF2P 1 "register_operand" "x")]
-         UNSPEC_MOVNT))]
-  "AVX_VEC_FLOAT_MODE_P (<MODE>mode)"
-  "vmovnt<ssemodesuffix>\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "prefix" "vex")
-   (set_attr "mode" "<MODE>")])
-
-(define_insn "<sse>_movnt<mode>"
-  [(set (match_operand:SSEMODEF2P 0 "memory_operand" "=m")
-       (unspec:SSEMODEF2P
-         [(match_operand:SSEMODEF2P 1 "register_operand" "x")]
-         UNSPEC_MOVNT))]
-  "SSE_VEC_FLOAT_MODE_P (<MODE>mode)"
-  "movnt<ssemodesuffix>\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "mode" "<MODE>")])
-
-(define_insn "avx_movnt<mode>"
-  [(set (match_operand:AVXMODEDI 0 "memory_operand" "=m")
-       (unspec:AVXMODEDI
-         [(match_operand:AVXMODEDI 1 "register_operand" "x")]
-         UNSPEC_MOVNT))]
-  "TARGET_AVX"
-  "vmovntdq\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssecvt")
-   (set_attr "prefix" "vex")
+   (set (attr "prefix_data16")
+     (if_then_else
+       (ne (symbol_ref "TARGET_AVX") (const_int 0))
+     (const_string "*")
+     (const_string "0")))
+   (set (attr "prefix_rep")
+     (if_then_else
+       (ne (symbol_ref "TARGET_AVX") (const_int 0))
+     (const_string "*")
+     (const_string "1")))
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<avxvecmode>")])
 
-(define_insn "sse2_movntv2di"
-  [(set (match_operand:V2DI 0 "memory_operand" "=m")
-       (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x")]
-                    UNSPEC_MOVNT))]
-  "TARGET_SSE2"
-  "movntdq\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "prefix_data16" "1")
-   (set_attr "mode" "TI")])
-
 (define_insn "sse2_movntsi"
   [(set (match_operand:SI 0 "memory_operand" "=m")
        (unspec:SI [(match_operand:SI 1 "register_operand" "r")]
    (set_attr "prefix_data16" "0")
    (set_attr "mode" "V2DF")])
 
-(define_insn "avx_lddqu<avxmodesuffix>"
-  [(set (match_operand:AVXMODEQI 0 "register_operand" "=x")
-       (unspec:AVXMODEQI
-         [(match_operand:AVXMODEQI 1 "memory_operand" "m")]
-         UNSPEC_LDDQU))]
-  "TARGET_AVX"
-  "vlddqu\t{%1, %0|%0, %1}"
+(define_insn "<sse>_movnt<mode>"
+  [(set (match_operand:VF 0 "memory_operand" "=m")
+       (unspec:VF [(match_operand:VF 1 "register_operand" "x")]
+                  UNSPEC_MOVNT))]
+  "TARGET_SSE"
+  "%vmovnt<ssemodesuffix>\t{%1, %0|%0, %1}"
+  [(set_attr "type" "ssemov")
+   (set_attr "prefix" "maybe_vex")
+   (set_attr "mode" "<MODE>")])
+
+(define_insn "<sse2>_movnt<mode>"
+  [(set (match_operand:VI8 0 "memory_operand" "=m")
+       (unspec:VI8 [(match_operand:VI8 1 "register_operand" "x")]
+                   UNSPEC_MOVNT))]
+  "TARGET_SSE2"
+  "%vmovntdq\t{%1, %0|%0, %1}"
   [(set_attr "type" "ssecvt")
-   (set_attr "movu" "1")
-   (set_attr "prefix" "vex")
+   (set (attr "prefix_data16")
+     (if_then_else
+       (ne (symbol_ref "TARGET_AVX") (const_int 0))
+     (const_string "*")
+     (const_string "1")))
+   (set_attr "prefix" "maybe_vex")
    (set_attr "mode" "<avxvecmode>")])
 
-(define_insn "sse3_lddqu"
-  [(set (match_operand:V16QI 0 "register_operand" "=x")
-       (unspec:V16QI [(match_operand:V16QI 1 "memory_operand" "m")]
-                     UNSPEC_LDDQU))]
-  "TARGET_SSE3"
-  "lddqu\t{%1, %0|%0, %1}"
-  [(set_attr "type" "ssemov")
-   (set_attr "movu" "1")
-   (set_attr "prefix_data16" "0")
-   (set_attr "prefix_rep" "1")
-   (set_attr "mode" "TI")])
-
 ; Expand patterns for non-temporal stores.  At the moment, only those
 ; that directly map to insns are defined; it would be possible to
 ; define patterns for other modes that would expand to several insns.
index ea66b492b77abc12733fb4f5999175e0e83c7164..97613c6b29b7c82b40d7ee22ee06ba11120a6efb 100644 (file)
@@ -1,3 +1,12 @@
+2011-04-16  Uros Bizjak  <ubizjak@gmail.com>
+
+       * gcc.target/i386/avx256-unaligned-load-1.c: Update scan patterns.
+       * gcc.target/i386/avx256-unaligned-load-2.c: Ditto.
+       * gcc.target/i386/avx256-unaligned-load-3.c: Ditto.
+       * gcc.target/i386/avx256-unaligned-store-1.c: Ditto.
+       * gcc.target/i386/avx256-unaligned-store-2.c: Ditto.
+       * gcc.target/i386/avx256-unaligned-store-3.c: Ditto.
+
 2011-04-15  Jason Merrill  <jason@redhat.com>
 
        * g++.dg/cpp0x/range-for17.C: New.
 2011-04-15  Nicola Pero  <nicola.pero@meta-innovation.com>
 
        * objc.dg/naming-4.m: Updated.
-       * objc.dg/naming-5.m: Updated.  
+       * objc.dg/naming-5.m: Updated.
        * objc.dg/naming-6.m: New.
-       * objc.dg/naming-7.m: New.      
+       * objc.dg/naming-7.m: New.
        * obj-c++.dg/naming-1.mm: Updated.
        * obj-c++.dg/naming-2.mm: Updated.
        * obj-c++.dg/naming-3.mm: New.
        * obj-c++.dg/naming-4.mm: New.
-       
+
 2011-04-15  Jerry DeLisle  <jvdelisle@gcc.gnu.org>
 
        PR libgfortran/48589
index 023e859b6c1dd21fbb3f4488cca171d889e8a11f..c909b9402ccdf77207e2e5ebbf47f89cedbe6cb1 100644 (file)
@@ -15,5 +15,5 @@ avx_test (void)
 }
 
 /* { dg-final { scan-assembler-not "\\*avx_movups256/1" } } */
-/* { dg-final { scan-assembler "\\*avx_movups/1" } } */
+/* { dg-final { scan-assembler "\\*sse_movups/1" } } */
 /* { dg-final { scan-assembler "vinsertf128" } } */
index 8394e27197b260bd5a17c16600ab8fea47cdbb75..7d188e2b4665322e11d6d53535ddd95bf296c0dd 100644 (file)
@@ -25,5 +25,5 @@ avx_test (void)
 }
 
 /* { dg-final { scan-assembler-not "\\*avx_movdqu256/1" } } */
-/* { dg-final { scan-assembler "\\*avx_movdqu/1" } } */
+/* { dg-final { scan-assembler "\\*sse2_movdqu/1" } } */
 /* { dg-final { scan-assembler "vinsertf128" } } */
index ec7d59d53ccee2cd650ccbea3922731d62002fde..670305423fe85e5f27f57b8b7a2ab128fcdeba81 100644 (file)
@@ -15,5 +15,5 @@ avx_test (void)
 }
 
 /* { dg-final { scan-assembler-not "\\*avx_movupd256/1" } } */
-/* { dg-final { scan-assembler "\\*avx_movupd/1" } } */
+/* { dg-final { scan-assembler "\\*sse2_movupd/1" } } */
 /* { dg-final { scan-assembler "vinsertf128" } } */
index 99db55c9d0add311851722e2ab7e4e787606d5a2..6af02a2202b6cc12515bd075be3d013105ca331e 100644 (file)
@@ -18,5 +18,5 @@ avx_test (void)
 }
 
 /* { dg-final { scan-assembler-not "\\*avx_movups256/2" } } */
-/* { dg-final { scan-assembler "movups.*\\*avx_movv4sf_internal/3" } } */
+/* { dg-final { scan-assembler "vmovups.*\\*movv4sf_internal/3" } } */
 /* { dg-final { scan-assembler "vextractf128" } } */
index 38ee9e2a45c5a11e4187213b16b35370a0f4fa65..d8ae5a9018978c9afcfa0f26743aaa93aa60f90a 100644 (file)
@@ -25,5 +25,5 @@ avx_test (void)
 }
 
 /* { dg-final { scan-assembler-not "\\*avx_movdqu256/2" } } */
-/* { dg-final { scan-assembler "movdqu.*\\*avx_movv16qi_internal/3" } } */
+/* { dg-final { scan-assembler "vmovdqu.*\\*movv16qi_internal/3" } } */
 /* { dg-final { scan-assembler "vextractf128" } } */
index eaab6fd775b94b980ee5c528d922ba8634d988a9..65e820444e4255e386e0972f1a30c6a1c3ae496b 100644 (file)
@@ -18,5 +18,5 @@ avx_test (void)
 }
 
 /* { dg-final { scan-assembler-not "\\*avx_movupd256/2" } } */
-/* { dg-final { scan-assembler "movupd.*\\*avx_movv2df_internal/3" } } */
+/* { dg-final { scan-assembler "vmovupd.*\\*movv2df_internal/3" } } */
 /* { dg-final { scan-assembler "vextractf128" } } */