This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
| Other format: | [Raw text] | |
The adjustments to deal with application registers accessible by both M-
and
I-units done so far were still insufficient; especially when using
manual
bundling errors could still result due to prematurely forcing such
moves to
happen on an M-unit. Decision what unit to run those on is now deferred
until
bundle generation. As a side effect, an ill error generation condition
for
chk.s in a similar scenario was also removed.
Built and tested on ia64-unknown-linux-gnu.
Jan
gas/
2005-01-24 Jan Beulich <jbeulich@novell.com>
* config/tc-ia64.c (emit_one_bundle): Add late resolution of
move
to/from application registers dynamic insns.
(md_assemble): Defer resolution of move to/from application
registers
dynamic insns when they can be issued on either the I- or
M-units.
gas/testsuite/
2005-01-24 Jan Beulich <jbeulich@novell.com>
* gas/ia64/dv-waw-err.l: Don't expect ar112 move warning to
refer to
M-unit.
* gas/ia64/mov-ar.[ds]: New.
* gas/ia64/ia64.exp: Run new test.
---
/home/jbeulich/src/binutils/mainline/2005-01-24.08.40/gas/config/tc-ia64.c 2005-01-18
10:43:33.000000000 +0100
+++ 2005-01-24.08.40/gas/config/tc-ia64.c 2005-01-24
10:06:35.868911608 +0100
@@ -6370,25 +6370,41 @@ emit_one_bundle ()
/* resolve dynamic opcodes such as "break", "hint", and "nop":
*/
if (idesc->type == IA64_TYPE_DYN)
{
+ 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, "chk.s") == 0)
+ else if (strcmp (idesc->name, "chk.s") == 0
+ || strcmp (idesc->name, "mov") == 0)
{
insn_unit = IA64_UNIT_M;
- if (required_unit == IA64_UNIT_I)
+ if (required_unit == IA64_UNIT_I
+ || (required_unit == IA64_UNIT_F && template == 6))
insn_unit = IA64_UNIT_I;
}
else
as_fatal ("emit_one_bundle: unexpected dynamic op");
sprintf (mnemonic, "%s.%c", idesc->name,
"?imbf??"[insn_unit]);
+ opnd1 = idesc->operands[0];
+ opnd2 = idesc->operands[1];
ia64_free_opcode (idesc);
- md.slot[curr].idesc = idesc = ia64_find_opcode (mnemonic);
+ idesc = ia64_find_opcode (mnemonic);
+ /* moves to/from ARs have collisions */
+ if (opnd1 == IA64_OPND_AR3 || opnd2 == IA64_OPND_AR3)
+ {
+ while (idesc != NULL
+ && (idesc->operands[0] != opnd1
+ || idesc->operands[1] != opnd2))
+ idesc = get_next_opcode (idesc);
+ }
#if 0
- know (!idesc->next); /* no resolved dynamic ops have
collisions */
+ else
+ know (!idesc->next);
#endif
+ md.slot[curr].idesc = idesc;
}
else
{
@@ -10071,17 +10087,22 @@ md_assemble (str)
{
if (ar_is_only_in_integer_unit
(CURR_SLOT.opnd[rop].X_add_number))
mnemonic = "mov.i";
- else
+ else if (ar_is_only_in_memory_unit
(CURR_SLOT.opnd[rop].X_add_number))
mnemonic = "mov.m";
+ else
+ rop = -1;
}
else
abort ();
- ia64_free_opcode (idesc);
- idesc = ia64_find_opcode (mnemonic);
- while (idesc != NULL
- && (idesc->operands[0] != opnd1
- || idesc->operands[1] != opnd2))
- idesc = get_next_opcode (idesc);
+ if (rop >= 0)
+ {
+ ia64_free_opcode (idesc);
+ idesc = ia64_find_opcode (mnemonic);
+ while (idesc != NULL
+ && (idesc->operands[0] != opnd1
+ || idesc->operands[1] != opnd2))
+ idesc = get_next_opcode (idesc);
+ }
}
}
else if (strcmp (idesc->name, "mov.i") == 0
---
/home/jbeulich/src/binutils/mainline/2005-01-24.08.40/gas/testsuite/gas/ia64/dv-waw-err.l 2000-09-22
21:43:48.000000000 +0200
+++
2005-01-24.08.40/gas/testsuite/gas/ia64/dv-waw-err.l 2005-01-21
13:29:04.000000000 +0100
@@ -81,7 +81,7 @@
.*:108: Warning: This is the location of the conflicting usage
.*:114: Warning: Use of 'st8\.spill' .* WAW dependency 'AR\[UNAT\]{%},
% in 0 - 63' \(impliedf\)
.*:113: Warning: This is the location of the conflicting usage
-.*:119: Warning: Use of 'mov\.m' .* WAW dependency 'AR%, % in 48 - 63,
112-127' \(impliedf\), specific resource number is 48
+.*:119: Warning: Use of 'mov(\.[im])?' .* WAW dependency 'AR%, % in 48
- 63, 112-127' \(impliedf\), specific resource number is 48
.*:118: Warning: This is the location of the conflicting usage
.*:124: Warning: Use of 'mov' .* WAW dependency 'BR%, % in 0 - 7'
\(impliedf\), specific resource number is 1
.*:123: Warning: This is the location of the conflicting usage
---
/home/jbeulich/src/binutils/mainline/2005-01-24.08.40/gas/testsuite/gas/ia64/ia64.exp 2004-07-02
08:26:34.000000000 +0200
+++ 2005-01-24.08.40/gas/testsuite/gas/ia64/ia64.exp 2005-01-24
09:58:13.223409953 +0100
@@ -24,6 +24,7 @@ if [istarget "ia64-*"] then {
run_dump_test "opc-i"
run_dump_test "opc-m"
run_dump_test "opc-x"
+ run_dump_test "mov-ar"
run_list_test "dv-raw-err" ""
run_list_test "dv-waw-err" ""
---
/home/jbeulich/src/binutils/mainline/2005-01-24.08.40/gas/testsuite/gas/ia64/mov-ar.d 1970-01-01
01:00:00.000000000 +0100
+++ 2005-01-24.08.40/gas/testsuite/gas/ia64/mov-ar.d 2005-01-21
15:37:10.000000000 +0100
@@ -0,0 +1,26 @@
+# objdump: -d
+# name: ia64 app reg moves
+
+.*: +file format .*
+
+Disassembly of section \.text:
+
+0+0 <_start>:
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m
ar.k0=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar127=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m
ar47=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar112=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m
ar48=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar111=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m
ar63=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar.pfs=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m
ar112=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar63=r0;;
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+\[MFI\][[:space:]]+mov\.m
ar127=r0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+nop\.f 0x0
+[[:space:]]*[[:xdigit:]]*:[[:space:][:xdigit:]]+mov\.i ar48=r0;;
---
/home/jbeulich/src/binutils/mainline/2005-01-24.08.40/gas/testsuite/gas/ia64/mov-ar.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-01-24.08.40/gas/testsuite/gas/ia64/mov-ar.s 2005-01-21
15:27:48.000000000 +0100
@@ -0,0 +1,21 @@
+.explicit
+_start:
+{.mfi
+ mov ar0 = r0
+ mov ar127 = r0
+} ;; {.mfi
+ mov ar47 = r0
+ mov ar112 = r0
+} ;; {.mfi
+ mov ar48 = r0
+ mov ar111 = r0
+} ;; {.mfi
+ mov ar63 = r0
+ mov ar64 = r0
+} ;; {.mfi
+ mov ar112 = r0
+ mov ar63 = r0
+} ;; {.mfi
+ mov ar127 = r0
+ mov ar48 = r0
+} ;;
Attachment:
binutils-mainline-ia64-ar.patch
Description: Text document
| Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
|---|---|---|
| Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |