eliminate MOV64r0 in favor of a Pat<> pattern.  This is only nontrivial because
the div lowering code explicitly references it.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@75408 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/X86/X86ISelDAGToDAG.cpp b/lib/Target/X86/X86ISelDAGToDAG.cpp
index 8aa627f..0c23ba8 100644
--- a/lib/Target/X86/X86ISelDAGToDAG.cpp
+++ b/lib/Target/X86/X86ISelDAGToDAG.cpp
@@ -1604,7 +1604,7 @@
         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 @@
             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);
         }