This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: PATCH: Disable hint in B unit for Montecito
On Wed, Feb 16, 2005 at 08:43:11PM -0800, H. J. Lu wrote:
> On Wed, Feb 16, 2005 at 06:02:14PM -0800, H. J. Lu wrote:
> > On Wed, Feb 16, 2005 at 03:50:56PM -0800, James E Wilson wrote:
> > > On Wed, 2005-02-16 at 09:02, H. J. Lu wrote:
> > > > + else if (strcmp (idesc->name, "hint") == 0)
> > > > + {
> > > > + if (required_unit == IA64_UNIT_B
> > > > + && md.hint_b != hint_b_ok)
> > > > + insn_unit = IA64_UNIT_I;
> > > > + else
> > > > + insn_unit = required_unit;
> > > > + }
> > >
> > > It isn't OK to change units like this. This will lead to assembler
> > > errors when explicit mode is used. This example for instance
> > > .explicit
> > > { .bbb
> > > hint @pause
> > > hint @pause
> > > hint @pause
> > > }
> > > gives me
> > > aretha$ ./as-new tmp.s
> > > tmp.s: Assembler messages:
> > > tmp.s:3: Error: `hint.i' does not fit into BBB template
> > > which may be confusing to the end user.
> > >
> > [...]
> > > Since b is always at the end of a template, or followed by another b,
> > > there are no unit changes we can make here. The only thing we can do is
> > > emit a warning/error, same as in md_assemble, and then emit the hint.b
> > > instruction that the user asked for.
> > >
> > > I don't know if this effects the linux kernel compilation. If it does,
> > > then we might need to make this a warning instead of an error by
> > > default.
> >
> > It shouldn't be a problem. We can change the kernel if needed.
> >
>
> Unfortunately, it is trickier than I thought. With 2.6 kernel, my
> old change works OK. My new change doesn't work. Jim, do you have
> any suggestions?
I think it is OK to change unit when manual bundling is off there is no
user template. I am testing 2.4 and 2.6 kernel build now.
H.J.
---
gas/
2005-02-16 H.J. Lu <hongjiu.lu@intel.com>
* 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-16 H.J. Lu <hongjiu.lu@intel.com>
* 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/NEWS.hint 2005-02-14 09:31:16.000000000 -0800
+++ gas/NEWS 2005-02-17 09:48:07.935342572 -0800
@@ -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.
--- gas/config/tc-ia64.c.hint 2005-02-17 08:32:22.407920366 -0800
+++ gas/config/tc-ia64.c 2005-02-17 10:34:43.167087671 -0800
@@ -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,31 @@ 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:
+ /* We can only change unit if manual bundling is
+ off and there is no user template. */
+ 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 +6946,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 +7072,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 +7426,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 +10645,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)
--- gas/doc/as.texinfo.hint 2005-02-11 13:18:37.000000000 -0800
+++ gas/doc/as.texinfo 2005-02-17 09:48:07.946341148 -0800
@@ -316,6 +316,7 @@ gcc(1), ld(1), and the Info entries for
[@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
--- gas/doc/c-ia64.texi.hint 2005-02-14 09:31:17.000000000 -0800
+++ gas/doc/c-ia64.texi 2005-02-17 09:48:07.947341018 -0800
@@ -73,6 +73,15 @@ will make the assembler issue a warning
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.
--- gas/testsuite/gas/ia64/hint.b-err.l.hint 2005-02-17 08:36:41.588430056 -0800
+++ gas/testsuite/gas/ia64/hint.b-err.l 2005-02-17 09:48:07.947341018 -0800
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*:1: Error: hint.b shouldn't be used
+.*:2: Error: hint.b shouldn't be used
--- gas/testsuite/gas/ia64/hint.b-err.s.hint 2005-02-17 08:36:41.588430056 -0800
+++ gas/testsuite/gas/ia64/hint.b-err.s 2005-02-17 09:48:07.947341018 -0800
@@ -0,0 +1,2 @@
+ hint.b @pause
+ hint.b 0x1ffff
--- gas/testsuite/gas/ia64/hint.b-warn.l.hint 2005-02-17 08:36:41.589429927 -0800
+++ gas/testsuite/gas/ia64/hint.b-warn.l 2005-02-17 09:48:07.948340889 -0800
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*:1: Warning: hint.b may be treated as nop
+.*:2: Warning: hint.b may be treated as nop
--- gas/testsuite/gas/ia64/hint.b-warn.s.hint 2005-02-17 08:36:41.589429927 -0800
+++ gas/testsuite/gas/ia64/hint.b-warn.s 2005-02-17 09:48:07.948340889 -0800
@@ -0,0 +1,2 @@
+ hint.b @pause
+ hint.b 0x1ffff
--- gas/testsuite/gas/ia64/ia64.exp.hint 2005-02-17 08:32:23.217815714 -0800
+++ gas/testsuite/gas/ia64/ia64.exp 2005-02-17 09:48:07.948340889 -0800
@@ -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"
}
--- gas/testsuite/gas/ia64/opc-b.d.hint 2005-02-14 09:31:17.000000000 -0800
+++ gas/testsuite/gas/ia64/opc-b.d 2005-02-17 09:48:07.949340759 -0800
@@ -1,4 +1,4 @@
-#as: -xnone
+#as: -xnone -mhint.b=ok
#objdump: -d
#name: ia64 opc-b