[PATCH, i386]: Cleanup splitters that call ix86_split_long_move

Uros Bizjak ubizjak@gmail.com
Tue Dec 6 20:00:00 GMT 2016


Hello!

ix86_split_long_move operates on general hard registers only.
Introduce and use predicates that allow only these regs (in addition
to memory and/or immediate operands).

No functional changes.

2016-12-06  Uros Bizjak  <ubizjak@gmail.com>

    * config/i386/predicates.md (general_gr_operand): New predicate.
    * config/i386/i386.md (TImode and DImode push_operand splitter):
    Use general_gr_operand.  Macroize using DWI mode macro.
    (TImode and DImode nonimmediate_operand splitter): Use
    nonimmediate_gr_operand and general_gr_operand.  Macroize using
    DWI mode macro.
    (TF/XF/DFmode push_operand splitter): Use general_gr_operand.
    (TFmode nonimmediate_operand splitter): Use nonimmediate_gr_operand
    and general_gr_operand.
    (XFmode nonimmediate_operand splitter): Ditto.
    (DFmode nonimmediate_operand splitter): Ditto.
    * config/i386/mmx.md (MMXMODE nonimmediate_operand splitter): Ditto.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Committed to mainline SVN.

Uros.
-------------- next part --------------
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 773f29b..f2248a5 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -1749,10 +1749,9 @@
    (set_attr "mode" "<MODE>")])
 
 (define_split
-  [(set (match_operand:TI 0 "push_operand")
-        (match_operand:TI 1 "general_operand"))]
-  "TARGET_64BIT && reload_completed
-   && !SSE_REG_P (operands[1])"
+  [(set (match_operand:DWI 0 "push_operand")
+        (match_operand:DWI 1 "general_gr_operand"))]
+  "reload_completed"
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 
@@ -1814,14 +1813,6 @@
 						   GEN_INT (4)));
 })
 
-(define_split
-  [(set (match_operand:DI 0 "push_operand")
-        (match_operand:DI 1 "general_operand"))]
-  "!TARGET_64BIT && reload_completed
-   && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
-  [(const_int 0)]
-  "ix86_split_long_move (operands); DONE;")
-
 (define_insn "*pushsi2"
   [(set (match_operand:SI 0 "push_operand" "=<")
 	(match_operand:SI 1 "general_no_elim_operand" "ri*m"))]
@@ -2150,14 +2141,6 @@
 	       ]
 	       (const_string "TI")))])
 
-(define_split
-  [(set (match_operand:TI 0 "nonimmediate_operand")
-	(match_operand:TI 1 "general_operand"))]
-  "reload_completed
-   && !SSE_REG_P (operands[0]) && !SSE_REG_P (operands[1])"
-  [(const_int 0)]
-  "ix86_split_long_move (operands); DONE;")
-
 (define_insn "*movdi_internal"
   [(set (match_operand:DI 0 "nonimmediate_operand"
     "=r  ,o  ,r,r  ,r,m ,*y,*y,?*y,?m,?r ,?*Ym,*v,*v,*v,m ,m,?r ,?r,?*Yi,?*Ym,?*Yi,*k,*k ,*r,*m")
@@ -2333,15 +2316,9 @@
 	   (const_string "*")))])
 
 (define_split
-  [(set (match_operand:DI 0 "nonimmediate_operand")
-        (match_operand:DI 1 "general_operand"))]
-  "!TARGET_64BIT && reload_completed
-   && !(MMX_REG_P (operands[0])
-	|| SSE_REG_P (operands[0])
-	|| MASK_REG_P (operands[0]))
-   && !(MMX_REG_P (operands[1])
-	|| SSE_REG_P (operands[1])
-	|| MASK_REG_P (operands[1]))"
+  [(set (match_operand:DWI 0 "nonimmediate_gr_operand")
+        (match_operand:DWI 1 "general_gr_operand"))]
+  "reload_completed"
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 
@@ -3098,12 +3075,11 @@
 
 (define_split
   [(set (match_operand 0 "push_operand")
-	(match_operand 1 "general_operand"))]
+	(match_operand 1 "general_gr_operand"))]
   "reload_completed
    && (GET_MODE (operands[0]) == TFmode
        || GET_MODE (operands[0]) == XFmode
-       || GET_MODE (operands[0]) == DFmode)
-   && !ANY_FP_REG_P (operands[1])"
+       || GET_MODE (operands[0]) == DFmode)"
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 

@@ -3197,10 +3173,9 @@
 	       (const_string "TI")))])
 
 (define_split
-  [(set (match_operand:TF 0 "nonimmediate_operand")
-        (match_operand:TF 1 "general_operand"))]
-  "reload_completed
-   && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))"
+  [(set (match_operand:TF 0 "nonimmediate_gr_operand")
+        (match_operand:TF 1 "general_gr_operand"))]
+  "reload_completed"
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 
@@ -3271,10 +3246,9 @@
 	   (const_string "*")))])
    
 (define_split
-  [(set (match_operand:XF 0 "nonimmediate_operand")
-        (match_operand:XF 1 "general_operand"))]
-  "reload_completed
-   && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))"
+  [(set (match_operand:XF 0 "nonimmediate_gr_operand")
+        (match_operand:XF 1 "general_gr_operand"))]
+  "reload_completed"
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 
@@ -3474,10 +3448,9 @@
 	   (const_string "*")))])
 
 (define_split
-  [(set (match_operand:DF 0 "nonimmediate_operand")
-        (match_operand:DF 1 "general_operand"))]
-  "!TARGET_64BIT && reload_completed
-   && !(ANY_FP_REG_P (operands[0]) || ANY_FP_REG_P (operands[1]))"
+  [(set (match_operand:DF 0 "nonimmediate_gr_operand")
+        (match_operand:DF 1 "general_gr_operand"))]
+  "!TARGET_64BIT && reload_completed"
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 
diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md
index 9992233..37e6a28 100644
--- a/gcc/config/i386/mmx.md
+++ b/gcc/config/i386/mmx.md
@@ -205,11 +205,9 @@
 	   (const_string "DI")))])
 
 (define_split
-  [(set (match_operand:MMXMODE 0 "nonimmediate_operand")
-        (match_operand:MMXMODE 1 "general_operand"))]
-  "!TARGET_64BIT && reload_completed
-   && !(MMX_REG_P (operands[0]) || SSE_REG_P (operands[0]))
-   && !(MMX_REG_P (operands[1]) || SSE_REG_P (operands[1]))"
+  [(set (match_operand:MMXMODE 0 "nonimmediate_gr_operand")
+        (match_operand:MMXMODE 1 "general_gr_operand"))]
+  "!TARGET_64BIT && reload_completed"
   [(const_int 0)]
   "ix86_split_long_move (operands); DONE;")
 
diff --git a/gcc/config/i386/predicates.md b/gcc/config/i386/predicates.md
index 5956690..4c45df6 100644
--- a/gcc/config/i386/predicates.md
+++ b/gcc/config/i386/predicates.md
@@ -38,6 +38,12 @@
     (match_test "GENERAL_REGNO_P (REGNO (op))")
     (match_operand 0 "nonimmediate_operand")))
 
+;; True if the operand is a general operand with GENERAL class register.
+(define_predicate "general_gr_operand"
+  (if_then_else (match_code "reg")
+    (match_test "GENERAL_REGNO_P (REGNO (op))")
+    (match_operand 0 "general_operand")))
+
 ;; True if the operand is an MMX register.
 (define_predicate "mmx_reg_operand"
   (and (match_code "reg")


More information about the Gcc-patches mailing list