LegalizeDAG.cpp revision ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8f
13e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//===-- LegalizeDAG.cpp - Implement SelectionDAG::Legalize ----------------===//
23e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//
33e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//                     The LLVM Compiler Infrastructure
43e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//
53e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner// This file was developed by the LLVM research group and is distributed under
63e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner// the University of Illinois Open Source License. See LICENSE.TXT for details.
73e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//
83e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//===----------------------------------------------------------------------===//
93e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//
103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner// This file implements the SelectionDAG::Legalize method.
113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//
123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//===----------------------------------------------------------------------===//
133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include "llvm/CodeGen/SelectionDAG.h"
153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include "llvm/CodeGen/MachineConstantPool.h"
163e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include "llvm/CodeGen/MachineFunction.h"
1745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner#include "llvm/CodeGen/MachineFrameInfo.h"
183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include "llvm/Target/TargetLowering.h"
19e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner#include "llvm/Target/TargetData.h"
200f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner#include "llvm/Target/TargetOptions.h"
213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include "llvm/Constants.h"
223e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include <iostream>
233e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerusing namespace llvm;
243e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//===----------------------------------------------------------------------===//
263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// SelectionDAGLegalize - This takes an arbitrary SelectionDAG as input and
273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// hacks on it until the target machine can handle it.  This involves
283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// eliminating value sizes the machine cannot handle (promoting small sizes to
293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// large sizes or splitting up large values into small values) as well as
303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// eliminating operations the machine cannot handle.
313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner///
323e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// This code also does a small amount of optimization and recognition of idioms
333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// as part of its processing.  For example, if a target does not support a
343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// 'setcc' instruction efficiently, but does support 'brcc' instruction, this
353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// will attempt merge setcc and brc instructions into brcc's.
363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner///
373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnernamespace {
383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerclass SelectionDAGLegalize {
393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  TargetLowering &TLI;
403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SelectionDAG &DAG;
413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// LegalizeAction - This enum indicates what action we should take for each
433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// value type the can occur in the program.
443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  enum LegalizeAction {
453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Legal,            // The target natively supports this value type.
463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Promote,          // This should be promoted to the next larger type.
473e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Expand,           // This integer type should be broken into smaller pieces.
483e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  };
493e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// ValueTypeActions - This is a bitvector that contains two bits for each
513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// value type, where the two bits correspond to the LegalizeAction enum.
523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// This can be queried with "getTypeAction(VT)".
533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  unsigned ValueTypeActions;
543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// NeedsAnotherIteration - This is set when we expand a large integer
563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// operation into smaller integer operations, but the smaller operations are
573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// not set.  This occurs only rarely in practice, for targets that don't have
583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// 32-bit or larger integer registers.
593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  bool NeedsAnotherIteration;
603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// LegalizedNodes - For nodes that are of legal width, and that have more
623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// than one use, this map indicates what regularized operand to use.  This
633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// allows us to avoid legalizing the same thing more than once.
643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  std::map<SDOperand, SDOperand> LegalizedNodes;
653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
6603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  /// PromotedNodes - For nodes that are below legal width, and that have more
6703c8546ec57523970874917854a2fb77b1ff598eChris Lattner  /// than one use, this map indicates what promoted value to use.  This allows
6803c8546ec57523970874917854a2fb77b1ff598eChris Lattner  /// us to avoid promoting the same thing more than once.
6903c8546ec57523970874917854a2fb77b1ff598eChris Lattner  std::map<SDOperand, SDOperand> PromotedNodes;
7003c8546ec57523970874917854a2fb77b1ff598eChris Lattner
713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// ExpandedNodes - For nodes that need to be expanded, and which have more
723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// than one use, this map indicates which which operands are the expanded
733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// version of the input.  This allows us to avoid expanding the same node
743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// more than once.
753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  std::map<SDOperand, std::pair<SDOperand, SDOperand> > ExpandedNodes;
763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
778afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner  void AddLegalizedOperand(SDOperand From, SDOperand To) {
788afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    bool isNew = LegalizedNodes.insert(std::make_pair(From, To)).second;
798afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    assert(isNew && "Got into the map somehow?");
808afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner  }
8103c8546ec57523970874917854a2fb77b1ff598eChris Lattner  void AddPromotedOperand(SDOperand From, SDOperand To) {
8203c8546ec57523970874917854a2fb77b1ff598eChris Lattner    bool isNew = PromotedNodes.insert(std::make_pair(From, To)).second;
8303c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(isNew && "Got into the map somehow?");
8403c8546ec57523970874917854a2fb77b1ff598eChris Lattner  }
858afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner
863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerpublic:
873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
889c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SelectionDAGLegalize(SelectionDAG &DAG);
893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// Run - While there is still lowering to do, perform a pass over the DAG.
913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// Most regularization can be done in a single pass, but targets that require
923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// large values to be split into registers multiple times (e.g. i64 -> 4x
933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// i16) require iteration for these values (the first iteration will demote
943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// to i32, the second will demote to i16).
953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  void Run() {
963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    do {
973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      NeedsAnotherIteration = false;
983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      LegalizeDAG();
993e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    } while (NeedsAnotherIteration);
1003e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// getTypeAction - Return how we should legalize values of this type, either
1033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// it is already legal or we need to expand it into multiple registers of
1043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// smaller integer type, or we need to promote it to a larger type.
1053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  LegalizeAction getTypeAction(MVT::ValueType VT) const {
1063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    return (LegalizeAction)((ValueTypeActions >> (2*VT)) & 3);
1073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1083e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// isTypeLegal - Return true if this type is legal on this target.
1103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  ///
1113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  bool isTypeLegal(MVT::ValueType VT) const {
1123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    return getTypeAction(VT) == Legal;
1133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerprivate:
1163e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  void LegalizeDAG();
1173e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand LegalizeOp(SDOperand O);
1193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  void ExpandOp(SDOperand O, SDOperand &Lo, SDOperand &Hi);
12003c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDOperand PromoteOp(SDOperand O);
1213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
12277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand ExpandLibCall(const char *Name, SDNode *Node,
12377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                          SDOperand &Hi);
12477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand ExpandIntToFP(bool isSigned, MVT::ValueType DestTy,
12577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                          SDOperand Source);
126e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  bool ExpandShift(unsigned Opc, SDOperand Op, SDOperand Amt,
127e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                   SDOperand &Lo, SDOperand &Hi);
12884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  void ExpandAddSub(bool isAdd, SDOperand Op, SDOperand Amt,
12984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner                    SDOperand &Lo, SDOperand &Hi);
130e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand getIntPtrConstant(uint64_t Val) {
1323e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    return DAG.getConstant(Val, TLI.getPointerTy());
1333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner};
1353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
1363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1389c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris LattnerSelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag)
1399c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  : TLI(dag.getTargetLoweringInfo()), DAG(dag),
1409c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    ValueTypeActions(TLI.getValueTypeActions()) {
1413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(MVT::LAST_VALUETYPE <= 16 &&
1423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner         "Too many value types for ValueTypeActions to hold!");
1433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
1443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnervoid SelectionDAGLegalize::LegalizeDAG() {
1463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand OldRoot = DAG.getRoot();
1473e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand NewRoot = LegalizeOp(OldRoot);
1483e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  DAG.setRoot(NewRoot);
1493e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  ExpandedNodes.clear();
1513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  LegalizedNodes.clear();
15271c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner  PromotedNodes.clear();
1533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // Remove dead nodes now.
15562fd269c146d9023efe32644e44cd97b88631d4fChris Lattner  DAG.RemoveDeadNodes(OldRoot.Val);
1563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
1573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris LattnerSDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
159e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner  assert(getTypeAction(Op.getValueType()) == Legal &&
160e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner         "Caller should expand or promote operands that are not legal!");
161e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner
1623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // If this operation defines any values that cannot be represented in a
163e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner  // register on this target, make sure to expand or promote them.
164e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner  if (Op.Val->getNumValues() > 1) {
1653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    for (unsigned i = 0, e = Op.Val->getNumValues(); i != e; ++i)
1663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      switch (getTypeAction(Op.Val->getValueType(i))) {
1673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Legal: break;  // Nothing to do.
1683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Expand: {
1693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        SDOperand T1, T2;
1703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        ExpandOp(Op.getValue(i), T1, T2);
1713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        assert(LegalizedNodes.count(Op) &&
1723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner               "Expansion didn't add legal operands!");
1733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        return LegalizedNodes[Op];
1743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
1753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Promote:
17603c8546ec57523970874917854a2fb77b1ff598eChris Lattner        PromoteOp(Op.getValue(i));
17703c8546ec57523970874917854a2fb77b1ff598eChris Lattner        assert(LegalizedNodes.count(Op) &&
17803c8546ec57523970874917854a2fb77b1ff598eChris Lattner               "Expansion didn't add legal operands!");
17903c8546ec57523970874917854a2fb77b1ff598eChris Lattner        return LegalizedNodes[Op];
1803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
1813e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
183e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  std::map<SDOperand, SDOperand>::iterator I = LegalizedNodes.find(Op);
184e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  if (I != LegalizedNodes.end()) return I->second;
1853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
186fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner  SDOperand Tmp1, Tmp2, Tmp3;
1873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand Result = Op;
1893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDNode *Node = Op.Val;
1903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  switch (Node->getOpcode()) {
1923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  default:
1933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::cerr << "NODE: "; Node->dump(); std::cerr << "\n";
1943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(0 && "Do not know how to legalize this operator!");
1953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    abort();
1963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::EntryToken:
1973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::FrameIndex:
1983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::GlobalAddress:
19903c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::ExternalSymbol:
20069a52155d2eff066b49dbac385113002fd9dba14Chris Lattner  case ISD::ConstantPool:           // Nothing to do.
2013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(getTypeAction(Node->getValueType(0)) == Legal &&
2023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner           "This must be legal!");
2033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
20469a52155d2eff066b49dbac385113002fd9dba14Chris Lattner  case ISD::CopyFromReg:
20569a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
20669a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    if (Tmp1 != Node->getOperand(0))
20769a52155d2eff066b49dbac385113002fd9dba14Chris Lattner      Result = DAG.getCopyFromReg(cast<RegSDNode>(Node)->getReg(),
20869a52155d2eff066b49dbac385113002fd9dba14Chris Lattner                                  Node->getValueType(0), Tmp1);
20913c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    else
21013c184de29c09294ed63b01ac43e1b46c049278eChris Lattner      Result = Op.getValue(0);
21113c184de29c09294ed63b01ac43e1b46c049278eChris Lattner
21213c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    // Since CopyFromReg produces two values, make sure to remember that we
21313c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    // legalized both of them.
21413c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    AddLegalizedOperand(Op.getValue(0), Result);
21513c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
21613c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    return Result.getValue(Op.ResNo);
21718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner  case ISD::ImplicitDef:
21818c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
21918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    if (Tmp1 != Node->getOperand(0))
2202ee743ff9be43c350075a2fa15d11a79bff36775Chris Lattner      Result = DAG.getImplicitDef(Tmp1, cast<RegSDNode>(Node)->getReg());
22118c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    break;
222fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  case ISD::UNDEF: {
223fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    MVT::ValueType VT = Op.getValueType();
224fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    switch (TLI.getOperationAction(ISD::UNDEF, VT)) {
225ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    default: assert(0 && "This action is not supported yet!");
226ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    case TargetLowering::Expand:
227ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    case TargetLowering::Promote:
228fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      if (MVT::isInteger(VT))
229fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman        Result = DAG.getConstant(0, VT);
230fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      else if (MVT::isFloatingPoint(VT))
231fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman        Result = DAG.getConstantFP(0, VT);
232fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      else
233fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman        assert(0 && "Unknown value type!");
234fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      break;
235ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    case TargetLowering::Legal:
236fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      break;
237fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    }
238fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    break;
239fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  }
2403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::Constant:
2413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // We know we don't need to expand constants here, constants only have one
2423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // value and we check that it is fine above.
2433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // FIXME: Maybe we should handle things like targets that don't support full
2453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // 32-bit immediates?
2463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
2473e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ConstantFP: {
2483e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Spill FP immediates to the constant pool if the target cannot directly
2493e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // codegen them.  Targets often have some immediate values that can be
2503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // efficiently generated into an FP register without a load.  We explicitly
2513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // leave these constants as ConstantFP nodes for the target to deal with.
2523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(Node);
2543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Check to see if this FP immediate is already legal.
2563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    bool isLegal = false;
2573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    for (TargetLowering::legal_fpimm_iterator I = TLI.legal_fpimm_begin(),
2583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner           E = TLI.legal_fpimm_end(); I != E; ++I)
2593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (CFP->isExactlyValue(*I)) {
2603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        isLegal = true;
2613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
2623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
2633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (!isLegal) {
2653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // Otherwise we need to spill the constant to memory.
2663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool();
2673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      bool Extend = false;
2693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // If a FP immediate is precise when represented as a float, we put it
2713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // into the constant pool as a float, even if it's is statically typed
2723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // as a double.
2733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      MVT::ValueType VT = CFP->getValueType(0);
2743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      bool isDouble = VT == MVT::f64;
2753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ConstantFP *LLVMC = ConstantFP::get(isDouble ? Type::DoubleTy :
2763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                                             Type::FloatTy, CFP->getValue());
27799939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner      if (isDouble && CFP->isExactlyValue((float)CFP->getValue()) &&
27899939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner          // Only do this if the target has a native EXTLOAD instruction from
27999939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner          // f32.
28099939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner          TLI.getOperationAction(ISD::EXTLOAD,
28199939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner                                 MVT::f32) == TargetLowering::Legal) {
2823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        LLVMC = cast<ConstantFP>(ConstantExpr::getCast(LLVMC, Type::FloatTy));
2833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        VT = MVT::f32;
2843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Extend = true;
2853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
2863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(LLVMC),
2883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                                            TLI.getPointerTy());
289f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner      if (Extend) {
290f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(), CPIdx,
291f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner                             MVT::f32);
292f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner      } else {
293f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getLoad(VT, DAG.getEntryNode(), CPIdx);
294f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner      }
2953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
2963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
2973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
298a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner  case ISD::TokenFactor: {
299a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    std::vector<SDOperand> Ops;
300a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    bool Changed = false;
301a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
3021e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      SDOperand Op = Node->getOperand(i);
3031e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      // Fold single-use TokenFactor nodes into this token factor as we go.
3041e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      if (Op.getOpcode() == ISD::TokenFactor && Op.hasOneUse()) {
3051e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        Changed = true;
3061e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        for (unsigned j = 0, e = Op.getNumOperands(); j != e; ++j)
3071e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner          Ops.push_back(LegalizeOp(Op.getOperand(j)));
3081e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      } else {
3091e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        Ops.push_back(LegalizeOp(Op));  // Legalize the operands
3101e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        Changed |= Ops[i] != Op;
3111e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      }
312a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    }
313a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    if (Changed)
314a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner      Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Ops);
315a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    break;
316a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner  }
317a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner
3183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ADJCALLSTACKDOWN:
3193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ADJCALLSTACKUP:
3203e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
3213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // There is no need to legalize the size argument (Operand #1)
3223e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (Tmp1 != Node->getOperand(0))
3233e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = DAG.getNode(Node->getOpcode(), MVT::Other, Tmp1,
3243e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                           Node->getOperand(1));
3253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
326fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner  case ISD::DYNAMIC_STACKALLOC:
327fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
328fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the size.
329fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));  // Legalize the alignment.
330fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
331fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner        Tmp3 != Node->getOperand(2))
332fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner      Result = DAG.getNode(ISD::DYNAMIC_STACKALLOC, Node->getValueType(0),
333fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner                           Tmp1, Tmp2, Tmp3);
334513e52ec4e20048a8f491498d219a2669283f3bdChris Lattner    else
335513e52ec4e20048a8f491498d219a2669283f3bdChris Lattner      Result = Op.getValue(0);
336fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner
337fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    // Since this op produces two values, make sure to remember that we
338fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    // legalized both of them.
339fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    AddLegalizedOperand(SDOperand(Node, 0), Result);
340fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
341fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    return Result.getValue(Op.ResNo);
342fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner
3433d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner  case ISD::CALL: {
3443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
3453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the callee.
3463d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
3473d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    bool Changed = false;
3483d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    std::vector<SDOperand> Ops;
3493d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i) {
3503d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
3513d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Changed |= Ops.back() != Node->getOperand(i);
3523d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    }
3533d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
3543d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || Changed) {
3553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      std::vector<MVT::ValueType> RetTyVTs;
3563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      RetTyVTs.reserve(Node->getNumValues());
3573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
358ebda942efcb86634a6581aae76a0d0c92c4a232eChris Lattner        RetTyVTs.push_back(Node->getValueType(i));
3593d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Result = SDOperand(DAG.getCall(RetTyVTs, Tmp1, Tmp2, Ops), 0);
36038d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    } else {
36138d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner      Result = Result.getValue(0);
3623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
36338d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    // Since calls produce multiple values, make sure to remember that we
36438d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    // legalized all of them.
36538d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
36638d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner      AddLegalizedOperand(SDOperand(Node, i), Result.getValue(i));
36738d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    return Result.getValue(Op.ResNo);
3683d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner  }
369c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner  case ISD::BR:
370c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
371c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner    if (Tmp1 != Node->getOperand(0))
372c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner      Result = DAG.getNode(ISD::BR, MVT::Other, Tmp1, Node->getOperand(1));
373c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner    break;
374c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner
375c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner  case ISD::BRCOND:
376c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
37747e9223e06390897c3834f8c527001df392570ffChris Lattner
37847e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
37947e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
38047e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
38147e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the condition.
38247e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
38347e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
38447e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp2 = PromoteOp(Node->getOperand(1));  // Promote the condition.
38547e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
38647e9223e06390897c3834f8c527001df392570ffChris Lattner    }
387c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    // Basic block destination (Op#2) is always legal.
388c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
389c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner      Result = DAG.getNode(ISD::BRCOND, MVT::Other, Tmp1, Tmp2,
390c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner                           Node->getOperand(2));
391c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    break;
392c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner
3933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::LOAD:
3943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
3953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the pointer.
3963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (Tmp1 != Node->getOperand(0) ||
3973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 != Node->getOperand(1))
3983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = DAG.getLoad(Node->getValueType(0), Tmp1, Tmp2);
3998afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    else
4008afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner      Result = SDOperand(Node, 0);
4018afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner
4028afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    // Since loads produce two values, make sure to remember that we legalized
4038afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    // both of them.
4048afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    AddLegalizedOperand(SDOperand(Node, 0), Result);
4058afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
4068afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    return Result.getValue(Op.ResNo);
4073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
4080f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::EXTLOAD:
4090f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::SEXTLOAD:
4100f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::ZEXTLOAD:
4110f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
4120f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the pointer.
4130f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    if (Tmp1 != Node->getOperand(0) ||
4140f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner        Tmp2 != Node->getOperand(1))
4150f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1, Tmp2,
4160f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner                           cast<MVTSDNode>(Node)->getExtraValueType());
4170f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    else
4180f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      Result = SDOperand(Node, 0);
4190f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
4200f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // Since loads produce two values, make sure to remember that we legalized
4210f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // both of them.
4220f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    AddLegalizedOperand(SDOperand(Node, 0), Result);
4230f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
4240f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    return Result.getValue(Op.ResNo);
4250f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
4263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::EXTRACT_ELEMENT:
4273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Get both the low and high parts.
4283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(0), Tmp1, Tmp2);
4293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (cast<ConstantSDNode>(Node->getOperand(1))->getValue())
4303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = Tmp2;  // 1 -> Hi
4313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    else
4323e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = Tmp1;  // 0 -> Lo
4333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
4343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
4353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::CopyToReg:
4363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
4373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
4383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
4393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal:
4403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // Legalize the incoming value (must be legal).
4413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1));
4423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
44318c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner        Result = DAG.getCopyToReg(Tmp1, Tmp2, cast<RegSDNode>(Node)->getReg());
4443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
445ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    case Promote:
446ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner      Tmp2 = PromoteOp(Node->getOperand(1));
447ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner      Result = DAG.getCopyToReg(Tmp1, Tmp2, cast<RegSDNode>(Node)->getReg());
448ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner      break;
449ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    case Expand:
4503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand Lo, Hi;
4513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ExpandOp(Node->getOperand(1), Lo, Hi);
45218c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner      unsigned Reg = cast<RegSDNode>(Node)->getReg();
453ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Lo = DAG.getCopyToReg(Tmp1, Lo, Reg);
454ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Hi = DAG.getCopyToReg(Tmp1, Hi, Reg+1);
455ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      // Note that the copytoreg nodes are independent of each other.
456ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
4573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      assert(isTypeLegal(Result.getValueType()) &&
4583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner             "Cannot expand multiple times yet (i64 -> i16)");
4593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
4603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
4613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
4623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
4633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::RET:
4643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
4653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (Node->getNumOperands()) {
4663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case 2:  // ret val
4673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      switch (getTypeAction(Node->getOperand(1).getValueType())) {
4683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Legal:
4693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 = LegalizeOp(Node->getOperand(1));
4708afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner        if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
4713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1, Tmp2);
4723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
4733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Expand: {
4743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        SDOperand Lo, Hi;
4753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        ExpandOp(Node->getOperand(1), Lo, Hi);
4763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1, Lo, Hi);
4773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
4783e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
4793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Promote:
4808b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        Tmp2 = PromoteOp(Node->getOperand(1));
4818b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1, Tmp2);
4828b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        break;
4833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
4843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
4853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case 1:  // ret void
4863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0))
4873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1);
4883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
4893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    default: { // ret <values>
4903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      std::vector<SDOperand> NewValues;
4913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      NewValues.push_back(Tmp1);
4923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
4933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        switch (getTypeAction(Node->getOperand(i).getValueType())) {
4943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case Legal:
4954e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner          NewValues.push_back(LegalizeOp(Node->getOperand(i)));
4963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          break;
4973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case Expand: {
4983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          SDOperand Lo, Hi;
4993e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          ExpandOp(Node->getOperand(i), Lo, Hi);
5003e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          NewValues.push_back(Lo);
5013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          NewValues.push_back(Hi);
5023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          break;
5033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        }
5043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case Promote:
5058b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          assert(0 && "Can't promote multiple return value yet!");
5063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        }
5073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = DAG.getNode(ISD::RET, MVT::Other, NewValues);
5083e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
5093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
5103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
5113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
5123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::STORE:
5133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
5143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(2));  // Legalize the pointer.
5153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
5165d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner    // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr'
51703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    if (ConstantFPSDNode *CFP =dyn_cast<ConstantFPSDNode>(Node->getOperand(1))){
5185d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner      if (CFP->getValueType(0) == MVT::f32) {
5195d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        union {
5205d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          unsigned I;
5215d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          float    F;
5225d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        } V;
5235d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        V.F = CFP->getValue();
5245d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1,
5255d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner                             DAG.getConstant(V.I, MVT::i32), Tmp2);
5265d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner      } else {
5275d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        assert(CFP->getValueType(0) == MVT::f64 && "Unknown FP type!");
5285d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        union {
5295d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          uint64_t I;
5305d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          double   F;
5315d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        } V;
5325d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        V.F = CFP->getValue();
5335d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1,
5345d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner                             DAG.getConstant(V.I, MVT::i64), Tmp2);
5355d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner      }
53684734ce8ef1a21eb347d4deca0bf32d59001f751Chris Lattner      Node = Result.Val;
5375d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner    }
5385d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner
5393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
5403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal: {
5413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand Val = LegalizeOp(Node->getOperand(1));
5423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Val != Node->getOperand(1) || Tmp1 != Node->getOperand(0) ||
5433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          Tmp2 != Node->getOperand(2))
5443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Val, Tmp2);
5453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
5463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
5473e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Promote:
54803c8546ec57523970874917854a2fb77b1ff598eChris Lattner      // Truncate the value and store the result.
54903c8546ec57523970874917854a2fb77b1ff598eChris Lattner      Tmp3 = PromoteOp(Node->getOperand(1));
55003c8546ec57523970874917854a2fb77b1ff598eChris Lattner      Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp3, Tmp2,
55103c8546ec57523970874917854a2fb77b1ff598eChris Lattner                           Node->getOperand(1).getValueType());
55203c8546ec57523970874917854a2fb77b1ff598eChris Lattner      break;
55303c8546ec57523970874917854a2fb77b1ff598eChris Lattner
5543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Expand:
5553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand Lo, Hi;
5563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ExpandOp(Node->getOperand(1), Lo, Hi);
5573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
5583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (!TLI.isLittleEndian())
5593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        std::swap(Lo, Hi);
5603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
561ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Lo = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Lo, Tmp2);
5623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
563ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      unsigned IncrementSize = MVT::getSizeInBits(Hi.getValueType())/8;
5643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp2 = DAG.getNode(ISD::ADD, Tmp2.getValueType(), Tmp2,
5653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                         getIntPtrConstant(IncrementSize));
5663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      assert(isTypeLegal(Tmp2.getValueType()) &&
5673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner             "Pointers must be legal!");
568ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Hi = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Hi, Tmp2);
569ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
570ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      break;
5713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
5723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
57395762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth  case ISD::PCMARKER:
57495762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
57595762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth    Result = DAG.getNode(ISD::PCMARKER, MVT::Other, Tmp1, Node->getOperand(1));
57695762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth    break;
5770f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::TRUNCSTORE:
5780f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
5790f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));  // Legalize the pointer.
5800f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
5810f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
5820f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    case Legal:
5830f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1));
5840f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
5850f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner          Tmp3 != Node->getOperand(2))
58645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp2, Tmp3,
5870f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner                             cast<MVTSDNode>(Node)->getExtraValueType());
5880f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      break;
5890f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    case Promote:
5900f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    case Expand:
5910f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      assert(0 && "Cannot handle illegal TRUNCSTORE yet!");
5920f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    }
5930f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    break;
5942ee743ff9be43c350075a2fa15d11a79bff36775Chris Lattner  case ISD::SELECT:
59547e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
59647e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
59747e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
59847e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the condition.
59947e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
60047e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
60147e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0));  // Promote the condition.
60247e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
60347e9223e06390897c3834f8c527001df392570ffChris Lattner    }
6043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));   // TrueVal
6052ee743ff9be43c350075a2fa15d11a79bff36775Chris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));   // FalseVal
60655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner
60755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), Tmp2.getValueType())) {
60855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    default: assert(0 && "This action is not supported yet!");
60955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Legal:
61055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
61155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner          Tmp3 != Node->getOperand(2))
61255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        Result = DAG.getNode(ISD::SELECT, Node->getValueType(0),
61355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner                             Tmp1, Tmp2, Tmp3);
61455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
61555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Promote: {
61655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      MVT::ValueType NVT =
61755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        TLI.getTypeToPromoteTo(ISD::SELECT, Tmp2.getValueType());
61855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      unsigned ExtOp, TruncOp;
61955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      if (MVT::isInteger(Tmp2.getValueType())) {
62055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        ExtOp = ISD::ZERO_EXTEND;
62155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        TruncOp  = ISD::TRUNCATE;
62255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      } else {
62355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        ExtOp = ISD::FP_EXTEND;
62455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        TruncOp  = ISD::FP_ROUND;
62555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      }
62655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      // Promote each of the values to the new type.
62755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Tmp2 = DAG.getNode(ExtOp, NVT, Tmp2);
62855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Tmp3 = DAG.getNode(ExtOp, NVT, Tmp3);
62955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      // Perform the larger operation, then round down.
63055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = DAG.getNode(ISD::SELECT, NVT, Tmp1, Tmp2,Tmp3);
63155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = DAG.getNode(TruncOp, Node->getValueType(0), Result);
63255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
63355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    }
63455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    }
6353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
6363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SETCC:
6373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
6383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal:
6393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));   // LHS
6403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1));   // RHS
6413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
6423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
643f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                              Node->getValueType(0), Tmp1, Tmp2);
6443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
6453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Promote:
6468b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0));   // LHS
6478b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp2 = PromoteOp(Node->getOperand(1));   // RHS
6488b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
6498b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // If this is an FP compare, the operands have already been extended.
6508b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      if (MVT::isInteger(Node->getOperand(0).getValueType())) {
6518b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        MVT::ValueType VT = Node->getOperand(0).getValueType();
65271c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner        MVT::ValueType NVT = TLI.getTypeToTransformTo(VT);
6538b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
6548b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // Otherwise, we have to insert explicit sign or zero extends.  Note
6558b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // that we could insert sign extends for ALL conditions, but zero extend
6568b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // is cheaper on many machines (an AND instead of two shifts), so prefer
6578b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // it.
6588b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        switch (cast<SetCCSDNode>(Node)->getCondition()) {
6598b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        default: assert(0 && "Unknown integer comparison!");
6608b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETEQ:
6618b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETNE:
6628b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETUGE:
6638b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETUGT:
6648b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETULE:
6658b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETULT:
6668b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          // ALL of these operations will work if we either sign or zero extend
6678b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          // the operands (including the unsigned comparisons!).  Zero extend is
6688b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          // usually a simpler/cheaper operation, so prefer it.
6698b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          Tmp1 = DAG.getNode(ISD::ZERO_EXTEND_INREG, NVT, Tmp1, VT);
6708b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          Tmp2 = DAG.getNode(ISD::ZERO_EXTEND_INREG, NVT, Tmp2, VT);
6718b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          break;
6728b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETGE:
6738b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETGT:
6748b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETLT:
6758b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETLE:
6768b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp1, VT);
6778b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          Tmp2 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp2, VT);
6788b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          break;
6798b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        }
6808b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
6818b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      }
6828b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
683f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                            Node->getValueType(0), Tmp1, Tmp2);
6843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
6853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Expand:
6863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand LHSLo, LHSHi, RHSLo, RHSHi;
6873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ExpandOp(Node->getOperand(0), LHSLo, LHSHi);
6883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ExpandOp(Node->getOperand(1), RHSLo, RHSHi);
6893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      switch (cast<SetCCSDNode>(Node)->getCondition()) {
6903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case ISD::SETEQ:
6913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case ISD::SETNE:
6923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp1 = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSLo, RHSLo);
6933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSHi, RHSHi);
6943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp1 = DAG.getNode(ISD::OR, Tmp1.getValueType(), Tmp1, Tmp2);
695f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner        Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
696f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                              Node->getValueType(0), Tmp1,
6973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                              DAG.getConstant(0, Tmp1.getValueType()));
6983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
6993e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      default:
7003e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // FIXME: This generated code sucks.
7013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        ISD::CondCode LowCC;
7023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        switch (cast<SetCCSDNode>(Node)->getCondition()) {
7033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        default: assert(0 && "Unknown integer setcc!");
7043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETLT:
7053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETULT: LowCC = ISD::SETULT; break;
7063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETGT:
7073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETUGT: LowCC = ISD::SETUGT; break;
7083e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETLE:
7093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETULE: LowCC = ISD::SETULE; break;
7103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETGE:
7113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETUGE: LowCC = ISD::SETUGE; break;
7123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        }
7133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
7143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // Tmp1 = lo(op1) < lo(op2)   // Always unsigned comparison
7153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // Tmp2 = hi(op1) < hi(op2)   // Signedness depends on operands
7163e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // dest = hi(op1) == hi(op2) ? Tmp1 : Tmp2;
7173e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
7183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // NOTE: on targets without efficient SELECT of bools, we can always use
7193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3)
720f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner        Tmp1 = DAG.getSetCC(LowCC, Node->getValueType(0), LHSLo, RHSLo);
7213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
722f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                            Node->getValueType(0), LHSHi, RHSHi);
723f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner        Result = DAG.getSetCC(ISD::SETEQ, Node->getValueType(0), LHSHi, RHSHi);
724f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner        Result = DAG.getNode(ISD::SELECT, Tmp1.getValueType(),
725f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                             Result, Tmp1, Tmp2);
7263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
7273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
7283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
7293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
7303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
731e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  case ISD::MEMSET:
732e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  case ISD::MEMCPY:
733e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  case ISD::MEMMOVE: {
734deb692e756cd3826e4ecc6eaec3397177c8b89ceChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));      // Chain
735e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));      // Pointer
736e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner
737e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    if (Node->getOpcode() == ISD::MEMSET) {      // memset = ubyte
738e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      switch (getTypeAction(Node->getOperand(2).getValueType())) {
739e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      case Expand: assert(0 && "Cannot expand a byte!");
740e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      case Legal:
741deb692e756cd3826e4ecc6eaec3397177c8b89ceChris Lattner        Tmp3 = LegalizeOp(Node->getOperand(2));
742e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner        break;
743e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      case Promote:
744deb692e756cd3826e4ecc6eaec3397177c8b89ceChris Lattner        Tmp3 = PromoteOp(Node->getOperand(2));
745e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner        break;
746e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      }
747e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    } else {
748e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      Tmp3 = LegalizeOp(Node->getOperand(2));    // memcpy/move = pointer,
749e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    }
750272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner
751272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    SDOperand Tmp4;
752272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    switch (getTypeAction(Node->getOperand(3).getValueType())) {
753e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    case Expand: assert(0 && "Cannot expand this yet!");
754e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    case Legal:
755e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      Tmp4 = LegalizeOp(Node->getOperand(3));
756e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      break;
757e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    case Promote:
758e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      Tmp4 = PromoteOp(Node->getOperand(3));
759272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner      break;
760272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    }
761272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner
762272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    SDOperand Tmp5;
763272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    switch (getTypeAction(Node->getOperand(4).getValueType())) {  // uint
764272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    case Expand: assert(0 && "Cannot expand this yet!");
765272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    case Legal:
766272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner      Tmp5 = LegalizeOp(Node->getOperand(4));
767272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner      break;
768272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    case Promote:
769e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      Tmp5 = PromoteOp(Node->getOperand(4));
770e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      break;
771e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    }
77255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner
77355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), MVT::Other)) {
77455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    default: assert(0 && "This action not implemented for this operation!");
77555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Legal:
776e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
777e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner          Tmp3 != Node->getOperand(2) || Tmp4 != Node->getOperand(3) ||
778e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner          Tmp5 != Node->getOperand(4)) {
779e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        std::vector<SDOperand> Ops;
780e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Ops.push_back(Tmp1); Ops.push_back(Tmp2); Ops.push_back(Tmp3);
781e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Ops.push_back(Tmp4); Ops.push_back(Tmp5);
782e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Result = DAG.getNode(Node->getOpcode(), MVT::Other, Ops);
783e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      }
78455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
78555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Expand: {
786e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      // Otherwise, the target does not support this operation.  Lower the
787e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      // operation to an explicit libcall as appropriate.
788e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      MVT::ValueType IntPtr = TLI.getPointerTy();
789e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      const Type *IntPtrTy = TLI.getTargetData().getIntPtrType();
790e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      std::vector<std::pair<SDOperand, const Type*> > Args;
791e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner
7923bfbf4ea990930d153e58e153f319408341a94feReid Spencer      const char *FnName = 0;
793e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      if (Node->getOpcode() == ISD::MEMSET) {
794e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp2, IntPtrTy));
795e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        // Extend the ubyte argument to be an int value for the call.
796e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Tmp3 = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Tmp3);
797e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp3, Type::IntTy));
798e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp4, IntPtrTy));
799e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner
800e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        FnName = "memset";
801e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      } else if (Node->getOpcode() == ISD::MEMCPY ||
802e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner                 Node->getOpcode() == ISD::MEMMOVE) {
803e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp2, IntPtrTy));
804e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp3, IntPtrTy));
805e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp4, IntPtrTy));
806e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        FnName = Node->getOpcode() == ISD::MEMMOVE ? "memmove" : "memcpy";
807e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      } else {
808e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        assert(0 && "Unknown op!");
809e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      }
810e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      std::pair<SDOperand,SDOperand> CallResult =
8118e21e71b248365c69c0f666518c378b5819ce6fbNate Begeman        TLI.LowerCallTo(Tmp1, Type::VoidTy, false,
812e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner                        DAG.getExternalSymbol(FnName, IntPtr), Args, DAG);
813e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      Result = LegalizeOp(CallResult.second);
81455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
81555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    }
81655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Custom:
81755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      std::vector<SDOperand> Ops;
81855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Ops.push_back(Tmp1); Ops.push_back(Tmp2); Ops.push_back(Tmp3);
81955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Ops.push_back(Tmp4); Ops.push_back(Tmp5);
82055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = DAG.getNode(Node->getOpcode(), MVT::Other, Ops);
82155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = TLI.LowerOperation(Result);
82255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = LegalizeOp(Result);
82355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
824e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner    }
825e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner    break;
826e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  }
82784f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  case ISD::ADD_PARTS:
82884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  case ISD::SUB_PARTS: {
82984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    std::vector<SDOperand> Ops;
83084f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    bool Changed = false;
83184f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
83284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
83384f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner      Changed |= Ops.back() != Node->getOperand(i);
83484f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    }
83584f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    if (Changed)
83684f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner      Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Ops);
83784f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    break;
83884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  }
8393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ADD:
8403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SUB:
8413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::MUL:
8423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::UDIV:
8433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SDIV:
8443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::UREM:
8453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SREM:
8463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::AND:
8473e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::OR:
8483e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::XOR:
84903c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::SHL:
85003c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::SRL:
85103c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::SRA:
8523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));   // LHS
8533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));   // RHS
8543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (Tmp1 != Node->getOperand(0) ||
8553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 != Node->getOperand(1))
8563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,Tmp2);
8573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
8583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ZERO_EXTEND:
8593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SIGN_EXTEND:
8607cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner  case ISD::TRUNCATE:
86103c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::FP_EXTEND:
86203c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::FP_ROUND:
863ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::FP_TO_SINT:
864ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::FP_TO_UINT:
865ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::SINT_TO_FP:
866ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::UINT_TO_FP:
8673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
8683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal:
8693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));
8703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0))
8713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1);
8723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
873b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner    case Expand:
87477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      if (Node->getOpcode() == ISD::SINT_TO_FP ||
87577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner          Node->getOpcode() == ISD::UINT_TO_FP) {
87677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner        Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP,
87777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                               Node->getValueType(0), Node->getOperand(0));
87877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner        Result = LegalizeOp(Result);
87977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner        break;
88077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      }
881b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      // In the expand case, we must be dealing with a truncate, because
882b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      // otherwise the result would be larger than the source.
883b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      assert(Node->getOpcode() == ISD::TRUNCATE &&
884b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner             "Shouldn't need to expand other operators here!");
885b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      ExpandOp(Node->getOperand(0), Tmp1, Tmp2);
886b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner
887b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      // Since the result is legal, we should just be able to truncate the low
888b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      // part of the source.
889b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      Result = DAG.getNode(ISD::TRUNCATE, Node->getValueType(0), Tmp1);
890b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner      break;
891b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner
89203c8546ec57523970874917854a2fb77b1ff598eChris Lattner    case Promote:
89303c8546ec57523970874917854a2fb77b1ff598eChris Lattner      switch (Node->getOpcode()) {
8941713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner      case ISD::ZERO_EXTEND:
8951713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
89647e9223e06390897c3834f8c527001df392570ffChris Lattner        // NOTE: Any extend would work here...
89747e9223e06390897c3834f8c527001df392570ffChris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND, Op.getValueType(), Result);
89847e9223e06390897c3834f8c527001df392570ffChris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND_INREG, Op.getValueType(),
8991713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner                             Result, Node->getOperand(0).getValueType());
90003c8546ec57523970874917854a2fb77b1ff598eChris Lattner        break;
90103c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::SIGN_EXTEND:
9021713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
90347e9223e06390897c3834f8c527001df392570ffChris Lattner        // NOTE: Any extend would work here...
904d5d56825123665b60d4eada0a4ad7d0adc5cf3a3Chris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND, Op.getValueType(), Result);
9051713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(),
9061713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner                             Result, Node->getOperand(0).getValueType());
9071713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        break;
90803c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::TRUNCATE:
9091713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
9101713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = DAG.getNode(ISD::TRUNCATE, Op.getValueType(), Result);
9111713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        break;
91203c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_EXTEND:
9131713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
9141713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        if (Result.getValueType() != Op.getValueType())
9151713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner          // Dynamically dead while we have only 2 FP types.
9161713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner          Result = DAG.getNode(ISD::FP_EXTEND, Op.getValueType(), Result);
9171713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        break;
91803c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_ROUND:
91903c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_TO_SINT:
92003c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_TO_UINT:
921f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = PromoteOp(Node->getOperand(0));
922f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(Node->getOpcode(), Op.getValueType(), Result);
923f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        break;
92403c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::SINT_TO_FP:
925f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = PromoteOp(Node->getOperand(0));
926f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(),
927f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner                             Result, Node->getOperand(0).getValueType());
928f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::SINT_TO_FP, Op.getValueType(), Result);
929f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        break;
93003c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::UINT_TO_FP:
931f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = PromoteOp(Node->getOperand(0));
932f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND_INREG, Result.getValueType(),
933f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner                             Result, Node->getOperand(0).getValueType());
934f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::UINT_TO_FP, Op.getValueType(), Result);
935f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        break;
93603c8546ec57523970874917854a2fb77b1ff598eChris Lattner      }
9373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
9383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
9390f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::FP_ROUND_INREG:
9400f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::SIGN_EXTEND_INREG:
94145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner  case ISD::ZERO_EXTEND_INREG: {
9420f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
94345b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner    MVT::ValueType ExtraVT = cast<MVTSDNode>(Node)->getExtraValueType();
94445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner
94545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner    // If this operation is not supported, convert it to a shl/shr or load/store
94645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner    // pair.
94755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), ExtraVT)) {
94855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    default: assert(0 && "This action not supported for this op yet!");
94955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Legal:
95055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      if (Tmp1 != Node->getOperand(0))
95155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,
95255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner                             ExtraVT);
95355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
95455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Expand:
95545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      // If this is an integer extend and shifts are supported, do that.
95645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      if (Node->getOpcode() == ISD::ZERO_EXTEND_INREG) {
95745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // NOTE: we could fall back on load/store here too for targets without
95845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // AND.  However, it is doubtful that any exist.
95945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // AND out the appropriate bits.
96045b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        SDOperand Mask =
96145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner          DAG.getConstant((1ULL << MVT::getSizeInBits(ExtraVT))-1,
96245b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                          Node->getValueType(0));
96345b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::AND, Node->getValueType(0),
96445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                             Node->getOperand(0), Mask);
96545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      } else if (Node->getOpcode() == ISD::SIGN_EXTEND_INREG) {
96645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // NOTE: we could fall back on load/store here too for targets without
96745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // SAR.  However, it is doubtful that any exist.
96845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        unsigned BitsDiff = MVT::getSizeInBits(Node->getValueType(0)) -
96945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                            MVT::getSizeInBits(ExtraVT);
97027ff112948d059524e5f4ebe249a1da0b7c710e8Chris Lattner        SDOperand ShiftCst = DAG.getConstant(BitsDiff, TLI.getShiftAmountTy());
97145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::SHL, Node->getValueType(0),
97245b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                             Node->getOperand(0), ShiftCst);
97345b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::SRA, Node->getValueType(0),
97445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                             Result, ShiftCst);
97545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      } else if (Node->getOpcode() == ISD::FP_ROUND_INREG) {
97645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // The only way we can lower this is to turn it into a STORETRUNC,
97745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // EXTLOAD pair, targetting a temporary location (a stack slot).
97845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner
97945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // NOTE: there is a choice here between constantly creating new stack
98045b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // slots and always reusing the same one.  We currently always create
98145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // new ones, as reuse may inhibit scheduling.
98245b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        const Type *Ty = MVT::getTypeForValueType(ExtraVT);
98345b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        unsigned TySize = (unsigned)TLI.getTargetData().getTypeSize(Ty);
98445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        unsigned Align  = TLI.getTargetData().getTypeAlignment(Ty);
98545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        MachineFunction &MF = DAG.getMachineFunction();
98645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        int SSFI =
98745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner          MF.getFrameInfo()->CreateStackObject((unsigned)TySize, Align);
98845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        SDOperand StackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy());
98945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, DAG.getEntryNode(),
99045b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                             Node->getOperand(0), StackSlot, ExtraVT);
99145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::EXTLOAD, Node->getValueType(0),
99245b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                             Result, StackSlot, ExtraVT);
99345b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      } else {
99445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        assert(0 && "Unknown op");
99545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      }
99645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      Result = LegalizeOp(Result);
99755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
99845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner    }
9990f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    break;
10003e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
100145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner  }
10023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
10038afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner  if (!Op.Val->hasOneUse())
10048afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    AddLegalizedOperand(Op, Result);
10053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
10063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  return Result;
10073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
10083e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
10098b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// PromoteOp - Given an operation that produces a value in an invalid type,
10108b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// promote it to compute the value into a larger type.  The produced value will
10118b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// have the correct bits for the low portion of the register, but no guarantee
10128b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// is made about the top bits: it may be zero, sign-extended, or garbage.
101303c8546ec57523970874917854a2fb77b1ff598eChris LattnerSDOperand SelectionDAGLegalize::PromoteOp(SDOperand Op) {
101403c8546ec57523970874917854a2fb77b1ff598eChris Lattner  MVT::ValueType VT = Op.getValueType();
101571c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner  MVT::ValueType NVT = TLI.getTypeToTransformTo(VT);
101603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  assert(getTypeAction(VT) == Promote &&
101703c8546ec57523970874917854a2fb77b1ff598eChris Lattner         "Caller should expand or legalize operands that are not promotable!");
101803c8546ec57523970874917854a2fb77b1ff598eChris Lattner  assert(NVT > VT && MVT::isInteger(NVT) == MVT::isInteger(VT) &&
101903c8546ec57523970874917854a2fb77b1ff598eChris Lattner         "Cannot promote to smaller type!");
102003c8546ec57523970874917854a2fb77b1ff598eChris Lattner
102103c8546ec57523970874917854a2fb77b1ff598eChris Lattner  std::map<SDOperand, SDOperand>::iterator I = PromotedNodes.find(Op);
102203c8546ec57523970874917854a2fb77b1ff598eChris Lattner  if (I != PromotedNodes.end()) return I->second;
102303c8546ec57523970874917854a2fb77b1ff598eChris Lattner
102403c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDOperand Tmp1, Tmp2, Tmp3;
102503c8546ec57523970874917854a2fb77b1ff598eChris Lattner
102603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDOperand Result;
102703c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDNode *Node = Op.Val;
102803c8546ec57523970874917854a2fb77b1ff598eChris Lattner
10290f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  // Promotion needs an optimization step to clean up after it, and is not
10300f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  // careful to avoid operations the target does not support.  Make sure that
10310f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  // all generated operations are legalized in the next iteration.
10320f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  NeedsAnotherIteration = true;
10330f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
103403c8546ec57523970874917854a2fb77b1ff598eChris Lattner  switch (Node->getOpcode()) {
103503c8546ec57523970874917854a2fb77b1ff598eChris Lattner  default:
103603c8546ec57523970874917854a2fb77b1ff598eChris Lattner    std::cerr << "NODE: "; Node->dump(); std::cerr << "\n";
103703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(0 && "Do not know how to promote this operator!");
103803c8546ec57523970874917854a2fb77b1ff598eChris Lattner    abort();
1039fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  case ISD::UNDEF:
1040fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    Result = DAG.getNode(ISD::UNDEF, NVT);
1041fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    break;
104203c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::Constant:
104303c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Result = DAG.getNode(ISD::ZERO_EXTEND, NVT, Op);
104403c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(isa<ConstantSDNode>(Result) && "Didn't constant fold zext?");
104503c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
104603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::ConstantFP:
104703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Result = DAG.getNode(ISD::FP_EXTEND, NVT, Op);
104803c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(isa<ConstantFPSDNode>(Result) && "Didn't constant fold fp_extend?");
104903c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
1050ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner  case ISD::CopyFromReg:
1051ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    Result = DAG.getCopyFromReg(cast<RegSDNode>(Node)->getReg(), NVT,
1052ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner                                Node->getOperand(0));
1053ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    // Remember that we legalized the chain.
1054ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
1055ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    break;
1056ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner
105782fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner  case ISD::SETCC:
105882fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    assert(getTypeAction(TLI.getSetCCResultTy()) == Legal &&
105982fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner           "SetCC type is not legal??");
106082fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
106182fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner                          TLI.getSetCCResultTy(), Node->getOperand(0),
106282fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner                          Node->getOperand(1));
106382fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    Result = LegalizeOp(Result);
106482fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    break;
106503c8546ec57523970874917854a2fb77b1ff598eChris Lattner
106603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::TRUNCATE:
106703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
106803c8546ec57523970874917854a2fb77b1ff598eChris Lattner    case Legal:
106903c8546ec57523970874917854a2fb77b1ff598eChris Lattner      Result = LegalizeOp(Node->getOperand(0));
107003c8546ec57523970874917854a2fb77b1ff598eChris Lattner      assert(Result.getValueType() >= NVT &&
107103c8546ec57523970874917854a2fb77b1ff598eChris Lattner             "This truncation doesn't make sense!");
107203c8546ec57523970874917854a2fb77b1ff598eChris Lattner      if (Result.getValueType() > NVT)    // Truncate to NVT instead of VT
107303c8546ec57523970874917854a2fb77b1ff598eChris Lattner        Result = DAG.getNode(ISD::TRUNCATE, NVT, Result);
107403c8546ec57523970874917854a2fb77b1ff598eChris Lattner      break;
1075e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner    case Promote:
1076e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      // The truncation is not required, because we don't guarantee anything
1077e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      // about high bits anyway.
1078e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      Result = PromoteOp(Node->getOperand(0));
1079e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      break;
108003c8546ec57523970874917854a2fb77b1ff598eChris Lattner    case Expand:
108103c8546ec57523970874917854a2fb77b1ff598eChris Lattner      assert(0 && "Cannot handle expand yet");
108203c8546ec57523970874917854a2fb77b1ff598eChris Lattner    }
108303c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
10848b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SIGN_EXTEND:
10858b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::ZERO_EXTEND:
10868b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
10878b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand: assert(0 && "BUG: Smaller reg should have been promoted!");
10888b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
10898b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // Input is legal?  Just do extend all the way to the larger type.
10908b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = LegalizeOp(Node->getOperand(0));
10918b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = DAG.getNode(Node->getOpcode(), NVT, Result);
10928b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
10938b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:
10948b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // Promote the reg if it's smaller.
10958b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = PromoteOp(Node->getOperand(0));
10968b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // The high bits are not guaranteed to be anything.  Insert an extend.
10978b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      if (Node->getOpcode() == ISD::SIGN_EXTEND)
1098595dc5408ad809b9a9a417db275c43242e54b8dcChris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Result,
1099595dc5408ad809b9a9a417db275c43242e54b8dcChris Lattner                             Node->getOperand(0).getValueType());
11008b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      else
1101595dc5408ad809b9a9a417db275c43242e54b8dcChris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND_INREG, NVT, Result,
1102595dc5408ad809b9a9a417db275c43242e54b8dcChris Lattner                             Node->getOperand(0).getValueType());
11038b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
11048b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
11058b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
11068b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
11078b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_EXTEND:
11088b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    assert(0 && "Case not implemented.  Dynamically dead with 2 FP types!");
11098b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_ROUND:
11108b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
11118b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand: assert(0 && "BUG: Cannot expand FP regs!");
11128b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:  assert(0 && "Unreachable with 2 FP types!");
11138b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
11148b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // Input is legal?  Do an FP_ROUND_INREG.
11158b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = LegalizeOp(Node->getOperand(0));
11168b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result, VT);
11178b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
11188b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
11198b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
11208b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
11218b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SINT_TO_FP:
11228b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::UINT_TO_FP:
11238b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
11248b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
11258b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = LegalizeOp(Node->getOperand(0));
112677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      // No extra round required here.
112777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Result = DAG.getNode(Node->getOpcode(), NVT, Result);
11288b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
11298b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
11308b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:
11318b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = PromoteOp(Node->getOperand(0));
11328b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      if (Node->getOpcode() == ISD::SINT_TO_FP)
11338b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(),
11348b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner                             Result, Node->getOperand(0).getValueType());
11358b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      else
11368b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND_INREG, Result.getValueType(),
11378b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner                             Result, Node->getOperand(0).getValueType());
113877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      // No extra round required here.
113977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Result = DAG.getNode(Node->getOpcode(), NVT, Result);
11408b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
11418b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand:
114277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, NVT,
114377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                             Node->getOperand(0));
114477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Result = LegalizeOp(Result);
114577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
114677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      // Round if we cannot tolerate excess precision.
114777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      if (NoExcessFPPrecision)
114877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner        Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result, VT);
114977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      break;
11508b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
11518b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
11528b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
11538b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_TO_SINT:
11548b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_TO_UINT:
11558b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
11568b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
11578b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));
11588b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
11598b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:
11608b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // The input result is prerounded, so we don't have to do anything
11618b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // special.
11628b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0));
11638b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
11648b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand:
11658b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      assert(0 && "not implemented");
11668b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
11678b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
11688b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
11698b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
117003c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::AND:
117103c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::OR:
117203c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::XOR:
11730f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::ADD:
11748b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SUB:
11750f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::MUL:
11760f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // The input may have strange things in the top bits of the registers, but
11770f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // these operations don't care.  They may have wierd bits going out, but
11780f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // that too is okay if they are integer operations.
11790f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
11800f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));
11810f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    assert(Tmp1.getValueType() == NVT && Tmp2.getValueType() == NVT);
11820f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1, Tmp2);
11830f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
11840f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // However, if this is a floating point operation, they will give excess
11850f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // precision that we may not be able to tolerate.  If we DO allow excess
11860f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // precision, just leave it, otherwise excise it.
11878b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // FIXME: Why would we need to round FP ops more than integer ones?
11888b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    //     Is Round(Add(Add(A,B),C)) != Round(Add(Round(Add(A,B)), C))
11890f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    if (MVT::isFloatingPoint(NVT) && NoExcessFPPrecision)
11900f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result, VT);
11910f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    break;
11920f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
11938b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SDIV:
11948b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SREM:
11958b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // These operators require that their input be sign extended.
11968b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
11978b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));
11988b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    if (MVT::isInteger(NVT)) {
11998b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp1, VT);
1200ff3e50cc39db6939b637165997283f59412387bbChris Lattner      Tmp2 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp2, VT);
12018b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
12028b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1, Tmp2);
12038b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
12048b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // Perform FP_ROUND: this is probably overly pessimistic.
12058b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    if (MVT::isFloatingPoint(NVT) && NoExcessFPPrecision)
12068b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result, VT);
12078b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
12088b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
12098b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::UDIV:
12108b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::UREM:
12118b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // These operators require that their input be zero extended.
12128b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
12138b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));
12148b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    assert(MVT::isInteger(NVT) && "Operators don't apply to FP!");
12158b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = DAG.getNode(ISD::ZERO_EXTEND_INREG, NVT, Tmp1, VT);
1216ff3e50cc39db6939b637165997283f59412387bbChris Lattner    Tmp2 = DAG.getNode(ISD::ZERO_EXTEND_INREG, NVT, Tmp2, VT);
12178b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1, Tmp2);
12188b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
12198b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
12208b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SHL:
12218b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
12228b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
12238b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(ISD::SHL, NVT, Tmp1, Tmp2);
12248b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
12258b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SRA:
12268b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // The input value must be properly sign extended.
12278b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
12288b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp1, VT);
12298b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
12308b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(ISD::SRA, NVT, Tmp1, Tmp2);
12318b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
12328b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SRL:
12338b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // The input value must be properly zero extended.
12348b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
12358b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = DAG.getNode(ISD::ZERO_EXTEND_INREG, NVT, Tmp1, VT);
12368b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
12378b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(ISD::SRL, NVT, Tmp1, Tmp2);
12388b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
123903c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::LOAD:
124003c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));   // Legalize the chain.
124103c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));   // Legalize the pointer.
124203c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Result = DAG.getNode(ISD::EXTLOAD, NVT, Tmp1, Tmp2, VT);
124303c8546ec57523970874917854a2fb77b1ff598eChris Lattner
124403c8546ec57523970874917854a2fb77b1ff598eChris Lattner    // Remember that we legalized the chain.
124503c8546ec57523970874917854a2fb77b1ff598eChris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
124603c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
124703c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::SELECT:
124847e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
124947e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
125047e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
125147e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));// Legalize the condition.
125247e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
125347e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
125447e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0)); // Promote the condition.
125547e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
125647e9223e06390897c3834f8c527001df392570ffChris Lattner    }
125703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));   // Legalize the op0
125803c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp3 = PromoteOp(Node->getOperand(2));   // Legalize the op1
125903c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Result = DAG.getNode(ISD::SELECT, NVT, Tmp1, Tmp2, Tmp3);
126003c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
12618ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner  case ISD::CALL: {
12628ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
12638ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the callee.
12648ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner
12653d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    std::vector<SDOperand> Ops;
12663d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i)
12673d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
12683d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
12698ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    assert(Node->getNumValues() == 2 && Op.ResNo == 0 &&
12708ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner           "Can only promote single result calls");
12718ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    std::vector<MVT::ValueType> RetTyVTs;
12728ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    RetTyVTs.reserve(2);
12738ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    RetTyVTs.push_back(NVT);
12748ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    RetTyVTs.push_back(MVT::Other);
12753d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    SDNode *NC = DAG.getCall(RetTyVTs, Tmp1, Tmp2, Ops);
12768ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    Result = SDOperand(NC, 0);
12778ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner
12788ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    // Insert the new chain mapping.
12798ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
12808ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    break;
12818ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner  }
128203c8546ec57523970874917854a2fb77b1ff598eChris Lattner  }
128303c8546ec57523970874917854a2fb77b1ff598eChris Lattner
128403c8546ec57523970874917854a2fb77b1ff598eChris Lattner  assert(Result.Val && "Didn't set a result!");
128503c8546ec57523970874917854a2fb77b1ff598eChris Lattner  AddPromotedOperand(Op, Result);
128603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  return Result;
128703c8546ec57523970874917854a2fb77b1ff598eChris Lattner}
12883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
128984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner/// ExpandAddSub - Find a clever way to expand this add operation into
129084f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner/// subcomponents.
129184f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattnervoid SelectionDAGLegalize::ExpandAddSub(bool isAdd, SDOperand LHS,SDOperand RHS,
129284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner                                        SDOperand &Lo, SDOperand &Hi) {
129384f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  // Expand the subcomponents.
129484f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  SDOperand LHSL, LHSH, RHSL, RHSH;
129584f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  ExpandOp(LHS, LHSL, LHSH);
129684f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  ExpandOp(RHS, RHSL, RHSH);
129784f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner
129884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  // Convert this add to the appropriate ADDC pair.  The low part has no carry
129984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  // in.
130084f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  unsigned Opc = isAdd ? ISD::ADD_PARTS : ISD::SUB_PARTS;
130184f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  std::vector<SDOperand> Ops;
130284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(LHSL);
130384f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(LHSH);
130484f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(RHSL);
130584f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(RHSH);
130684f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Lo = DAG.getNode(Opc, LHSL.getValueType(), Ops);
130784f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Hi = Lo.getValue(1);
130884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner}
130984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner
1310e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// ExpandShift - Try to find a clever way to expand this shift operation out to
1311e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// smaller elements.  If we can't find a way that is more efficient than a
1312e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// libcall on this target, return false.  Otherwise, return true with the
1313e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// low-parts expanded into Lo and Hi.
1314e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattnerbool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDOperand Op,SDOperand Amt,
1315e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                                       SDOperand &Lo, SDOperand &Hi) {
1316e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  assert((Opc == ISD::SHL || Opc == ISD::SRA || Opc == ISD::SRL) &&
1317e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner         "This is not a shift!");
1318e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  MVT::ValueType NVT = TLI.getTypeToTransformTo(Op.getValueType());
1319e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1320e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  // If we have an efficient select operation (or if the selects will all fold
1321e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  // away), lower to some complex code, otherwise just emit the libcall.
1322e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  if (TLI.getOperationAction(ISD::SELECT, NVT) != TargetLowering::Legal &&
1323e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      !isa<ConstantSDNode>(Amt))
1324e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    return false;
1325e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1326e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  SDOperand InL, InH;
1327e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  ExpandOp(Op, InL, InH);
1328e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  SDOperand ShAmt = LegalizeOp(Amt);
1329e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  MVT::ValueType ShTy = ShAmt.getValueType();
1330e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1331e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  unsigned NVTBits = MVT::getSizeInBits(NVT);
1332e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  SDOperand NAmt = DAG.getNode(ISD::SUB, ShTy,           // NAmt = 32-ShAmt
1333e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getConstant(NVTBits, ShTy), ShAmt);
1334e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1335e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner  // Compare the unmasked shift amount against 32.
1336e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner  SDOperand Cond = DAG.getSetCC(ISD::SETGE, TLI.getSetCCResultTy(), ShAmt,
1337e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner                                DAG.getConstant(NVTBits, ShTy));
1338e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner
1339e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  if (TLI.getShiftAmountFlavor() != TargetLowering::Mask) {
1340e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    ShAmt = DAG.getNode(ISD::AND, ShTy, ShAmt,             // ShAmt &= 31
1341e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                        DAG.getConstant(NVTBits-1, ShTy));
1342e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    NAmt  = DAG.getNode(ISD::AND, ShTy, NAmt,              // NAmt &= 31
1343e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                        DAG.getConstant(NVTBits-1, ShTy));
1344e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  }
1345e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1346e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  if (Opc == ISD::SHL) {
1347e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    SDOperand T1 = DAG.getNode(ISD::OR, NVT,// T1 = (Hi << Amt) | (Lo >> NAmt)
1348e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getNode(ISD::SHL, NVT, InH, ShAmt),
1349e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getNode(ISD::SRL, NVT, InL, NAmt));
1350e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner    SDOperand T2 = DAG.getNode(ISD::SHL, NVT, InL, ShAmt); // T2 = Lo << Amt&31
1351e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1352e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    Hi = DAG.getNode(ISD::SELECT, NVT, Cond, T2, T1);
1353e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, Cond, DAG.getConstant(0, NVT), T2);
1354e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  } else {
135577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    SDOperand HiLoPart = DAG.getNode(ISD::SELECT, NVT,
135677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                     DAG.getSetCC(ISD::SETEQ,
135777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                                  TLI.getSetCCResultTy(), NAmt,
135877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                                  DAG.getConstant(32, ShTy)),
135977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                     DAG.getConstant(0, NVT),
136077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                     DAG.getNode(ISD::SHL, NVT, InH, NAmt));
1361e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    SDOperand T1 = DAG.getNode(ISD::OR, NVT,// T1 = (Hi << NAmt) | (Lo >> Amt)
136277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                               HiLoPart,
1363e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getNode(ISD::SRL, NVT, InL, ShAmt));
1364e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner    SDOperand T2 = DAG.getNode(Opc, NVT, InH, ShAmt);  // T2 = InH >> ShAmt&31
1365e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1366e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    SDOperand HiPart;
136777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (Opc == ISD::SRA)
136877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      HiPart = DAG.getNode(ISD::SRA, NVT, InH,
136977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                           DAG.getConstant(NVTBits-1, ShTy));
1370e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    else
1371e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      HiPart = DAG.getConstant(0, NVT);
1372e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, Cond, T2, T1);
1373e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner    Hi = DAG.getNode(ISD::SELECT, NVT, Cond, HiPart, T2);
1374e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  }
1375e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  return true;
1376e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner}
137777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
13789c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// FindLatestAdjCallStackDown - Scan up the dag to find the latest (highest
13799c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// NodeDepth) node that is an AdjCallStackDown operation and occurs later than
13809c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// Found.
13819c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattnerstatic void FindLatestAdjCallStackDown(SDNode *Node, SDNode *&Found) {
13829c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Node->getNodeDepth() <= Found->getNodeDepth()) return;
13839c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
13849c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // If we found an ADJCALLSTACKDOWN, we already know this node occurs later
13859c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // than the Found node. Just remember this node and return.
13869c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Node->getOpcode() == ISD::ADJCALLSTACKDOWN) {
13879c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    Found = Node;
13889c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    return;
13899c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  }
13909c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
13919c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Otherwise, scan the operands of Node to see if any of them is a call.
13929c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  assert(Node->getNumOperands() != 0 &&
13939c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner         "All leaves should have depth equal to the entry node!");
13949c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  for (unsigned i = 0, e = Node->getNumOperands()-1; i != e; ++i)
13959c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    FindLatestAdjCallStackDown(Node->getOperand(i).Val, Found);
13969c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
13979c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Tail recurse for the last iteration.
13989c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  FindLatestAdjCallStackDown(Node->getOperand(Node->getNumOperands()-1).Val,
13999c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner                             Found);
14009c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
14019c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14029c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14039c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// FindEarliestAdjCallStackUp - Scan down the dag to find the earliest (lowest
14049c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// NodeDepth) node that is an AdjCallStackUp operation and occurs more recent
14059c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// than Found.
14069c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattnerstatic void FindEarliestAdjCallStackUp(SDNode *Node, SDNode *&Found) {
14079c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Found && Node->getNodeDepth() >= Found->getNodeDepth()) return;
14089c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14099c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // If we found an ADJCALLSTACKUP, we already know this node occurs earlier
14109c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // than the Found node. Just remember this node and return.
14119c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Node->getOpcode() == ISD::ADJCALLSTACKUP) {
14129c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    Found = Node;
14139c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    return;
14149c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  }
14159c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14169c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Otherwise, scan the operands of Node to see if any of them is a call.
14179c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode::use_iterator UI = Node->use_begin(), E = Node->use_end();
14189c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (UI == E) return;
14199c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  for (--E; UI != E; ++UI)
14209c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    FindEarliestAdjCallStackUp(*UI, Found);
14219c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14229c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Tail recurse for the last iteration.
14239c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  FindEarliestAdjCallStackUp(*UI, Found);
14249c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
14259c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14269c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// FindAdjCallStackUp - Given a chained node that is part of a call sequence,
14279c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// find the ADJCALLSTACKUP node that terminates the call sequence.
14289c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattnerstatic SDNode *FindAdjCallStackUp(SDNode *Node) {
14299c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Node->getOpcode() == ISD::ADJCALLSTACKUP)
14309c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    return Node;
14319c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  assert(!Node->use_empty() && "Could not find ADJCALLSTACKUP!");
14329c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14339c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Node->hasOneUse())  // Simple case, only has one user to check.
14349c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    return FindAdjCallStackUp(*Node->use_begin());
14359c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14369c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDOperand TheChain(Node, Node->getNumValues()-1);
14379c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  assert(TheChain.getValueType() == MVT::Other && "Is not a token chain!");
14389c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14399c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  for (SDNode::use_iterator UI = Node->use_begin(),
14409c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner         E = Node->use_end(); ; ++UI) {
14419c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    assert(UI != E && "Didn't find a user of the tokchain, no ADJCALLSTACKUP!");
14429c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14439c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    // Make sure to only follow users of our token chain.
14449c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    SDNode *User = *UI;
14459c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i)
14469c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner      if (User->getOperand(i) == TheChain)
14479c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner        return FindAdjCallStackUp(User);
14489c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  }
14499c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  assert(0 && "Unreachable");
14509c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  abort();
14519c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
14529c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14539c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// FindInputOutputChains - If we are replacing an operation with a call we need
14549c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// to find the call that occurs before and the call that occurs after it to
14559c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// properly serialize the calls in the block.
14569c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattnerstatic SDOperand FindInputOutputChains(SDNode *OpNode, SDNode *&OutChain,
14579c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner                                       SDOperand Entry) {
14589c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode *LatestAdjCallStackDown = Entry.Val;
14599c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  FindLatestAdjCallStackDown(OpNode, LatestAdjCallStackDown);
14609c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  //std::cerr << "Found node: "; LatestAdjCallStackDown->dump(); std::cerr <<"\n";
14619c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14629c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode *LatestAdjCallStackUp = FindAdjCallStackUp(LatestAdjCallStackDown);
14639c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14649c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14659c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode *EarliestAdjCallStackUp = 0;
14669c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  FindEarliestAdjCallStackUp(OpNode, EarliestAdjCallStackUp);
14679c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14689c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (EarliestAdjCallStackUp) {
14699c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    //std::cerr << "Found node: ";
14709c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    //EarliestAdjCallStackUp->dump(); std::cerr <<"\n";
14719c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  }
14729c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14739c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  return SDOperand(LatestAdjCallStackUp, 0);
14749c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
14759c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14769c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
14779c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
147877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// ExpandLibCall - Expand a node into a call to a libcall.  If the result value
147977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// does not fit into a register, return the lo part and set the hi part to the
148077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// by-reg argument.  If it does fit into a single register, return the result
148177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// and leave the Hi part unset.
148277e77a6aa0ab25a812947aed477220dd11220a18Chris LattnerSDOperand SelectionDAGLegalize::ExpandLibCall(const char *Name, SDNode *Node,
148377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                              SDOperand &Hi) {
14849c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode *OutChain;
14859c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDOperand InChain = FindInputOutputChains(Node, OutChain,
14869c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner                                            DAG.getEntryNode());
14879c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // TODO.  Link in chains.
14889c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
148977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  TargetLowering::ArgListTy Args;
149077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
149177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    MVT::ValueType ArgVT = Node->getOperand(i).getValueType();
149277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    const Type *ArgTy = MVT::getTypeForValueType(ArgVT);
149377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Args.push_back(std::make_pair(Node->getOperand(i), ArgTy));
149477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  }
149577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand Callee = DAG.getExternalSymbol(Name, TLI.getPointerTy());
149677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
149777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // We don't care about token chains for libcalls.  We just use the entry
149877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // node as our input and ignore the output chain.  This allows us to place
149977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // calls wherever we need them to satisfy data dependences.
150077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  const Type *RetTy = MVT::getTypeForValueType(Node->getValueType(0));
15018e21e71b248365c69c0f666518c378b5819ce6fbNate Begeman  SDOperand Result = TLI.LowerCallTo(InChain, RetTy, false, Callee,
150277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                     Args, DAG).first;
150377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  switch (getTypeAction(Result.getValueType())) {
150477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  default: assert(0 && "Unknown thing");
150577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case Legal:
150677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    return Result;
150777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case Promote:
150877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    assert(0 && "Cannot promote this yet!");
150977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case Expand:
151077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    SDOperand Lo;
151177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    ExpandOp(Result, Lo, Hi);
151277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    return Lo;
151377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  }
151477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner}
151577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
15169c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
151777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner/// ExpandIntToFP - Expand a [US]INT_TO_FP operation, assuming that the
151877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner/// destination type is legal.
151977e77a6aa0ab25a812947aed477220dd11220a18Chris LattnerSDOperand SelectionDAGLegalize::
152077e77a6aa0ab25a812947aed477220dd11220a18Chris LattnerExpandIntToFP(bool isSigned, MVT::ValueType DestTy, SDOperand Source) {
152177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  assert(getTypeAction(DestTy) == Legal && "Destination type is not legal!");
152277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  assert(getTypeAction(Source.getValueType()) == Expand &&
152377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner         "This is not an expansion!");
152477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  assert(Source.getValueType() == MVT::i64 && "Only handle expand from i64!");
152577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
15269c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode *OutChain;
15279c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDOperand InChain = FindInputOutputChains(Source.Val, OutChain,
15289c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner                                            DAG.getEntryNode());
15299c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
1530fed5577066aa13948745415316ebad1c2e72507eChris Lattner  const char *FnName = 0;
153177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  if (isSigned) {
153277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (DestTy == MVT::f32)
153377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      FnName = "__floatdisf";
153477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    else {
153577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      assert(DestTy == MVT::f64 && "Unknown fp value type!");
153677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      FnName = "__floatdidf";
153777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    }
153877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  } else {
153977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    // If this is unsigned, and not supported, first perform the conversion to
154077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    // signed, then adjust the result if the sign bit is set.
154177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    SDOperand SignedConv = ExpandIntToFP(false, DestTy, Source);
154277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
154377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    assert(0 && "Unsigned casts not supported yet!");
154477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  }
154577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand Callee = DAG.getExternalSymbol(FnName, TLI.getPointerTy());
154677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
154777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  TargetLowering::ArgListTy Args;
154877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  const Type *ArgTy = MVT::getTypeForValueType(Source.getValueType());
154977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  Args.push_back(std::make_pair(Source, ArgTy));
155077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
155177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // We don't care about token chains for libcalls.  We just use the entry
155277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // node as our input and ignore the output chain.  This allows us to place
155377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // calls wherever we need them to satisfy data dependences.
155477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  const Type *RetTy = MVT::getTypeForValueType(DestTy);
15558e21e71b248365c69c0f666518c378b5819ce6fbNate Begeman  return TLI.LowerCallTo(InChain, RetTy, false, Callee, Args, DAG).first;
15569c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
155777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner}
155877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
1559e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1560e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
15613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// ExpandOp - Expand the specified SDOperand into its two component pieces
15623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// Lo&Hi.  Note that the Op MUST be an expanded type.  As a result of this, the
15633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// LegalizeNodes map is filled in for any results that are not expanded, the
15643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// ExpandedNodes map is filled in for any results that are expanded, and the
15653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// Lo/Hi values are returned.
15663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnervoid SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
15673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  MVT::ValueType VT = Op.getValueType();
156871c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner  MVT::ValueType NVT = TLI.getTypeToTransformTo(VT);
15693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDNode *Node = Op.Val;
15703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(getTypeAction(VT) == Expand && "Not an expanded type!");
15713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(MVT::isInteger(VT) && "Cannot expand FP values!");
15723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(MVT::isInteger(NVT) && NVT < VT &&
15733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner         "Cannot expand to FP value or to larger int value!");
15743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
15753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // If there is more than one use of this, see if we already expanded it.
15763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // There is no use remembering values that only have a single use, as the map
15773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // entries will never be reused.
15783e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  if (!Node->hasOneUse()) {
15793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::map<SDOperand, std::pair<SDOperand, SDOperand> >::iterator I
15803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      = ExpandedNodes.find(Op);
15813e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (I != ExpandedNodes.end()) {
15823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Lo = I->second.first;
15833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Hi = I->second.second;
15843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      return;
15853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
15863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
15873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
15884e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  // Expanding to multiple registers needs to perform an optimization step, and
15894e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  // is not careful to avoid operations the target does not support.  Make sure
15904e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  // that all generated operations are legalized in the next iteration.
15914e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  NeedsAnotherIteration = true;
15923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
15933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  switch (Node->getOpcode()) {
15943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  default:
15953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::cerr << "NODE: "; Node->dump(); std::cerr << "\n";
15963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(0 && "Do not know how to expand this operator!");
15973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    abort();
1598fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  case ISD::UNDEF:
1599fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    Lo = DAG.getNode(ISD::UNDEF, NVT);
1600fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    Hi = DAG.getNode(ISD::UNDEF, NVT);
1601fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    break;
16023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::Constant: {
16033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    uint64_t Cst = cast<ConstantSDNode>(Node)->getValue();
16043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getConstant(Cst, NVT);
16053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getConstant(Cst >> MVT::getSizeInBits(NVT), NVT);
16063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
16073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
16083e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
16093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::CopyFromReg: {
161018c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    unsigned Reg = cast<RegSDNode>(Node)->getReg();
16113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Aggregate register values are always in consequtive pairs.
161269a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    Lo = DAG.getCopyFromReg(Reg, NVT, Node->getOperand(0));
161369a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    Hi = DAG.getCopyFromReg(Reg+1, NVT, Lo.getValue(1));
161469a52155d2eff066b49dbac385113002fd9dba14Chris Lattner
161569a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    // Remember that we legalized the chain.
161669a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    AddLegalizedOperand(Op.getValue(1), Hi.getValue(1));
161769a52155d2eff066b49dbac385113002fd9dba14Chris Lattner
16183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(isTypeLegal(NVT) && "Cannot expand this multiple times yet!");
16193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
16203e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
16213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1622d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner  case ISD::BUILD_PAIR:
1623d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    // Legalize both operands.  FIXME: in the future we should handle the case
1624d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    // where the two elements are not legal.
1625d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    assert(isTypeLegal(NVT) && "Cannot expand this multiple times yet!");
1626d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    Lo = LegalizeOp(Node->getOperand(0));
1627d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    Hi = LegalizeOp(Node->getOperand(1));
1628d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    break;
1629d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner
16303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::LOAD: {
16313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Ch = LegalizeOp(Node->getOperand(0));   // Legalize the chain.
16323e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Ptr = LegalizeOp(Node->getOperand(1));  // Legalize the pointer.
16333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getLoad(NVT, Ch, Ptr);
16343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
16353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Increment the pointer to the other half.
163638d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    unsigned IncrementSize = MVT::getSizeInBits(Lo.getValueType())/8;
16373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
16383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                      getIntPtrConstant(IncrementSize));
1639ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    Hi = DAG.getLoad(NVT, Ch, Ptr);
1640ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner
1641ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    // Build a factor node to remember that this load is independent of the
1642ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    // other one.
1643ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    SDOperand TF = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1),
1644ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner                               Hi.getValue(1));
16453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
16463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Remember that we legalized the chain.
1647ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    AddLegalizedOperand(Op.getValue(1), TF);
16483e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (!TLI.isLittleEndian())
16493e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      std::swap(Lo, Hi);
16503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
16513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
16523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::CALL: {
16533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Chain  = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
16543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Callee = LegalizeOp(Node->getOperand(1));  // Legalize the callee.
16553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
16563d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    bool Changed = false;
16573d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    std::vector<SDOperand> Ops;
16583d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i) {
16593d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
16603d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Changed |= Ops.back() != Node->getOperand(i);
16613d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    }
16623d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
16633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(Node->getNumValues() == 2 && Op.ResNo == 0 &&
16643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner           "Can only expand a call once so far, not i64 -> i16!");
16653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
16663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::vector<MVT::ValueType> RetTyVTs;
16673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.reserve(3);
16683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.push_back(NVT);
16693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.push_back(NVT);
16703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.push_back(MVT::Other);
16713d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    SDNode *NC = DAG.getCall(RetTyVTs, Chain, Callee, Ops);
16723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = SDOperand(NC, 0);
16733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = SDOperand(NC, 1);
16743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
16753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Insert the new chain mapping.
1676e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner    AddLegalizedOperand(Op.getValue(1), Hi.getValue(2));
16773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
16783e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
16793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::AND:
16803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::OR:
16813e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::XOR: {   // Simple logical operators -> two trivial pieces.
16823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand LL, LH, RL, RH;
16833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(0), LL, LH);
16843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(1), RL, RH);
16853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getNode(Node->getOpcode(), NVT, LL, RL);
16863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getNode(Node->getOpcode(), NVT, LH, RH);
16873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
16883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
16893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SELECT: {
16903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand C, LL, LH, RL, RH;
169147e9223e06390897c3834f8c527001df392570ffChris Lattner
169247e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
169347e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
169447e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
169547e9223e06390897c3834f8c527001df392570ffChris Lattner      C = LegalizeOp(Node->getOperand(0)); // Legalize the condition.
169647e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
169747e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
169847e9223e06390897c3834f8c527001df392570ffChris Lattner      C = PromoteOp(Node->getOperand(0));  // Promote the condition.
169947e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
170047e9223e06390897c3834f8c527001df392570ffChris Lattner    }
17013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(1), LL, LH);
17023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(2), RL, RH);
17033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, C, LL, RL);
17043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getNode(ISD::SELECT, NVT, C, LH, RH);
17053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
17063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
17073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SIGN_EXTEND: {
17083e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The low part is just a sign extension of the input (which degenerates to
17093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // a copy).
17103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getNode(ISD::SIGN_EXTEND, NVT, LegalizeOp(Node->getOperand(0)));
17113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
17123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The high part is obtained by SRA'ing all but one of the bits of the lo
17133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // part.
17142dad454af674cb41a14a85ad6ce5c85c43959acdChris Lattner    unsigned LoSize = MVT::getSizeInBits(Lo.getValueType());
171527ff112948d059524e5f4ebe249a1da0b7c710e8Chris Lattner    Hi = DAG.getNode(ISD::SRA, NVT, Lo, DAG.getConstant(LoSize-1,
171627ff112948d059524e5f4ebe249a1da0b7c710e8Chris Lattner                                                       TLI.getShiftAmountTy()));
17173e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
17183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
17193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ZERO_EXTEND:
17203e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The low part is just a zero extension of the input (which degenerates to
17213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // a copy).
17223e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getNode(ISD::ZERO_EXTEND, NVT, LegalizeOp(Node->getOperand(0)));
17233e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
17243e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The high part is just a zero.
17253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getConstant(0, NVT);
17263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
17274e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner
17284e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    // These operators cannot be expanded directly, emit them as calls to
17294e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    // library functions.
17304e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  case ISD::FP_TO_SINT:
17314e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    if (Node->getOperand(0).getValueType() == MVT::f32)
173277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixsfdi", Node, Hi);
17334e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    else
173477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixdfdi", Node, Hi);
17354e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    break;
17364e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  case ISD::FP_TO_UINT:
17374e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    if (Node->getOperand(0).getValueType() == MVT::f32)
173877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixunssfdi", Node, Hi);
17394e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    else
174077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixunsdfdi", Node, Hi);
17414e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    break;
17424e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner
1743e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  case ISD::SHL:
1744e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // If we can emit an efficient shift operation, do so now.
174577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (ExpandShift(ISD::SHL, Node->getOperand(0), Node->getOperand(1), Lo, Hi))
1746e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      break;
1747e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // Otherwise, emit a libcall.
174877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Lo = ExpandLibCall("__ashldi3", Node, Hi);
1749e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    break;
1750e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
1751e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  case ISD::SRA:
1752e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // If we can emit an efficient shift operation, do so now.
175377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (ExpandShift(ISD::SRA, Node->getOperand(0), Node->getOperand(1), Lo, Hi))
1754e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      break;
1755e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // Otherwise, emit a libcall.
175677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Lo = ExpandLibCall("__ashrdi3", Node, Hi);
1757e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    break;
1758e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  case ISD::SRL:
1759e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // If we can emit an efficient shift operation, do so now.
176077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (ExpandShift(ISD::SRL, Node->getOperand(0), Node->getOperand(1), Lo, Hi))
1761e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      break;
1762e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // Otherwise, emit a libcall.
176377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Lo = ExpandLibCall("__lshrdi3", Node, Hi);
1764e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    break;
1765e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
176684f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  case ISD::ADD:
176784f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    ExpandAddSub(true, Node->getOperand(0), Node->getOperand(1), Lo, Hi);
176884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    break;
176984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  case ISD::SUB:
177084f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    ExpandAddSub(false, Node->getOperand(0), Node->getOperand(1), Lo, Hi);
177184f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    break;
177277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::MUL:  Lo = ExpandLibCall("__muldi3" , Node, Hi); break;
177377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::SDIV: Lo = ExpandLibCall("__divdi3" , Node, Hi); break;
177477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::UDIV: Lo = ExpandLibCall("__udivdi3", Node, Hi); break;
177577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::SREM: Lo = ExpandLibCall("__moddi3" , Node, Hi); break;
177677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::UREM: Lo = ExpandLibCall("__umoddi3", Node, Hi); break;
17773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
17783e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
17793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // Remember in a map if the values will be reused later.
17803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  if (!Node->hasOneUse()) {
17813e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    bool isNew = ExpandedNodes.insert(std::make_pair(Op,
17823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                                            std::make_pair(Lo, Hi))).second;
17833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(isNew && "Value already expanded?!?");
17843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
17853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
17863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
17873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
17883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner// SelectionDAG::Legalize - This is the entry point for the file.
17893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//
17909c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattnervoid SelectionDAG::Legalize() {
17913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// run - This is the main entry point to this class.
17923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  ///
17939c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SelectionDAGLegalize(*this).Run();
17943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
17953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1796