]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
i386.c (min_insn_size): Use get_attr_length for normal insns other than TYPE_MULTI...
authorJakub Jelinek <jakub@redhat.com>
Thu, 11 Jun 2009 06:42:08 +0000 (08:42 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 11 Jun 2009 06:42:08 +0000 (08:42 +0200)
* config/i386/i386.c (min_insn_size): Use get_attr_length
for normal insns other than TYPE_MULTI, TYPE_OTHER and TYPE_FCMP.
For __asm return 0.

From-SVN: r148365

gcc/ChangeLog
gcc/config/i386/i386.c

index 819bcb8f722b50334ff484464b7b5e7e1bd82bdf..42c245ca385d2ffe4f9b9954225048fb55c00102 100644 (file)
@@ -1,5 +1,9 @@
 2009-06-11  Jakub Jelinek  <jakub@redhat.com>
 
+       * config/i386/i386.c (min_insn_size): Use get_attr_length
+       for normal insns other than TYPE_MULTI, TYPE_OTHER and TYPE_FCMP.
+       For __asm return 0.
+
        * config/i386/i386.c (ix86_pad_returns): Use emit_jump_insn_before
        instead of emit_insn_before.
 
index 6652d771213dc636d8b11c5ecf0ce2b930d5047d..0bab4632468845999f1c5afd0a674f550b8b7cd4 100644 (file)
@@ -27571,7 +27571,7 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
 static int
 min_insn_size (rtx insn)
 {
-  int l = 0;
+  int l = 0, len;
 
   if (!INSN_P (insn) || !active_insn_p (insn))
     return 0;
@@ -27580,7 +27580,7 @@ min_insn_size (rtx insn)
   if (GET_CODE (PATTERN (insn)) == UNSPEC_VOLATILE
       && XINT (PATTERN (insn), 1) == UNSPECV_ALIGN)
     return 0;
-  if (JUMP_TABLE_DATA_P(insn))
+  if (JUMP_TABLE_DATA_P (insn))
     return 0;
 
   /* Important case - calls are always 5 bytes.
@@ -27589,14 +27589,31 @@ min_insn_size (rtx insn)
       && symbolic_reference_mentioned_p (PATTERN (insn))
       && !SIBLING_CALL_P (insn))
     return 5;
-  if (get_attr_length (insn) <= 1)
+  len = get_attr_length (insn);
+  if (len <= 1)
     return 1;
 
-  /* For normal instructions we may rely on the sizes of addresses
-     and the presence of symbol to require 4 bytes of encoding.
-     This is not the case for jumps where references are PC relative.  */
+  /* For normal instructions we rely on get_attr_length being exact,
+     with a few exceptions.  */
   if (!JUMP_P (insn))
     {
+      enum attr_type type = get_attr_type (insn);
+
+      switch (type)
+       {
+       case TYPE_MULTI:
+         if (GET_CODE (PATTERN (insn)) == ASM_INPUT
+             || asm_noperands (PATTERN (insn)) >= 0)
+           return 0;
+         break;
+       case TYPE_OTHER:
+       case TYPE_FCMP:
+         break;
+       default:
+         /* Otherwise trust get_attr_length.  */
+         return len;
+       }
+
       l = get_attr_length_address (insn);
       if (l < 4 && symbolic_reference_mentioned_p (PATTERN (insn)))
        l = 4;