This is the mail archive of the binutils@sourceware.org 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]

[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)

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]