diff options
Diffstat (limited to 'llvm/lib')
3 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/Target/MSP430/AsmParser/MSP430AsmParser.cpp b/llvm/lib/Target/MSP430/AsmParser/MSP430AsmParser.cpp index 3cc6da2c21a..1ad70ac72c7 100644 --- a/llvm/lib/Target/MSP430/AsmParser/MSP430AsmParser.cpp +++ b/llvm/lib/Target/MSP430/AsmParser/MSP430AsmParser.cpp @@ -497,7 +497,11 @@ bool MSP430AsmParser::ParseOperand(OperandVector &Operands) { getLexer().Lex(); // Eat '+' return false; } - Operands.push_back(MSP430Operand::CreateIndReg(RegNo, StartLoc, EndLoc)); + if (Operands.size() > 1) // Emulate @rd in destination position as 0(rd) + Operands.push_back(MSP430Operand::CreateMem(RegNo, + MCConstantExpr::create(0, getContext()), StartLoc, EndLoc)); + else + Operands.push_back(MSP430Operand::CreateIndReg(RegNo, StartLoc, EndLoc)); return false; } case AsmToken::Hash: diff --git a/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp b/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp index 2a66b4ed7f2..e5da130f9bb 100644 --- a/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp +++ b/llvm/lib/Target/MSP430/Disassembler/MSP430Disassembler.cpp @@ -249,6 +249,10 @@ DecodeStatus MSP430Disassembler::getInstructionI(MCInst &MI, uint64_t &Size, case amSymbolic: case amImmediate: case amAbsolute: + if (Bytes.size() < (Words + 1) * 2) { + Size = 2; + return DecodeStatus::Fail; + } Insn |= (uint64_t)support::endian::read16le(Bytes.data() + 2) << 16; ++Words; break; @@ -259,6 +263,10 @@ DecodeStatus MSP430Disassembler::getInstructionI(MCInst &MI, uint64_t &Size, case amIndexed: case amSymbolic: case amAbsolute: + if (Bytes.size() < (Words + 1) * 2) { + Size = 2; + return DecodeStatus::Fail; + } Insn |= (uint64_t)support::endian::read16le(Bytes.data() + Words * 2) << (Words * 16); ++Words; @@ -296,6 +304,10 @@ DecodeStatus MSP430Disassembler::getInstructionII(MCInst &MI, uint64_t &Size, case amSymbolic: case amImmediate: case amAbsolute: + if (Bytes.size() < (Words + 1) * 2) { + Size = 2; + return DecodeStatus::Fail; + } Insn |= (uint64_t)support::endian::read16le(Bytes.data() + 2) << 16; ++Words; break; diff --git a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCCodeEmitter.cpp b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCCodeEmitter.cpp index adf2384f6e9..06f9f307cb1 100644 --- a/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCCodeEmitter.cpp +++ b/llvm/lib/Target/MSP430/MCTargetDesc/MSP430MCCodeEmitter.cpp @@ -128,7 +128,7 @@ unsigned MSP430MCCodeEmitter::getMemOpValue(const MCInst &MI, unsigned Op, const MCOperand &MO2 = MI.getOperand(Op + 1); if (MO2.isImm()) { Offset += 2; - return (MO2.getImm() << 4) | Reg; + return ((unsigned)MO2.getImm() << 4) | Reg; } assert(MO2.isExpr() && "Expr operand expected"); |