diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h | 19 | 
2 files changed, 29 insertions, 8 deletions
diff --git a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp index ca67e5e2e6e..7900f9960ad 100644 --- a/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp +++ b/llvm/lib/Target/ARM/Disassembler/ARMDisassemblerCore.cpp @@ -3286,13 +3286,19 @@ static bool DisassembleMiscFrm(MCInst &MI, unsigned Opcode, uint32_t insn,      unsigned short NumOps, unsigned &NumOpsAdded, BO B) {    if (MemBarrierInstr(insn)) { -    // DMBsy, DSBsy, and ISBsy instructions have zero operand and are taken care -    // of within the generic ARMBasicMCBuilder::BuildIt() method. -    //      // Inst{3-0} encodes the memory barrier option for the variants. -    MI.addOperand(MCOperand::CreateImm(slice(insn, 3, 0))); -    NumOpsAdded = 1; -    return true; +    unsigned opt = slice(insn, 3, 0); +    switch (opt) { +    case ARM_MB::SY:  case ARM_MB::ST: +    case ARM_MB::ISH: case ARM_MB::ISHST: +    case ARM_MB::NSH: case ARM_MB::NSHST: +    case ARM_MB::OSH: case ARM_MB::OSHST: +      MI.addOperand(MCOperand::CreateImm(opt)); +      NumOpsAdded = 1; +      return true; +    default: +      return false; +    }    }    switch (Opcode) { diff --git a/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h b/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h index 066a8e3178e..618526816f7 100644 --- a/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h +++ b/llvm/lib/Target/ARM/Disassembler/ThumbDisassemblerCore.h @@ -1616,8 +1616,7 @@ static inline bool t2MiscCtrlInstr(uint32_t insn) {  // A8.6.26  // t2BXJ -> Rn  // -// Miscellaneous control: t2DMBsy (and its t2DMB variants), -// t2DSBsy (and its t2DSB varianst), t2ISBsy, t2CLREX +// Miscellaneous control:  //   -> no operand (except pred-imm pred-ccr for CLREX, memory barrier variants)  //  // Hint: t2NOP, t2YIELD, t2WFE, t2WFI, t2SEV @@ -1634,6 +1633,22 @@ static bool DisassembleThumb2BrMiscCtrl(MCInst &MI, unsigned Opcode,    if (NumOps == 0)      return true; +  if (Opcode == ARM::t2DMB || Opcode == ARM::t2DSB) { +    // Inst{3-0} encodes the memory barrier option for the variants. +    unsigned opt = slice(insn, 3, 0); +    switch (opt) { +    case ARM_MB::SY:  case ARM_MB::ST: +    case ARM_MB::ISH: case ARM_MB::ISHST: +    case ARM_MB::NSH: case ARM_MB::NSHST: +    case ARM_MB::OSH: case ARM_MB::OSHST: +      MI.addOperand(MCOperand::CreateImm(opt)); +      NumOpsAdded = 1; +      return true; +    default: +      return false; +    } +  } +    if (t2MiscCtrlInstr(insn))      return true;  | 

