Previously, the assembler - allowed changing the value of r0 through .reg.val - didn't consider r0 to be constant zero after the first label - in dependency violation diagnostics, didn't point to the specific resource when the index of it was zero - considered relocatable (immediate) input operands of moves as having a known (at assembly time) value - didn't deal with the common case of setting a register to a constant value through dep.z Built and tested on ia64-unknown-linux-gnu. Jan gas/ 2005-02-10 Jan Beulich * config/tc-ia64.c: Include limits.h (if available). (gr_values[0]): Set path to INT_MAX. (dot_reg_val): Don't allow changing value of r0. Limit range of general registers at r127. (specify_resource): Default resource index is -1. Don't set resource index (in case IA64_RS_RSE) without setting the specific flag. (note_register_values): Check operand is O_constant before tracking input value of moves. Add tracking for dep.z with constant inputs. (print_dependency): Resource index of specific resource may be zero. (check_dependencies): Likewise. gas/testsuite/ 2005-02-10 Jan Beulich * gas/ia64/dv-raw-err.l: Expect specific resource for RAW violation on b0. * gas/ia64/regval.[ls]: New. * gas/ia64/ia64.exp: Run new test. --- /home/jbeulich/src/binutils/mainline/2005-02-08/gas/config/tc-ia64.c 2005-02-02 08:33:18.000000000 +0100 +++ 2005-02-08/gas/config/tc-ia64.c 2005-02-10 13:55:42.562935575 +0100 @@ -51,6 +51,10 @@ #include "elf/ia64.h" +#ifdef HAVE_LIMITS_H +#include +#endif + #define NELEMS(a) ((int) (sizeof (a)/sizeof ((a)[0]))) #define MIN(a,b) ((a) < (b) ? (a) : (b)) @@ -635,7 +639,17 @@ static struct gr { unsigned known:1; int path; valueT value; -} gr_values[128] = {{ 1, 0, 0 }}; +} gr_values[128] = { + { + 1, +#ifdef INT_MAX + INT_MAX, +#else + (((1 << (8 * sizeof(gr_values->path) - 2)) - 1) << 1) + 1, +#endif + 0 + } +}; /* Remember the alignment frag. */ static fragS *align_frag; @@ -4837,7 +4851,7 @@ dot_reg_val (dummy) { valueT value = get_absolute_expression (); int regno = reg.X_add_number; - if (regno < REG_GR || regno > REG_GR + 128) + if (regno <= REG_GR || regno > REG_GR + 127) as_warn (_("Register value annotation ignored")); else { @@ -7827,7 +7841,7 @@ specify_resource (dep, idesc, type, spec tmpl.link_to_qp_branch = 1; tmpl.mem_offset.hint = 0; tmpl.specific = 1; - tmpl.index = 0; + tmpl.index = -1; tmpl.cmp_type = CMP_NONE; #define UNHANDLED \ @@ -9070,8 +9084,7 @@ dep->name, idesc->name, (rsrc_write?"wri if (idesc->operands[0] == IA64_OPND_AR3 && CURR_SLOT.opnd[0].X_add_number - REG_AR == AR_BSPSTORE) { - specs[count] = tmpl; - specs[count++].index = 0; /* IA64_RSE_BSPLOAD/RNATBITINDEX */ + specs[count++] = tmpl; } } else @@ -9525,6 +9538,7 @@ note_register_values (idesc) else if (idesc->operands[0] == IA64_OPND_R1 && (idesc->operands[1] == IA64_OPND_IMM22 || idesc->operands[1] == IA64_OPND_IMMU64) + && CURR_SLOT.opnd[1].X_op == O_constant && (strcmp (idesc->name, "mov") == 0 || strcmp (idesc->name, "movl") == 0)) { @@ -9542,6 +9556,30 @@ note_register_values (idesc) } } } + /* Look for dep.z imm insns. */ + else if (idesc->operands[0] == IA64_OPND_R1 + && idesc->operands[1] == IA64_OPND_IMM8 + && strcmp (idesc->name, "dep.z") == 0) + { + int regno = CURR_SLOT.opnd[0].X_add_number - REG_GR; + if (regno > 0 && regno < NELEMS (gr_values)) + { + valueT value = CURR_SLOT.opnd[1].X_add_number; + + if (CURR_SLOT.opnd[3].X_add_number < 64) + value &= ((valueT)1 << CURR_SLOT.opnd[3].X_add_number) - 1; + value <<= CURR_SLOT.opnd[2].X_add_number; + gr_values[regno].known = 1; + gr_values[regno].value = value; + gr_values[regno].path = md.path; + if (md.debug_dv) + { + fprintf (stderr, " Know gr%d = ", regno); + fprintf_vma (stderr, gr_values[regno].value); + fputs ("\n", stderr); + } + } + } else { clear_qp_mutex (qp_changemask); @@ -9762,7 +9800,7 @@ print_dependency (action, depind) fprintf (stderr, " %s %s '%s'", action, dv_mode[(regdeps[depind].dependency)->mode], (regdeps[depind].dependency)->name); - if (regdeps[depind].specific && regdeps[depind].index != 0) + if (regdeps[depind].specific && regdeps[depind].index >= 0) fprintf (stderr, " (%d)", regdeps[depind].index); if (regdeps[depind].mem_offset.hint) { @@ -9960,7 +9998,7 @@ check_dependencies (idesc) if (path != 0) sprintf (pathmsg, " when entry is at label '%s'", md.entry_labels[path - 1]); - if (rs->specific && rs->index != 0) + if (matchtype == 1 && rs->index >= 0) sprintf (indexmsg, ", specific resource number is %d", rs->index); sprintf (msg, "Use of '%s' %s %s dependency '%s' (%s)%s%s", --- /home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/dv-raw-err.l 2004-06-16 15:23:12.000000000 +0200 +++ 2005-02-08/gas/testsuite/gas/ia64/dv-raw-err.l 2005-02-10 13:55:42.563912137 +0100 @@ -51,7 +51,7 @@ .*:98: Warning: This is the location of the conflicting usage .*:104: Warning: Use of 'ld8\.fill' .* RAW dependency 'AR\[UNAT\]{%}, % in 0 - 63' \(impliedf\) .*:103: Warning: This is the location of the conflicting usage -.*:111: Warning: Use of 'mov' .* RAW dependency 'BR%, % in 0 - 7' \(impliedf\) +.*:111: Warning: Use of 'mov' .* RAW dependency 'BR%, % in 0 - 7' \(impliedf\), specific resource number is 0 .*:110: Warning: This is the location of the conflicting usage .*:116: Warning: Use of 'fadd' .* RAW dependency 'CFM' \(impliedf\) .*:115: Warning: This is the location of the conflicting usage --- /home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/ia64.exp 2005-02-02 08:33:18.000000000 +0100 +++ 2005-02-08/gas/testsuite/gas/ia64/ia64.exp 2005-02-10 13:55:42.564888700 +0100 @@ -40,6 +40,7 @@ if [istarget "ia64-*"] then { gas_test "pred-rel.s" "" "" ".pred.rel alternative forms" run_dump_test "dv-safe" run_dump_test "dv-srlz" + run_list_test "regval" "" run_dump_test "tls" run_dump_test "ldxmov-1" run_list_test "ldxmov-2" "" --- /home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/regval.l 1970-01-01 01:00:00.000000000 +0100 +++ 2005-02-08/gas/testsuite/gas/ia64/regval.l 2005-02-10 13:00:19.000000000 +0100 @@ -0,0 +1,17 @@ +.*: Assembler messages: +.*:11: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 0 +.*:11: Warning: Only the first path encountering the conflict is reported +.*:10: Warning: This is the location of the conflicting usage +#... +.*:25: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 0 +.*:25: Warning: Only the first path encountering the conflict is reported +.*:24: Warning: This is the location of the conflicting usage +#... +.*:32: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\) +.*:32: Warning: Only the first path encountering the conflict is reported +.*:31: Warning: This is the location of the conflicting usage +#... +.*:46: Warning: Use of 'mov' .* WAW dependency 'RR#' \(impliedf\), specific resource number is 0 +.*:46: Warning: Only the first path encountering the conflict is reported +.*:45: Warning: This is the location of the conflicting usage +#pass --- /home/jbeulich/src/binutils/mainline/2005-02-08/gas/testsuite/gas/ia64/regval.s 1970-01-01 01:00:00.000000000 +0100 +++ 2005-02-08/gas/testsuite/gas/ia64/regval.s 2005-02-10 12:59:46.000000000 +0100 @@ -0,0 +1,48 @@ +.explicit +rr1: + .reg.val r1, 0xE000000000000000 + mov rr[r0] = r0 + mov rr[r1] = r0 + br.ret.sptk rp + ;; +rr2: + .reg.val r1, 0 + mov rr[r0] = r0 + mov rr[r1] = r0 + br.ret.sptk rp + ;; +rr3: + movl r1 = 0xE000000000000000 + ;; + mov rr[r0] = r0 + mov rr[r1] = r0 + br.ret.sptk rp + ;; +rr4: + mov r1 = 0 + ;; + mov rr[r0] = r0 + mov rr[r1] = r0 + br.ret.sptk rp + ;; +rr5: + movl r1 = xyz+0xE000000000000000 + ;; + mov rr[r0] = r0 + mov rr[r1] = r0 + br.ret.sptk rp + ;; +rr6: + dep.z r1 = 1, 61, 3 + ;; + mov rr[r0] = r0 + mov rr[r1] = r0 + br.ret.sptk rp + ;; +rr7: + dep.z r1 = -1, 0, 61 + ;; + mov rr[r0] = r0 + mov rr[r1] = r0 + br.ret.sptk rp + ;;