aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1995-06-29 06:02:46 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1995-06-29 06:02:46 -0400
commit30a830e9692c8cec556127a6adae0b406069da6e (patch)
treefa0db83df36e4323f4c691f709cbc66d28ef80fe /gcc
parent46f9b8286325de315c27246a30e43001ebf85042 (diff)
downloadgcc-30a830e9692c8cec556127a6adae0b406069da6e.zip
gcc-30a830e9692c8cec556127a6adae0b406069da6e.tar.gz
gcc-30a830e9692c8cec556127a6adae0b406069da6e.tar.bz2
(reload addsi3): New pattern to avoid reload lossage with register
eliminations. From-SVN: r10091
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/pa/pa.md19
1 files changed, 19 insertions, 0 deletions
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 03ae98e..de8e081 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -2537,6 +2537,25 @@
[(set_attr "type" "binary,binary")
(set_attr "length" "4,4")])
+;; Disgusting kludge to work around reload bugs with frame pointer
+;; elimination. Similar to other magic reload patterns in the
+;; indexed memory operations.
+(define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=&r")
+ (plus:SI (plus:SI (match_operand:SI 1 "register_operand" "%r")
+ (match_operand:SI 2 "register_operand" "r"))
+ (match_operand:SI 3 "const_int_operand" "rL")))]
+ "reload_in_progress"
+ "*
+{
+ if (GET_CODE (operands[3]) == CONST_INT)
+ return \"ldo %3(%2),%0\;addl %1,%0,%0\";
+ else
+ return \"addl %3,%2,%0\;addl %1,%0,%0\";
+}"
+ [(set_attr "type" "binary")
+ (set_attr "length" "8")])
+
(define_insn "subdi3"
[(set (match_operand:DI 0 "register_operand" "=r")
(minus:DI (match_operand:DI 1 "register_operand" "r")