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, ", :", align); + func (stream, " :", align); else - func (stream, ", :%d", align); + func (stream, " :%d", align); } func (stream, "]"); if (rm == 0xd)