i386.md (Load+RegOp to Mov+MemOp peephole2): Use SWI mode iterator.
authorUros Bizjak <ubizjak@gmail.com>
Fri, 29 Apr 2016 06:12:47 +0000 (08:12 +0200)
committerUros Bizjak <uros@gcc.gnu.org>
Fri, 29 Apr 2016 06:12:47 +0000 (08:12 +0200)
* config/i386/i386.md (Load+RegOp to Mov+MemOp peephole2):
Use SWI mode iterator.  Use general_reg_operand predicate.
(Load+RegOp to Mov+MemOp peephole2 with vector regs): Split
peephole to MMX and SSE part.  Use mmx_reg_operand and sse_reg_operand
predicates.

From-SVN: r235620

gcc/ChangeLog
gcc/config/i386/i386.md

index 400a65af02a365c2008d0122dc1244378a726d8e..984a7032794ada68a45a48d48511fe7c055df3b4 100644 (file)
@@ -1,3 +1,11 @@
+2016-04-29  Uros Bizjak  <ubizjak@gmail.com>
+
+       * config/i386/i386.md (Load+RegOp to Mov+MemOp peephole2):
+       Use SWI mode iterator.  Use general_reg_operand predicate.
+       (Load+RegOp to Mov+MemOp peephole2 with vector regs): Split
+       peephole to MMX and SSE part.  Use mmx_reg_operand and sse_reg_operand
+       predicates.
+
 2016-04-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/70843
index 6dfb240a25e5abeef6332e25173c596e3cae619e..aef6369f28e099579aecb41cf853138dc2a5319c 100644 (file)
                   (match_op_dup 3 [(match_dup 2) (match_dup 0)]))
              (clobber (reg:CC FLAGS_REG))])])
 
-;; Prefer Load+RegOp to Mov+MemOp.  Watch out for cases when the memory address
-;; refers to the destination of the load!
+;; Prefer Load+RegOp to Mov+MemOp.  Watch out for cases when
+;; the memory address refers to the destination of the load!
 
 (define_peephole2
-  [(set (match_operand:SI 0 "register_operand")
-        (match_operand:SI 1 "register_operand"))
+  [(set (match_operand:SWI 0 "general_reg_operand")
+       (match_operand:SWI 1 "general_reg_operand"))
    (parallel [(set (match_dup 0)
-                   (match_operator:SI 3 "commutative_operator"
-                     [(match_dup 0)
-                      (match_operand:SI 2 "memory_operand")]))
-              (clobber (reg:CC FLAGS_REG))])]
+                  (match_operator:SWI 3 "commutative_operator"
+                    [(match_dup 0)
+                     (match_operand:SWI 2 "memory_operand")]))
+             (clobber (reg:CC FLAGS_REG))])]
   "REGNO (operands[0]) != REGNO (operands[1])
-   && GENERAL_REGNO_P (REGNO (operands[0]))
-   && GENERAL_REGNO_P (REGNO (operands[1]))"
+   && (<MODE>mode != QImode
+       || any_QIreg_operand (operands[1], QImode))"
   [(set (match_dup 0) (match_dup 4))
    (parallel [(set (match_dup 0)
-                   (match_op_dup 3 [(match_dup 0) (match_dup 1)]))
-              (clobber (reg:CC FLAGS_REG))])]
+                  (match_op_dup 3 [(match_dup 0) (match_dup 1)]))
+             (clobber (reg:CC FLAGS_REG))])]
   "operands[4] = replace_rtx (operands[2], operands[0], operands[1], true);")
 
 (define_peephole2
-  [(set (match_operand 0 "register_operand")
-        (match_operand 1 "register_operand"))
+  [(set (match_operand 0 "mmx_reg_operand")
+       (match_operand 1 "mmx_reg_operand"))
    (set (match_dup 0)
-                   (match_operator 3 "commutative_operator"
-                     [(match_dup 0)
-                      (match_operand 2 "memory_operand")]))]
-  "REGNO (operands[0]) != REGNO (operands[1])
-   && ((MMX_REGNO_P (REGNO (operands[0]))
-        && MMX_REGNO_P (REGNO (operands[1]))) 
-       || (SSE_REGNO_P (REGNO (operands[0]))
-           && SSE_REGNO_P (REGNO (operands[1]))))"
+       (match_operator 3 "commutative_operator"
+         [(match_dup 0)
+          (match_operand 2 "memory_operand")]))]
+  "REGNO (operands[0]) != REGNO (operands[1])"
+  [(set (match_dup 0) (match_dup 2))
+   (set (match_dup 0)
+       (match_op_dup 3 [(match_dup 0) (match_dup 1)]))])
+
+(define_peephole2
+  [(set (match_operand 0 "sse_reg_operand")
+       (match_operand 1 "sse_reg_operand"))
+   (set (match_dup 0)
+       (match_operator 3 "commutative_operator"
+         [(match_dup 0)
+          (match_operand 2 "memory_operand")]))]
+  "REGNO (operands[0]) != REGNO (operands[1])"
   [(set (match_dup 0) (match_dup 2))
    (set (match_dup 0)
-        (match_op_dup 3 [(match_dup 0) (match_dup 1)]))])
+       (match_op_dup 3 [(match_dup 0) (match_dup 1)]))])
 
 ; Don't do logical operations with memory outputs
 ;