summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp')
-rw-r--r--llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp22
1 files changed, 22 insertions, 0 deletions
diff --git a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
index c35c2b1cf2f..e177b85dbbb 100644
--- a/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
+++ b/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
@@ -530,6 +530,10 @@ public:
(Kind == Immediate && isInt<16>(getImm()) &&
(getImm() & 3) == 0); }
bool isRegNumber() const { return Kind == Immediate && isUInt<5>(getImm()); }
+ bool isD8RCRegNumber() const { return Kind == Immediate &&
+ isUInt<5>(getImm()) &&
+ // required even register id
+ !(getImm() & 0x1); }
bool isVSRegNumber() const { return Kind == Immediate && isUInt<6>(getImm()); }
bool isCCRegNumber() const { return (Kind == Expression
&& isUInt<3>(getExprCRVal())) ||
@@ -592,6 +596,11 @@ public:
Inst.addOperand(MCOperand::createReg(FRegs[getReg()]));
}
+ void addRegD8RCOperands(MCInst &Inst, unsigned N) const {
+ assert(N == 1 && "Invalid number of operands!");
+ Inst.addOperand(MCOperand::createReg(FRegs[getReg()]));
+ }
+
void addRegVRRCOperands(MCInst &Inst, unsigned N) const {
assert(N == 1 && "Invalid number of operands!");
Inst.addOperand(MCOperand::createReg(VRegs[getReg()]));
@@ -1222,6 +1231,19 @@ void PPCAsmParser::ProcessInstruction(MCInst &Inst,
Inst = TmpInst;
break;
}
+ // ISA3.0 Instructions:
+ case PPC::SUBPCIS:
+ case PPC::LNIA: {
+ MCInst TmpInst;
+ TmpInst.setOpcode(PPC::ADDPCIS);
+ TmpInst.addOperand(Inst.getOperand(0));
+ if (Opcode == PPC::SUBPCIS)
+ addNegOperand(TmpInst, Inst.getOperand(1), getContext());
+ else
+ TmpInst.addOperand(MCOperand::createImm(0));
+ Inst = TmpInst;
+ break;
+ }
}
}
OpenPOWER on IntegriCloud