aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Henderson <rth@cygnus.com>1998-01-19 13:54:09 -0800
committerRichard Henderson <rth@gcc.gnu.org>1998-01-19 13:54:09 -0800
commit685885b773c21a431e87d59de0620b0098fc6dc2 (patch)
treeee89068efeafb38e07b6fa28de76236b8ce5e80c
parent11ea364a691943c03275f081d97c75f75777d83c (diff)
downloadgcc-685885b773c21a431e87d59de0620b0098fc6dc2.zip
gcc-685885b773c21a431e87d59de0620b0098fc6dc2.tar.gz
gcc-685885b773c21a431e87d59de0620b0098fc6dc2.tar.bz2
i386.md (push): Prohibit symbolic constants if flag_pic.
* i386.md (push): Prohibit symbolic constants if flag_pic. (movsi+1): Likewise for move to non-register. From-SVN: r17425
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386.md43
2 files changed, 44 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4613ac2..3413a89 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+Mon Jan 19 21:57:00 1998 Richard Henderson <rth@cygnus.com>
+
+ * i386.md (push): Prohibit symbolic constants if flag_pic.
+ (movsi+1): Likewise for move to non-register.
+
Mon Jan 19 11:15:38 1998 Jim Wilson <wilson@cygnus.com>
* alpha.c (mode_mask_operand): Accept 0xffffffff on 32 bit host.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index f0692f9..7deee6c 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -834,8 +834,14 @@
(define_insn ""
[(set (match_operand:SI 0 "push_operand" "=<")
+ (match_operand:SI 1 "nonmemory_operand" "rn"))]
+ "flag_pic"
+ "* return AS1 (push%L0,%1);")
+
+(define_insn ""
+ [(set (match_operand:SI 0 "push_operand" "=<")
(match_operand:SI 1 "nonmemory_operand" "ri"))]
- ""
+ "!flag_pic"
"* return AS1 (push%L0,%1);")
;; On a 386, it is faster to push MEM directly.
@@ -876,8 +882,10 @@
(define_insn ""
[(set (match_operand:SI 0 "general_operand" "=g,r")
- (match_operand:SI 1 "general_operand" "ri,m"))]
- "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)"
+ (match_operand:SI 1 "general_operand" "rn,im"))]
+ "((!TARGET_MOVE || GET_CODE (operands[0]) != MEM)
+ || (GET_CODE (operands[1]) != MEM))
+ && flag_pic"
"*
{
rtx link;
@@ -896,13 +904,40 @@
/* Fastest way to change a 0 to a 1. */
return AS1 (inc%L0,%0);
- if (flag_pic && SYMBOLIC_CONST (operands[1]))
+ if (SYMBOLIC_CONST (operands[1]))
return AS2 (lea%L0,%a1,%0);
return AS2 (mov%L0,%1,%0);
}")
(define_insn ""
+ [(set (match_operand:SI 0 "general_operand" "=g,r")
+ (match_operand:SI 1 "general_operand" "ri,m"))]
+ "((!TARGET_MOVE || GET_CODE (operands[0]) != MEM)
+ || (GET_CODE (operands[1]) != MEM))
+ && !flag_pic"
+ "*
+{
+ rtx link;
+ if (operands[1] == const0_rtx && REG_P (operands[0]))
+ return AS2 (xor%L0,%0,%0);
+
+ if (operands[1] == const1_rtx
+ && (link = find_reg_note (insn, REG_WAS_0, 0))
+ /* Make sure the insn that stored the 0 is still present. */
+ && ! INSN_DELETED_P (XEXP (link, 0))
+ && GET_CODE (XEXP (link, 0)) != NOTE
+ /* Make sure cross jumping didn't happen here. */
+ && no_labels_between_p (XEXP (link, 0), insn)
+ /* Make sure the reg hasn't been clobbered. */
+ && ! reg_set_between_p (operands[0], XEXP (link, 0), insn))
+ /* Fastest way to change a 0 to a 1. */
+ return AS1 (inc%L0,%0);
+
+ return AS2 (mov%L0,%1,%0);
+}")
+
+(define_insn ""
[(set (match_operand:HI 0 "push_operand" "=<")
(match_operand:HI 1 "nonmemory_operand" "ri"))]
""