]> gcc.gnu.org Git - gcc.git/commitdiff
i386.md (push): Prohibit symbolic constants if flag_pic.
authorRichard Henderson <rth@cygnus.com>
Mon, 19 Jan 1998 21:54:09 +0000 (13:54 -0800)
committerRichard Henderson <rth@gcc.gnu.org>
Mon, 19 Jan 1998 21:54:09 +0000 (13:54 -0800)
* i386.md (push): Prohibit symbolic constants if flag_pic.
(movsi+1): Likewise for move to non-register.

From-SVN: r17425

gcc/ChangeLog
gcc/config/i386/i386.md

index 4613ac2d14746c0106fb940f5a7744ff6c080f6c..3413a8910bb73439ae7312bc55daa5482dc3c18a 100644 (file)
@@ -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.
index f0692f945cbf5fb6a28e5f96b678a404c263f95a..7deee6c8e88d1e81f11a28f89e1a5179c331f70d 100644 (file)
 ;; and each is preceded by a corresponding push-insn pattern
 ;; (since pushes are not general_operands on the 386).
 
+(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.
 
 (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;
     /* 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"))]
This page took 0.082057 seconds and 5 git commands to generate.