2005-03-08  Jan Beulich  <jbeulich@novell.com>

	* config/tc-ia64.c (emit_one_bundle): Track last slot user insn was
	emitted to. Add more precise diagnostics for non-fitting insns based
	on that. Eliminate now superfluous special casing of MLX. Clear out
	slot information when dropping an insn.

gas/testsuite/
2005-03-08  Jan Beulich  <jbeulich@novell.com>

	* gas/ia64/no-fit.[ls]: New.
	* gas/ia64/ia64.exp: Run new test.
This commit is contained in:
Jan Beulich 2005-03-08 08:27:02 +00:00
parent ef6a2b4181
commit 9b50584289
6 changed files with 87 additions and 26 deletions

View File

@ -1,3 +1,10 @@
2005-03-08 Jan Beulich <jbeulich@novell.com>
* config/tc-ia64.c (emit_one_bundle): Track last slot user insn was
emitted to. Add more precise diagnostics for non-fitting insns based
on that. Eliminate now superfluous special casing of MLX. Clear out
slot information when dropping an insn.
2005-03-08 Jan Beulich <jbeulich@novell.com> 2005-03-08 Jan Beulich <jbeulich@novell.com>
* config/tc-ia64.c (parse_section_name): Rename to... * config/tc-ia64.c (parse_section_name): Rename to...

View File

