[PATCH] ia64: index handling cleanup
Jan Beulich
JBeulich@novell.com
Fri Oct 21 09:54:00 GMT 2005
This fixes a number of inconsistent/meaningless error messages on ill
uses
of operands to the index operator.
Built and tested on ia64-unknown-linux-gnu.
Jan
include/opcode/
2005-10-21 Jan Beulich <jbeulich@novell.com>
* ia64.h (enum ia64_opnd): Move memory operand out of set of
indirect operands.
bfd/
2005-10-21 Jan Beulich <jbeulich@novell.com>
* cpu-ia64-opc.c (elf64_ia64_operands): Move memory operand out
of
set of indirect operands.
gas/
2005-10-21 Jan Beulich <jbeulich@novell.com>
* config/tc-ia64.c (enum reg_symbol): Delete IND_MEM.
(dot_rot): Change type of num_* variables. Check for positive
count.
(ia64_optimize_expr): Re-structure.
(md_operand): Check for general register.
gas/testsuite/
2005-10-21 Jan Beulich <jbeulich@novell.com>
* gas/ia64/index.[sl]: New.
* gas/ia64/rotX.[sl]: New.
* gas/ia64/ia64.exp: Run new tests.
opcodes/
2005-10-21 Jan Beulich <jbeulich@novell.com>
* ia64-asmtab.c: Regenerate.
---
/home/jbeulich/src/binutils/mainline/2005-10-20/bfd/cpu-ia64-opc.c 2005-05-06
08:24:20.000000000 +0200
+++ 2005-10-20/bfd/cpu-ia64-opc.c 2005-10-21 11:27:22.574142670
+0200
@@ -457,6 +457,10 @@ const struct ia64_operand elf64_ia64_ope
{ REG, ins_reg, ext_reg, "r", {{ 2, 20}},
0, /* R3_2 */
"a general register r0-r3" },
+ /* memory operands: */
+ { IND, ins_reg, ext_reg, "", {{7, 20}},
0, /* MR3 */
+ "a memory address" },
+
/* indirect operands: */
{ IND, ins_reg, ext_reg, "cpuid", {{7, 20}},
0, /* CPUID_R3 */
"a cpuid register" },
@@ -468,8 +472,6 @@ const struct ia64_operand elf64_ia64_ope
"an itr register" },
{ IND, ins_reg, ext_reg, "ibr", {{7, 20}},
0, /* IBR_R3 */
"an ibr register" },
- { IND, ins_reg, ext_reg, "", {{7, 20}},
0, /* MR3 */
- "an indirect memory address" },
{ IND, ins_reg, ext_reg, "msr", {{7, 20}},
0, /* MSR_R3 */
"an msr register" },
{ IND, ins_reg, ext_reg, "pkr", {{7, 20}},
0, /* PKR_R3 */
---
/home/jbeulich/src/binutils/mainline/2005-10-20/gas/config/tc-ia64.c 2005-10-12
09:50:45.000000000 +0200
+++ 2005-10-20/gas/config/tc-ia64.c 2005-10-21 10:50:20.361279267
+0200
@@ -124,7 +124,6 @@ enum reg_symbol
IND_DTR,
IND_ITR,
IND_IBR,
- IND_MEM,
IND_MSR,
IND_PKR,
IND_PMC,
@@ -4772,7 +4771,8 @@ static void
dot_rot (type)
int type;
{
- unsigned num_regs, num_alloced = 0;
+ offsetT num_regs;
+ valueT num_alloced = 0;
struct dynreg **drpp, *dr;
int ch, base_reg = 0;
char *name, *start;
@@ -4817,6 +4817,11 @@ dot_rot (type)
as_bad ("Expected ']'");
goto err;
}
+ if (num_regs <= 0)
+ {
+ as_bad ("Number of elements must be positive");
+ goto err;
+ }
SKIP_WHITESPACE ();
num_alloced += num_regs;
@@ -7989,31 +7994,38 @@ ia64_optimize_expr (l, op, r)
operatorT op;
expressionS *r;
{
- unsigned num_regs;
-
- if (op == O_index)
+ if (op != O_index)
+ return 0;
+ resolve_expression (l);
+ if (l->X_op == O_register)
{
- if (l->X_op == O_register && r->X_op == O_constant)
+ unsigned num_regs = l->X_add_number >> 16;
+
+ resolve_expression (r);
+ if (num_regs)
{
- num_regs = (l->X_add_number >> 16);
- if ((unsigned) r->X_add_number >= num_regs)
+ /* Left side is a .rotX-allocated register. */
+ if (r->X_op != O_constant)
{
- if (!num_regs)
- as_bad ("No current frame");
- else
- as_bad ("Index out of range 0..%u", num_regs - 1);
+ as_bad ("Rotating register index must be a non-negative
constant");
+ r->X_add_number = 0;
+ }
+ else if ((valueT) r->X_add_number >= num_regs)
+ {
+ as_bad ("Index out of range 0..%u", num_regs - 1);
r->X_add_number = 0;
}
l->X_add_number = (l->X_add_number & 0xffff) +
r->X_add_number;
return 1;
}
- else if (l->X_op == O_register && r->X_op == O_register)
+ else if (l->X_add_number >= IND_CPUID && l->X_add_number <=
IND_RR)
{
- if (l->X_add_number < IND_CPUID || l->X_add_number > IND_RR
- || l->X_add_number == IND_MEM)
+ if (r->X_op != O_register
+ || r->X_add_number < REG_GR
+ || r->X_add_number > REG_GR + 127)
{
- as_bad ("Indirect register set name expected");
- l->X_add_number = IND_CPUID;
+ as_bad ("Indirect register index must be a general
register");
+ r->X_add_number = REG_GR;
}
l->X_op = O_index;
l->X_op_symbol = md.regsym[l->X_add_number];
@@ -8021,7 +8033,12 @@ ia64_optimize_expr (l, op, r)
return 1;
}
}
- return 0;
+ as_bad ("Index can only be applied to rotating or indirect
registers");
+ /* Fall back to some register use of which has as little as
possible
+ side effects, to minimize subsequent error messages. */
+ l->X_op = O_register;
+ l->X_add_number = REG_GR + 3;
+ return 1;
}
int
@@ -11030,8 +11047,13 @@ md_operand (e)
}
else
{
- if (e->X_op != O_register)
- as_bad ("Register expected as index");
+ if (e->X_op != O_register
+ || e->X_add_number < REG_GR
+ || e->X_add_number > REG_GR + 127)
+ {
+ as_bad ("Index must be a general register");
+ e->X_add_number = REG_GR;
+ }
++input_line_pointer;
e->X_op = O_index;
---
/home/jbeulich/src/binutils/mainline/2005-10-20/gas/testsuite/gas/ia64/ia64.exp 2005-10-12
09:50:45.000000000 +0200
+++ 2005-10-20/gas/testsuite/gas/ia64/ia64.exp 2005-10-21
10:50:20.363232392 +0200
@@ -79,12 +79,14 @@ if [istarget "ia64-*"] then {
run_list_test "alloc" ""
run_dump_test "bundling"
run_dump_test "forward"
+ run_list_test "index" ""
run_list_test "label" ""
run_list_test "last" ""
run_list_test "no-fit" ""
run_list_test "pound" "-al"
run_list_test "proc" "-munwind-check=error"
run_list_test "radix" ""
+ run_list_test "rotX" ""
run_list_test "slot2" ""
run_dump_test "strange"
run_list_test "unwind-bad" ""
---
/home/jbeulich/src/binutils/mainline/2005-10-20/gas/testsuite/gas/ia64/index.l 1970-01-01
01:00:00.000000000 +0100
+++ 2005-10-20/gas/testsuite/gas/ia64/index.l 2005-10-21
08:44:30.000000000 +0200
@@ -0,0 +1,42 @@
+.*: Assembler messages:
+.*.s:6: Error: [Ii]ndex must be a general register
+.*.s:7: Error: [Ii]ndex must be a general register
+.*.s:8: Error: [Ii]ndex must be a general register
+.*.s:9: Error: [Ii]ndex must be a general register
+.*.s:13: Error: [Ii]ndirect register index must be a general register
+.*.s:14: Error: [Ii]ndirect register index must be a general register
+.*.s:15: Error: [Ii]ndirect register index must be a general register
+.*.s:16: Error: [Ii]ndirect register index must be a general register
+.*.s:20: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:21: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:22: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:23: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:24: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:25: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:27: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:28: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:29: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:30: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:31: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:32: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:37: Error: [Rr]otating register index must be a non-negative
constant
+.*.s:39: Error: [Ii]ndex out of range 0\.\.[[:digit:]]+
+.*.s:40: Error: [Rr]otating register index must be a non-negative
constant
+.*.s:41: Error: [Rr]otating register index must be a non-negative
constant
+.*.s:42: Error: [Rr]otating register index must be a non-negative
constant
+.*.s:44: Error: [Ii]ndirect register index must be a general register
+.*.s:45: Error: [Ii]ndirect register index must be a general register
+.*.s:46: Error: [Ii]ndirect register index must be a general register
+.*.s:47: Error: [Ii]ndirect register index must be a general register
+.*.s:51: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:52: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:53: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:54: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:55: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:56: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:58: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:59: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:60: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:61: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:62: Error: [Ii]ndex can only be applied to rotating or indirect
registers
+.*.s:63: Error: [Ii]ndex can only be applied to rotating or indirect
registers
---
/home/jbeulich/src/binutils/mainline/2005-10-20/gas/testsuite/gas/ia64/index.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-10-20/gas/testsuite/gas/ia64/index.s 2005-10-20
17:16:18.000000000 +0200
@@ -0,0 +1,63 @@
+z == zero
+zero == r0
+
+.text
+_start:
+ ld8 r2 = [ar.lc]
+ ld8 r3 = [1]
+ ld8 r4 = [-1]
+ ld8 r5 = [xyz]
+ ld8 r6 = [zero]
+ ld8 r7 = [z]
+
+ mov r2 = cpuid[ar.lc]
+ mov r3 = cpuid[1]
+ mov r4 = cpuid[-1]
+ mov r5 = cpuid[xyz]
+ mov r6 = cpuid[zero]
+ mov r7 = cpuid[z]
+
+ mov r2 = b0[ar.lc]
+ mov r3 = b0[1]
+ mov r4 = b0[-1]
+ mov r5 = b0[xyz]
+ mov r6 = b0[zero]
+ mov r7 = b0[z]
+
+ mov r2 = xyz[ar.lc]
+ mov r3 = xyz[1]
+ mov r4 = xyz[-1]
+ mov r5 = xyz[xyz]
+ mov r6 = xyz[zero]
+ mov r7 = xyz[z]
+
+.regstk 0, 8, 0, 8
+.rotr reg[8]
+
+ mov r2 = reg[ar.lc]
+ mov r3 = reg[1]
+ mov r4 = reg[-1]
+ mov r5 = reg[xyz]
+ mov r6 = reg[zero]
+ mov r7 = reg[z]
+
+ mov r2 = cpuid[ar.lc]
+ mov r3 = cpuid[1]
+ mov r4 = cpuid[-1]
+ mov r5 = cpuid[xyz]
+ mov r6 = cpuid[zero]
+ mov r7 = cpuid[z]
+
+ mov r2 = b0[ar.lc]
+ mov r3 = b0[1]
+ mov r4 = b0[-1]
+ mov r5 = b0[xyz]
+ mov r6 = b0[zero]
+ mov r7 = b0[z]
+
+ mov r2 = xyz[ar.lc]
+ mov r3 = xyz[1]
+ mov r4 = xyz[-1]
+ mov r5 = xyz[xyz]
+ mov r6 = xyz[zero]
+ mov r7 = xyz[z]
---
/home/jbeulich/src/binutils/mainline/2005-10-20/gas/testsuite/gas/ia64/rotX.l 1970-01-01
01:00:00.000000000 +0100
+++ 2005-10-20/gas/testsuite/gas/ia64/rotX.l 2005-10-21
08:39:19.000000000 +0200
@@ -0,0 +1,5 @@
+.*: Assembler messages:
+.*.s:[[:digit:]]+: Error: [Nn]umber of elements must be positive
+.*.s:[[:digit:]]+: Error: [Nn]umber of elements must be positive
+.*.s:[[:digit:]]+: Error: [Bb]ad or irreducible absolute expression
+#pass
---
/home/jbeulich/src/binutils/mainline/2005-10-20/gas/testsuite/gas/ia64/rotX.s 1970-01-01
01:00:00.000000000 +0100
+++ 2005-10-20/gas/testsuite/gas/ia64/rotX.s 2005-10-20
17:50:26.000000000 +0200
@@ -0,0 +1,4 @@
+.regstk 0, 8, 0, 8
+.rotr a[8], b[-8]
+.rotp c[8], d[0]
+.rotf e[8], f[x]
---
/home/jbeulich/src/binutils/mainline/2005-10-20/include/opcode/ia64.h 2005-03-04
15:52:17.000000000 +0100
+++ 2005-10-20/include/opcode/ia64.h 2005-10-21 10:50:20.367138642
+0200
@@ -75,13 +75,15 @@ enum ia64_opnd
IA64_OPND_R3, /* third register # */
IA64_OPND_R3_2, /* third register # (limited to gr0-gr3) */
+ /* memory operands: */
+ IA64_OPND_MR3, /* memory at addr of third register # */
+
/* indirect operands: */
IA64_OPND_CPUID_R3, /* cpuid[reg] */
IA64_OPND_DBR_R3, /* dbr[reg] */
IA64_OPND_DTR_R3, /* dtr[reg] */
IA64_OPND_ITR_R3, /* itr[reg] */
IA64_OPND_IBR_R3, /* ibr[reg] */
- IA64_OPND_MR3, /* memory at addr of third register # */
IA64_OPND_MSR_R3, /* msr[reg] */
IA64_OPND_PKR_R3, /* pkr[reg] */
IA64_OPND_PMC_R3, /* pmc[reg] */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: binutils-mainline-ia64-index-cleanup.patch
Type: application/octet-stream
Size: 32782 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/binutils/attachments/20051021/f31f3c98/attachment.obj>
More information about the Binutils
mailing list