diff mbox

gas/config/tc-arm.c: Fix parsing of NEON load/store element sizes.

Message ID 523364E9.6030604@linaro.org
State Accepted
Headers show

Commit Message

Will Newton Sept. 13, 2013, 7:18 p.m. UTC
The existing code would accept VLD2.64 and similar undefined
instructions.

gas/ChangeLog:

2013-09-13  Will Newton  <will.newton@linaro.org>

	* config/tc-arm.c (do_neon_ld_st_interleave): Add constraint
	disallowing element size 64 with interleave other than 1.

gas/testsuite/ChangeLog:

2013-09-13  Will Newton  <will.newton@linaro.org>

	* gas/arm/neon-ldst-es.d: Add VLD1.64 instructions.
	* gas/arm/neon-ldst-es.s: Likewise.
	* testsuite/gas/arm/neon-ldst-es-bad.d: New file.
	* testsuite/gas/arm/neon-ldst-es-bad.l: Likewise.
	* testsuite/gas/arm/neon-ldst-es-bad.s: Likewise.
---
 gas/config/tc-arm.c                      |  2 ++
 gas/testsuite/gas/arm/neon-ldst-es-bad.d |  3 +++
 gas/testsuite/gas/arm/neon-ldst-es-bad.l | 12 ++++++++++++
 gas/testsuite/gas/arm/neon-ldst-es-bad.s | 12 ++++++++++++
 gas/testsuite/gas/arm/neon-ldst-es.d     |  2 ++
 gas/testsuite/gas/arm/neon-ldst-es.s     |  3 +++
 6 files changed, 34 insertions(+)
 create mode 100644 gas/testsuite/gas/arm/neon-ldst-es-bad.d
 create mode 100644 gas/testsuite/gas/arm/neon-ldst-es-bad.l
 create mode 100644 gas/testsuite/gas/arm/neon-ldst-es-bad.s

Comments

Richard Earnshaw Sept. 16, 2013, 8:57 a.m. UTC | #1
On 13/09/13 20:18, Will Newton wrote:
> 
> The existing code would accept VLD2.64 and similar undefined
> instructions.
> 
> gas/ChangeLog:
> 
> 2013-09-13  Will Newton  <will.newton@linaro.org>
> 
> 	* config/tc-arm.c (do_neon_ld_st_interleave): Add constraint
> 	disallowing element size 64 with interleave other than 1.
> 
> gas/testsuite/ChangeLog:
> 
> 2013-09-13  Will Newton  <will.newton@linaro.org>
> 
> 	* gas/arm/neon-ldst-es.d: Add VLD1.64 instructions.
> 	* gas/arm/neon-ldst-es.s: Likewise.
> 	* testsuite/gas/arm/neon-ldst-es-bad.d: New file.
> 	* testsuite/gas/arm/neon-ldst-es-bad.l: Likewise.
> 	* testsuite/gas/arm/neon-ldst-es-bad.s: Likewise.

OK.

R.
diff mbox

Patch

diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c
index 8c405a8..9c8211d 100644
--- a/gas/config/tc-arm.c
+++ b/gas/config/tc-arm.c
@@ -15783,6 +15783,8 @@  do_neon_ld_st_interleave (void)
   typebits = typetable[idx];

   constraint (typebits == -1, _("bad list type for instruction"));
+  constraint (((inst.instruction >> 8) & 3) && et.size == 64,
+	      _("bad element type for instruction"));

   inst.instruction &= ~0xf00;
   inst.instruction |= typebits << 8;
