This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[RFA] [ARM] Fix Neon Alignment Syntax acceptance
- From: Matthew Gretton-Dann <matthew dot gretton-dann at arm dot com>
- To: binutils at sourceware dot org
- Date: Fri, 25 Jun 2010 15:15:12 +0100
- Subject: [RFA] [ARM] Fix Neon Alignment Syntax acceptance
All,
Please can someone review, and approve the attached patch?
Most Neon load/store instructions accept an optional alignment
parameter. The current syntax accepted by gas requires a comma before
the alignment parameter. However, this is not what was originally
intended, and this patch corrects that. We still accept the current
syntax as well.
This means that the following are now both valid:
VLD1.8 {d0}, [r1, :128]
VLD1.8 {d0}, [r1 :128]
We disassemble to the second form.
Proposed ChangeLogs:
gas/ChangeLog:
2010-06-25 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
* config/tc-arm.c (parse_neon_alignment): New function.
(parse_address_main): Fix Neon load/store alignment parsing.
gas/testsuite/ChangeLog:
2010-06-25 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
* gas/arm/neon-ldst-align-bad.l: Update for Neon alignment
syntax fix.
* gas/arm/neon-ldst-align-bad.s: Likewise.
* gas/arm/neon-ldst-es.d: Likewise.
* gas/arm/neon-ldst-es.s: Likewise.
opcodes/ChangeLog:
2010-06-25 Matthew Gretton-Dann <matthew.gretton-dann@arm.com>
* arm-disc.c (parse_insn_neon): Fix Neon alignment syntax.
Thanks,
Matt
Index: gas/config/tc-arm.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-arm.c,v
retrieving revision 1.447
diff -u -p -r1.447 tc-arm.c
--- gas/config/tc-arm.c 9 Jun 2010 15:11:49 -0000 1.447
+++ gas/config/tc-arm.c 25 Jun 2010 13:16:58 -0000
@@ -4948,6 +4948,33 @@ parse_shifter_operand_group_reloc (char
/* Never reached. */
}
+/* Parse a Neon alignment expression. Information is written to
+ inst.operands[i]. We assume the initial ':' has been skipped.
+
+ align .imm = align << 8, .immisalign=1, .preind=0 */
+static parse_operand_result
+parse_neon_alignment (char **str, int i)
+{
+ char *p = *str;
+ expressionS exp;
+
+ my_get_expression (&exp, &p, GE_NO_PREFIX);
+
+ if (exp.X_op != O_constant)
+ {
+ inst.error = _("alignment must be constant");
+ return PARSE_OPERAND_FAIL;
+ }
+
+ inst.operands[i].imm = exp.X_add_number << 8;
+ inst.operands[i].immisalign = 1;
+ /* Alignments are not pre-indexes. */
+ inst.operands[i].preind = 0;
+
+ *str = p;
+ return PARSE_OPERAND_SUCCESS;
+}
+
/* Parse all forms of an ARM address expression. Information is written
to inst.operands[i] and/or inst.reloc.
@@ -5031,22 +5058,15 @@ parse_address_main (char **str, int i, i
return PARSE_OPERAND_FAIL;
}
else if (skip_past_char (&p, ':') == SUCCESS)
- {
- /* FIXME: '@' should be used here, but it's filtered out by generic
- code before we get to see it here. This may be subject to
- change. */
- expressionS exp;
- my_get_expression (&exp, &p, GE_NO_PREFIX);
- if (exp.X_op != O_constant)
- {
- inst.error = _("alignment must be constant");
- return PARSE_OPERAND_FAIL;
- }
- inst.operands[i].imm = exp.X_add_number << 8;
- inst.operands[i].immisalign = 1;
- /* Alignments are not pre-indexes. */
- inst.operands[i].preind = 0;
- }
+ {
+ /* FIXME: '@' should be used here, but it's filtered out by generic
+ code before we get to see it here. This may be subject to
+ change. */
+ parse_operand_result result = parse_neon_alignment (&p, i);
+
+ if (result != PARSE_OPERAND_SUCCESS)
+ return result;
+ }
else
{
if (inst.operands[i].negative)
@@ -5110,6 +5130,15 @@ parse_address_main (char **str, int i, i
return PARSE_OPERAND_FAIL;
}
}
+ else if (skip_past_char (&p, ':') == SUCCESS)
+ {
+ /* FIXME: '@' should be used here, but it's filtered out by generic code
+ before we get to see it here. This may be subject to change. */
+ parse_operand_result result = parse_neon_alignment (&p, i);
+
+ if (result != PARSE_OPERAND_SUCCESS)
+ return result;
+ }
if (skip_past_char (&p, ']') == FAIL)
{
Index: gas/testsuite/gas/arm/neon-ldst-align-bad.l
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/neon-ldst-align-bad.l,v
retrieving revision 1.1
diff -u -p -r1.1 neon-ldst-align-bad.l
--- gas/testsuite/gas/arm/neon-ldst-align-bad.l 26 Feb 2010 15:49:07 -0000 1.1
+++ gas/testsuite/gas/arm/neon-ldst-align-bad.l 25 Jun 2010 13:16:59 -0000
@@ -1,3 +1,3 @@
[^:]*: Assembler messages:
-[^:]*:1: Error: bad alignment -- `vld1.8 {d0},\[r0,:128\]'
-[^:]*:2: Error: bad alignment -- `vld1.8 {q0},\[r0,:256\]'
+[^:]*:1: Error: bad alignment -- `vld1.8 {d0},\[r0:128\]'
+[^:]*:2: Error: bad alignment -- `vld1.8 {q0},\[r0:256\]'
Index: gas/testsuite/gas/arm/neon-ldst-align-bad.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/neon-ldst-align-bad.s,v
retrieving revision 1.1
diff -u -p -r1.1 neon-ldst-align-bad.s
--- gas/testsuite/gas/arm/neon-ldst-align-bad.s 26 Feb 2010 15:49:07 -0000 1.1
+++ gas/testsuite/gas/arm/neon-ldst-align-bad.s 25 Jun 2010 13:16:59 -0000
@@ -1,2 +1,2 @@
-vld1.8 {d0}, [r0, :128]
-vld1.8 {q0}, [r0, :256]
+vld1.8 {d0}, [r0 :128]
+vld1.8 {q0}, [r0 :256]
Index: gas/testsuite/gas/arm/neon-ldst-es.d
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/neon-ldst-es.d,v
retrieving revision 1.2
diff -u -p -r1.2 neon-ldst-es.d
--- gas/testsuite/gas/arm/neon-ldst-es.d 26 Apr 2006 15:42:17 -0000 1.2
+++ gas/testsuite/gas/arm/neon-ldst-es.d 25 Jun 2010 13:16:59 -0000
@@ -5,50 +5,50 @@
.*: +file format .*arm.*
Disassembly of section \.text:
-0[0-9a-f]+ <[^>]+> f406282f vst2\.8 {d2-d3}, \[r6, :128\]
+0[0-9a-f]+ <[^>]+> f406282f vst2\.8 {d2-d3}, \[r6 :128\]
0[0-9a-f]+ <[^>]+> f427140d vld3\.8 {d1-d3}, \[r7\]!
-0[0-9a-f]+ <[^>]+> f4091553 vst3\.16 {d1,d3,d5}, \[r9, :64\], r3
+0[0-9a-f]+ <[^>]+> f4091553 vst3\.16 {d1,d3,d5}, \[r9 :64\], r3
0[0-9a-f]+ <[^>]+> f42a208f vld4\.32 {d2-d5}, \[sl\]
0[0-9a-f]+ <[^>]+> f40a114f vst4\.16 {d1,d3,d5,d7}, \[sl\]
0[0-9a-f]+ <[^>]+> f4aa1c6f vld1\.16 {d1\[\]-d2\[\]}, \[sl\]
-0[0-9a-f]+ <[^>]+> f4aa1c5f vld1\.16 {d1\[\]}, \[sl, :16\]
-0[0-9a-f]+ <[^>]+> f4aa1dbf vld2\.32 {d1\[\],d3\[\]}, \[sl, :64\]
+0[0-9a-f]+ <[^>]+> f4aa1c5f vld1\.16 {d1\[\]}, \[sl :16\]
+0[0-9a-f]+ <[^>]+> f4aa1dbf vld2\.32 {d1\[\],d3\[\]}, \[sl :64\]
0[0-9a-f]+ <[^>]+> f4aa3e0c vld3\.8 {d3\[\]-d5\[\]}, \[sl\], ip
0[0-9a-f]+ <[^>]+> f4a9af6d vld4\.16 {d10\[\],d12\[\],d14\[\],d16\[\]}, \[r9\]!
-0[0-9a-f]+ <[^>]+> f4a9af5f vld4\.16 {d10\[\]-d13\[\]}, \[r9, :64\]
-0[0-9a-f]+ <[^>]+> f4a9af9f vld4\.32 {d10\[\]-d13\[\]}, \[r9, :64\]
-0[0-9a-f]+ <[^>]+> f4a9afdf vld4\.32 {d10\[\]-d13\[\]}, \[r9, :128\]
+0[0-9a-f]+ <[^>]+> f4a9af5f vld4\.16 {d10\[\]-d13\[\]}, \[r9 :64\]
+0[0-9a-f]+ <[^>]+> f4a9af9f vld4\.32 {d10\[\]-d13\[\]}, \[r9 :64\]
+0[0-9a-f]+ <[^>]+> f4a9afdf vld4\.32 {d10\[\]-d13\[\]}, \[r9 :128\]
0[0-9a-f]+ <[^>]+> f4a530ed vld1\.8 {d3\[7\]}, \[r5\]!
-0[0-9a-f]+ <[^>]+> f48554df vst1\.16 {d5\[3\]}, \[r5, :16\]
-0[0-9a-f]+ <[^>]+> f4a535dd vld2\.16 {d3\[3\],d4\[3\]}, \[r5, :32\]!
+0[0-9a-f]+ <[^>]+> f48554df vst1\.16 {d5\[3\]}, \[r5 :16\]
+0[0-9a-f]+ <[^>]+> f4a535dd vld2\.16 {d3\[3\],d4\[3\]}, \[r5 :32\]!
0[0-9a-f]+ <[^>]+> f4858a83 vst3\.32 {d8\[1\],d9\[1\],d10\[1\]}, \[r5\], r3
0[0-9a-f]+ <[^>]+> f4a7804f vld1\.8 {d8\[2\]}, \[r7\]
0[0-9a-f]+ <[^>]+> f4a7848f vld1\.16 {d8\[2\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a7849f vld1\.16 {d8\[2\]}, \[r7, :16\]
+0[0-9a-f]+ <[^>]+> f4a7849f vld1\.16 {d8\[2\]}, \[r7 :16\]
0[0-9a-f]+ <[^>]+> f4a7888f vld1\.32 {d8\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a788bf vld1\.32 {d8\[1\]}, \[r7, :32\]
+0[0-9a-f]+ <[^>]+> f4a788bf vld1\.32 {d8\[1\]}, \[r7 :32\]
0[0-9a-f]+ <[^>]+> f4a7812f vld2\.8 {d8\[1\],d9\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a7813f vld2\.8 {d8\[1\],d9\[1\]}, \[r7, :16\]
+0[0-9a-f]+ <[^>]+> f4a7813f vld2\.8 {d8\[1\],d9\[1\]}, \[r7 :16\]
0[0-9a-f]+ <[^>]+> f4a7854f vld2\.16 {d8\[1\],d9\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a7855f vld2\.16 {d8\[1\],d9\[1\]}, \[r7, :32\]
+0[0-9a-f]+ <[^>]+> f4a7855f vld2\.16 {d8\[1\],d9\[1\]}, \[r7 :32\]
0[0-9a-f]+ <[^>]+> f4a7856f vld2\.16 {d8\[1\],d10\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a7857f vld2\.16 {d8\[1\],d10\[1\]}, \[r7, :32\]
+0[0-9a-f]+ <[^>]+> f4a7857f vld2\.16 {d8\[1\],d10\[1\]}, \[r7 :32\]
0[0-9a-f]+ <[^>]+> f4a7898f vld2\.32 {d8\[1\],d9\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a7899f vld2\.32 {d8\[1\],d9\[1\]}, \[r7, :64\]
+0[0-9a-f]+ <[^>]+> f4a7899f vld2\.32 {d8\[1\],d9\[1\]}, \[r7 :64\]
0[0-9a-f]+ <[^>]+> f4a789cf vld2\.32 {d8\[1\],d10\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a789df vld2\.32 {d8\[1\],d10\[1\]}, \[r7, :64\]
+0[0-9a-f]+ <[^>]+> f4a789df vld2\.32 {d8\[1\],d10\[1\]}, \[r7 :64\]
0[0-9a-f]+ <[^>]+> f4a7822f vld3\.8 {d8\[1\],d9\[1\],d10\[1\]}, \[r7\]
0[0-9a-f]+ <[^>]+> f4a7864f vld3\.16 {d8\[1\],d9\[1\],d10\[1\]}, \[r7\]
0[0-9a-f]+ <[^>]+> f4a7866f vld3\.16 {d8\[1\],d10\[1\],d12\[1\]}, \[r7\]
0[0-9a-f]+ <[^>]+> f4a78a8f vld3\.32 {d8\[1\],d9\[1\],d10\[1\]}, \[r7\]
0[0-9a-f]+ <[^>]+> f4a78acf vld3\.32 {d8\[1\],d10\[1\],d12\[1\]}, \[r7\]
0[0-9a-f]+ <[^>]+> f4a7834f vld4\.8 {d8\[2\],d9\[2\],d10\[2\],d11\[2\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a7835f vld4\.8 {d8\[2\],d9\[2\],d10\[2\],d11\[2\]}, \[r7, :32\]
+0[0-9a-f]+ <[^>]+> f4a7835f vld4\.8 {d8\[2\],d9\[2\],d10\[2\],d11\[2\]}, \[r7 :32\]
0[0-9a-f]+ <[^>]+> f4a7876f vld4\.16 {d8\[1\],d10\[1\],d12\[1\],d14\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a7875f vld4\.16 {d8\[1\],d9\[1\],d10\[1\],d11\[1\]}, \[r7, :64\]
+0[0-9a-f]+ <[^>]+> f4a7875f vld4\.16 {d8\[1\],d9\[1\],d10\[1\],d11\[1\]}, \[r7 :64\]
0[0-9a-f]+ <[^>]+> f4a78bcf vld4\.32 {d8\[1\],d10\[1\],d12\[1\],d14\[1\]}, \[r7\]
-0[0-9a-f]+ <[^>]+> f4a78bdf vld4\.32 {d8\[1\],d10\[1\],d12\[1\],d14\[1\]}, \[r7, :64\]
-0[0-9a-f]+ <[^>]+> f4a78bef vld4\.32 {d8\[1\],d10\[1\],d12\[1\],d14\[1\]}, \[r7, :128\]
+0[0-9a-f]+ <[^>]+> f4a78bdf vld4\.32 {d8\[1\],d10\[1\],d12\[1\],d14\[1\]}, \[r7 :64\]
+0[0-9a-f]+ <[^>]+> f4a78bef vld4\.32 {d8\[1\],d10\[1\],d12\[1\],d14\[1\]}, \[r7 :128\]
0[0-9a-f]+ <[^>]+> f3b43805 vtbl\.8 d3, {d4}, d5
0[0-9a-f]+ <[^>]+> f3b23b05 vtbl\.8 d3, {d2-d5}, d5
0[0-9a-f]+ <[^>]+> f3be3985 vtbl\.8 d3, {d30-d31}, d5
Index: gas/testsuite/gas/arm/neon-ldst-es.s
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/arm/neon-ldst-es.s,v
retrieving revision 1.2
diff -u -p -r1.2 neon-ldst-es.s
--- gas/testsuite/gas/arm/neon-ldst-es.s 26 Apr 2006 15:42:17 -0000 1.2
+++ gas/testsuite/gas/arm/neon-ldst-es.s 25 Jun 2010 13:16:59 -0000
@@ -6,12 +6,12 @@
vst2.8 {d2,d3},[r6,:128]
vld3.8 {d1,d2,d3},[r7]!
- vst3.16 {d1,d3,d5},[r9,:64],r3
+ vst3.16 {d1,d3,d5},[r9:64],r3
vld4.32 {d2,d3,d4,d5},[r10]
vst4.16 {d1,d3,d5,d7},[r10]
vld1.16 {d1[],d2[]},[r10]
vld1.16 {d1[]},[r10,:16]
- vld2.32 {d1[],d3[]},[r10,:64]
+ vld2.32 {d1[],d3[]},[r10:64]
vld3.s8 {d3[],d4[],d5[]},[r10],r12
vld4.16 {d10[],d12[],d14[],d16[]},[r9]!
vld4.16 {d10[],d11[],d12[],d13[]},[r9,:64]
@@ -24,31 +24,31 @@
vld1.8 {d8[2]},[r7]
vld1.16 {d8[2]},[r7]
- vld1.16 {d8[2]},[r7,:16]
+ vld1.16 {d8[2]},[r7:16]
vld1.32 {d8[1]},[r7]
- vld1.32 {d8[1]},[r7,:32]
+ vld1.32 {d8[1]},[r7:32]
vld2.8 {d8[1],d9[1]},[r7]
- vld2.8 {d8[1],d9[1]},[r7,:16]
+ vld2.8 {d8[1],d9[1]},[r7:16]
vld2.16 {d8[1],d9[1]},[r7]
- vld2.16 {d8[1],d9[1]},[r7,:32]
+ vld2.16 {d8[1],d9[1]},[r7:32]
vld2.16 {d8[1],d10[1]},[r7]
- vld2.16 {d8[1],d10[1]},[r7,:32]
+ vld2.16 {d8[1],d10[1]},[r7:32]
vld2.32 {d8[1],d9[1]},[r7]
- vld2.32 {d8[1],d9[1]},[r7,:64]
+ vld2.32 {d8[1],d9[1]},[r7:64]
vld2.32 {d8[1],d10[1]},[r7]
- vld2.32 {d8[1],d10[1]},[r7,:64]
+ vld2.32 {d8[1],d10[1]},[r7:64]
vld3.8 {d8[1],d9[1],d10[1]},[r7]
vld3.16 {d8[1],d9[1],d10[1]},[r7]
vld3.16 {d8[1],d10[1],d12[1]},[r7]
vld3.32 {d8[1],d9[1],d10[1]},[r7]
vld3.32 {d8[1],d10[1],d12[1]},[r7]
vld4.8 {d8[2],d9[2],d10[2],d11[2]},[r7]
- vld4.8 {d8[2],d9[2],d10[2],d11[2]},[r7,:32]
+ vld4.8 {d8[2],d9[2],d10[2],d11[2]},[r7:32]
vld4.16 {d8[1],d10[1],d12[1],d14[1]},[r7]
- vld4.16 {d8[1],d9[1],d10[1],d11[1]},[r7,:64]
+ vld4.16 {d8[1],d9[1],d10[1],d11[1]},[r7:64]
vld4.32 {d8[1],d10[1],d12[1],d14[1]},[r7]
- vld4.32 {d8[1],d10[1],d12[1],d14[1]},[r7,:64]
- vld4.32 {d8[1],d10[1],d12[1],d14[1]},[r7,:128]
+ vld4.32 {d8[1],d10[1],d12[1],d14[1]},[r7:64]
+ vld4.32 {d8[1],d10[1],d12[1],d14[1]},[r7:128]
vtbl.8 d3,{d4},d5
vtbl.8 d3,{q1-q2},d5
Index: opcodes/arm-dis.c
===================================================================
RCS file: /cvs/src/src/opcodes/arm-dis.c,v
retrieving revision 1.127
diff -u -p -r1.127 arm-dis.c
--- opcodes/arm-dis.c 7 Jun 2010 10:43:52 -0000 1.127
+++ opcodes/arm-dis.c 25 Jun 2010 13:17:01 -0000
@@ -2470,7 +2470,7 @@ print_insn_neon (struct disassemble_info
func (stream, "d%d-d%d", rd, rd + n - 1);
func (stream, "}, [%s", arm_regnames[rn]);
if (align)
- func (stream, ", :%d", 32 << align);
+ func (stream, " :%d", 32 << align);
func (stream, "]");
if (rm == 0xd)
func (stream, "!");
@@ -2545,7 +2545,7 @@ print_insn_neon (struct disassemble_info
rd + i * stride, idx);
func (stream, "}, [%s", arm_regnames[rn]);
if (align)
- func (stream, ", :%d", align);
+ func (stream, " :%d", align);
func (stream, "]");
if (rm == 0xd)
func (stream, "!");
@@ -2586,9 +2586,9 @@ print_insn_neon (struct disassemble_info
if (type == 3)
align = (size > 1) ? align >> 1 : align;
if (type == 2 || (type == 0 && !size))
- func (stream, ", :<bad align %d>", align);
+ func (stream, " :<bad align %d>", align);
else
- func (stream, ", :%d", align);
+ func (stream, " :%d", align);
}
func (stream, "]");
if (rm == 0xd)