diff options
author | Richard Sandiford <richard.sandiford@arm.com> | 2023-03-30 11:09:11 +0100 |
---|---|---|
committer | Richard Sandiford <richard.sandiford@arm.com> | 2023-03-30 11:09:11 +0100 |
commit | 586c62819f6eb9a77978628afd53ba12c91a11e7 (patch) | |
tree | c26d5e26c23b5d083216b296736491ac866a48d9 /gas | |
parent | e2dc4040f30caba49d2bb7bd1d5119dd8a72cdba (diff) | |
download | binutils-gdb-586c62819f6eb9a77978628afd53ba12c91a11e7.tar.gz |
aarch64; Add support for vector offset ranges
Some SME2 instructions operate on a range of consecutive ZA vectors.
This is indicated by syntax such as:
za[<Wv>, <imml>:<immh>]
Like with the earlier vgx2 and vgx4 support, we get better error
messages if the parser allows all ZA indices to have a range.
We can then reject invalid cases during constraint checking.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/tc-aarch64.c | 23 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-2-illegal.l | 13 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-2-illegal.s | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-5-illegal.l | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-5-illegal.s | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-6-illegal.l | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-6-illegal.s | 3 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-7-illegal.l | 8 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-7-illegal.s | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-9-illegal.l | 9 | ||||
-rw-r--r-- | gas/testsuite/gas/aarch64/sme-9-illegal.s | 4 |
11 files changed, 84 insertions, 0 deletions
diff --git a/gas/config/tc-aarch64.c b/gas/config/tc-aarch64.c index 2d732ea1780..5873fc754a3 100644 --- a/gas/config/tc-aarch64.c +++ b/gas/config/tc-aarch64.c @@ -4550,6 +4550,29 @@ parse_sme_za_index (char **str, struct aarch64_indexed_za *opnd) return false; } + if (skip_past_char (str, ':')) + { + int64_t end; + if (!parse_sme_immediate (str, &end)) + { + set_syntax_error (_("expected a constant immediate offset")); + return false; + } + if (end < opnd->index.imm) + { + set_syntax_error (_("the last offset is less than the" + " first offset")); + return false; + } + if (end == opnd->index.imm) + { + set_syntax_error (_("the last offset is equal to the" + " first offset")); + return false; + } + opnd->index.countm1 = (uint64_t) end - opnd->index.imm; + } + opnd->group_size = 0; if (skip_past_char (str, ',')) { diff --git a/gas/testsuite/gas/aarch64/sme-2-illegal.l b/gas/testsuite/gas/aarch64/sme-2-illegal.l index fd36ed78381..71a104a2ecf 100644 --- a/gas/testsuite/gas/aarch64/sme-2-illegal.l +++ b/gas/testsuite/gas/aarch64/sme-2-illegal.l @@ -28,3 +28,16 @@ [^:]*:[0-9]+: Error: unexpected vector group size at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,#0,vgx2\]' [^:]*:[0-9]+: Error: unexpected vector group size at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,#0,vgx4\]' [^:]*:[0-9]+: Error: invalid vector group size at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,#0,vgx8\]' +[^:]*:[0-9]+: Error: the last offset is less than the first offset at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,1:0\]' +[^:]*:[0-9]+: Error: the last offset is equal to the first offset at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,0:0\]' +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,0:1\]' +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,0:2\]' +[^:]+:[0-9]+: Error: operand mismatch -- `mova z0\.b,p0/m,za0h\.h\[w12,0:1\]' +[^:]+:[0-9]+: Info: did you mean this\? +[^:]+:[0-9]+: Info: mova z0\.b, p0/m, za0h\.b\[w12, 0:1\] +[^:]+:[0-9]+: Info: other valid variant\(s\): +[^:]+:[0-9]+: Info: mova z0\.h, p0/m, za0h\.h\[w12, 0:1\] +[^:]+:[0-9]+: Info: mova z0\.s, p0/m, za0h\.s\[w12, 0:1\] +[^:]+:[0-9]+: Info: mova z0\.d, p0/m, za0h\.d\[w12, 0:1\] +[^:]+:[0-9]+: Info: mova z0\.q, p0/m, za0h\.q\[w12, 0:1\] +[^:]*:[0-9]+: Error: expected a constant immediate offset at operand 3 -- `mova z0.b,p0/m,za0h.b\[w12,0:foo\]' diff --git a/gas/testsuite/gas/aarch64/sme-2-illegal.s b/gas/testsuite/gas/aarch64/sme-2-illegal.s index 8cc130ac9c0..41bbe4e930b 100644 --- a/gas/testsuite/gas/aarch64/sme-2-illegal.s +++ b/gas/testsuite/gas/aarch64/sme-2-illegal.s @@ -34,3 +34,10 @@ mova z0.q, p0/m, za0v.q[w12, #1a2] mova z0.b, p0/m, za0h.b[w12, #0, vgx2] mova z0.b, p0/m, za0h.b[w12, #0, vgx4] mova z0.b, p0/m, za0h.b[w12, #0, vgx8] + +mova z0.b, p0/m, za0h.b[w12, 1:0] +mova z0.b, p0/m, za0h.b[w12, 0:0] +mova z0.b, p0/m, za0h.b[w12, 0:1] +mova z0.b, p0/m, za0h.b[w12, 0:2] +mova z0.b, p0/m, za0h.h[w12, 0:1] +mova z0.b, p0/m, za0h.b[w12, 0:foo] diff --git a/gas/testsuite/gas/aarch64/sme-5-illegal.l b/gas/testsuite/gas/aarch64/sme-5-illegal.l index f6eda9da5e2..c4bfc1f8b5a 100644 --- a/gas/testsuite/gas/aarch64/sme-5-illegal.l +++ b/gas/testsuite/gas/aarch64/sme-5-illegal.l @@ -62,3 +62,7 @@ [^:]*:[0-9]+: Error: operand mismatch -- `ld1b {za0h\.b\[w12,0,vgx4\]},p0/m,\[x0\]' [^:]*:[0-9]+: Info: did you mean this\? [^:]*:[0-9]+: Info: ld1b {za0h\.b\[w12, 0, vgx4\]}, p0/z, \[x0, xzr\] +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 1 -- `ld1b {za0h\.b\[w12,0:1\]},p0/z,\[x0\]' +[^:]+:[0-9]+: Error: operand mismatch -- `ld1b {za0h\.b\[w12,0:1\]},p0/m,\[x0\]' +[^:]+:[0-9]+: Info: did you mean this\? +[^:]*:[0-9]+: Info: ld1b {za0h\.b\[w12, 0:1\]}, p0/z, \[x0, xzr\] diff --git a/gas/testsuite/gas/aarch64/sme-5-illegal.s b/gas/testsuite/gas/aarch64/sme-5-illegal.s index 9dbce626a6e..942a5cf9588 100644 --- a/gas/testsuite/gas/aarch64/sme-5-illegal.s +++ b/gas/testsuite/gas/aarch64/sme-5-illegal.s @@ -63,3 +63,6 @@ ld1b {za0h.b[w12, 0, vgx4]}, p0/z, [x0] ld1b {za0h.b[w12, 0, vgx8]}, p0/z, [x0] ld1b {za0h.b[w12, 0, vgx4]}, p0/m, [x0] + +ld1b {za0h.b[w12, 0:1]}, p0/z, [x0] +ld1b {za0h.b[w12, 0:1]}, p0/m, [x0] diff --git a/gas/testsuite/gas/aarch64/sme-6-illegal.l b/gas/testsuite/gas/aarch64/sme-6-illegal.l index bc0d19417fc..b98b76faaed 100644 --- a/gas/testsuite/gas/aarch64/sme-6-illegal.l +++ b/gas/testsuite/gas/aarch64/sme-6-illegal.l @@ -49,3 +49,7 @@ [^:]*:[0-9]+: Error: operand mismatch -- `st1b {za0h\.b\[w12,0,vgx2\]},p0/z,\[x0\]' [^:]*:[0-9]+: Info: did you mean this\? [^:]*:[0-9]+: Info: st1b {za0h\.b\[w12, 0, vgx2\]}, p0, \[x0, xzr\] +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 1 -- `st1b {za0h\.b\[w12,0:1,vgx2\]},p0,\[x0\]' +[^:]+:[0-9]+: Error: operand mismatch -- `st1b {za0h\.b\[w12,0:1,vgx2\]},p0/m,\[x0\]' +[^:]+:[0-9]+: Info: did you mean this\? +[^:]*:[0-9]+: Info: st1b {za0h\.b\[w12, 0:1, vgx2\]}, p0, \[x0, xzr\] diff --git a/gas/testsuite/gas/aarch64/sme-6-illegal.s b/gas/testsuite/gas/aarch64/sme-6-illegal.s index 04a508821bc..bebbcb658e8 100644 --- a/gas/testsuite/gas/aarch64/sme-6-illegal.s +++ b/gas/testsuite/gas/aarch64/sme-6-illegal.s @@ -50,3 +50,6 @@ st1b {za0h.b[w12, 0, vgx4]}, p0, [x0] st1b {za0h.b[w12, 0, vgx8]}, p0, [x0] st1b {za0h.b[w12, 0, vgx2]}, p0/z, [x0] + +st1b {za0h.b[w12, 0:1, vgx2]}, p0, [x0] +st1b {za0h.b[w12, 0:1, vgx2]}, p0/m, [x0] diff --git a/gas/testsuite/gas/aarch64/sme-7-illegal.l b/gas/testsuite/gas/aarch64/sme-7-illegal.l index eb0c5e6f51a..5ab025cc27e 100644 --- a/gas/testsuite/gas/aarch64/sme-7-illegal.l +++ b/gas/testsuite/gas/aarch64/sme-7-illegal.l @@ -66,3 +66,11 @@ [^:]*:[0-9]+: Error: operand mismatch -- `str za\.b\[w12,0,vgx4\],\[x0\]' [^:]*:[0-9]+: Info: did you mean this\? [^:]*:[0-9]+: Info: str za\[w12, 0, vgx4\], \[x0\] +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 1 -- `ldr za\[w12,0:1\],\[x0\]' +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 1 -- `str za\[w12,0:2,vgx4\],\[x0\]' +[^:]*:[0-9]+: Error: operand mismatch -- `ldr za\.b\[w12,0:1\],\[x0\]' +[^:]*:[0-9]+: Info: did you mean this\? +[^:]*:[0-9]+: Info: ldr za\[w12, 0:1\], \[x0\] +[^:]*:[0-9]+: Error: operand mismatch -- `str za\.b\[w12,0:2,vgx4\],\[x0\]' +[^:]*:[0-9]+: Info: did you mean this\? +[^:]*:[0-9]+: Info: str za\[w12, 0:2, vgx4\], \[x0\] diff --git a/gas/testsuite/gas/aarch64/sme-7-illegal.s b/gas/testsuite/gas/aarch64/sme-7-illegal.s index 05d7d23fe29..7e97f910cf8 100644 --- a/gas/testsuite/gas/aarch64/sme-7-illegal.s +++ b/gas/testsuite/gas/aarch64/sme-7-illegal.s @@ -63,3 +63,9 @@ str za[w12, 0, vgx8], [x0] ldr za.b[w12, 0, vgx2], [x0] str za.b[w12, 0, vgx4], [x0] + +ldr za[w12, 0:1], [x0] +str za[w12, 0:2, vgx4], [x0] + +ldr za.b[w12, 0:1], [x0] +str za.b[w12, 0:2, vgx4], [x0] diff --git a/gas/testsuite/gas/aarch64/sme-9-illegal.l b/gas/testsuite/gas/aarch64/sme-9-illegal.l index d7aff825288..7f44435ef08 100644 --- a/gas/testsuite/gas/aarch64/sme-9-illegal.l +++ b/gas/testsuite/gas/aarch64/sme-9-illegal.l @@ -37,6 +37,15 @@ [^:]*:[0-9]+: Info: psel p0, p0, p0\.h\[w12, 0\] [^:]*:[0-9]+: Info: psel p0, p0, p0\.s\[w12, 0\] [^:]*:[0-9]+: Info: psel p0, p0, p0\.d\[w12, 0\] +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 3 -- `psel p0,p0,p0\.b\[w12,0:1\]' +[^:]*:[0-9]+: Error: expected a single offset rather than a range at operand 3 -- `psel p0,p0,p0\.b\[w12,0:1,vgx2\]' +[^:]*:[0-9]+: Error: operand mismatch -- `psel p0\.b,p0\.b,p0\.b\[w12,0:1,vgx2\]' +[^:]*:[0-9]+: Info: did you mean this\? +[^:]*:[0-9]+: Info: psel p0, p0, p0\.b\[w12, 0\] +[^:]*:[0-9]+: Info: other valid variant\(s\): +[^:]*:[0-9]+: Info: psel p0, p0, p0\.h\[w12, 0\] +[^:]*:[0-9]+: Info: psel p0, p0, p0\.s\[w12, 0\] +[^:]*:[0-9]+: Info: psel p0, p0, p0\.d\[w12, 0\] [^:]*:[0-9]+: Error: operand mismatch -- `revd z0.q,p0/m,z0.b' [^:]*:[0-9]+: Info: did you mean this\? [^:]*:[0-9]+: Info: revd z0.q, p0/m, z0.q diff --git a/gas/testsuite/gas/aarch64/sme-9-illegal.s b/gas/testsuite/gas/aarch64/sme-9-illegal.s index 8f41298cd3c..3c07e2d6fcb 100644 --- a/gas/testsuite/gas/aarch64/sme-9-illegal.s +++ b/gas/testsuite/gas/aarch64/sme-9-illegal.s @@ -23,6 +23,10 @@ psel p0, p0, p0.b[w12, #0, vgx8] psel p0.b, p0.b, p0.b[w12, #0, vgx2] +psel p0, p0, p0.b[w12, 0:1] +psel p0, p0, p0.b[w12, 0:1, vgx2] +psel p0.b, p0.b, p0.b[w12, 0:1, vgx2] + revd z0.q, p0/m, z0.b sclamp z8.b, z1.b, z31.q |