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] |