* gas/config/tc-arm.c (parse_neon_alignment): New function.
authorMatthew Gretton-Dann <matthew.gretton-dann@arm.com>
Mon, 28 Jun 2010 09:10:25 +0000 (09:10 +0000)
committerMatthew Gretton-Dann <matthew.gretton-dann@arm.com>
Mon, 28 Jun 2010 09:10:25 +0000 (09:10 +0000)
(parse_address_main): Fix Neon load/store alignment parsing.
* gas/testsuite/gas/arm/neon-ldst-align-bad.l: Update for Neon alignment syntax fix.
* gas/testsuite/gas/arm/neon-ldst-align-bad.s: Likewise.
* gas/testsuite/gas/arm/neon-ldst-es.d: Likewise.
* gas/testsuite/gas/arm/neon-ldst-es.s: Likewise.
* opcodes/arm-disc.c (parse_insn_neon):  Fix Neon alignment syntax.

gas/ChangeLog
gas/config/tc-arm.c
gas/testsuite/ChangeLog
gas/testsuite/gas/arm/neon-ldst-align-bad.l
gas/testsuite/gas/arm/neon-ldst-align-bad.s
gas/testsuite/gas/arm/neon-ldst-es.d
gas/testsuite/gas/arm/neon-ldst-es.s
opcodes/ChangeLog
opcodes/arm-dis.c

index 1d6f0e07c5cefc7c21bb6745406f63c2b76661e4..80aae5b7aafcac7b1a40be5618cffd872f1f7c97 100644 (file)
@@ -1,3 +1,8 @@
+2010-06-28  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.
+
 2010-06-22  Jan Beulich  <jbeulich@novell.com>
 
        PR gas/11732
index 2e4880ac5b358bb941d9a5e973e8a5d3c9251591..0a713d4b8a00b2761f9f32d288873e8e364a54d0 100644 (file)
@@ -4948,6 +4948,33 @@ parse_shifter_operand_group_reloc (char **str, int i)
   /* 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, int group_relocations,
              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, int group_relocations,
              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 d46c075b21d8711aac7f42fd8b5246987fc06ba8..2198986133c1cf5372f6994079af940d81f16668 100644 (file)
@@ -1,3 +1,10 @@
+2010-06-28  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.
+
 2010-06-22  Jan Beulich  <jbeulich@novell.com>
 
        PR gas/11732
index 89cafba3655a84f1b4197404e878bfee8f1c93f8..5d32ace80efce34e12bcb3e9888d3d9fe634e52d 100644 (file)
@@ -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 0efb0a060d4859c026406f4ee118806d603d00b9..a899f8104e5cd620f1a43f96d2a185d187569124 100644 (file)
@@ -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 c520ac93116b0a3d6f193037158dac47a906f2c5..82bbab3e536c816252beb44e5fd05850e29b2e23 100644 (file)
@@ -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 5a29a437939034553f2dd745f8ec8763c1412c25..c97794c34cbbc502dd5ca38dce35168c98796dc5 100644 (file)
@@ -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]
         
         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 276106756a15d7ddfdb73bce79a2f462a99d3576..bbeeae310388e66c3c6b554a0160aa139f6f5006 100644 (file)
@@ -1,3 +1,7 @@
+2010-06-28  Matthew Gretton-Dann  <matthew.gretton-dann@arm.com>
+
+       * arm-disc.c (parse_insn_neon):  Fix Neon alignment syntax.
+
 2010-06-27  Alan Modra  <amodra@gmail.com>
 
        * arc-dis.c (arc_sprintf): Delete set but unused variables.
index 174de5ab445097821aad2e221a6bdac9ffadaae6..1463c659138a3ce70b4dd78c53f203dd7f59eac6 100644 (file)
@@ -2470,7 +2470,7 @@ print_insn_neon (struct disassemble_info *info, long given, bfd_boolean thumb)
                          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 *info, long given, bfd_boolean thumb)
                             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 *info, long given, bfd_boolean thumb)
                             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)