diff options
author | Richard Henderson <rth@cygnus.com> | 1998-01-19 13:54:09 -0800 |
---|---|---|
committer | Richard Henderson <rth@gcc.gnu.org> | 1998-01-19 13:54:09 -0800 |
commit | 685885b773c21a431e87d59de0620b0098fc6dc2 (patch) | |
tree | ee89068efeafb38e07b6fa28de76236b8ce5e80c | |
parent | 11ea364a691943c03275f081d97c75f75777d83c (diff) | |
download | gcc-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/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 43 |
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"))] "" |