@ -6459,7 +6459,7 @@ emit_one_bundle ()
bfd_vma insn[3] = { -1, -1, -1 }; bfd_vma insn[3] = { -1, -1, -1 };
struct ia64_opcode *idesc; struct ia64_opcode *idesc;
int end_of_insn_group = 0, user_template = -1; int end_of_insn_group = 0, user_template = -1;
int n, i, j, first, curr; int n, i, j, first, curr, last_slot;
unw_rec_list *ptr, *last_ptr, *end_ptr; unw_rec_list *ptr, *last_ptr, *end_ptr;
bfd_vma t0 = 0, t1 = 0; bfd_vma t0 = 0, t1 = 0;
struct label_fix *lfix; struct label_fix *lfix;
@ -6511,6 +6511,7 @@ emit_one_bundle ()
curr = first; curr = first;
idesc = md.slot[curr].idesc; idesc = md.slot[curr].idesc;
end_of_insn_group = 0; end_of_insn_group = 0;
last_slot = -1;
for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i) for (i = 0; i < 3 && md.num_slots_in_use > 0; ++i)
{ {
/* If we have unwind records, we may need to update some now. */ /* If we have unwind records, we may need to update some now. */
@ -6776,27 +6777,7 @@ emit_one_bundle ()
} }
if (insn_unit != required_unit) if (insn_unit != required_unit)
{ continue; /* Try next slot. */
if (required_unit == IA64_UNIT_L
&& insn_unit == IA64_UNIT_I
&& !(idesc->flags & IA64_OPCODE_X_IN_MLX))
{
/* we got ourselves an MLX template but the current
instruction isn't an X-unit, or an I-unit instruction
that can go into the X slot of an MLX template. Duh. */
if (md.num_slots_in_use >= NUM_SLOTS)
{
as_bad_where (md.slot[curr].src_file,
md.slot[curr].src_line,
"`%s' can't go in X slot of "
"MLX template", idesc->name);
/* drop this insn so we don't livelock: */
--md.num_slots_in_use;
}
break;
}
continue; /* try next slot */
}
if (debug_type == DEBUG_DWARF2 || md.slot[curr].loc_directive_seen) if (debug_type == DEBUG_DWARF2 || md.slot[curr].loc_directive_seen)
{ {
@ -6830,6 +6811,7 @@ emit_one_bundle ()
++i; ++i;
} }
--md.num_slots_in_use; --md.num_slots_in_use;
last_slot = i;
/* now is a good time to fix up the labels for this insn: */ /* now is a good time to fix up the labels for this insn: */
for (lfix = md.slot[curr].label_fixups; lfix; lfix = lfix->next) for (lfix = md.slot[curr].label_fixups; lfix; lfix = lfix->next)
@ -6874,10 +6856,35 @@ emit_one_bundle ()
{ {
if (md.num_slots_in_use > 0) if (md.num_slots_in_use > 0)
{ {
as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line, if (last_slot >= 2)
"`%s' does not fit into %s template", as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
idesc->name, ia64_templ_desc[template].name); "`%s' does not fit into bundle", idesc->name);
--md.num_slots_in_use; else if (last_slot < 0)
{
as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
"`%s' does not fit into %s template",
idesc->name, ia64_templ_desc[template].name);
/* Drop first insn so we don't livelock. */
--md.num_slots_in_use;
know (curr == first);
ia64_free_opcode (md.slot[curr].idesc);
memset (md.slot + curr, 0, sizeof (md.slot[curr]));
md.slot[curr].user_template = -1;
}
else
{
const char *where;
if (template == 2)
where = "X slot";
else if (last_slot == 0)
where = "slots 2 or 3";
else
where = "slot 3";
as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,
"`%s' can't go in %s of %s template",
idesc->name, where, ia64_templ_desc[template].name);
}
} }
else else
as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line, as_bad_where (md.slot[curr].src_file, md.slot[curr].src_line,

View File

@ -1,3 +1,8 @@
2005-03-08 Jan Beulich <jbeulich@novell.com>
* gas/ia64/no-fit.[ls]: New.
* gas/ia64/ia64.exp: Run new test.
2005-03-08 Jan Beulich <jbeulich@novell.com> 2005-03-08 Jan Beulich <jbeulich@novell.com>
* gas/ia64/xdata.[sd], gas/ia64/xdata-ilp32.d: New. * gas/ia64/xdata.[sd], gas/ia64/xdata-ilp32.d: New.

View File

@ -76,6 +76,7 @@ if [istarget "ia64-*"] then {
run_dump_test "bundling" run_dump_test "bundling"
run_list_test "label" "" run_list_test "label" ""
run_list_test "last" "" run_list_test "last" ""
run_list_test "no-fit" ""
run_list_test "pound" "-al" run_list_test "pound" "-al"
run_list_test "proc" "-munwind-check=error" run_list_test "proc" "-munwind-check=error"
run_list_test "slot2" "" run_list_test "slot2" ""

View File

@ -0,0 +1,8 @@
.*: Assembler messages:
.*:5: Error: .nop\.i.[[:space:]]+[^23]*[[:space:]]+MFB[[:space:]]+.*
.*:8: Error: .nop\.f.[[:space:]]+[^23]*[[:space:]]+MLX[[:space:]]+.*
.*:12: Error: .nop\.i.[[:space:]]+.*[[:space:]]+2[[:space:]]+.*[[:space:]]+3[[:space:]]+.*[[:space:]]+MFB[[:space:]]+.*
.*:17: Error: .nop\.i.[[:space:]]+[^2]*[[:space:]]+3[[:space:]]+.*[[:space:]]+MFB[[:space:]]+.*
.*:21: Error: .nop\.f.[[:space:]]+.*[[:space:]]+X[[:space:]]+.*[[:space:]]+MLX[[:space:]]+.*
.*:27: Error: .nop.[[:space:]]+[^23M]*
.*:32: Error: .nop.[[:space:]]+[^23M]*

View File

@ -0,0 +1,33 @@
.explicit
.text
_start:
{.mfb
nop.i 0
}
{.mlx
nop.f 0
}
{.mfb
nop.m 0
nop.i 0
}
{.mfb
nop.m 0
nop.f 0
nop.i 0
}
{.mlx
nop.m 0
nop.f 0
}
{.mfb
nop 0
nop 0
nop 0
nop 0
}
{.mlx
nop 0
nop 0
nop 0
}