[committed] Fix incorrect code on H8/SX with bit logicals

Message ID 9f01c0d86a2c047eee8ed5420bf4307fb1cca90e.camel@redhat.com
State New
Headers show
Series
  • [committed] Fix incorrect code on H8/SX with bit logicals
Related show

Commit Message

Kewen.Lin via Gcc-patches May 28, 2020, 6:40 p.m.
The H8/SX has some extended capabilities for bit-and, bit-ior and bit-xor
compared to earlier processors in the H8 family and thus there's some special
patterns to handle them.

THe instructions work on byte sized chunks, but GCC is exposing them in HImode as
well. It looks like someone tried to handle the big endian correction issues for
the bit-and instruction and there's some chance that splitter might work.  But
the ior/xor pattern is clearly broken.

I tried to fix the ior/xor pattern in a similar manner, but doing so highlighted
that these insns don't allow reg+d addressing modes.  It seems safest to limit
when they apply.  If someone cares enough they can always go back and try to
handle the address adjustments (allocating a scratch as needed) and add support
for SImode as well.

So this patch restricts the existing splitter to cases where no address
adjustment is needed.  It removes bclrhi_msx and turns b<ior,xor>hi_msx into a
splitter.

Committing to the trunk.


Jeff
commit f04f2fcd3d40f944f29189b1f995aa35ea04a379
Author: Jeff Law <law@redhat.com>
Date:   Thu May 28 12:28:56 2020 -0600

    Fix incorrect code generation with bit insns on H8/SX.
    
            * config/h8300/logical.md (HImode H8/SX bit-and splitter): Don't
            make a nonzero adjustment to the memory offset.
            (b<ior,xor>hi_msx): Turn into a splitter.
commit ccf4e86dc01d8c89a8d56b228757a689d1fcc564
Author: Jeff Law <law@redhat.com>
Date:   Thu May 28 12:37:08 2020 -0600

    Finish prior patch
    
            * config/h8300/logical.md (bclrhi_msx): Remove pattern.

diff --git a/gcc/config/h8300/logical.md b/gcc/config/h8300/logical.md
index a099bbb4f5f..7d24fad360a 100644
--- a/gcc/config/h8300/logical.md
+++ b/gcc/config/h8300/logical.md
@@ -24,14 +24,6 @@
     operands[2] = GEN_INT ((INTVAL (operands[2])) >> 8);
   })
 
-(define_insn "bclrhi_msx"
-  [(set (match_operand:HI 0 "bit_register_indirect_operand" "=m")
-	(and:HI (match_operand:HI 1 "bit_register_indirect_operand" "%0")
-		(match_operand:HI 2 "single_zero_operand" "Y0")))]
-  "TARGET_H8300SX"
-  "bclr\\t%W2,%0"
-  [(set_attr "length" "8")])
-
 (define_insn "*andqi3_2"
   [(set (match_operand:QI 0 "bit_operand" "=U,rQ,r")
 	(and:QI (match_operand:QI 1 "bit_operand" "%0,0,WU")

Patch

diff --git a/gcc/config/h8300/logical.md b/gcc/config/h8300/logical.md
index 9dd863cdd8c..a099bbb4f5f 100644
--- a/gcc/config/h8300/logical.md
+++ b/gcc/config/h8300/logical.md
@@ -14,22 +14,14 @@ 
   [(set (match_operand:HI 0 "bit_register_indirect_operand")
 	(and:HI (match_operand:HI 1 "bit_register_indirect_operand")
 		(match_operand:HI 2 "single_zero_operand")))]
-  "TARGET_H8300SX"
+  "TARGET_H8300SX && abs (INTVAL (operands[2])) > 0xff"
   [(set (match_dup 0)
 	(and:QI (match_dup 1)
 		(match_dup 2)))]
   {
-    if (abs (INTVAL (operands[2])) > 0xFF)
-      {
-	operands[0] = adjust_address (operands[0], QImode, 0);
-	operands[1] = adjust_address (operands[1], QImode, 0);
-	operands[2] = GEN_INT ((INTVAL (operands[2])) >> 8);
-      }
-    else
-      {
-	operands[0] = adjust_address (operands[0], QImode, 1);
-	operands[1] = adjust_address (operands[1], QImode, 1);
-      }
+    operands[0] = adjust_address (operands[0], QImode, 0);
+    operands[1] = adjust_address (operands[1], QImode, 0);
+    operands[2] = GEN_INT ((INTVAL (operands[2])) >> 8);
   })
 
 (define_insn "bclrhi_msx"
@@ -134,13 +126,19 @@ 
   { return <CODE> == IOR ? "bset\\t%V2,%0" : "bnot\\t%V2,%0"; }
   [(set_attr "length" "8")])
 
-(define_insn "b<code>hi_msx"
-  [(set (match_operand:HI 0 "bit_register_indirect_operand" "=m")
-	(ors:HI (match_operand:HI 1 "bit_register_indirect_operand" "%0")
-		(match_operand:HI 2 "single_one_operand" "Y2")))]
-  "TARGET_H8300SX"
-  { return <CODE> == IOR ? "bset\\t%V2,%0" : "bnot\\t%V2,%0"; }
-  [(set_attr "length" "8")])
+(define_split
+  [(set (match_operand:HI 0 "bit_register_indirect_operand")
+	(ors:HI (match_operand:HI 1 "bit_register_indirect_operand")
+		(match_operand:HI 2 "single_one_operand")))]
+  "TARGET_H8300SX && abs (INTVAL (operands[2])) > 0xff"
+  [(set (match_dup 0)
+	(and:QI (match_dup 1)
+		(match_dup 2)))]
+  {
+    operands[0] = adjust_address (operands[0], QImode, 0);
+    operands[1] = adjust_address (operands[1], QImode, 0);
+    operands[2] = GEN_INT ((INTVAL (operands[2])) >> 8);
+  })
 
 (define_insn "<code>qi3_1"
   [(set (match_operand:QI 0 "bit_operand" "=U,rQ")