aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2005-08-26 00:28:00 +0000
committerNate Begeman <natebegeman@mac.com>2005-08-26 00:28:00 +0000
commit6660cd65cf79f4be328f072526580471bde5fe22 (patch)
tree9fba19810296e92b50fe0b3e008c5cc0dad721d6
parent23004e5f21716671401e95e3be91d87dc7d4d68b (diff)
Implement SHL_PARTS and SRL_PARTS
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23072 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Target/PowerPC/PPCISelDAGToDAG.cpp38
1 files changed, 38 insertions, 0 deletions
diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
index 5e170de8da..9bbbc16cda 100644
--- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
+++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp
@@ -1184,6 +1184,44 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) {
CurDAG->ReplaceAllUsesWith(N, Result);
return Result[Op.ResNo];
}
+ case ISD::SHL_PARTS: {
+ SDOperand HI = Select(N->getOperand(0));
+ SDOperand LO = Select(N->getOperand(1));
+ SDOperand SH = Select(N->getOperand(2));
+ SDOperand SH_LO_R = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, SH,
+ getI32Imm(32));
+ SDOperand SH_LO_L = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, SH,
+ getI32Imm((unsigned)-32));
+ SDOperand HI_SHL = CurDAG->getTargetNode(PPC::SLW, MVT::i32, HI, SH);
+ SDOperand HI_LOR = CurDAG->getTargetNode(PPC::SRW, MVT::i32, LO, SH_LO_R);
+ SDOperand HI_LOL = CurDAG->getTargetNode(PPC::SLW, MVT::i32, LO, SH_LO_L);
+ SDOperand HI_OR = CurDAG->getTargetNode(PPC::OR, MVT::i32, HI_SHL, HI_LOR);
+
+ std::vector<SDOperand> Result;
+ Result.push_back(CurDAG->getTargetNode(PPC::SLW, MVT::i32, LO, SH));
+ Result.push_back(CurDAG->getTargetNode(PPC::OR, MVT::i32, HI_OR, HI_LOL));
+ CurDAG->ReplaceAllUsesWith(N, Result);
+ return Result[Op.ResNo];
+ }
+ case ISD::SRL_PARTS: {
+ SDOperand HI = Select(N->getOperand(0));
+ SDOperand LO = Select(N->getOperand(1));
+ SDOperand SH = Select(N->getOperand(2));
+ SDOperand SH_HI_L = CurDAG->getTargetNode(PPC::SUBFIC, MVT::i32, SH,
+ getI32Imm(32));
+ SDOperand SH_HI_R = CurDAG->getTargetNode(PPC::ADDI, MVT::i32, SH,
+ getI32Imm((unsigned)-32));
+ SDOperand LO_SHR = CurDAG->getTargetNode(PPC::SRW, MVT::i32, LO, SH);
+ SDOperand LO_HIL = CurDAG->getTargetNode(PPC::SLW, MVT::i32, HI, SH_HI_L);
+ SDOperand LO_HIR = CurDAG->getTargetNode(PPC::SRW, MVT::i32, HI, SH_HI_R);
+ SDOperand LO_OR = CurDAG->getTargetNode(PPC::OR, MVT::i32, LO_SHR, LO_HIL);
+
+ std::vector<SDOperand> Result;
+ Result.push_back(CurDAG->getTargetNode(PPC::OR, MVT::i32, LO_OR, LO_HIR));
+ Result.push_back(CurDAG->getTargetNode(PPC::SRW, MVT::i32, HI, SH));
+ CurDAG->ReplaceAllUsesWith(N, Result);
+ return Result[Op.ResNo];
+ }
case ISD::LOAD:
case ISD::EXTLOAD: