This is a minor H8 specific bugfix.  The H8/SX multiply instructions are all 4
bytes in length, but the machine description claims they are 2 bytes in length.

This can cause GCC to emit a short branch when a long branch was actually 
needed.
Sadly the assembler didn't complain and instead the branch goes to the wrong
place and all hell breaks loose when you try to execute the code.

My tester tripped over this while testing the H8 port.

Committed to the trunk.

Jeff


commit b3346399a245e9f262792f76f67f8e2dfa7e064c
Author: Jeff Law <l...@torsion.usersys.redhat.com>
Date:   Tue Apr 28 16:34:45 2020 -0400

    Fix some testsuite failures for H8/SX multilibs where short branches
    where used when long branches were necessary.
    
            * config/h8300/h8300.md (H8/SX mult patterns): All H8/SX specific
            multiply patterns are 4 bytes long.

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 905d2b8a2f5..9c947299964 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+2020-04-28  Jeff Law  <l...@redhat.com>
+
+       * config/h8300/h8300.md (H8/SX mult patterns): All H8/SX specific
+       multiply patterns are 4 bytes long.
+
 2020-04-28  Kyrylo Tkachov  <kyrylo.tkac...@arm.com>
 
        * config/arm/arm-cpus.in (cortex-m55): Remove +nofp option.
diff --git a/gcc/config/h8300/h8300.md b/gcc/config/h8300/h8300.md
index fdd2d8b02d7..3e5cdbeeebe 100644
--- a/gcc/config/h8300/h8300.md
+++ b/gcc/config/h8300/h8300.md
@@ -1146,7 +1146,7 @@
                  (match_operand:HSI 2 "reg_or_nibble_operand" "r IP4>X")))]
   "TARGET_H8300SX"
   { return <MODE>mode == HImode ? "muls.w\\t%T2,%T0" : "muls.l\\t%S2,%S0"; }
-  [(set_attr "length" "2")
+  [(set_attr "length" "4")
    (set_attr "cc" "set_zn")])
 
 (define_insn "smulsi3_highpart"
@@ -1159,7 +1159,7 @@
          (const_int 32))))]
   "TARGET_H8300SXMUL"
   "muls/u.l\\t%S2,%S0"
-  [(set_attr "length" "2")
+  [(set_attr "length" "4")
    (set_attr "cc" "set_zn")])
 
 (define_insn "umulsi3_highpart"
@@ -1172,7 +1172,7 @@
            (const_int 32))))]
   "TARGET_H8300SX"
   "mulu/u.l\\t%S2,%S0"
-  [(set_attr "length" "2")
+  [(set_attr "length" "4")
    (set_attr "cc" "none_0hit")])
 
 ;; This is a "bridge" instruction.  Combine can't cram enough insns

Reply via email to