]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/9888 (-mcpu=k6 -Os produces out of range loop instructions)
authorEric Botcazou <ebotcazou@libertysurf.fr>
Wed, 12 Mar 2003 09:08:34 +0000 (10:08 +0100)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Wed, 12 Mar 2003 09:08:34 +0000 (09:08 +0000)
PR optimization/9888
Backport patch from mainline:

Tue Nov 19 23:50:56 CET 2002  Jan Hubicka  <jh@suse.cz>

* i386.md (length_immediate): Do not refer to insn address.
(jcc*, jmp patterns): Compute length explicitly.
(doloop_end_internal pattern): Unconditionally set the type to "ibr".

From-SVN: r64229

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

index 114aff6c458faad1c1197b81f434ea92cf187a33..972e5abb40a3ba79fd1eddfe868e2521e77ad3d6 100644 (file)
@@ -1,3 +1,14 @@
+2003-03-12  Eric Botcazou  <ebotcazou@libertysurf.fr>
+
+       PR optimization/9888
+       Backport patch from mainline:
+
+       Tue Nov 19 23:50:56 CET 2002  Jan Hubicka  <jh@suse.cz>
+
+       * i386.md (length_immediate): Do not refer to insn address.
+       (jcc*, jmp patterns): Compute length explicitly.
+       (doloop_end_internal pattern): Unconditionally set the type to "ibr".
+
 2003-03-12  Eric Botcazou  <ebotcazou@libertysurf.fr>
 
        PR optimization/9888
index a159fa536e0d529834edac5a9558856300bd76a2..ed497f0b0e08cf4c40e74e16c25d4954559d5d1f 100644 (file)
           (if_then_else (match_operand 1 "constant_call_address_operand" "")
             (const_int 4)
             (const_int 0))
+        ;; We don't know the size before shorten_branches.  Expect
+        ;; the instruction to fit for better scheduling.
         (eq_attr "type" "ibr")
-          (if_then_else (and (ge (minus (match_dup 0) (pc))
-                                 (const_int -128))
-                             (lt (minus (match_dup 0) (pc))
-                                 (const_int 124)))
-            (const_int 1)
-            (const_int 4))
+          (const_int 1)
         ]
         (symbol_ref "/* Update immediate_length and other attributes! */ abort(),1")))
 
   "%+j%C1\t%l0"
   [(set_attr "type" "ibr")
    (set_attr "modrm" "0")
-   (set (attr "prefix_0f")
+   (set (attr "length")
           (if_then_else (and (ge (minus (match_dup 0) (pc))
                                  (const_int -128))
                              (lt (minus (match_dup 0) (pc))
                                  (const_int 124)))
-            (const_int 0)
-            (const_int 1)))])
+            (const_int 2)
+            (const_int 6)))])
 
 (define_insn "*jcc_2"
   [(set (pc)
   "%+j%c1\t%l0"
   [(set_attr "type" "ibr")
    (set_attr "modrm" "0")
-   (set (attr "prefix_0f")
+   (set (attr "length")
           (if_then_else (and (ge (minus (match_dup 0) (pc))
                                  (const_int -128))
                              (lt (minus (match_dup 0) (pc))
                                  (const_int 124)))
-            (const_int 0)
-            (const_int 1)))])
+            (const_int 2)
+            (const_int 6)))])
 
 ;; In general it is not safe to assume too much about CCmode registers,
 ;; so simplify-rtx stops when it sees a second one.  Under certain 
   ""
   "jmp\t%l0"
   [(set_attr "type" "ibr")
+   (set (attr "length")
+          (if_then_else (and (ge (minus (match_dup 0) (pc))
+                                 (const_int -128))
+                             (lt (minus (match_dup 0) (pc))
+                                 (const_int 124)))
+            (const_int 2)
+            (const_int 5)))
    (set_attr "modrm" "0")])
 
 (define_expand "indirect_jump"
                                    (const_int 124))))
                      (const_int 2)
                      (const_int 16)))
-   (set (attr "type")
-       (if_then_else (and (eq_attr "alternative" "0")
-                          (and (ge (minus (match_dup 0) (pc))
-                                   (const_int -128))
-                               (lt (minus (match_dup 0) (pc))
-                                   (const_int 124))))
-                     (const_string "ibr")
-                     (const_string "multi")))])
+   ;; We don't know the type before shorten branches.  Optimistically expect
+   ;; the loop instruction to match.
+   (set (attr "type") (const_string "ibr"))])
 
 (define_split
   [(set (pc)