diff options
author | Jan Beulich <jbeulich@novell.com> | 2005-01-27 08:41:25 +0000 |
---|---|---|
committer | Jan Beulich <jbeulich@novell.com> | 2005-01-27 08:41:25 +0000 |
commit | 97762d08db7baa887e466890451958465253d014 (patch) | |
tree | 73a2e58ae6145db1a79457100d7f6a98553f77e0 /gas | |
parent | 67f937f572b3793d08cc0704622365dff73acd9a (diff) | |
download | gdb-97762d08db7baa887e466890451958465253d014.zip gdb-97762d08db7baa887e466890451958465253d014.tar.gz gdb-97762d08db7baa887e466890451958465253d014.tar.bz2 |
gas/
2005-01-25 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-25 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.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 7 | ||||
-rw-r--r-- | gas/config/tc-ia64.c | 44 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/dv-waw-err.l | 2 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/ia64.exp | 1 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/mov-ar.d | 26 | ||||
-rw-r--r-- | gas/testsuite/gas/ia64/mov-ar.s | 21 |
7 files changed, 96 insertions, 12 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 5cc7c42..5fe349f 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2005-01-25 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. + 2005-01-25 Alexandre Oliva <aoliva@redhat.com> * config/tc-frv.c (md_apply_fix3): Mark TLS symbols as such. diff --git a/gas/config/tc-ia64.c b/gas/config/tc-ia64.c index 75a8434..d065449 100644 --- a/gas/config/tc-ia64.c +++ b/gas/config/tc-ia64.c @@ -6370,25 +6370,42 @@ 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 + /* no other resolved dynamic ops have collisions */ + know (!get_next_opcode (idesc)); #endif + md.slot[curr].idesc = idesc; } else { @@ -10071,17 +10088,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 diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index eaf1df9..71a6567 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2005-01-25 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. + 2005-01-24 Nick Clifton <nickc@redhat.com> * gas/all/sleb128.d: Do not assume an 8-bit byte. diff --git a/gas/testsuite/gas/ia64/dv-waw-err.l b/gas/testsuite/gas/ia64/dv-waw-err.l index 6c9225b..c641cb3 100644 --- a/gas/testsuite/gas/ia64/dv-waw-err.l +++ b/gas/testsuite/gas/ia64/dv-waw-err.l @@ -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 diff --git a/gas/testsuite/gas/ia64/ia64.exp b/gas/testsuite/gas/ia64/ia64.exp index 48c4b50..89d3965 100644 --- a/gas/testsuite/gas/ia64/ia64.exp +++ b/gas/testsuite/gas/ia64/ia64.exp @@ -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" "" diff --git a/gas/testsuite/gas/ia64/mov-ar.d b/gas/testsuite/gas/ia64/mov-ar.d new file mode 100644 index 0000000..ec7cb61 --- /dev/null +++ b/gas/testsuite/gas/ia64/mov-ar.d @@ -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;; diff --git a/gas/testsuite/gas/ia64/mov-ar.s b/gas/testsuite/gas/ia64/mov-ar.s new file mode 100644 index 0000000..79780d9 --- /dev/null +++ b/gas/testsuite/gas/ia64/mov-ar.s @@ -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 +} ;; |