[AArch64][SVE] Improve diagnostics for vectors with incorrect element-size.
authorSander de Smalen <sander.desmalen@arm.com>
Wed, 16 May 2018 15:45:17 +0000 (15:45 +0000)
committerSander de Smalen <sander.desmalen@arm.com>
Wed, 16 May 2018 15:45:17 +0000 (15:45 +0000)
commit22176a22427b32fb82e3b18a79e7b5f55f49026a
tree61ca3dea1554d4e45b7d909adcdd1a4b23ce9b27
parentcabe50a308736a0f5c72fc7bf034b4ee3dac5760
[AArch64][SVE] Improve diagnostics for vectors with incorrect element-size.

For regular SVE vector operands, this patch introduces a more
sensible diagnostic when the vector has a wrong suffix (e.g. z0.s vs z0.b).

For example:
  add z0.s, z1.s, z2.b      -> invalid element width
               ^_____^
               mismatch

For the vector-with-shift/extend (e.g. z0.s, uxtw #2) this patch takes
a slightly different approach and instead returns a 'invalid operand'
if the element size is not as expected. This is because the diagnostics
are more specificied to suggest using the right shift/extend suffix. This
is a trade-off not to introduce more operand classes and still provide
useful diagnostics for LD1 and PRF instructions.

For example:
  ld1w z1.s, p0/z, [x0, z0.s] -> invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw)'
  ld1w z1.d, p0/z, [x0, z0.s] -> invalid operand
          ^________________^
               mismatch

For gather prefetches, both 'z0.s' and 'z0.d' would be allowed:
  prfw #0, p0, [x0, z0.s]   -> invalid shift/extend specified, expected 'z[0..31].s, (uxtw|sxtw) #2'
  prfw #0, p0, [x0, z0.d]   -> invalid shift/extend specified, expected 'z[0..31].d, (lsl|uxtw|sxtw) #2'

Without this change, the diagnostic would unnecessarily suggest a
different element size:
  prfw #0, p0, [x0, z0.s]   -> invalid shift/extend specified, expected 'z[0..31].d, (lsl|uxtw|sxtw) #2'

Reviewers: SjoerdMeijer, aemerson, fhahn, samparker, javed.absar

Reviewed By: SjoerdMeijer

Differential Revision: https://reviews.llvm.org/D46688

llvm-svn: 332483
49 files changed:
llvm/lib/Target/AArch64/AArch64RegisterInfo.td
llvm/lib/Target/AArch64/AsmParser/AArch64AsmParser.cpp
llvm/test/MC/AArch64/SVE/add-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1b-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1d-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1h-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rd-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rh-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rqb-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rqd-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rqh-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rqw-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rsb-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rsh-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rsw-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1rw-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1sb-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1sh-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1sw-diagnostics.s
llvm/test/MC/AArch64/SVE/ld1w-diagnostics.s
llvm/test/MC/AArch64/SVE/ldff1b-diagnostics.s
llvm/test/MC/AArch64/SVE/ldff1d-diagnostics.s
llvm/test/MC/AArch64/SVE/ldff1h-diagnostics.s
llvm/test/MC/AArch64/SVE/ldff1sb-diagnostics.s
llvm/test/MC/AArch64/SVE/ldff1sh-diagnostics.s
llvm/test/MC/AArch64/SVE/ldff1sw-diagnostics.s
llvm/test/MC/AArch64/SVE/ldff1w-diagnostics.s
llvm/test/MC/AArch64/SVE/ldnf1sb-diagnostics.s
llvm/test/MC/AArch64/SVE/ldnf1sh-diagnostics.s
llvm/test/MC/AArch64/SVE/ldnf1sw-diagnostics.s
llvm/test/MC/AArch64/SVE/ldnt1b-diagnostics.s
llvm/test/MC/AArch64/SVE/ldnt1d-diagnostics.s
llvm/test/MC/AArch64/SVE/ldnt1h-diagnostics.s
llvm/test/MC/AArch64/SVE/ldnt1w-diagnostics.s
llvm/test/MC/AArch64/SVE/prfb-diagnostics.s
llvm/test/MC/AArch64/SVE/prfd-diagnostics.s
llvm/test/MC/AArch64/SVE/prfh-diagnostics.s
llvm/test/MC/AArch64/SVE/prfw-diagnostics.s
llvm/test/MC/AArch64/SVE/st1b-diagnostics.s
llvm/test/MC/AArch64/SVE/st1d-diagnostics.s
llvm/test/MC/AArch64/SVE/st1h-diagnostics.s
llvm/test/MC/AArch64/SVE/st1w-diagnostics.s
llvm/test/MC/AArch64/SVE/stnt1b-diagnostics.s
llvm/test/MC/AArch64/SVE/stnt1d-diagnostics.s
llvm/test/MC/AArch64/SVE/stnt1h-diagnostics.s
llvm/test/MC/AArch64/SVE/stnt1w-diagnostics.s
llvm/test/MC/AArch64/SVE/sub-diagnostics.s
llvm/test/MC/AArch64/SVE/zip1-diagnostics.s
llvm/test/MC/AArch64/SVE/zip2-diagnostics.s