OSDN Git Service

[ARM] Fix handling of zero offsets in LOB instructions.
authorSimon Tatham <simon.tatham@arm.com>
Thu, 27 Jun 2019 12:41:07 +0000 (12:41 +0000)
committerSimon Tatham <simon.tatham@arm.com>
Thu, 27 Jun 2019 12:41:07 +0000 (12:41 +0000)
commitc82b7efc96f42b732e1f1ee3dc8e0e6c948fc5c9
tree60aefe0ed800105b2b185d0c1ed65a4632e9590f
parentc27a34eed4e279c21ef324196a6c7960f4ec387b
[ARM] Fix handling of zero offsets in LOB instructions.

The BF and WLS/WLSTP instructions have various branch-offset fields
occupying different positions and lengths in the instruction encoding,
and all of them were decoded at disassembly time by the function
DecodeBFLabelOffset() which returned SoftFail if the offset was zero.

In fact, it's perfectly fine and not even a SoftFail for most of those
offset fields to be zero. The only one that can't be zero is the 4-bit
field labelled `boff` in the architecture spec, occupying bits {26-23}
of the BF instruction family. If that one is zero, the encoding
overlaps other instructions (WLS, DLS, LETP, VCTP), so it ought to be
a full Fail.

Fixed by adding an extra template parameter to DecodeBFLabelOffset
which controls whether a zero offset is accepted or rejected. Adjusted
existing tests (only in error messages for bad disassemblies); added
extra tests to demonstrate zero offsets being accepted in all the
right places, and a few demonstrating rejection of zero `boff`.

Reviewers: DavidSpickett, ostannard

Subscribers: javed.absar, kristof.beyls, hiraditya, llvm-commits

Tags: #llvm

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

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@364533 91177308-0d34-0410-b5e6-96231b3b80d8
lib/Target/ARM/ARMInstrThumb2.td
lib/Target/ARM/Disassembler/ARMDisassembler.cpp
test/MC/ARM/mve-misc.s
test/MC/ARM/thumbv8.1m.s
test/MC/Disassembler/ARM/mve-misc.txt
test/MC/Disassembler/ARM/mve-qdest-rsrc.txt
test/MC/Disassembler/ARM/thumb2-v8.1m.txt