From 1d50d57ca2c58167dc7ba142c6d38fad3d10b980 Mon Sep 17 00:00:00 2001 From: Will Newton Date: Mon, 16 Sep 2013 09:34:30 +0000 Subject: [PATCH] gas/config/tc-arm.c: Fix parsing of NEON load/store element sizes. The existing code would accept VLD2.64 and similar undefined instructions. gas/ChangeLog: 2013-09-16 Will Newton * 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-16 Will Newton * 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/ChangeLog | 5 +++++ gas/config/tc-arm.c | 2 ++ gas/testsuite/ChangeLog | 8 ++++++++ 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 +++ 8 files changed, 47 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 diff --git a/gas/ChangeLog b/gas/ChangeLog index 8434721a20..8177107b16 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2013-09-16 Will Newton + + * config/tc-arm.c (do_neon_ld_st_interleave): Add constraint + disallowing element size 64 with interleave other than 1. + 2013-09-12 Chao-ying Fu * config/tc-mips.c (match_insn): Set error when $31 is used for diff --git a/gas/config/tc-arm.c b/gas/config/tc-arm.c index 8c405a87b1..9c8211d535 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/ChangeLog b/gas/testsuite/ChangeLog index ac33815b33..f2d5d56cc2 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2013-09-16 Will Newton + + * 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. + 2013-09-12 Chao-ying Fu * gas/mips/bltzal.s: New file. 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 0000000000..576ee7aa69 --- /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 0000000000..b0c854eee7 --- /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 0000000000..f7e335e067 --- /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 6c22c6907e..e9c0734748 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 79f4b0cdd3..cb93f0618f 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]