From: Jakub Jelinek Date: Thu, 11 Jun 2009 06:42:08 +0000 (+0200) Subject: i386.c (min_insn_size): Use get_attr_length for normal insns other than TYPE_MULTI... X-Git-Tag: releases/gcc-4.5.0~5264 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e521964299930c05e5306addf709980a52d4a62c;p=thirdparty%2Fgcc.git i386.c (min_insn_size): Use get_attr_length for normal insns other than TYPE_MULTI... * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 819bcb8f722b..42c245ca385d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,9 @@ 2009-06-11 Jakub Jelinek + * 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. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 6652d771213d..0bab46324688 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -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;