aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn David Anglin <danglin@gcc.gnu.org>2025-02-03 11:35:38 -0500
committerJohn David Anglin <danglin@gcc.gnu.org>2025-02-03 11:35:38 -0500
commit88bb18ccd87d43abe401a1228cc337e4b46be88d (patch)
tree09467ce53c73b82c22073ca1d6ae363a567b09a6
parent6ec19825b4e72611cdbd4749feed67b61392aa81 (diff)
downloadgcc-88bb18ccd87d43abe401a1228cc337e4b46be88d.zip
gcc-88bb18ccd87d43abe401a1228cc337e4b46be88d.tar.gz
gcc-88bb18ccd87d43abe401a1228cc337e4b46be88d.tar.bz2
hppa: Revise various millicode insn patterns to use match_operand
LRA does not correctly support hard-register input operands that are clobbered. This is needed to support millicode calls on hppa. The operand setup is sometimes deleted. This problem can be avoided by hiding hard-register input operands using match_operand. This also potentially allows for constraints that specify the operand is both read and written. 2025-02-03 John David Anglin <danglin@gcc.gnu.org> gcc/ChangeLog: PR rtl-optimization/117248 * config/pa/predicates.md (r25_operand): New predicate. (r26_operand): Likewise. * config/pa/pa.md: Use match_operand for r25 and r26 hard register operands in mult, div, udiv, mod and umod millicode patterns.
-rw-r--r--gcc/config/pa/pa.md56
-rw-r--r--gcc/config/pa/predicates.md16
2 files changed, 52 insertions, 20 deletions
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index df1b61e..2312994 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -5632,8 +5632,10 @@
(set_attr "length" "4")])
(define_insn ""
- [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
- (clobber (match_operand:SI 0 "register_operand" "=a"))
+ [(set (reg:SI 29)
+ (mult:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "r25_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 31))]
@@ -5645,8 +5647,10 @@
(symbol_ref "pa_attr_length_millicode_call (insn)")))])
(define_insn ""
- [(set (reg:SI 29) (mult:SI (reg:SI 26) (reg:SI 25)))
- (clobber (match_operand:SI 0 "register_operand" "=a"))
+ [(set (reg:SI 29)
+ (mult:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "r25_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 2))]
@@ -5753,8 +5757,9 @@
(define_insn ""
[(set (reg:SI 29)
- (div:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
- (clobber (match_operand:SI 1 "register_operand" "=a"))
+ (div:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "div_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 31))]
@@ -5768,8 +5773,9 @@
(define_insn ""
[(set (reg:SI 29)
- (div:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
- (clobber (match_operand:SI 1 "register_operand" "=a"))
+ (div:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "div_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 2))]
@@ -5800,8 +5806,9 @@
(define_insn ""
[(set (reg:SI 29)
- (udiv:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
- (clobber (match_operand:SI 1 "register_operand" "=a"))
+ (udiv:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "div_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 31))]
@@ -5815,8 +5822,9 @@
(define_insn ""
[(set (reg:SI 29)
- (udiv:SI (reg:SI 26) (match_operand:SI 0 "div_operand" "")))
- (clobber (match_operand:SI 1 "register_operand" "=a"))
+ (udiv:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "div_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 2))]
@@ -5844,8 +5852,10 @@
}")
(define_insn ""
- [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
- (clobber (match_operand:SI 0 "register_operand" "=a"))
+ [(set (reg:SI 29)
+ (mod:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "r25_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 31))]
@@ -5858,8 +5868,10 @@
(symbol_ref "pa_attr_length_millicode_call (insn)")))])
(define_insn ""
- [(set (reg:SI 29) (mod:SI (reg:SI 26) (reg:SI 25)))
- (clobber (match_operand:SI 0 "register_operand" "=a"))
+ [(set (reg:SI 29)
+ (mod:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "r25_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 2))]
@@ -5887,8 +5899,10 @@
}")
(define_insn ""
- [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
- (clobber (match_operand:SI 0 "register_operand" "=a"))
+ [(set (reg:SI 29)
+ (umod:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "r25_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 31))]
@@ -5901,8 +5915,10 @@
(symbol_ref "pa_attr_length_millicode_call (insn)")))])
(define_insn ""
- [(set (reg:SI 29) (umod:SI (reg:SI 26) (reg:SI 25)))
- (clobber (match_operand:SI 0 "register_operand" "=a"))
+ [(set (reg:SI 29)
+ (umod:SI (match_operand:SI 1 "r26_operand" "")
+ (match_operand:SI 0 "r25_operand" "")))
+ (clobber (match_operand:SI 2 "register_operand" "=a"))
(clobber (reg:SI 26))
(clobber (reg:SI 25))
(clobber (reg:SI 2))]
diff --git a/gcc/config/pa/predicates.md b/gcc/config/pa/predicates.md
index 24bb1ac..b0f8274 100644
--- a/gcc/config/pa/predicates.md
+++ b/gcc/config/pa/predicates.md
@@ -191,6 +191,22 @@
&& CONSTANT_P (op) && ! TARGET_PORTABLE_RUNTIME);
})
+;; True iff OP is a SImode r25 register operand.
+
+(define_predicate "r25_operand"
+ (match_code "reg")
+{
+ return mode == SImode && REG_P (op) && REGNO (op) == 25;
+})
+
+;; True iff OP is a SImode r26 register operand.
+
+(define_predicate "r26_operand"
+ (match_code "reg")
+{
+ return mode == SImode && REG_P (op) && REGNO (op) == 26;
+})
+
;; True iff OP can be used as the divisor in a div millicode call.
(define_predicate "div_operand"