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