diff options
Diffstat (limited to 'lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp')
-rw-r--r-- | lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp | 66 |
1 files changed, 51 insertions, 15 deletions
diff --git a/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp b/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp index 220c70a485427..4181775fc6dab 100644 --- a/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp +++ b/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp @@ -1,4 +1,4 @@ -//===-- PPCAsmParser.cpp - Parse PowerPC asm to MCInst instructions ---------===// +//===-- PPCAsmParser.cpp - Parse PowerPC asm to MCInst instructions -------===// // // The LLVM Compiler Infrastructure // @@ -7,12 +7,10 @@ // //===----------------------------------------------------------------------===// -#include "MCTargetDesc/PPCMCTargetDesc.h" #include "MCTargetDesc/PPCMCExpr.h" +#include "MCTargetDesc/PPCMCTargetDesc.h" #include "PPCTargetStreamer.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/SmallString.h" -#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/ADT/Twine.h" #include "llvm/MC/MCContext.h" @@ -22,11 +20,11 @@ #include "llvm/MC/MCParser/MCAsmLexer.h" #include "llvm/MC/MCParser/MCAsmParser.h" #include "llvm/MC/MCParser/MCParsedAsmOperand.h" +#include "llvm/MC/MCParser/MCTargetAsmParser.h" #include "llvm/MC/MCRegisterInfo.h" #include "llvm/MC/MCStreamer.h" -#include "llvm/MC/MCSymbolELF.h" #include "llvm/MC/MCSubtargetInfo.h" -#include "llvm/MC/MCTargetAsmParser.h" +#include "llvm/MC/MCSymbolELF.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/raw_ostream.h" @@ -294,7 +292,7 @@ public: const MCInstrInfo &MII, const MCTargetOptions &Options) : MCTargetAsmParser(Options, STI), MII(MII) { // Check for 64-bit vs. 32-bit pointer mode. - Triple TheTriple(STI.getTargetTriple()); + const Triple &TheTriple = STI.getTargetTriple(); IsPPC64 = (TheTriple.getArch() == Triple::ppc64 || TheTriple.getArch() == Triple::ppc64le); IsDarwin = TheTriple.isMacOSX(); @@ -378,6 +376,10 @@ public: } } + // Disable use of sized deallocation due to overallocation of PPCOperand + // objects in CreateTokenWithStringCopy. + void operator delete(void *p) { ::operator delete(p); } + /// getStartLoc - Get the location of the first token of this operand. SMLoc getStartLoc() const override { return StartLoc; } @@ -392,13 +394,15 @@ public: return Imm.Val; } int64_t getImmS16Context() const { - assert((Kind == Immediate || Kind == ContextImmediate) && "Invalid access!"); + assert((Kind == Immediate || Kind == ContextImmediate) && + "Invalid access!"); if (Kind == Immediate) return Imm.Val; return static_cast<int16_t>(Imm.Val); } int64_t getImmU16Context() const { - assert((Kind == Immediate || Kind == ContextImmediate) && "Invalid access!"); + assert((Kind == Immediate || Kind == ContextImmediate) && + "Invalid access!"); return Imm.Val; } @@ -443,7 +447,9 @@ public: } bool isToken() const override { return Kind == Token; } - bool isImm() const override { return Kind == Immediate || Kind == Expression; } + bool isImm() const override { + return Kind == Immediate || Kind == Expression; + } bool isU1Imm() const { return Kind == Immediate && isUInt<1>(getImm()); } bool isU2Imm() const { return Kind == Immediate && isUInt<2>(getImm()); } bool isU3Imm() const { return Kind == Immediate && isUInt<3>(getImm()); } @@ -454,13 +460,15 @@ public: bool isU6ImmX2() const { return Kind == Immediate && isUInt<6>(getImm()) && (getImm() & 1) == 0; } + bool isU7Imm() const { return Kind == Immediate && isUInt<7>(getImm()); } bool isU7ImmX4() const { return Kind == Immediate && isUInt<7>(getImm()) && (getImm() & 3) == 0; } + bool isU8Imm() const { return Kind == Immediate && isUInt<8>(getImm()); } bool isU8ImmX8() const { return Kind == Immediate && isUInt<8>(getImm()) && (getImm() & 7) == 0; } - + bool isU10Imm() const { return Kind == Immediate && isUInt<10>(getImm()); } bool isU12Imm() const { return Kind == Immediate && isUInt<12>(getImm()); } bool isU16Imm() const { @@ -488,6 +496,9 @@ public: bool isS16ImmX4() const { return Kind == Expression || (Kind == Immediate && isInt<16>(getImm()) && (getImm() & 3) == 0); } + bool isS16ImmX16() const { return Kind == Expression || + (Kind == Immediate && isInt<16>(getImm()) && + (getImm() & 15) == 0); } bool isS17Imm() const { switch (Kind) { case Expression: @@ -521,7 +532,9 @@ public: (Kind == Immediate && isInt<16>(getImm()) && (getImm() & 3) == 0); } bool isRegNumber() const { return Kind == Immediate && isUInt<5>(getImm()); } - bool isVSRegNumber() const { return Kind == Immediate && isUInt<6>(getImm()); } + bool isVSRegNumber() const { + return Kind == Immediate && isUInt<6>(getImm()); + } bool isCCRegNumber() const { return (Kind == Expression && isUInt<3>(getExprCRVal())) || (Kind == Immediate @@ -1190,6 +1203,29 @@ void PPCAsmParser::ProcessInstruction(MCInst &Inst, } break; } + case PPC::CP_COPYx: + case PPC::CP_COPY_FIRST: { + MCInst TmpInst; + TmpInst.setOpcode(PPC::CP_COPY); + TmpInst.addOperand(Inst.getOperand(0)); + TmpInst.addOperand(Inst.getOperand(1)); + TmpInst.addOperand(MCOperand::createImm(Opcode == PPC::CP_COPYx ? 0 : 1)); + + Inst = TmpInst; + break; + } + case PPC::CP_PASTEx : + case PPC::CP_PASTE_LAST: { + MCInst TmpInst; + TmpInst.setOpcode(Opcode == PPC::CP_PASTEx ? + PPC::CP_PASTE : PPC::CP_PASTEo); + TmpInst.addOperand(Inst.getOperand(0)); + TmpInst.addOperand(Inst.getOperand(1)); + TmpInst.addOperand(MCOperand::createImm(Opcode == PPC::CP_PASTEx ? 0 : 1)); + + Inst = TmpInst; + break; + } } } @@ -1454,8 +1490,8 @@ ParseExpression(const MCExpr *&EVal) { /// This differs from the default "parseExpression" in that it handles detection /// of the \code hi16(), ha16() and lo16() \endcode modifiers. At present, /// parseExpression() doesn't recognise the modifiers when in the Darwin/MachO -/// syntax form so it is done here. TODO: Determine if there is merit in arranging -/// for this to be done at a higher level. +/// syntax form so it is done here. TODO: Determine if there is merit in +/// arranging for this to be done at a higher level. bool PPCAsmParser:: ParseDarwinExpression(const MCExpr *&EVal) { MCAsmParser &Parser = getParser(); @@ -1674,7 +1710,7 @@ bool PPCAsmParser::ParseInstruction(ParseInstructionInfo &Info, StringRef Name, while (getLexer().isNot(AsmToken::EndOfStatement) && getLexer().is(AsmToken::Comma)) { // Consume the comma token - getLexer().Lex(); + Lex(); // Parse the next operand if (ParseOperand(Operands)) |