diff mbox series

[committed] Consolidate some H8 patterns

Message ID e0e22193-40f9-bb87-1a77-3eebca3cb70d@redhat.com
State New
Headers show
Series [committed] Consolidate some H8 patterns | expand

Commit Message

Jeff Law July 3, 2018, 5:15 a.m. UTC
The h8 port has 3 movqi and movhi patterns.  One for the H8, another for
the H8/H and H8/S and another for the H8/SX.  The basic H8 pattern can
be trivially merged with the H8/H and H8/S patterns.  In addition to
just simplifing the port, the movqi H8/H and H8/S pattern is better WRT
condition code handling and length computation.  The latter in
particular can result in better code as we're more likely to use short
branches without resorting to linker relaxation.

We can also combine the pushqi and pushhi patterns into a single pattern
using a mode iterator.

I've verified that the only changes in libgcc are the conversion of long
branches to short branches.

These aren't huge cleanups, but every little bit helps this rather
convoluted machine description. I expect to find more cleanups of a
similar nature.

Jeff
diff mbox series

Patch

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 15becdc2466..a1f2d351983 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@ 
 2018-07-02  Jeff Law  <law@redhat.com>
 
+	* config/h8300/h8300.md (movqi_h8300, movqi_h8300hs): Consolidate
+	the H8/300, H8/300H and H8/S variants into a single pattern.
+	(movhi_h8300, movqi_h8300hs): Similarly.
+	(pushqi_h8300hs, pushhi_h8300hs): Consolidate into a single pattern.
+	(QHI mode iterator): New.
+
 	* config/h8300/h8300.md: Remove trailing whitespace.
 
 2018-07-02  Jim Wilson  <jimw@sifive.com>
diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index 846fd735de0..74b22338c21 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -184,6 +184,7 @@ 
 
 (define_mode_iterator P [(HI "Pmode == HImode") (SI "Pmode == SImode")])
 
+(define_mode_iterator QHI [QI HI])
 
 ;; ----------------------------------------------------------------------
 ;; MOVE INSTRUCTIONS
@@ -191,25 +192,10 @@ 
 
 ;; movqi
 
-(define_insn "*movqi_h8300"
+(define_insn "*movqi_h8nosx"
   [(set (match_operand:QI 0 "general_operand_dst" "=r,r ,<,r,r,m")
 	(match_operand:QI 1 "general_operand_src" " I,r>,r,n,m,r"))]
-  "TARGET_H8300
-   && h8300_move_ok (operands[0], operands[1])"
-  "@
-   sub.b	%X0,%X0
-   mov.b	%R1,%X0
-   mov.b	%X1,%R0
-   mov.b	%R1,%X0
-   mov.b	%R1,%X0
-   mov.b	%X1,%R0"
-  [(set_attr "length" "2,2,2,2,4,4")
-   (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,set_znv,set_znv")])
-
-(define_insn "*movqi_h8300hs"
-  [(set (match_operand:QI 0 "general_operand_dst" "=r,r ,<,r,r,m")
-	(match_operand:QI 1 "general_operand_src" " I,r>,r,n,m,r"))]
-  "(TARGET_H8300H || TARGET_H8300S) && !TARGET_H8300SX
+  "(TARGET_H8300 || TARGET_H8300H || TARGET_H8300S) && !TARGET_H8300SX
     && h8300_move_ok (operands[0], operands[1])"
   "@
    sub.b	%X0,%X0
@@ -220,7 +206,7 @@ 
    mov.b	%X1,%R0"
   [(set (attr "length")
 	(symbol_ref "compute_mov_length (operands)"))
-   (set_attr "cc" "set_zn,set_znv,set_znv,clobber,set_znv,set_znv")])
+   (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,set_znv,set_znv")])
 
 (define_insn "*movqi_h8sx"
   [(set (match_operand:QI 0 "general_operand_dst" "=Z,rQ")
@@ -255,26 +241,10 @@ 
 
 ;; movhi
 
-(define_insn "*movhi_h8300"
+(define_insn "*movhi_h8nosx"
   [(set (match_operand:HI 0 "general_operand_dst" "=r,r,<,r,r,m")
 	(match_operand:HI 1 "general_operand_src" "I,r>,r,i,m,r"))]
-  "TARGET_H8300
-   && h8300_move_ok (operands[0], operands[1])"
-  "@
-   sub.w	%T0,%T0
-   mov.w	%T1,%T0
-   mov.w	%T1,%T0
-   mov.w	%T1,%T0
-   mov.w	%T1,%T0
-   mov.w	%T1,%T0"
-  [(set (attr "length")
-	(symbol_ref "compute_mov_length (operands)"))
-   (set_attr "cc" "set_zn,set_znv,set_znv,set_znv,set_znv,set_znv")])
-
-(define_insn "*movhi_h8300hs"
-  [(set (match_operand:HI 0 "general_operand_dst" "=r,r,<,r,r,m")
-	(match_operand:HI 1 "general_operand_src" "I,r>,r,i,m,r"))]
-  "(TARGET_H8300H || TARGET_H8300S) && !TARGET_H8300SX
+  "(TARGET_H8300 || TARGET_H8300H || TARGET_H8300S) && !TARGET_H8300SX
     && h8300_move_ok (operands[0], operands[1])"
   "@
    sub.w	%T0,%T0
@@ -855,25 +825,16 @@ 
   "mov.w\\t%T0,@-r7"
   [(set_attr "length" "2")])
 
-(define_insn "*pushqi1_h8300hs_<mode>"
-  [(set (mem:QI
+(define_insn "*push1_h8300hs_<mode>"
+  [(set (mem:QHI
 	(pre_modify:P
 	  (reg:P SP_REG)
 	  (plus:P (reg:P SP_REG) (const_int -4))))
-	(match_operand:QI 0 "register_no_sp_elim_operand" "r"))]
+	(match_operand:QHI 0 "register_no_sp_elim_operand" "r"))]
   "TARGET_H8300H || TARGET_H8300S"
   "mov.l\\t%S0,@-er7"
   [(set_attr "length" "4")])
 
-(define_insn "*pushhi1_h8300hs_<mode>"
-  [(set (mem:HI
-	(pre_modify:P
-	  (reg:P SP_REG)
-	  (plus:P (reg:P SP_REG) (const_int -4))))
-	(match_operand:HI 0 "register_no_sp_elim_operand" "r"))]
-  "TARGET_H8300H || TARGET_H8300S"
-  "mov.l\\t%S0,@-er7"
-  [(set_attr "length" "4")])
 
 ;; ----------------------------------------------------------------------
 ;; TEST INSTRUCTIONS