diff options
author | Owen Anderson <resistor@mac.com> | 2011-09-09 23:13:33 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2011-09-09 23:13:33 +0000 |
commit | 921d01ae1ff4e1dad2daeed22f8259a7a520412f (patch) | |
tree | 262967d116782e44c254359d236729e336b6df78 | |
parent | 112fb73502d54dd7dd61ae2de24c92d4df181294 (diff) | |
download | llvm-921d01ae1ff4e1dad2daeed22f8259a7a520412f.tar.gz llvm-921d01ae1ff4e1dad2daeed22f8259a7a520412f.tar.bz2 llvm-921d01ae1ff4e1dad2daeed22f8259a7a520412f.tar.xz |
LDM writeback is not allowed if Rn is in the target register list.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139432 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Target/ARM/Disassembler/ARMDisassembler.cpp | 19 | ||||
-rw-r--r-- | test/MC/Disassembler/ARM/invalid-LDM-thumb.txt | 5 |
2 files changed, 24 insertions, 0 deletions
diff --git a/lib/Target/ARM/Disassembler/ARMDisassembler.cpp b/lib/Target/ARM/Disassembler/ARMDisassembler.cpp index 0edb7a5d93..da5b6b86aa 100644 --- a/lib/Target/ARM/Disassembler/ARMDisassembler.cpp +++ b/lib/Target/ARM/Disassembler/ARMDisassembler.cpp @@ -918,12 +918,31 @@ static DecodeStatus DecodeRegListOperand(llvm::MCInst &Inst, unsigned Val, uint64_t Address, const void *Decoder) { DecodeStatus S = MCDisassembler::Success; + bool writebackLoad = false; + unsigned writebackReg = 0; + switch (Inst.getOpcode()) { + default: + break; + case ARM::LDMIA_UPD: + case ARM::LDMDB_UPD: + case ARM::LDMIB_UPD: + case ARM::LDMDA_UPD: + case ARM::t2LDMIA_UPD: + case ARM::t2LDMDB_UPD: + writebackLoad = true; + writebackReg = Inst.getOperand(0).getReg(); + break; + } + // Empty register lists are not allowed. if (CountPopulation_32(Val) == 0) return MCDisassembler::Fail; for (unsigned i = 0; i < 16; ++i) { if (Val & (1 << i)) { if (!Check(S, DecodeGPRRegisterClass(Inst, i, Address, Decoder))) return MCDisassembler::Fail; + // Writeback not allowed if Rn is in the target list. + if (writebackLoad && writebackReg == Inst.end()[-1].getReg()) + Check(S, MCDisassembler::SoftFail); } } diff --git a/test/MC/Disassembler/ARM/invalid-LDM-thumb.txt b/test/MC/Disassembler/ARM/invalid-LDM-thumb.txt new file mode 100644 index 0000000000..a42b24880e --- /dev/null +++ b/test/MC/Disassembler/ARM/invalid-LDM-thumb.txt @@ -0,0 +1,5 @@ +# RUN: llvm-mc --disassemble %s -triple=thumbv7-apple-darwin9 |& grep {potentially undefined instruction encoding} + +# Writeback is not allowed is Rn is in the target register list. + +0xb4 0xe8 0x34 0x04 |