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 --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 <l...@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 <j...@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