aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
diff options
context:
space:
mode:
authorChuang-Yu Cheng <cycheng@multicorewareinc.com>2016-04-06 01:47:02 +0000
committerChuang-Yu Cheng <cycheng@multicorewareinc.com>2016-04-06 01:47:02 +0000
commit024a623c5599bd11839939dfed0eeecbc389201e (patch)
tree18d437143f33d3e35eb7128eea65234527d99caf /llvm/lib/Target/PowerPC/AsmParser/PPCAsmParser.cpp
parenteaf4b3d75ca523b19b4da1a329775ae988633c07 (diff)
downloadllvm-024a623c5599bd11839939dfed0eeecbc389201e.zip
llvm-024a623c5599bd11839939dfed0eeecbc389201e.tar.gz
llvm-024a623c5599bd11839939dfed0eeecbc389201e.tar.bz2
[Power9] Implement add-pc, multiply-add, modulo, extend-sign-shift, random number, set bool, and dfp test significance
This patch implement the following instructions: - addpcis subpcis - maddhd maddhdu maddld - modsw moduw modsd modud - darn - extswsli extswsli. - setb - dtstsfi dtstsfiq Total 15 instructions Reviewers: nemanjai hfinkel tjablin amehsan kbarton http://reviews.llvm.org/D17885 llvm-svn: 265505
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 c35c2b1..e177b85 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;
+ }
}
}