aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
diff options
context:
space:
mode:
authorMihai Popa <mihail.popa@gmail.com>2013-05-20 14:42:43 +0000
committerMihai Popa <mihail.popa@gmail.com>2013-05-20 14:42:43 +0000
commitbac932e9c3c4305a3c73598f3d0dc55de53d4c68 (patch)
tree2e327d9ba95ca008228d65b33314386cf9c2a3be /lib/Target/ARM/Disassembler/ARMDisassembler.cpp
parent44b486ed78c60b50aa14d4eed92ee828d4d44293 (diff)
downloadexternal_llvm-bac932e9c3c4305a3c73598f3d0dc55de53d4c68.zip
external_llvm-bac932e9c3c4305a3c73598f3d0dc55de53d4c68.tar.gz
external_llvm-bac932e9c3c4305a3c73598f3d0dc55de53d4c68.tar.bz2
Q registers are encoded in fields of the same length as D registers. As Q registers are half as many, the ARM reference manual mandates the least significant bit to be zeroed out. Failure to do so should result in an undefined instruction. With this change test/MC/Disassembler/ARM/invalid-VQADD-arm.txt is passing (removed XFAIL).
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@182279 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/Disassembler/ARMDisassembler.cpp')
-rw-r--r--lib/Target/ARM/Disassembler/ARMDisassembler.cpp2
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
index c562cf7..aa59c98 100644
--- a/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
+++ b/lib/Target/ARM/Disassembler/ARMDisassembler.cpp
@@ -1048,7 +1048,7 @@ static const uint16_t QPRDecoderTable[] = {
static DecodeStatus DecodeQPRRegisterClass(MCInst &Inst, unsigned RegNo,
uint64_t Address, const void *Decoder) {
- if (RegNo > 31)
+ if (RegNo > 31 || (RegNo & 1) != 0)
return MCDisassembler::Fail;
RegNo >>= 1;