diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1995-06-29 06:02:46 -0400 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1995-06-29 06:02:46 -0400 |
commit | 30a830e9692c8cec556127a6adae0b406069da6e (patch) | |
tree | fa0db83df36e4323f4c691f709cbc66d28ef80fe /gcc | |
parent | 46f9b8286325de315c27246a30e43001ebf85042 (diff) | |
download | gcc-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.md | 19 |
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") |