From 91d777eed76adf91d91e558330e7dbb0158656f7 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Thu, 17 Feb 2005 23:22:05 +0000 Subject: gas/ 2005-02-17 H.J. Lu * NEWS: Mention "-mhint.b=[ok|warning|error]". * config/tc-ia64.c (md): Add hint_b. (emit_one_bundle): Handle md.hint_b for "hint". (md_parse_option): Accepted "-mhint.b=[ok|warning|error]". (md_show_usage): Add "-mhint.b=[ok|warning|error]". (ia64_init): Set md.hint_b to error. (md_assemble): Handle md.hint_b for "hint.b". * doc/as.texinfo: Add "-mhint.b=[ok|warning|error]". * doc/c-ia64.texi: Likewise. gas/testsuite/ 2005-02-17 H.J. Lu * gas/ia64/hint.b-err.l: New file. * gas/ia64/hint.b-err.s: Likewise. * gas/ia64/hint.b-warn.l: Likewise. * gas/ia64/hint.b-warn.s: Likewise. * gas/ia64/ia64.exp: Run hint.b-err and hint.b-warn. * gas/ia64/opc-b.d: Pass -mhint.b=ok to as. --- gas/ChangeLog | 14 ++++++++ gas/NEWS | 2 ++ gas/config/tc-ia64.c | 64 +++++++++++++++++++++++++++++++++++- gas/doc/as.texinfo | 1 + gas/doc/c-ia64.texi | 9 +++++ gas/testsuite/ChangeLog | 11 +++++++ gas/testsuite/gas/ia64/hint.b-err.l | 3 ++ gas/testsuite/gas/ia64/hint.b-err.s | 2 ++ gas/testsuite/gas/ia64/hint.b-warn.l | 3 ++ gas/testsuite/gas/ia64/hint.b-warn.s | 2 ++ gas/testsuite/gas/ia64/ia64.exp | 2 ++ gas/testsuite/gas/ia64/opc-b.d | 2 +- 12 files changed, 113 insertions(+), 2 deletions(-) create mode 100644 gas/testsuite/gas/ia64/hint.b-err.l create mode 100644 gas/testsuite/gas/ia64/hint.b-err.s create mode 100644 gas/testsuite/gas/ia64/hint.b-warn.l create mode 100644 gas/testsuite/gas/ia64/hint.b-warn.s diff --git a/gas/ChangeLog b/gas/ChangeLog index 699c9a6..ebf77e7 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,17 @@ +2005-02-17 H.J. Lu + + * NEWS: Mention "-mhint.b=[ok|warning|error]". + + * config/tc-ia64.c (md): Add hint_b. + (emit_one_bundle): Handle md.hint_b for "hint". + (md_parse_option): Accepted "-mhint.b=[ok|warning|error]". + (md_show_usage): Add "-mhint.b=[ok|warning|error]". + (ia64_init): Set md.hint_b to error. + (md_assemble): Handle md.hint_b for "hint.b". + + * doc/as.texinfo: Add "-mhint.b=[ok|warning|error]". + * doc/c-ia64.texi: Likewise. + 2005-02-17 Alan Modra * tc.h (struct relax_type, relax_typeS): Move from here.. diff --git a/gas/NEWS b/gas/NEWS index feaee1f..293668c 100644 --- a/gas/NEWS +++ b/gas/NEWS @@ -1,5 +1,7 @@ -*- text -*- +* New command line option -mhint.b=[ok|warning|error] for IA64 targets. + * New command line option -munwind-check=[warning|error] for IA64 targets. diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index e43619d..251185f 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -229,6 +229,14 @@ static struct that are predicatable. */ expressionS qp; + /* What to do when hint.b is used. */ + enum + { + hint_b_error, + hint_b_warning, + hint_b_ok + } hint_b; + unsigned int manual_bundling : 1, debug_dv: 1, @@ -6705,9 +6713,34 @@ emit_one_bundle () enum ia64_opnd opnd1, opnd2; if ((strcmp (idesc->name, "nop") == 0) - || (strcmp (idesc->name, "hint") == 0) || (strcmp (idesc->name, "break") == 0)) insn_unit = required_unit; + else if (strcmp (idesc->name, "hint") == 0) + { + insn_unit = required_unit; + if (required_unit == IA64_UNIT_B) + { + switch (md.hint_b) + { + case hint_b_ok: + break; + case hint_b_warning: + as_warn ("hint in B unit may be treated as nop"); + break; + case hint_b_error: + /* When manual bundling is off and there is no + user template, we choose a different unit so + that hint won't go into the current slot. We + will fill the current bundle with nops and + try to put hint into the next bundle. */ + if (!manual_bundling && user_template < 0) + insn_unit = IA64_UNIT_I; + else + as_bad ("hint in B unit can't be used"); + break; + } + } + } else if (strcmp (idesc->name, "chk.s") == 0 || strcmp (idesc->name, "mov") == 0) { @@ -6916,6 +6949,18 @@ md_parse_option (c, arg) else return 0; } + else if (strncmp (arg, "hint.b=", 7) == 0) + { + arg += 7; + if (strcmp (arg, "ok") == 0) + md.hint_b = hint_b_ok; + else if (strcmp (arg, "warning") == 0) + md.hint_b = hint_b_warning; + else if (strcmp (arg, "error") == 0) + md.hint_b = hint_b_error; + else + return 0; + } else return 0; break; @@ -7030,6 +7075,8 @@ IA-64 options:\n\ -mle | -mbe select little- or big-endian byte order (default -mle)\n\ -munwind-check=[warning|error]\n\ unwind directive check (default -munwind-check=warning)\n\ + -mhint.b=[ok|warning|error]\n\ + hint.b check (default -mhint.b=error)\n\ -x | -xexplicit turn on dependency violation checking\n\ -xauto automagically remove dependency violations (default)\n\ -xnone turn off dependency violation checking\n\ @@ -7382,6 +7429,7 @@ ia64_init (argc, argv) md.detect_dv = 1; /* FIXME: We should change it to unwind_check_error someday. */ md.unwind_check = unwind_check_warning; + md.hint_b = hint_b_error; } /* Return a string for the target object file format. */ @@ -10600,6 +10648,20 @@ md_assemble (str) TOUPPER (unit)); } } + else if (strcmp (idesc->name, "hint.b") == 0) + { + switch (md.hint_b) + { + case hint_b_ok: + break; + case hint_b_warning: + as_warn ("hint.b may be treated as nop"); + break; + case hint_b_error: + as_bad ("hint.b shouldn't be used"); + break; + } + } qp_regno = 0; if (md.qp.X_op == O_register) diff --git a/gas/doc/as.texinfo b/gas/doc/as.texinfo index 051ab70..6e616df 100644 --- a/gas/doc/as.texinfo +++ b/gas/doc/as.texinfo @@ -316,6 +316,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}. [@b{-milp32}|@b{-milp64}|@b{-mlp64}|@b{-mp64}] [@b{-mle}|@b{mbe}] [@b{-munwind-check=warning}|@b{-munwind-check=error}] + [@b{-mhint.b=ok}|@b{-mhint.b=warning}|@b{-mhint.b=error}] [@b{-x}|@b{-xexplicit}] [@b{-xauto}] [@b{-xdebug}] @end ifset @ifset IP2K diff --git a/gas/doc/c-ia64.texi b/gas/doc/c-ia64.texi index 4858cb9..5d0ec90 100644 --- a/gas/doc/c-ia64.texi +++ b/gas/doc/c-ia64.texi @@ -73,6 +73,15 @@ will make the assembler issue a warning when an unwind directive check fails. This is the default. @code{-munwind-check=error} will make the assembler issue an error when an unwind directive check fails. +@item -mhint.b=ok +@item -mhint.b=warning +@item -mhint.b=error +These options control what the assembler will do when the @samp{hint.b} +instruction is used. @code{-mhint.b=ok} will make the assembler accept +@samp{hint.b}. @code{-mint.b=warning} will make the assembler issue a +warning when @samp{hint.b} is used. @code{-mhint.b=error} will make +the assembler treat @samp{hint.b} as an error, which is the default. + @item -x @item -xexplicit These options turn on dependency violation checking. diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 680365d..8ae4093 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,14 @@ +2005-02-17 H.J. Lu + + * gas/ia64/hint.b-err.l: New file. + * gas/ia64/hint.b-err.s: Likewise. + * gas/ia64/hint.b-warn.l: Likewise. + * gas/ia64/hint.b-warn.s: Likewise. + + * gas/ia64/ia64.exp: Run hint.b-err and hint.b-warn. + + * gas/ia64/opc-b.d: Pass -mhint.b=ok to as. + 2005-02-17 Jan Beulich * gas/ia64/nostkreg.[ds]: New. diff --git a/gas/testsuite/gas/ia64/hint.b-err.l b/gas/testsuite/gas/ia64/hint.b-err.l new file mode 100644 index 0000000..86d8b5e --- /dev/null +++ b/gas/testsuite/gas/ia64/hint.b-err.l @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:1: Error: hint.b shouldn't be used +.*:2: Error: hint.b shouldn't be used diff --git a/gas/testsuite/gas/ia64/hint.b-err.s b/gas/testsuite/gas/ia64/hint.b-err.s new file mode 100644 index 0000000..75f7a65 --- /dev/null +++ b/gas/testsuite/gas/ia64/hint.b-err.s @@ -0,0 +1,2 @@ + hint.b @pause + hint.b 0x1ffff diff --git a/gas/testsuite/gas/ia64/hint.b-warn.l b/gas/testsuite/gas/ia64/hint.b-warn.l new file mode 100644 index 0000000..1c5f0be --- /dev/null +++ b/gas/testsuite/gas/ia64/hint.b-warn.l @@ -0,0 +1,3 @@ +.*: Assembler messages: +.*:1: Warning: hint.b may be treated as nop +.*:2: Warning: hint.b may be treated as nop diff --git a/gas/testsuite/gas/ia64/hint.b-warn.s b/gas/testsuite/gas/ia64/hint.b-warn.s new file mode 100644 index 0000000..75f7a65 --- /dev/null +++ b/gas/testsuite/gas/ia64/hint.b-warn.s @@ -0,0 +1,2 @@ + hint.b @pause + hint.b 0x1ffff diff --git a/gas/testsuite/gas/ia64/ia64.exp b/gas/testsuite/gas/ia64/ia64.exp index 0f1ec68..83d98fb 100644 --- a/gas/testsuite/gas/ia64/ia64.exp +++ b/gas/testsuite/gas/ia64/ia64.exp @@ -79,4 +79,6 @@ if [istarget "ia64-*"] then { run_list_test "slot2" "" run_list_test "unwind-err" "-munwind-check=error" run_dump_test "operand-or" + run_list_test "hint.b-err" "" + run_list_test "hint.b-warn" "-mhint.b=warning" } diff --git a/gas/testsuite/gas/ia64/opc-b.d b/gas/testsuite/gas/ia64/opc-b.d index 64a4928..cb0973c 100644 --- a/gas/testsuite/gas/ia64/opc-b.d +++ b/gas/testsuite/gas/ia64/opc-b.d @@ -1,4 +1,4 @@ -#as: -xnone +#as: -xnone -mhint.b=ok #objdump: -d #name: ia64 opc-b -- cgit v1.1