summaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorwillnewton <willnewton>2013-08-23 07:16:56 +0000
committerwillnewton <willnewton>2013-08-23 07:16:56 +0000
commit9fce57aaed76c9a7de8a66c212219f9889681da0 (patch)
tree9e867460cbd3ed8678922de02930be0c7e8a841b /gas
parent60f561a936433831199b7fcb23ca85dc934c0f02 (diff)
downloadbinutils-redhat-9fce57aaed76c9a7de8a66c212219f9889681da0.tar.gz
gas/config/tc-arm.c: Improve validation of NEON addressing modes.
NEON vector load and store instructions do not accept immediates or pre-indexed base plus offset addressing modes, so make sure that the assembler enforces this. gas/ChangeLog: 2013-08-23 Will Newton <will.newton@linaro.org> * config/tc-arm.c (do_neon_ldx_stx): Add extra constraints for pre-indexed addressing modes. * testsuite/gas/arm/neon-addressing-bad.l: Add test for VLDn and VSTn instructions. * testsuite/gas/arm/neon-addressing-bad.s: Likewise. gas/testsuite/ChangeLog: 2013-08-23 Will Newton <will.newton@linaro.org> * testsuite/gas/arm/neon-addressing-bad.l: Add test for VLDn and VSTn instructions. * testsuite/gas/arm/neon-addressing-bad.s: Likewise.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/config/tc-arm.c16
-rw-r--r--gas/testsuite/ChangeLog6
-rw-r--r--gas/testsuite/gas/arm/neon-addressing-bad.l22
-rw-r--r--gas/testsuite/gas/arm/neon-addressing-bad.s4
5 files changed, 40 insertions, 13 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index d335c919f3..fc79d4f461 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2013-08-23 Will Newton <will.newton@linaro.org>
+
+ * config/tc-arm.c (do_neon_ldx_stx): Add extra constraints
+ for pre-indexed addressing modes.
+
2013-08-21 Alan Modra <amodra@gmail.com>
* symbols.c (fb_label_instance_inc, fb_label_instance): Properly
diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 21369d7d10..50e0da742b 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -16008,12 +16008,20 @@ do_neon_ldx_stx (void)
_("bad register for post-index"));
inst.instruction |= postreg;
}
- else if (inst.operands[1].writeback)
+ else
{
- inst.instruction |= 0xd;
+ constraint (inst.operands[1].immisreg, BAD_ADDR_MODE);
+ constraint (inst.reloc.exp.X_op != O_constant
+ || inst.reloc.exp.X_add_number != 0,
+ BAD_ADDR_MODE);
+
+ if (inst.operands[1].writeback)
+ {
+ inst.instruction |= 0xd;
+ }
+ else
+ inst.instruction |= 0xf;
}
- else
- inst.instruction |= 0xf;
if (thumb_mode)
inst.instruction |= 0xf9000000;
diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog
index 870158f8ee..219591a78e 100644
--- a/gas/testsuite/ChangeLog
+++ b/gas/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-08-23 Will Newton <will.newton@linaro.org>
+
+ * testsuite/gas/arm/neon-addressing-bad.l: Add test for
+ VLDn and VSTn instructions.
+ * testsuite/gas/arm/neon-addressing-bad.s: Likewise.
+
2013-08-19 Richard Sandiford <rdsandiford@googlemail.com>
* gas/mips/ase-errors-1.l, gas/mips/ase-errors-2.l,
diff --git a/gas/testsuite/gas/arm/neon-addressing-bad.l b/gas/testsuite/gas/arm/neon-addressing-bad.l
index a8bc720421..38e180130d 100644
--- a/gas/testsuite/gas/arm/neon-addressing-bad.l
+++ b/gas/testsuite/gas/arm/neon-addressing-bad.l
@@ -12,12 +12,16 @@
[^:]*:14: Error: only loads support such operands -- `vst2.8 {D0\[\].*
[^:]*:15: Error: only loads support such operands -- `vst3.16 {D0\[\].*
[^:]*:16: Error: only loads support such operands -- `vst4.32 {D0\[\].*
-[^:]*:18: Error: r15 not allowed here -- `vld1.8 {d0},2f'
-[^:]*:20: Error: r15 not allowed here -- `vld1.8 {D0},R0'
-[^:]*:21: Error: r15 not allowed here -- `vld1.8 {Q1},R0'
-[^:]*:22: Error: r15 not allowed here -- `vld1.8 {D0},\[PC\]'
-[^:]*:23: Error: r15 not allowed here -- `vld1.8 {D0},\[PC,#0\]'
-[^:]*:24: Error: r15 not allowed here -- `vst1.8 {D0},R0'
-[^:]*:25: Error: r15 not allowed here -- `vst1.8 {Q1},R0'
-[^:]*:26: Error: r15 not allowed here -- `vst1.8 {D0},\[PC\]'
-[^:]*:27: Error: r15 not allowed here -- `vst1.8 {D0},\[PC,#0\]'
+[^:]*:17: Error: instruction does not accept this addressing mode -- `vld1.8 {Q0},\[R0,#8\]'
+[^:]*:18: Error: instruction does not accept this addressing mode -- `vld1.8 {Q0},\[R0,#8\]!'
+[^:]*:19: Error: instruction does not accept this addressing mode -- `vld1.8 {Q0},\[R0,R1\]'
+[^:]*:20: Error: instruction does not accept this addressing mode -- `vld1.8 {Q0},\[R0,R1\]!'
+[^:]*:22: Error: r15 not allowed here -- `vld1.8 {d0},2f'
+[^:]*:24: Error: r15 not allowed here -- `vld1.8 {D0},R0'
+[^:]*:25: Error: r15 not allowed here -- `vld1.8 {Q1},R0'
+[^:]*:26: Error: r15 not allowed here -- `vld1.8 {D0},\[PC\]'
+[^:]*:27: Error: r15 not allowed here -- `vld1.8 {D0},\[PC,#0\]'
+[^:]*:28: Error: r15 not allowed here -- `vst1.8 {D0},R0'
+[^:]*:29: Error: r15 not allowed here -- `vst1.8 {Q1},R0'
+[^:]*:30: Error: r15 not allowed here -- `vst1.8 {D0},\[PC\]'
+[^:]*:31: Error: r15 not allowed here -- `vst1.8 {D0},\[PC,#0\]'
diff --git a/gas/testsuite/gas/arm/neon-addressing-bad.s b/gas/testsuite/gas/arm/neon-addressing-bad.s
index c27b172685..6f7e769155 100644
--- a/gas/testsuite/gas/arm/neon-addressing-bad.s
+++ b/gas/testsuite/gas/arm/neon-addressing-bad.s
@@ -14,6 +14,10 @@ VST1.8 {D0[]}, [R0]
VST2.8 {D0[], D2[]}, [R0]
VST3.16 {D0[], D1[], D2[]}, [R0]
VST4.32 {D0[], D1[], D2[], D3[]}, [R0]
+VLD1.8 {Q0}, [R0, #8]
+VLD1.8 {Q0}, [R0, #8]!
+VLD1.8 {Q0}, [R0, R1]
+VLD1.8 {Q0}, [R0, R1]!
.thumb
VLD1.8 {d0}, 2f
2: