aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@gcc.gnu.org>1993-01-10 15:59:33 -0700
committerJeff Law <law@gcc.gnu.org>1993-01-10 15:59:33 -0700
commit9f309ba3e7ae686cd3e193722eb43e28e9d83018 (patch)
treeed5e6a00eb4f8ca0514ab0e6fa03dd096de16dc2 /gcc
parent4e82968e329e453ca8df62c1cb1b913a5a43ef8a (diff)
downloadgcc-9f309ba3e7ae686cd3e193722eb43e28e9d83018.zip
gcc-9f309ba3e7ae686cd3e193722eb43e28e9d83018.tar.gz
gcc-9f309ba3e7ae686cd3e193722eb43e28e9d83018.tar.bz2
pa.md (reload_insi, [...]): Use new "Z" constraint instead of "z" constraint.
* pa.md (reload_insi, reload_outsi): Use new "Z" constraint instead of "z" constraint. (load HIGH patterns): Rewrite to not show DP relocation. From-SVN: r3185
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/pa/pa.md52
1 files changed, 26 insertions, 26 deletions
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md
index 5dd3c81..fd37ec0 100644
--- a/gcc/config/pa/pa.md
+++ b/gcc/config/pa/pa.md
@@ -729,7 +729,7 @@
;; going in to or out of float point registers.
(define_expand "reload_insi"
- [(set (match_operand:SI 0 "register_operand" "=z")
+ [(set (match_operand:SI 0 "register_operand" "=Z")
(match_operand:SI 1 "general_operand" ""))
(clobber (match_operand:SI 2 "register_operand" "=&r"))]
""
@@ -745,7 +745,7 @@
(define_expand "reload_outsi"
[(set (match_operand:SI 0 "general_operand" "")
- (match_operand:SI 1 "register_operand""z"))
+ (match_operand:SI 1 "register_operand" "Z"))
(clobber (match_operand:SI 2 "register_operand" "=&r"))]
""
"
@@ -895,37 +895,34 @@
[(set_attr "type" "move")
(set_attr "length" "1")])
-(define_insn ""
- [(set (match_operand:SI 0 "register_operand" "=a,&?*r")
- (plus:SI (match_operand:SI 1 "register_operand" "r,r")
- (high:SI (match_operand 2 "" ""))))]
- "!TARGET_KERNEL"
- "@
- addil L'%G2,%1
- ldil L'%G2,%0\;add %0,%1,%0"
- [(set_attr "type" "binary,binary")
- (set_attr "length" "1,2")])
-
+;; For kernel code always use addil; else we can lose due to a linker
+;; bug involving absolute symbols and "ldil;add" style relocations
(define_insn ""
[(set (match_operand:SI 0 "register_operand" "=a")
- (plus:SI (match_operand:SI 1 "register_operand" "r")
- (high:SI (match_operand 2 "" ""))))]
- "TARGET_KERNEL"
+ (high:SI (match_operand 1 "" "")))]
+ "TARGET_KERNEL && symbolic_operand(operands[1], Pmode)
+ && ! function_label_operand (operands[1])
+ && ! read_only_operand (operands[1])"
"@
- addil L'%G2,%1"
+ addil L'%G1,%%r27"
[(set_attr "type" "binary")
(set_attr "length" "1")])
-(define_split
- [(set (match_operand:SI 0 "register_operand" "")
- (plus:SI (match_operand:SI 1 "register_operand" "")
- (high:SI (match_operand 2 "" ""))))
- (clobber (match_scratch:SI 3 ""))]
- "reload_completed && REGNO (operands[0]) != 1"
- [(set (match_dup 3) (high:SI (match_dup 2)))
- (set (match_dup 0) (plus:SI (match_dup 3) (match_dup 1)))]
- "")
+;; For all symbolic operands *except* function addresses and read-only
+;; operands (which live in TEXT space and do not require relocation).
+(define_insn ""
+ [(set (match_operand:SI 0 "register_operand" "=a,!*r")
+ (high:SI (match_operand 1 "" "")))]
+ "! TARGET_KERNEL && symbolic_operand(operands[1], Pmode)
+ && ! function_label_operand (operands[1])
+ && ! read_only_operand (operands[1])"
+ "@
+ addil L'%G1,%%r27
+ ldil L'%G1,%0\;add %0,%%r27,%0"
+ [(set_attr "type" "binary,binary")
+ (set_attr "length" "1,2")])
+;; For function addresses when TARGET_SHARED_LIBS
(define_insn ""
[(set (match_operand:SI 0 "register_operand" "=r")
(high:SI (match_operand:SI 1 "function_label_operand" "")))]
@@ -934,6 +931,8 @@
[(set_attr "type" "move")
(set_attr "length" "1")])
+;; The following two patterns should be for using ldil to load constants
+;; (which include addresses of read_only_operands)
(define_insn ""
[(set (match_operand:SI 0 "register_operand" "=r")
(high:SI (match_operand 1 "" "")))]
@@ -950,6 +949,7 @@
[(set_attr "type" "move")
(set_attr "length" "1")])
+;; lo_sum of a function address when TARGET_SHARED_LIBS
(define_insn ""
[(set (match_operand:SI 0 "register_operand" "=r")
(lo_sum:SI (match_operand:SI 1 "register_operand" "r")