diff options
| author | Chris Lattner <sabre@nondot.org> | 2009-07-14 20:19:57 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2009-07-14 20:19:57 +0000 |
| commit | 79c136d473052472bcbdc616e61dc3f233c5070a (patch) | |
| tree | efb86a46042c1824fcdde0658a9d18b88555d711 /llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | |
| parent | a31f96cf2bb2d4868d629b17b4e8ec106a23e776 (diff) | |
| download | bcm5719-llvm-79c136d473052472bcbdc616e61dc3f233c5070a.tar.gz bcm5719-llvm-79c136d473052472bcbdc616e61dc3f233c5070a.zip | |
reapply r75408, which eliminates MOV64r0 in favor of using
MOV32r0 + subregs to do the same thing. This should work now
that PR4544 is fixed. Thanks Evan!
llvm-svn: 75671
Diffstat (limited to 'llvm/lib/Target/X86/X86ISelDAGToDAG.cpp')
| -rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 24 |
1 files changed, 21 insertions, 3 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index 296a4d3856a..fcc2c249497 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -1604,7 +1604,7 @@ SDNode *X86DAGToDAGISel::Select(SDValue N) { break; case MVT::i64: LoReg = X86::RAX; HiReg = X86::RDX; - ClrOpcode = X86::MOV64r0; + ClrOpcode = ~0U; // NOT USED. SExtOpcode = X86::CQO; break; } @@ -1643,8 +1643,26 @@ SDNode *X86DAGToDAGISel::Select(SDValue N) { SDValue(CurDAG->getTargetNode(SExtOpcode, dl, MVT::Flag, InFlag),0); } else { // Zero out the high part, effectively zero extending the input. - SDValue ClrNode = SDValue(CurDAG->getTargetNode(ClrOpcode, dl, NVT), - 0); + SDValue ClrNode; + + if (NVT.getSimpleVT() == MVT::i64) { + ClrNode = SDValue(CurDAG->getTargetNode(X86::MOV32r0, dl, MVT::i32), + 0); + // We just did a 32-bit clear, insert it into a 64-bit register to + // clear the whole 64-bit reg. + SDValue Undef = + SDValue(CurDAG->getTargetNode(TargetInstrInfo::IMPLICIT_DEF, + dl, MVT::i64), 0); + SDValue SubRegNo = + CurDAG->getTargetConstant(X86::SUBREG_32BIT, MVT::i32); + ClrNode = + SDValue(CurDAG->getTargetNode(TargetInstrInfo::INSERT_SUBREG, dl, + MVT::i64, Undef, ClrNode, SubRegNo), + 0); + } else { + ClrNode = SDValue(CurDAG->getTargetNode(ClrOpcode, dl, NVT), 0); + } + InFlag = CurDAG->getCopyToReg(CurDAG->getEntryNode(), dl, HiReg, ClrNode, InFlag).getValue(1); } |

