This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[committed] Consolidate movsd and movmd patterns/splitters for H8


So the H8 port has movmd and movsd instructions which are used to
implement block moves and stpcpy.  Those expanders and patters are
necessarily fairly ugly, but not enough to warrant trying to simplify.

What is worth simplifying is the fact that we have two copies of each
pattern and splitter because Pmode varies.  This patch uses the P mode
iterator to consolidate the patterns & splitters that only differed in
the modes they used for the pointer operands.

The resulting code for libgcc & newlib is unchanged.

Installed on the trunk.

Jeff
	* config/h8300/h8300.md (movmd_internal_normal): Consolidated with
	(movmd_internal) into a single pattern using the P mode iterator.
	(movmd splitters): Similarly.
	(stpcpy_internal_normal, stpcpy_internal): Similarly for thes patterns.
	(movsd splitters): Similarly.
	

diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index 5014fd5..e654784 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -512,33 +512,16 @@
 ;; This is a difficult instruction to reload since operand 0 must be the
 ;; frame pointer.  See h8300_reg_class_from_letter for an explanation.
 
-(define_insn "movmd_internal_normal"
-  [(set (mem:BLK (match_operand:HI 3 "register_operand" "0,r"))
-	(mem:BLK (match_operand:HI 4 "register_operand" "1,1")))
+(define_insn "movmd_internal_<mode>"
+  [(set (mem:BLK (match_operand:P 3 "register_operand" "0,r"))
+	(mem:BLK (match_operand:P 4 "register_operand" "1,1")))
    (unspec [(match_operand:HI 5 "register_operand" "2,2")
 	    (match_operand:HI 6 "const_int_operand" "n,n")] UNSPEC_MOVMD)
-   (clobber (match_operand:HI 0 "register_operand" "=d,??D"))
-   (clobber (match_operand:HI 1 "register_operand" "=f,f"))
+   (clobber (match_operand:P 0 "register_operand" "=d,??D"))
+   (clobber (match_operand:P 1 "register_operand" "=f,f"))
    (set (match_operand:HI 2 "register_operand" "=c,c")
 	(const_int 0))]
-  "TARGET_H8300SX && TARGET_NORMAL_MODE"
-  "@
-    movmd%m6
-    #"
-  [(set_attr "length" "2,14")
-   (set_attr "can_delay" "no")
-   (set_attr "cc" "none,clobber")])
-
-(define_insn "movmd_internal"
-  [(set (mem:BLK (match_operand:SI 3 "register_operand" "0,r"))
-	(mem:BLK (match_operand:SI 4 "register_operand" "1,1")))
-   (unspec [(match_operand:HI 5 "register_operand" "2,2")
-	    (match_operand:HI 6 "const_int_operand" "n,n")] UNSPEC_MOVMD)
-   (clobber (match_operand:SI 0 "register_operand" "=d,??D"))
-   (clobber (match_operand:SI 1 "register_operand" "=f,f"))
-   (set (match_operand:HI 2 "register_operand" "=c,c")
-	(const_int 0))]
-  "TARGET_H8300SX && !TARGET_NORMAL_MODE"
+  "TARGET_H8300SX"
   "@
     movmd%m6
     #"
@@ -563,33 +546,11 @@
 	(match_operand:BLK 1 "memory_operand" ""))
    (unspec [(match_operand:HI 2 "register_operand" "")
 	    (match_operand:HI 3 "const_int_operand" "")] UNSPEC_MOVMD)
-   (clobber (match_operand:HI 4 "register_operand" ""))
-   (clobber (match_operand:HI 5 "register_operand" ""))
-   (set (match_dup 2)
-	(const_int 0))]
-  "TARGET_H8300SX && TARGET_NORMAL_MODE && reload_completed
-   && REGNO (operands[4]) != DESTINATION_REG"
-  [(const_int 0)]
-  {
-    rtx dest;
-
-    h8300_swap_into_er6 (XEXP (operands[0], 0));
-    dest = replace_equiv_address (operands[0], hard_frame_pointer_rtx);
-    emit_insn (gen_movmd (dest, operands[1], operands[2], operands[3]));
-    h8300_swap_out_of_er6 (operands[4]);
-    DONE;
-  })
-
-(define_split
-  [(set (match_operand:BLK 0 "memory_operand" "")
-	(match_operand:BLK 1 "memory_operand" ""))
-   (unspec [(match_operand:HI 2 "register_operand" "")
-	    (match_operand:HI 3 "const_int_operand" "")] UNSPEC_MOVMD)
-   (clobber (match_operand:SI 4 "register_operand" ""))
-   (clobber (match_operand:SI 5 "register_operand" ""))
+   (clobber (match_operand:P 4 "register_operand" ""))
+   (clobber (match_operand:P 5 "register_operand" ""))
    (set (match_dup 2)
 	(const_int 0))]
-  "TARGET_H8300SX && !TARGET_NORMAL_MODE && reload_completed
+  "TARGET_H8300SX && reload_completed
    && REGNO (operands[4]) != DESTINATION_REG"
   [(const_int 0)]
   {
@@ -641,28 +602,14 @@
 
 ;; See comments above memcpy_internal().
 
-(define_insn "stpcpy_internal_normal"
-  [(set (mem:BLK (match_operand:HI 3 "register_operand" "0,r"))
-	(unspec:BLK [(mem:BLK (match_operand:HI 4 "register_operand" "1,1"))]
-	UNSPEC_STPCPY))
-   (clobber (match_operand:HI 0 "register_operand" "=d,??D"))
-   (clobber (match_operand:HI 1 "register_operand" "=f,f"))
-   (clobber (match_operand:HI 2 "register_operand" "=c,c"))]
-  "TARGET_H8300SX && TARGET_NORMAL_MODE"
-  "@
-    \n1:\tmovsd\t2f\;bra\t1b\n2:
-    #"
-  [(set_attr "length" "6,18")
-   (set_attr "cc" "none,clobber")])
-
-(define_insn "stpcpy_internal"
-  [(set (mem:BLK (match_operand:SI 3 "register_operand" "0,r"))
-	(unspec:BLK [(mem:BLK (match_operand:SI 4 "register_operand" "1,1"))]
+(define_insn "stpcpy_internal_<mode>"
+  [(set (mem:BLK (match_operand:P 3 "register_operand" "0,r"))
+	(unspec:BLK [(mem:BLK (match_operand:P 4 "register_operand" "1,1"))]
 	UNSPEC_STPCPY))
-   (clobber (match_operand:SI 0 "register_operand" "=d,??D"))
-   (clobber (match_operand:SI 1 "register_operand" "=f,f"))
-   (clobber (match_operand:SI 2 "register_operand" "=c,c"))]
-  "TARGET_H8300SX && !TARGET_NORMAL_MODE"
+   (clobber (match_operand:P 0 "register_operand" "=d,??D"))
+   (clobber (match_operand:P 1 "register_operand" "=f,f"))
+   (clobber (match_operand:P 2 "register_operand" "=c,c"))]
+  "TARGET_H8300SX"
   "@
     \n1:\tmovsd\t2f\;bra\t1b\n2:
     #"
@@ -675,29 +622,10 @@
 (define_split
   [(set (match_operand:BLK 0 "memory_operand" "")
 	(unspec:BLK [(match_operand:BLK 1 "memory_operand" "")] UNSPEC_STPCPY))
-   (clobber (match_operand:HI 2 "register_operand" ""))
-   (clobber (match_operand:HI 3 "register_operand" ""))
-   (clobber (match_operand:HI 4 "register_operand" ""))]
-  "TARGET_H8300SX && TARGET_NORMAL_MODE && reload_completed
-   && REGNO (operands[2]) != DESTINATION_REG"
-  [(const_int 0)]
-  {
-    rtx dest;
-
-    h8300_swap_into_er6 (XEXP (operands[0], 0));
-    dest = replace_equiv_address (operands[0], hard_frame_pointer_rtx);
-    emit_insn (gen_movsd (dest, operands[1], operands[4]));
-    h8300_swap_out_of_er6 (operands[2]);
-    DONE;
-  })
-
-(define_split
-  [(set (match_operand:BLK 0 "memory_operand" "")
-	(unspec:BLK [(match_operand:BLK 1 "memory_operand" "")] UNSPEC_STPCPY))
-   (clobber (match_operand:SI 2 "register_operand" ""))
-   (clobber (match_operand:SI 3 "register_operand" ""))
-   (clobber (match_operand:SI 4 "register_operand" ""))]
-  "TARGET_H8300SX && !TARGET_NORMAL_MODE && reload_completed
+   (clobber (match_operand:P 2 "register_operand" ""))
+   (clobber (match_operand:P 3 "register_operand" ""))
+   (clobber (match_operand:P 4 "register_operand" ""))]
+  "TARGET_H8300SX &&  reload_completed
    && REGNO (operands[2]) != DESTINATION_REG"
   [(const_int 0)]
   {

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]