This adds a missing J constraint to an existing pattern, and adds missing
integer negate patterns.  Since subtract from zero canonicalizes to negate,
adding the missing patterns helps eliminate some unnecessary sign extend
instructions after subtract from zero for the 64-bit port.  The libc.so.6 file
ends up 152 bytes smaller with the patch.

This was tested with cross riscv32-elf and riscv64-linux builds and checks.
There were no regressions.

Committed.

Jim

        gcc/
        * config/riscv/riscv.md (subsi3_extended2): Add J constraint.
        (negdi2, negsi2, negsi2_extended, negsi2_extended2): New.
---
 gcc/config/riscv/riscv.md | 41 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 38 insertions(+), 3 deletions(-)

diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 95fbb282c7c..4162dc578e8 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -514,16 +514,51 @@
    (set_attr "mode" "SI")])
 
 (define_insn "*subsi3_extended2"
-  [(set (match_operand:DI                        0 "register_operand" "=r")
+  [(set (match_operand:DI                        0 "register_operand" "= r")
        (sign_extend:DI
-         (subreg:SI (minus:DI (match_operand:DI 1 "reg_or_0_operand" " r")
-                              (match_operand:DI 2 "register_operand" " r"))
+         (subreg:SI (minus:DI (match_operand:DI 1 "reg_or_0_operand" " rJ")
+                              (match_operand:DI 2 "register_operand" "  r"))
                     0)))]
   "TARGET_64BIT"
   "subw\t%0,%z1,%2"
   [(set_attr "type" "arith")
    (set_attr "mode" "SI")])
 
+(define_insn "negdi2"
+  [(set (match_operand:DI         0 "register_operand" "=r")
+       (neg:DI (match_operand:DI 1 "register_operand" " r")))]
+  "TARGET_64BIT"
+  "neg\t%0,%1"
+  [(set_attr "type" "arith")
+   (set_attr "mode" "DI")])
+
+(define_insn "negsi2"
+  [(set (match_operand:SI         0 "register_operand" "=r")
+       (neg:SI (match_operand:SI 1 "register_operand" " r")))]
+  ""
+  { return TARGET_64BIT ? "negw\t%0,%1" : "neg\t%0,%1"; }
+  [(set_attr "type" "arith")
+   (set_attr "mode" "SI")])
+
+(define_insn "*negsi2_extended"
+  [(set (match_operand:DI          0 "register_operand" "=r")
+       (sign_extend:DI
+        (neg:SI (match_operand:SI 1 "register_operand" " r"))))]
+  "TARGET_64BIT"
+  "negw\t%0,%1"
+  [(set_attr "type" "arith")
+   (set_attr "mode" "SI")])
+
+(define_insn "*negsi2_extended2"
+  [(set (match_operand:DI                     0 "register_operand" "=r")
+       (sign_extend:DI
+        (subreg:SI (neg:DI (match_operand:DI 1 "register_operand" " r"))
+                   0)))]
+  "TARGET_64BIT"
+  "negw\t%0,%1"
+  [(set_attr "type" "arith")
+   (set_attr "mode" "SI")])
+
 ;;
 ;;  ....................
 ;;
-- 
2.17.1

Reply via email to