diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2005-03-28 22:34:20 +0000 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2005-03-28 22:34:20 +0000 |
commit | 8c2fda1d2b06da6f93b21c939762ca118442351b (patch) | |
tree | ec0176b94fba24e13dd6c1bd4f968687314c1cac /gas/config | |
parent | 6d1eba4cf3eb987e53fd893fe2f1faa81c2bea89 (diff) | |
download | gdb-8c2fda1d2b06da6f93b21c939762ca118442351b.zip gdb-8c2fda1d2b06da6f93b21c939762ca118442351b.tar.gz gdb-8c2fda1d2b06da6f93b21c939762ca118442351b.tar.bz2 |
gas/
2005-03-28 David Mosberger <davidm@hpl.hp.com>
H.J. Lu <hongjiu.lu@intel.com>
PR 803
NEWS: Mention "-mtune=[itanium1|itanium2]".
* config/tc-ia64.c (md): Add tune.
(md_parse_option): Accepted "-mtune=[itanium1|itanium2]".
(md_show_usage): Add "-mtune=[itanium1|itanium2]".
(extra_goodness): Prefer M- and I-unit NOPs for itanium2. F and
B unit NOPs are discouraged for McKinley-derived cores.
(md_begin): Don't hardcode the "extra_goodness()" function in
the comment...
(ia64_init): Set md.tune to itanium2.
* doc/as.texinfo: Add -mtune=[itanium1|itanium2]".
* doc/c-ia64.texi: Likewise.
gas/testsuite/
2005-03-28 H.J. Lu <hongjiu.lu@intel.com>
PR 803
* gas/ia64/dv-imply.d: Pass -mtune=itanium1 to as.
* gas/ia64/dv-mutex.d : Likewise.
* gas/ia64/dv-safe.d: Likewise.
* gas/ia64/dv-srlz.d.nop: Likewise.
* gas/ia64/ldxmov-1.d: Likewise.
* gas/ia64/opc-b.d: Likewise.
* gas/ia64/opc-f.d: Likewise.
* gas/ia64/opc-i.d: Likewise.
* gas/ia64/opc-m.d: Likewise.
* gas/ia64/operand-or.d: Likewise.
* gas/ia64/pcrel.d: Likewise.
* gas/ia64/pseudo.d: Likewise.
* gas/ia64/tls.d: Likewise.
ld/testsuite/
2005-03-28 H.J. Lu <hongjiu.lu@intel.com>
PR 803
* ld-ia64/ia64.exp: Pass -mtune=itanium1 to as.
Diffstat (limited to 'gas/config')
-rw-r--r-- | gas/config/tc-ia64.c | 56 |
1 files changed, 47 insertions, 9 deletions
diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index b959cdc..d96d6f6 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -229,6 +229,13 @@ static struct that are predicatable. */ expressionS qp; + /* Optimize for which CPU. */ + enum + { + itanium1, + itanium2 + } tune; + /* What to do when hint.b is used. */ enum { @@ -6957,6 +6964,16 @@ md_parse_option (c, arg) else return 0; } + else if (strncmp (arg, "tune=", 5) == 0) + { + arg += 5; + if (strcmp (arg, "itanium1") == 0) + md.tune = itanium1; + else if (strcmp (arg, "itanium2") == 0) + md.tune = itanium2; + else + return 0; + } else return 0; break; @@ -7069,6 +7086,8 @@ IA-64 options:\n\ EF_IA_64_NOFUNCDESC_CONS_GP)\n\ -milp32|-milp64|-mlp64|-mp64 select data model (default -mlp64)\n\ -mle | -mbe select little- or big-endian byte order (default -mle)\n\ + -mtune=[itanium1|itanium2]\n\ + tune for a specific CPU (default -mtune=itanium2)\n\ -munwind-check=[warning|error]\n\ unwind directive check (default -munwind-check=warning)\n\ -mhint.b=[ok|warning|error]\n\ @@ -7122,11 +7141,30 @@ match (int templ, int type, int slot) static inline int extra_goodness (int templ, int slot) { - if (slot == 1 && match (templ, IA64_TYPE_F, slot)) - return 2; - if (slot == 2 && match (templ, IA64_TYPE_B, slot)) - return 1; - return 0; + switch (md.tune) + { + case itanium1: + if (slot == 1 && match (templ, IA64_TYPE_F, slot)) + return 2; + else if (slot == 2 && match (templ, IA64_TYPE_B, slot)) + return 1; + else + return 0; + break; + case itanium2: + if (match (templ, IA64_TYPE_M, slot) + || match (templ, IA64_TYPE_I, slot)) + /* Favor M- and I-unit NOPs. We definitely want to avoid + F-unit and B-unit may cause split-issue or less-than-optimal + branch-prediction. */ + return 2; + else + return 0; + break; + default: + abort (); + return 0; + } } /* This function is called once, at assembler startup time. It sets @@ -7222,10 +7260,9 @@ md_begin () &zero_address_frag); /* Compute the table of best templates. We compute goodness as a - base 4 value, in which each match counts for 3, each F counts - for 2, each B counts for 1. This should maximize the number of - F and B nops in the chosen bundles, which is good because these - pipelines are least likely to be overcommitted. */ + base 4 value, in which each match counts for 3. Match-failures + result in NOPs and we use extra_goodness() to pick the execution + units that are best suited for issuing the NOP. */ for (i = 0; i < IA64_NUM_TYPES; ++i) for (j = 0; j < IA64_NUM_TYPES; ++j) for (k = 0; k < IA64_NUM_TYPES; ++k) @@ -7426,6 +7463,7 @@ ia64_init (argc, argv) /* FIXME: We should change it to unwind_check_error someday. */ md.unwind_check = unwind_check_warning; md.hint_b = hint_b_error; + md.tune = itanium2; } /* Return a string for the target object file format. */ |