diff options
author | Nate Begeman <natebegeman@mac.com> | 2005-08-26 00:28:00 +0000 |
---|---|---|
committer | Nate Begeman <natebegeman@mac.com> | 2005-08-26 00:28:00 +0000 |
commit | 6660cd65cf79f4be328f072526580471bde5fe22 (patch) | |
tree | 9fba19810296e92b50fe0b3e008c5cc0dad721d6 | |
parent | 23004e5f21716671401e95e3be91d87dc7d4d68b (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.cpp | 38 |
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: |