diff --git a/gas/testsuite/gas/arm/neon-ldst-es-bad.d b/gas/testsuite/gas/arm/neon-ldst-es-bad.d
new file mode 100644
index 0000000..576ee7a
--- /dev/null
+++ b/gas/testsuite/gas/arm/neon-ldst-es-bad.d
@@ -0,0 +1,3 @@ 
+# name: Bad element size combinations in Neon load/store instructions
+# as: -mfpu=neon
+# error-output: neon-ldst-es-bad.l
diff --git a/gas/testsuite/gas/arm/neon-ldst-es-bad.l b/gas/testsuite/gas/arm/neon-ldst-es-bad.l
new file mode 100644
index 0000000..b0c854e
--- /dev/null
+++ b/gas/testsuite/gas/arm/neon-ldst-es-bad.l
@@ -0,0 +1,12 @@ 
+[^:]*: Assembler messages:
+[^:]*:2: Error: bad type in Neon instruction -- `vld1\.64 {d0\[1\]},\[r0\]'
+[^:]*:3: Error: bad type in Neon instruction -- `vld1\.64 {d0\[\]},\[r0\]'
+[^:]*:4: Error: bad type in Neon instruction -- `vld2\.64 {d0\[1\]},\[r0\]'
+[^:]*:5: Error: bad type in Neon instruction -- `vld2\.64 {d0\[\]},\[r0\]'
+[^:]*:6: Error: bad element type for instruction -- `vld2\.64 {d0-d1},\[r0\]'
+[^:]*:7: Error: bad type in Neon instruction -- `vld3\.64 {d0\[1\]},\[r0\]'
+[^:]*:8: Error: bad type in Neon instruction -- `vld3\.64 {d0\[\]},\[r0\]'
+[^:]*:9: Error: bad element type for instruction -- `vld3\.64 {d0-d2},\[r0\]'
+[^:]*:10: Error: bad type in Neon instruction -- `vld4\.64 {d0\[1\]},\[r0\]'
+[^:]*:11: Error: bad type in Neon instruction -- `vld4\.64 {d0\[\]},\[r0\]'
+[^:]*:12: Error: bad element type for instruction -- `vld4\.64 {d0-d3},\[r0\]'
diff --git a/gas/testsuite/gas/arm/neon-ldst-es-bad.s b/gas/testsuite/gas/arm/neon-ldst-es-bad.s
new file mode 100644
index 0000000..f7e335e
--- /dev/null
+++ b/gas/testsuite/gas/arm/neon-ldst-es-bad.s
@@ -0,0 +1,12 @@ 
+	.text
+	vld1.64	{d0[1]}, [r0]
+	vld1.64	{d0[]}, [r0]
+	vld2.64	{d0[1]}, [r0]
+	vld2.64	{d0[]}, [r0]
+	vld2.64	{d0-d1}, [r0]
+	vld3.64	{d0[1]}, [r0]
+	vld3.64	{d0[]}, [r0]
+	vld3.64	{d0-d2}, [r0]
+	vld4.64	{d0[1]}, [r0]
+	vld4.64	{d0[]}, [r0]
+	vld4.64	{d0-d3}, [r0]
diff --git a/gas/testsuite/gas/arm/neon-ldst-es.d b/gas/testsuite/gas/arm/neon-ldst-es.d
index 6c22c69..e9c0734 100644
--- a/gas/testsuite/gas/arm/neon-ldst-es.d
+++ b/gas/testsuite/gas/arm/neon-ldst-es.d
@@ -56,3 +56,5 @@  Disassembly of section \.text:
 0[0-9a-f]+ <[^>]+> f427208f 	vld4\.32	{d2-d5}, \[r7\]
 0[0-9a-f]+ <[^>]+> f467c08f 	vld4\.32	{d28-d31}, \[r7\]
 0[0-9a-f]+ <[^>]+> f4a21c83 	vld1\.32	{d1\[\]}, \[r2\], r3
+0[0-9a-f]+ <[^>]+> f42007cf 	vld1\.64	{d0}, \[r0\]
+0[0-9a-f]+ <[^>]+> f42002cf 	vld1\.64	{d0-d3}, \[r0\]
diff --git a/gas/testsuite/gas/arm/neon-ldst-es.s b/gas/testsuite/gas/arm/neon-ldst-es.s
index 79f4b0c..cb93f06 100644
--- a/gas/testsuite/gas/arm/neon-ldst-es.s
+++ b/gas/testsuite/gas/arm/neon-ldst-es.s
@@ -60,3 +60,6 @@ 

 	@ PR 14987 and 14887: Allow for whitespace in the instruction.
 	vld1.32 { d1 [ ] } , [ r2 ] , r3
+
+	vld1.64 {d0}, [r0]
+	vld1.64 {d0-d3}, [r0]