aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@gcc.gnu.org>1993-03-01 04:16:10 -0700
committerJeff Law <law@gcc.gnu.org>1993-03-01 04:16:10 -0700
commit26915fa9bcd03bec9a39835b075a605309e1e9d6 (patch)
treed62d60ff41490f4736d77d4071e6f095adc5c79e
parentc1d1b3f05fe1f7fe5027581becc3bd8ad1b25045 (diff)
downloadgcc-26915fa9bcd03bec9a39835b075a605309e1e9d6.zip
gcc-26915fa9bcd03bec9a39835b075a605309e1e9d6.tar.gz
gcc-26915fa9bcd03bec9a39835b075a605309e1e9d6.tar.bz2
pa.md (split for symbol_ref+int): New define_split for hte combiner.
* pa.md (split for symbol_ref+int): New define_split for hte combiner. From-SVN: r3572
-rw-r--r--gcc/config/pa/pa.md14
1 files changed, 14 insertions, 0 deletions
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 39d7834..bcb1a0d 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -994,6 +994,20 @@
"ldo R'%G2(%1),%0"
[(set_attr "length" "1")])
+;; Now that a symbolic_address plus a constant is broken up early
+;; in the compilation phase (for better CSE) we need a special
+;; combiner pattern to load the symbolic address plus the constant
+;; in only 2 instructions. (For cases where the symbolic address
+;; was not a common subexpression.)
+(define_split
+ [(set (match_operand:SI 0 "register_operand" "")
+ (match_operand 1 "symbolic_operand" ""))
+ (clobber (match_operand:SI 2 "register_operand" ""))]
+ ""
+ [(set (match_dup 2) (high:SI (match_dup 1)))
+ (set (match_dup 0) (lo_sum:SI (match_dup 2) (match_dup 1)))]
+ "")
+
(define_expand "movhi"
[(set (match_operand:HI 0 "general_operand" "")
(match_operand:HI 1 "general_operand" ""))]