LegalizeDAG.cpp revision cad063f1a8ecda4fd556a733dc5eaa8a96acb80d
13e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//===-- LegalizeDAG.cpp - Implement SelectionDAG::Legalize ----------------===//
2edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
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.
7edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman//
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"
21adf6a965a321372c640845407195594835921eb4Chris Lattner#include "llvm/CallingConv.h"
223e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include "llvm/Constants.h"
233e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner#include <iostream>
243e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerusing namespace llvm;
253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//===----------------------------------------------------------------------===//
273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// SelectionDAGLegalize - This takes an arbitrary SelectionDAG as input and
283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// hacks on it until the target machine can handle it.  This involves
293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// eliminating value sizes the machine cannot handle (promoting small sizes to
303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// large sizes or splitting up large values into small values) as well as
313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// eliminating operations the machine cannot handle.
323e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner///
333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// This code also does a small amount of optimization and recognition of idioms
343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// as part of its processing.  For example, if a target does not support a
353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// 'setcc' instruction efficiently, but does support 'brcc' instruction, this
363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// will attempt merge setcc and brc instructions into brcc's.
373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner///
383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnernamespace {
393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerclass SelectionDAGLegalize {
403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  TargetLowering &TLI;
413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SelectionDAG &DAG;
423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// LegalizeAction - This enum indicates what action we should take for each
443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// value type the can occur in the program.
453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  enum LegalizeAction {
463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Legal,            // The target natively supports this value type.
473e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Promote,          // This should be promoted to the next larger type.
483e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Expand,           // This integer type should be broken into smaller pieces.
493e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  };
503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// ValueTypeActions - This is a bitvector that contains two bits for each
523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// value type, where the two bits correspond to the LegalizeAction enum.
533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// This can be queried with "getTypeAction(VT)".
543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  unsigned ValueTypeActions;
553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// NeedsAnotherIteration - This is set when we expand a large integer
573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// operation into smaller integer operations, but the smaller operations are
583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// not set.  This occurs only rarely in practice, for targets that don't have
593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// 32-bit or larger integer registers.
603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  bool NeedsAnotherIteration;
613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// LegalizedNodes - For nodes that are of legal width, and that have more
633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// than one use, this map indicates what regularized operand to use.  This
643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// allows us to avoid legalizing the same thing more than once.
653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  std::map<SDOperand, SDOperand> LegalizedNodes;
663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
6703c8546ec57523970874917854a2fb77b1ff598eChris Lattner  /// PromotedNodes - For nodes that are below legal width, and that have more
6803c8546ec57523970874917854a2fb77b1ff598eChris Lattner  /// than one use, this map indicates what promoted value to use.  This allows
6903c8546ec57523970874917854a2fb77b1ff598eChris Lattner  /// us to avoid promoting the same thing more than once.
7003c8546ec57523970874917854a2fb77b1ff598eChris Lattner  std::map<SDOperand, SDOperand> PromotedNodes;
7103c8546ec57523970874917854a2fb77b1ff598eChris Lattner
723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// ExpandedNodes - For nodes that need to be expanded, and which have more
733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// than one use, this map indicates which which operands are the expanded
743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// version of the input.  This allows us to avoid expanding the same node
753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// more than once.
763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  std::map<SDOperand, std::pair<SDOperand, SDOperand> > ExpandedNodes;
773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
788afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner  void AddLegalizedOperand(SDOperand From, SDOperand To) {
798afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    bool isNew = LegalizedNodes.insert(std::make_pair(From, To)).second;
808afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    assert(isNew && "Got into the map somehow?");
818afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner  }
8203c8546ec57523970874917854a2fb77b1ff598eChris Lattner  void AddPromotedOperand(SDOperand From, SDOperand To) {
8303c8546ec57523970874917854a2fb77b1ff598eChris Lattner    bool isNew = PromotedNodes.insert(std::make_pair(From, To)).second;
8403c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(isNew && "Got into the map somehow?");
8503c8546ec57523970874917854a2fb77b1ff598eChris Lattner  }
868afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner
873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerpublic:
883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
899c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SelectionDAGLegalize(SelectionDAG &DAG);
903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// Run - While there is still lowering to do, perform a pass over the DAG.
923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// Most regularization can be done in a single pass, but targets that require
933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// large values to be split into registers multiple times (e.g. i64 -> 4x
943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// i16) require iteration for these values (the first iteration will demote
953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// to i32, the second will demote to i16).
963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  void Run() {
973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    do {
983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      NeedsAnotherIteration = false;
993e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      LegalizeDAG();
1003e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    } while (NeedsAnotherIteration);
1013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// getTypeAction - Return how we should legalize values of this type, either
1043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// it is already legal or we need to expand it into multiple registers of
1053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// smaller integer type, or we need to promote it to a larger type.
1063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  LegalizeAction getTypeAction(MVT::ValueType VT) const {
1073e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    return (LegalizeAction)((ValueTypeActions >> (2*VT)) & 3);
1083e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// isTypeLegal - Return true if this type is legal on this target.
1113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  ///
1123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  bool isTypeLegal(MVT::ValueType VT) const {
1133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    return getTypeAction(VT) == Legal;
1143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1163e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnerprivate:
1173e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  void LegalizeDAG();
1183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand LegalizeOp(SDOperand O);
1203e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  void ExpandOp(SDOperand O, SDOperand &Lo, SDOperand &Hi);
12103c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDOperand PromoteOp(SDOperand O);
1223e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
12377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand ExpandLibCall(const char *Name, SDNode *Node,
12477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                          SDOperand &Hi);
12577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand ExpandIntToFP(bool isSigned, MVT::ValueType DestTy,
12677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                          SDOperand Source);
127cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
128cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand ExpandLegalUINT_TO_FP(SDOperand LegalOp, MVT::ValueType DestVT);
129cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand PromoteLegalUINT_TO_FP(SDOperand LegalOp, MVT::ValueType DestVT);
130cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
131e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  bool ExpandShift(unsigned Opc, SDOperand Op, SDOperand Amt,
132e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                   SDOperand &Lo, SDOperand &Hi);
1335b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  void ExpandShiftParts(unsigned NodeOp, SDOperand Op, SDOperand Amt,
1345b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner                        SDOperand &Lo, SDOperand &Hi);
1355b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  void ExpandByParts(unsigned NodeOp, SDOperand LHS, SDOperand RHS,
1364759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner                     SDOperand &Lo, SDOperand &Hi);
137e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
138b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattner  void SpliceCallInto(const SDOperand &CallResult, SDNode *OutChain);
139b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattner
1403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand getIntPtrConstant(uint64_t Val) {
1413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    return DAG.getConstant(Val, TLI.getPointerTy());
1423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
1433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner};
1443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
1453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
1479c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris LattnerSelectionDAGLegalize::SelectionDAGLegalize(SelectionDAG &dag)
1489c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  : TLI(dag.getTargetLoweringInfo()), DAG(dag),
1499c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    ValueTypeActions(TLI.getValueTypeActions()) {
1503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(MVT::LAST_VALUETYPE <= 16 &&
1513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner         "Too many value types for ValueTypeActions to hold!");
1523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
1533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
154cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// ExpandLegalUINT_TO_FP - This function is responsible for legalizing a
155cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// UINT_TO_FP operation of the specified operand when the target requests that
156cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// we expand it.  At this point, we know that the result and operand types are
157cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// legal for the target.
158cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris LattnerSDOperand SelectionDAGLegalize::ExpandLegalUINT_TO_FP(SDOperand Op0,
159cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                                      MVT::ValueType DestVT) {
160cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  assert(Op0.getValueType() == MVT::i32 &&
161cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner         "This code only works for i32 input: extend in the future");
162cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand Tmp1 = DAG.getNode(ISD::SINT_TO_FP, DestVT, Op0);
163cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
164cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand SignSet = DAG.getSetCC(ISD::SETLT, TLI.getSetCCResultTy(),
165cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                   Op0,
166cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                   DAG.getConstant(0,
167cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                                   Op0.getValueType()));
168cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand Zero = getIntPtrConstant(0), Four = getIntPtrConstant(4);
169cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand CstOffset = DAG.getNode(ISD::SELECT, Zero.getValueType(),
170cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                    SignSet, Four, Zero);
171cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
172cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  uint64_t FF = 0x5f800000ULL;
173cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  if (TLI.isLittleEndian()) FF <<= 32;
174cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  static Constant *FudgeFactor = ConstantUInt::get(Type::ULongTy, FF);
175cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
176cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool();
177cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(FudgeFactor),
178cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                        TLI.getPointerTy());
179cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset);
180cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  SDOperand FudgeInReg;
181cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  if (DestVT == MVT::f32)
182cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx,
183cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                             DAG.getSrcValue(NULL));
184cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  else {
185cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    assert(DestVT == MVT::f64 && "Unexpected conversion");
186cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    FudgeInReg = LegalizeOp(DAG.getExtLoad(ISD::EXTLOAD, MVT::f64,
187cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                           DAG.getEntryNode(), CPIdx,
188cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                           DAG.getSrcValue(NULL), MVT::f32));
189cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  }
190cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
191cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  NeedsAnotherIteration = true;
192cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  return DAG.getNode(ISD::ADD, DestVT, Tmp1, FudgeInReg);
193cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner}
194cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
195cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// PromoteLegalUINT_TO_FP - This function is responsible for legalizing a
196cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// UINT_TO_FP operation of the specified operand when the target requests that
197cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// we promote it.  At this point, we know that the result and operand types are
198cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// legal for the target, and that there is a legal UINT_TO_FP or SINT_TO_FP
199cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner/// operation that takes a larger input.
200cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris LattnerSDOperand SelectionDAGLegalize::PromoteLegalUINT_TO_FP(SDOperand LegalOp,
201cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                                       MVT::ValueType DestVT) {
202cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  // First step, figure out the appropriate *INT_TO_FP operation to use.
203cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  MVT::ValueType NewInTy = LegalOp.getValueType();
204cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
205cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  unsigned OpToUse = 0;
206cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
207cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  // Scan for the appropriate larger type to use.
208cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  while (1) {
209cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    NewInTy = (MVT::ValueType)(NewInTy+1);
210cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    assert(MVT::isInteger(NewInTy) && "Ran out of possibilities!");
211cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
212cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    // If the target supports SINT_TO_FP of this type, use it.
213cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    switch (TLI.getOperationAction(ISD::SINT_TO_FP, NewInTy)) {
214cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner      default: break;
215cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner      case TargetLowering::Legal:
216cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        if (!TLI.hasNativeSupportFor(NewInTy))
217cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          break;  // Can't use this datatype.
218cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        // FALL THROUGH.
219cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner      case TargetLowering::Custom:
220cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        OpToUse = ISD::SINT_TO_FP;
221cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        break;
222cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    }
223cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    if (OpToUse) break;
224cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
225cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    // If the target supports UINT_TO_FP of this type, use it.
226cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    switch (TLI.getOperationAction(ISD::UINT_TO_FP, NewInTy)) {
227cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner      default: break;
228cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner      case TargetLowering::Legal:
229cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        if (!TLI.hasNativeSupportFor(NewInTy))
230cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          break;  // Can't use this datatype.
231cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        // FALL THROUGH.
232cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner      case TargetLowering::Custom:
233cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        OpToUse = ISD::UINT_TO_FP;
234cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        break;
235cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    }
236cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    if (OpToUse) break;
237cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
238cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner    // Otherwise, try a larger type.
239cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  }
240cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
241cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  // Make sure to legalize any nodes we create here in the next pass.
242cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  NeedsAnotherIteration = true;
243cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
244cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  // Okay, we found the operation and type to use.  Zero extend our input to the
245cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  // desired type then run the operation on it.
246cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner  return DAG.getNode(OpToUse, DestVT,
247cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                     DAG.getNode(ISD::ZERO_EXTEND, NewInTy, LegalOp));
248cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner}
249cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner
2503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnervoid SelectionDAGLegalize::LegalizeDAG() {
2513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand OldRoot = DAG.getRoot();
2523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand NewRoot = LegalizeOp(OldRoot);
2533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  DAG.setRoot(NewRoot);
2543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  ExpandedNodes.clear();
2563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  LegalizedNodes.clear();
25771c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner  PromotedNodes.clear();
2583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // Remove dead nodes now.
26062fd269c146d9023efe32644e44cd97b88631d4fChris Lattner  DAG.RemoveDeadNodes(OldRoot.Val);
2613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
2623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris LattnerSDOperand SelectionDAGLegalize::LegalizeOp(SDOperand Op) {
264e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner  assert(getTypeAction(Op.getValueType()) == Legal &&
265e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner         "Caller should expand or promote operands that are not legal!");
26645982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  SDNode *Node = Op.Val;
267e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner
2683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // If this operation defines any values that cannot be represented in a
269e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner  // register on this target, make sure to expand or promote them.
27045982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  if (Node->getNumValues() > 1) {
27145982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
27245982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner      switch (getTypeAction(Node->getValueType(i))) {
2733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Legal: break;  // Nothing to do.
2743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Expand: {
2753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        SDOperand T1, T2;
2763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        ExpandOp(Op.getValue(i), T1, T2);
2773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        assert(LegalizedNodes.count(Op) &&
2783e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner               "Expansion didn't add legal operands!");
2793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        return LegalizedNodes[Op];
2803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
2813e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Promote:
28203c8546ec57523970874917854a2fb77b1ff598eChris Lattner        PromoteOp(Op.getValue(i));
28303c8546ec57523970874917854a2fb77b1ff598eChris Lattner        assert(LegalizedNodes.count(Op) &&
28403c8546ec57523970874917854a2fb77b1ff598eChris Lattner               "Expansion didn't add legal operands!");
28503c8546ec57523970874917854a2fb77b1ff598eChris Lattner        return LegalizedNodes[Op];
2863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
2873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
2883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
28945982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  // Note that LegalizeOp may be reentered even from single-use nodes, which
29045982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  // means that we always must cache transformed nodes.
291e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  std::map<SDOperand, SDOperand>::iterator I = LegalizedNodes.find(Op);
292e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  if (I != LegalizedNodes.end()) return I->second;
2933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
294fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner  SDOperand Tmp1, Tmp2, Tmp3;
2953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDOperand Result = Op;
2973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  switch (Node->getOpcode()) {
2993e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  default:
300d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner    if (Node->getOpcode() >= ISD::BUILTIN_OP_END) {
301d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      // If this is a target node, legalize it by legalizing the operands then
302d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      // passing it through.
303d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      std::vector<SDOperand> Ops;
304d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      bool Changed = false;
305d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
306d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner        Ops.push_back(LegalizeOp(Node->getOperand(i)));
307d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner        Changed = Changed || Node->getOperand(i) != Ops.back();
308d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      }
309d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      if (Changed)
310d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner        if (Node->getNumValues() == 1)
311d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner          Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Ops);
312d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner        else {
313d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner          std::vector<MVT::ValueType> VTs(Node->value_begin(),
314d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner                                          Node->value_end());
315d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner          Result = DAG.getNode(Node->getOpcode(), VTs, Ops);
316d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner        }
317d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner
318d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
319d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner        AddLegalizedOperand(Op.getValue(i), Result.getValue(i));
320d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner      return Result.getValue(Op.ResNo);
321d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner    }
322d73cc5d0585e86bf6d350ab9fd9caf85bdfc8b52Chris Lattner    // Otherwise this is an unhandled builtin node.  splat.
3233e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::cerr << "NODE: "; Node->dump(); std::cerr << "\n";
3243e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(0 && "Do not know how to legalize this operator!");
3253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    abort();
3263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::EntryToken:
3273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::FrameIndex:
3283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::GlobalAddress:
32903c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::ExternalSymbol:
33069a52155d2eff066b49dbac385113002fd9dba14Chris Lattner  case ISD::ConstantPool:           // Nothing to do.
3313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(getTypeAction(Node->getValueType(0)) == Legal &&
3323e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner           "This must be legal!");
3333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
33469a52155d2eff066b49dbac385113002fd9dba14Chris Lattner  case ISD::CopyFromReg:
33569a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
33669a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    if (Tmp1 != Node->getOperand(0))
33769a52155d2eff066b49dbac385113002fd9dba14Chris Lattner      Result = DAG.getCopyFromReg(cast<RegSDNode>(Node)->getReg(),
33869a52155d2eff066b49dbac385113002fd9dba14Chris Lattner                                  Node->getValueType(0), Tmp1);
33913c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    else
34013c184de29c09294ed63b01ac43e1b46c049278eChris Lattner      Result = Op.getValue(0);
34113c184de29c09294ed63b01ac43e1b46c049278eChris Lattner
34213c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    // Since CopyFromReg produces two values, make sure to remember that we
34313c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    // legalized both of them.
34413c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    AddLegalizedOperand(Op.getValue(0), Result);
34513c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
34613c184de29c09294ed63b01ac43e1b46c049278eChris Lattner    return Result.getValue(Op.ResNo);
34718c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner  case ISD::ImplicitDef:
34818c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
34918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    if (Tmp1 != Node->getOperand(0))
3502ee743ff9be43c350075a2fa15d11a79bff36775Chris Lattner      Result = DAG.getImplicitDef(Tmp1, cast<RegSDNode>(Node)->getReg());
35118c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    break;
352fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  case ISD::UNDEF: {
353fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    MVT::ValueType VT = Op.getValueType();
354fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    switch (TLI.getOperationAction(ISD::UNDEF, VT)) {
355ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    default: assert(0 && "This action is not supported yet!");
356ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    case TargetLowering::Expand:
357ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    case TargetLowering::Promote:
358fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      if (MVT::isInteger(VT))
359fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman        Result = DAG.getConstant(0, VT);
360fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      else if (MVT::isFloatingPoint(VT))
361fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman        Result = DAG.getConstantFP(0, VT);
362fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      else
363fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman        assert(0 && "Unknown value type!");
364fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      break;
365ea19cd51aaf87c5cc19e7cdc2c32ddbefcac7b8fNate Begeman    case TargetLowering::Legal:
366fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman      break;
367fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    }
368fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    break;
369fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  }
3703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::Constant:
3713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // We know we don't need to expand constants here, constants only have one
3723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // value and we check that it is fine above.
3733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
3743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // FIXME: Maybe we should handle things like targets that don't support full
3753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // 32-bit immediates?
3763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
3773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ConstantFP: {
3783e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Spill FP immediates to the constant pool if the target cannot directly
3793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // codegen them.  Targets often have some immediate values that can be
3803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // efficiently generated into an FP register without a load.  We explicitly
3813e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // leave these constants as ConstantFP nodes for the target to deal with.
3823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
3833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ConstantFPSDNode *CFP = cast<ConstantFPSDNode>(Node);
3843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
3853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Check to see if this FP immediate is already legal.
3863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    bool isLegal = false;
3873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    for (TargetLowering::legal_fpimm_iterator I = TLI.legal_fpimm_begin(),
3883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner           E = TLI.legal_fpimm_end(); I != E; ++I)
3893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (CFP->isExactlyValue(*I)) {
3903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        isLegal = true;
3913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
3923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
3933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
3943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (!isLegal) {
3953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // Otherwise we need to spill the constant to memory.
3963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool();
3973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
3983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      bool Extend = false;
3993e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
4003e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // If a FP immediate is precise when represented as a float, we put it
4013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // into the constant pool as a float, even if it's is statically typed
4023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // as a double.
4033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      MVT::ValueType VT = CFP->getValueType(0);
4043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      bool isDouble = VT == MVT::f64;
4053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ConstantFP *LLVMC = ConstantFP::get(isDouble ? Type::DoubleTy :
4063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                                             Type::FloatTy, CFP->getValue());
40799939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner      if (isDouble && CFP->isExactlyValue((float)CFP->getValue()) &&
40899939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner          // Only do this if the target has a native EXTLOAD instruction from
40999939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner          // f32.
41099939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner          TLI.getOperationAction(ISD::EXTLOAD,
41199939d39c9555ebecbcd24c1b607eae52804ea37Chris Lattner                                 MVT::f32) == TargetLowering::Legal) {
4123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        LLVMC = cast<ConstantFP>(ConstantExpr::getCast(LLVMC, Type::FloatTy));
4133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        VT = MVT::f32;
4143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Extend = true;
4153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
416edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
4173e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(LLVMC),
4183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                                            TLI.getPointerTy());
419f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner      if (Extend) {
4205f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner        Result = DAG.getExtLoad(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(),
4215f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                                CPIdx, DAG.getSrcValue(NULL), MVT::f32);
422f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner      } else {
42352d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner        Result = DAG.getLoad(VT, DAG.getEntryNode(), CPIdx,
42452d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                             DAG.getSrcValue(NULL));
425f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner      }
4263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
4273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
4283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
429a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner  case ISD::TokenFactor: {
430a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    std::vector<SDOperand> Ops;
431a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    bool Changed = false;
432a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
4331e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      SDOperand Op = Node->getOperand(i);
4341e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      // Fold single-use TokenFactor nodes into this token factor as we go.
435e131e5b81e5853f3c2a8c63651898ecd37eaf6f8Chris Lattner      // FIXME: This is something that the DAGCombiner should do!!
4361e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      if (Op.getOpcode() == ISD::TokenFactor && Op.hasOneUse()) {
4371e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        Changed = true;
4381e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        for (unsigned j = 0, e = Op.getNumOperands(); j != e; ++j)
4391e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner          Ops.push_back(LegalizeOp(Op.getOperand(j)));
4401e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      } else {
4411e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        Ops.push_back(LegalizeOp(Op));  // Legalize the operands
4421e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner        Changed |= Ops[i] != Op;
4431e81b9e5112c40c23ecca9a64b6ab2ce97c8c6d4Chris Lattner      }
444a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    }
445a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    if (Changed)
446a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner      Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Ops);
447a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner    break;
448a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner  }
449a385e9b20fa7d37d3842ce15afd412f617d83a27Chris Lattner
45016cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  case ISD::CALLSEQ_START:
45116cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  case ISD::CALLSEQ_END:
4523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
453128b52d3d75f4b74367de43e891cd98b5a9b5483Chris Lattner    // Do not try to legalize the target-specific arguments (#1+)
45445982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    Tmp2 = Node->getOperand(0);
45545982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    if (Tmp1 != Tmp2) {
45688de6e77bfadea8962b017f372658204ab71448cChris Lattner      Node->setAdjCallChain(Tmp1);
45745982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner
45845982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner      // If moving the operand from pointing to Tmp2 dropped its use count to 1,
45945982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner      // this will cause the maps used to memoize results to get confused.
46045982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner      // Create and add a dummy use, just to increase its use count.  This will
46145982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner      // be removed at the end of legalize when dead nodes are removed.
46245982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner      if (Tmp2.Val->hasOneUse())
46345982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner        DAG.getNode(ISD::PCMARKER, MVT::Other, Tmp2,
46445982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner                    DAG.getConstant(0, MVT::i32));
46545982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    }
46616cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner    // Note that we do not create new CALLSEQ_DOWN/UP nodes here.  These
46788de6e77bfadea8962b017f372658204ab71448cChris Lattner    // nodes are treated specially and are mutated in place.  This makes the dag
46888de6e77bfadea8962b017f372658204ab71448cChris Lattner    // legalization process more efficient and also makes libcall insertion
46988de6e77bfadea8962b017f372658204ab71448cChris Lattner    // easier.
4703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
471fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner  case ISD::DYNAMIC_STACKALLOC:
472fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
473fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the size.
474fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));  // Legalize the alignment.
475fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
476adf6c2a0cb638e8b211200b57b927d16f6e1cfc4Chris Lattner        Tmp3 != Node->getOperand(2)) {
477adf6c2a0cb638e8b211200b57b927d16f6e1cfc4Chris Lattner      std::vector<MVT::ValueType> VTs(Node->value_begin(), Node->value_end());
478adf6c2a0cb638e8b211200b57b927d16f6e1cfc4Chris Lattner      std::vector<SDOperand> Ops;
479adf6c2a0cb638e8b211200b57b927d16f6e1cfc4Chris Lattner      Ops.push_back(Tmp1); Ops.push_back(Tmp2); Ops.push_back(Tmp3);
480adf6c2a0cb638e8b211200b57b927d16f6e1cfc4Chris Lattner      Result = DAG.getNode(ISD::DYNAMIC_STACKALLOC, VTs, Ops);
481adf6c2a0cb638e8b211200b57b927d16f6e1cfc4Chris Lattner    } else
482513e52ec4e20048a8f491498d219a2669283f3bdChris Lattner      Result = Op.getValue(0);
483fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner
484fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    // Since this op produces two values, make sure to remember that we
485fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    // legalized both of them.
486fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    AddLegalizedOperand(SDOperand(Node, 0), Result);
487fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
488fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner    return Result.getValue(Op.ResNo);
489fa404e8a76abfdafefb8806b35f596d288609496Chris Lattner
490d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner  case ISD::TAILCALL:
4913d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner  case ISD::CALL: {
4923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
4933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the callee.
4943d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
4953d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    bool Changed = false;
4963d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    std::vector<SDOperand> Ops;
4973d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i) {
4983d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
4993d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Changed |= Ops.back() != Node->getOperand(i);
5003d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    }
5013d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
5023d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) || Changed) {
5033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      std::vector<MVT::ValueType> RetTyVTs;
5043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      RetTyVTs.reserve(Node->getNumValues());
5053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
506ebda942efcb86634a6581aae76a0d0c92c4a232eChris Lattner        RetTyVTs.push_back(Node->getValueType(i));
507d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner      Result = SDOperand(DAG.getCall(RetTyVTs, Tmp1, Tmp2, Ops,
508d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner                                     Node->getOpcode() == ISD::TAILCALL), 0);
50938d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    } else {
51038d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner      Result = Result.getValue(0);
5113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
51238d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    // Since calls produce multiple values, make sure to remember that we
51338d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    // legalized all of them.
51438d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
51538d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner      AddLegalizedOperand(SDOperand(Node, i), Result.getValue(i));
51638d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    return Result.getValue(Op.ResNo);
5173d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner  }
518c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner  case ISD::BR:
519c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
520c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner    if (Tmp1 != Node->getOperand(0))
521c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner      Result = DAG.getNode(ISD::BR, MVT::Other, Tmp1, Node->getOperand(1));
522c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner    break;
523c7af17923e3bb6053f529679ef0be5399d3519edChris Lattner
524c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner  case ISD::BRCOND:
525c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
52647e9223e06390897c3834f8c527001df392570ffChris Lattner
52747e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
52847e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
52947e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
53047e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the condition.
53147e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
53247e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
53347e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp2 = PromoteOp(Node->getOperand(1));  // Promote the condition.
53447e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
53547e9223e06390897c3834f8c527001df392570ffChris Lattner    }
536c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    // Basic block destination (Op#2) is always legal.
537c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
538c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner      Result = DAG.getNode(ISD::BRCOND, MVT::Other, Tmp1, Tmp2,
539c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner                           Node->getOperand(2));
540c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner    break;
541411e888c1b4155190c8cffe388631ee20693b309Chris Lattner  case ISD::BRCONDTWOWAY:
542411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
543411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
544411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
545411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    case Legal:
546411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the condition.
547411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      break;
548411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    case Promote:
549411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      Tmp2 = PromoteOp(Node->getOperand(1));  // Promote the condition.
550411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      break;
551411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    }
552411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    // If this target does not support BRCONDTWOWAY, lower it to a BRCOND/BR
553411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    // pair.
554411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    switch (TLI.getOperationAction(ISD::BRCONDTWOWAY, MVT::Other)) {
555411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    case TargetLowering::Promote:
556411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    default: assert(0 && "This action is not supported yet!");
557411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    case TargetLowering::Legal:
558411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) {
559411e888c1b4155190c8cffe388631ee20693b309Chris Lattner        std::vector<SDOperand> Ops;
560411e888c1b4155190c8cffe388631ee20693b309Chris Lattner        Ops.push_back(Tmp1);
561411e888c1b4155190c8cffe388631ee20693b309Chris Lattner        Ops.push_back(Tmp2);
562411e888c1b4155190c8cffe388631ee20693b309Chris Lattner        Ops.push_back(Node->getOperand(2));
563411e888c1b4155190c8cffe388631ee20693b309Chris Lattner        Ops.push_back(Node->getOperand(3));
564411e888c1b4155190c8cffe388631ee20693b309Chris Lattner        Result = DAG.getNode(ISD::BRCONDTWOWAY, MVT::Other, Ops);
565411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      }
566411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      break;
567411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    case TargetLowering::Expand:
568411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      Result = DAG.getNode(ISD::BRCOND, MVT::Other, Tmp1, Tmp2,
569411e888c1b4155190c8cffe388631ee20693b309Chris Lattner                           Node->getOperand(2));
570411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      Result = DAG.getNode(ISD::BR, MVT::Other, Result, Node->getOperand(3));
571411e888c1b4155190c8cffe388631ee20693b309Chris Lattner      break;
572411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    }
573411e888c1b4155190c8cffe388631ee20693b309Chris Lattner    break;
574c18ae4cb6a263cf31283c0ef51ace24350f8d72bChris Lattner
5753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::LOAD:
5763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
5773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the pointer.
5782d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth
5793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (Tmp1 != Node->getOperand(0) ||
5803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 != Node->getOperand(1))
58152d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner      Result = DAG.getLoad(Node->getValueType(0), Tmp1, Tmp2,
58252d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                           Node->getOperand(2));
5838afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    else
5848afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner      Result = SDOperand(Node, 0);
585edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
5868afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    // Since loads produce two values, make sure to remember that we legalized
5878afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    // both of them.
5888afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    AddLegalizedOperand(SDOperand(Node, 0), Result);
5898afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
5908afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner    return Result.getValue(Op.ResNo);
5913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
5920f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::EXTLOAD:
5930f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::SEXTLOAD:
59401ff7216dd7829d4094754086baf28aa2d7149acChris Lattner  case ISD::ZEXTLOAD: {
5950f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
5960f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the pointer.
5970f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
5985f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner    MVT::ValueType SrcVT = cast<VTSDNode>(Node->getOperand(3))->getVT();
59901ff7216dd7829d4094754086baf28aa2d7149acChris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), SrcVT)) {
60001ff7216dd7829d4094754086baf28aa2d7149acChris Lattner    default: assert(0 && "This action is not supported yet!");
6011c51c6ac13b5e68b099605021784c7f552dcce3cChris Lattner    case TargetLowering::Promote:
6021c51c6ac13b5e68b099605021784c7f552dcce3cChris Lattner      assert(SrcVT == MVT::i1 && "Can only promote EXTLOAD from i1 -> i8!");
6035f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner      Result = DAG.getExtLoad(Node->getOpcode(), Node->getValueType(0),
6045f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                              Tmp1, Tmp2, Node->getOperand(2), MVT::i8);
6051c51c6ac13b5e68b099605021784c7f552dcce3cChris Lattner      // Since loads produce two values, make sure to remember that we legalized
6061c51c6ac13b5e68b099605021784c7f552dcce3cChris Lattner      // both of them.
6071c51c6ac13b5e68b099605021784c7f552dcce3cChris Lattner      AddLegalizedOperand(SDOperand(Node, 0), Result);
6081c51c6ac13b5e68b099605021784c7f552dcce3cChris Lattner      AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
6091c51c6ac13b5e68b099605021784c7f552dcce3cChris Lattner      return Result.getValue(Op.ResNo);
610edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
61101ff7216dd7829d4094754086baf28aa2d7149acChris Lattner    case TargetLowering::Legal:
61201ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      if (Tmp1 != Node->getOperand(0) ||
61301ff7216dd7829d4094754086baf28aa2d7149acChris Lattner          Tmp2 != Node->getOperand(1))
6145f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner        Result = DAG.getExtLoad(Node->getOpcode(), Node->getValueType(0),
6155f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                                Tmp1, Tmp2, Node->getOperand(2), SrcVT);
61601ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      else
61701ff7216dd7829d4094754086baf28aa2d7149acChris Lattner        Result = SDOperand(Node, 0);
61801ff7216dd7829d4094754086baf28aa2d7149acChris Lattner
61901ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      // Since loads produce two values, make sure to remember that we legalized
62001ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      // both of them.
62101ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      AddLegalizedOperand(SDOperand(Node, 0), Result);
62201ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
62301ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      return Result.getValue(Op.ResNo);
62401ff7216dd7829d4094754086baf28aa2d7149acChris Lattner    case TargetLowering::Expand:
6259d416f713e8b9e4f0c0c2b3f6f57ce2dd8993209Andrew Lenharth      //f64 = EXTLOAD f32 should expand to LOAD, FP_EXTEND
6269d416f713e8b9e4f0c0c2b3f6f57ce2dd8993209Andrew Lenharth      if (SrcVT == MVT::f32 && Node->getValueType(0) == MVT::f64) {
6279d416f713e8b9e4f0c0c2b3f6f57ce2dd8993209Andrew Lenharth        SDOperand Load = DAG.getLoad(SrcVT, Tmp1, Tmp2, Node->getOperand(2));
62831559081a4285f4b7282e765aea4ec8a8e1d396cAndrew Lenharth        Result = DAG.getNode(ISD::FP_EXTEND, Node->getValueType(0), Load);
6299d416f713e8b9e4f0c0c2b3f6f57ce2dd8993209Andrew Lenharth        if (Op.ResNo)
6309d416f713e8b9e4f0c0c2b3f6f57ce2dd8993209Andrew Lenharth          return Load.getValue(1);
6319d416f713e8b9e4f0c0c2b3f6f57ce2dd8993209Andrew Lenharth        return Result;
6329d416f713e8b9e4f0c0c2b3f6f57ce2dd8993209Andrew Lenharth      }
63301ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      assert(Node->getOpcode() != ISD::EXTLOAD &&
63401ff7216dd7829d4094754086baf28aa2d7149acChris Lattner             "EXTLOAD should always be supported!");
63501ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      // Turn the unsupported load into an EXTLOAD followed by an explicit
63601ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      // zero/sign extend inreg.
6375f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner      Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0),
6385f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                              Tmp1, Tmp2, Node->getOperand(2), SrcVT);
63923993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner      SDOperand ValRes;
64023993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner      if (Node->getOpcode() == ISD::SEXTLOAD)
64123993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner        ValRes = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(),
64215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                             Result, DAG.getValueType(SrcVT));
64323993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner      else
64423993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner        ValRes = DAG.getZeroExtendInReg(Result, SrcVT);
64501ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      AddLegalizedOperand(SDOperand(Node, 0), ValRes);
64601ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
64701ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      if (Op.ResNo)
64801ff7216dd7829d4094754086baf28aa2d7149acChris Lattner        return Result.getValue(1);
64901ff7216dd7829d4094754086baf28aa2d7149acChris Lattner      return ValRes;
65001ff7216dd7829d4094754086baf28aa2d7149acChris Lattner    }
65101ff7216dd7829d4094754086baf28aa2d7149acChris Lattner    assert(0 && "Unreachable");
65201ff7216dd7829d4094754086baf28aa2d7149acChris Lattner  }
6533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::EXTRACT_ELEMENT:
6543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Get both the low and high parts.
6553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(0), Tmp1, Tmp2);
6563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (cast<ConstantSDNode>(Node->getOperand(1))->getValue())
6573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = Tmp2;  // 1 -> Hi
6583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    else
6593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = Tmp1;  // 0 -> Lo
6603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
6613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
6623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::CopyToReg:
6633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
664edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
6653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
6663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal:
6673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      // Legalize the incoming value (must be legal).
6683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1));
6693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
67018c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner        Result = DAG.getCopyToReg(Tmp1, Tmp2, cast<RegSDNode>(Node)->getReg());
6713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
672ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    case Promote:
673ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner      Tmp2 = PromoteOp(Node->getOperand(1));
674ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner      Result = DAG.getCopyToReg(Tmp1, Tmp2, cast<RegSDNode>(Node)->getReg());
675ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner      break;
676ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    case Expand:
6773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand Lo, Hi;
678edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman      ExpandOp(Node->getOperand(1), Lo, Hi);
67918c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner      unsigned Reg = cast<RegSDNode>(Node)->getReg();
680ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Lo = DAG.getCopyToReg(Tmp1, Lo, Reg);
681ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Hi = DAG.getCopyToReg(Tmp1, Hi, Reg+1);
682ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      // Note that the copytoreg nodes are independent of each other.
683ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
6843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      assert(isTypeLegal(Result.getValueType()) &&
6853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner             "Cannot expand multiple times yet (i64 -> i16)");
6863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
6873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
6883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
6893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
6903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::RET:
6913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
6923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (Node->getNumOperands()) {
6933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case 2:  // ret val
6943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      switch (getTypeAction(Node->getOperand(1).getValueType())) {
6953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Legal:
6963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 = LegalizeOp(Node->getOperand(1));
6978afc48e44ad8868c1d41511db645e2ba1a4b894eChris Lattner        if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
6983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1, Tmp2);
6993e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
7003e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Expand: {
7013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        SDOperand Lo, Hi;
7023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        ExpandOp(Node->getOperand(1), Lo, Hi);
7033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1, Lo, Hi);
704edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        break;
7053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
7063e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case Promote:
7078b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        Tmp2 = PromoteOp(Node->getOperand(1));
7088b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1, Tmp2);
7098b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        break;
7103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
7113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
7123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case 1:  // ret void
7133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0))
7143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getNode(ISD::RET, MVT::Other, Tmp1);
7153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
7163e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    default: { // ret <values>
7173e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      std::vector<SDOperand> NewValues;
7183e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      NewValues.push_back(Tmp1);
7193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      for (unsigned i = 1, e = Node->getNumOperands(); i != e; ++i)
7203e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        switch (getTypeAction(Node->getOperand(i).getValueType())) {
7213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case Legal:
7224e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner          NewValues.push_back(LegalizeOp(Node->getOperand(i)));
7233e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          break;
7243e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case Expand: {
7253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          SDOperand Lo, Hi;
7263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          ExpandOp(Node->getOperand(i), Lo, Hi);
7273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          NewValues.push_back(Lo);
7283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          NewValues.push_back(Hi);
729edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman          break;
7303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        }
7313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case Promote:
7328b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          assert(0 && "Can't promote multiple return value yet!");
7333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        }
7343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = DAG.getNode(ISD::RET, MVT::Other, NewValues);
7353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
7363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
7373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
7383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
7393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::STORE:
7403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
7413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(2));  // Legalize the pointer.
7423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
7435d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner    // Turn 'store float 1.0, Ptr' -> 'store int 0x12345678, Ptr'
74403c8546ec57523970874917854a2fb77b1ff598eChris Lattner    if (ConstantFPSDNode *CFP =dyn_cast<ConstantFPSDNode>(Node->getOperand(1))){
7455d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner      if (CFP->getValueType(0) == MVT::f32) {
7465d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        union {
7475d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          unsigned I;
7485d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          float    F;
7495d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        } V;
7505d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        V.F = CFP->getValue();
7512d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1,
7526d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner                             DAG.getConstant(V.I, MVT::i32), Tmp2,
75352d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                             Node->getOperand(3));
7545d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner      } else {
7555d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        assert(CFP->getValueType(0) == MVT::f64 && "Unknown FP type!");
7565d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        union {
7575d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          uint64_t I;
7585d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner          double   F;
7595d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        } V;
7605d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner        V.F = CFP->getValue();
7612d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1,
76252d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                             DAG.getConstant(V.I, MVT::i64), Tmp2,
76352d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                             Node->getOperand(3));
7645d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner      }
76584734ce8ef1a21eb347d4deca0bf32d59001f751Chris Lattner      Node = Result.Val;
7665d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner    }
7675d2c6c784bdc3d572a553ed7aa48dcf27a45b1a3Chris Lattner
7683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
7693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal: {
7703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand Val = LegalizeOp(Node->getOperand(1));
7713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Val != Node->getOperand(1) || Tmp1 != Node->getOperand(0) ||
7723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner          Tmp2 != Node->getOperand(2))
77352d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner        Result = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Val, Tmp2,
77452d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                             Node->getOperand(3));
7753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
7763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
7773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Promote:
77803c8546ec57523970874917854a2fb77b1ff598eChris Lattner      // Truncate the value and store the result.
77903c8546ec57523970874917854a2fb77b1ff598eChris Lattner      Tmp3 = PromoteOp(Node->getOperand(1));
78003c8546ec57523970874917854a2fb77b1ff598eChris Lattner      Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp3, Tmp2,
7812d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth                           Node->getOperand(3),
7829fadb4c1c0a6d223aa468f9f72f8c2562dc66839Chris Lattner                          DAG.getValueType(Node->getOperand(1).getValueType()));
78303c8546ec57523970874917854a2fb77b1ff598eChris Lattner      break;
78403c8546ec57523970874917854a2fb77b1ff598eChris Lattner
7853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Expand:
7863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand Lo, Hi;
7873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ExpandOp(Node->getOperand(1), Lo, Hi);
7883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
7893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (!TLI.isLittleEndian())
7903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        std::swap(Lo, Hi);
7913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
792edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner      Lo = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Lo, Tmp2,
793edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner                       Node->getOperand(3));
794ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      unsigned IncrementSize = MVT::getSizeInBits(Hi.getValueType())/8;
7953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp2 = DAG.getNode(ISD::ADD, Tmp2.getValueType(), Tmp2,
7963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                         getIntPtrConstant(IncrementSize));
7973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      assert(isTypeLegal(Tmp2.getValueType()) &&
7983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner             "Pointers must be legal!");
7992d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth      //Again, claiming both parts of the store came form the same Instr
800edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner      Hi = DAG.getNode(ISD::STORE, MVT::Other, Tmp1, Hi, Tmp2,
801edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner                       Node->getOperand(3));
802ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      Result = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo, Hi);
803ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner      break;
8043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
8053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
80695762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth  case ISD::PCMARKER:
80795762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
8082c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    if (Tmp1 != Node->getOperand(0))
8092c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      Result = DAG.getNode(ISD::PCMARKER, MVT::Other, Tmp1,Node->getOperand(1));
81095762124a1d781cc0f8cbc4c22e9c5c1358d7ea0Andrew Lenharth    break;
8110f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::TRUNCSTORE:
8120f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
8130f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));  // Legalize the pointer.
8140f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
8150f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    switch (getTypeAction(Node->getOperand(1).getValueType())) {
8160f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    case Legal:
8170f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1));
8180f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
8190f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner          Tmp3 != Node->getOperand(2))
82045b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, Tmp1, Tmp2, Tmp3,
8219fadb4c1c0a6d223aa468f9f72f8c2562dc66839Chris Lattner                             Node->getOperand(3), Node->getOperand(4));
8220f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      break;
8230f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    case Promote:
8240f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    case Expand:
8250f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner      assert(0 && "Cannot handle illegal TRUNCSTORE yet!");
8260f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    }
8270f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    break;
8282ee743ff9be43c350075a2fa15d11a79bff36775Chris Lattner  case ISD::SELECT:
82947e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
83047e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
83147e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
83247e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0)); // Legalize the condition.
83347e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
83447e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
83547e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0));  // Promote the condition.
83647e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
83747e9223e06390897c3834f8c527001df392570ffChris Lattner    }
8383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));   // TrueVal
8392ee743ff9be43c350075a2fa15d11a79bff36775Chris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));   // FalseVal
84055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner
84155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), Tmp2.getValueType())) {
84255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    default: assert(0 && "This action is not supported yet!");
84355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Legal:
84455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
84555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner          Tmp3 != Node->getOperand(2))
84655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        Result = DAG.getNode(ISD::SELECT, Node->getValueType(0),
84755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner                             Tmp1, Tmp2, Tmp3);
84855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
84955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Promote: {
85055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      MVT::ValueType NVT =
85155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        TLI.getTypeToPromoteTo(ISD::SELECT, Tmp2.getValueType());
85255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      unsigned ExtOp, TruncOp;
85355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      if (MVT::isInteger(Tmp2.getValueType())) {
85455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        ExtOp = ISD::ZERO_EXTEND;
85555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        TruncOp  = ISD::TRUNCATE;
85655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      } else {
85755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        ExtOp = ISD::FP_EXTEND;
85855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        TruncOp  = ISD::FP_ROUND;
85955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      }
86055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      // Promote each of the values to the new type.
86155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Tmp2 = DAG.getNode(ExtOp, NVT, Tmp2);
86255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Tmp3 = DAG.getNode(ExtOp, NVT, Tmp3);
86355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      // Perform the larger operation, then round down.
86455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = DAG.getNode(ISD::SELECT, NVT, Tmp1, Tmp2,Tmp3);
86555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = DAG.getNode(TruncOp, Node->getValueType(0), Result);
86655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
86755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    }
86855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    }
8693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
8703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SETCC:
8713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
8723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal:
8733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));   // LHS
8743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp2 = LegalizeOp(Node->getOperand(1));   // RHS
8753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1))
8763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
877f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                              Node->getValueType(0), Tmp1, Tmp2);
8783e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
8793e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Promote:
8808b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0));   // LHS
8818b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp2 = PromoteOp(Node->getOperand(1));   // RHS
8828b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
8838b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // If this is an FP compare, the operands have already been extended.
8848b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      if (MVT::isInteger(Node->getOperand(0).getValueType())) {
8858b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        MVT::ValueType VT = Node->getOperand(0).getValueType();
88671c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner        MVT::ValueType NVT = TLI.getTypeToTransformTo(VT);
8878b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
8888b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // Otherwise, we have to insert explicit sign or zero extends.  Note
8898b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // that we could insert sign extends for ALL conditions, but zero extend
8908b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // is cheaper on many machines (an AND instead of two shifts), so prefer
8918b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        // it.
8928b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        switch (cast<SetCCSDNode>(Node)->getCondition()) {
8938b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        default: assert(0 && "Unknown integer comparison!");
8948b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETEQ:
8958b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETNE:
8968b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETUGE:
8978b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETUGT:
8988b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETULE:
8998b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETULT:
9008b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          // ALL of these operations will work if we either sign or zero extend
9018b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          // the operands (including the unsigned comparisons!).  Zero extend is
9028b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          // usually a simpler/cheaper operation, so prefer it.
90323993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner          Tmp1 = DAG.getZeroExtendInReg(Tmp1, VT);
90423993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner          Tmp2 = DAG.getZeroExtendInReg(Tmp2, VT);
9058b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          break;
9068b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETGE:
9078b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETGT:
9088b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETLT:
9098b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        case ISD::SETLE:
91015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner          Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp1,
91115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                             DAG.getValueType(VT));
91215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner          Tmp2 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp2,
91315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                             DAG.getValueType(VT));
9148b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner          break;
9158b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        }
9168b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
9178b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      }
9188b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
919f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                            Node->getValueType(0), Tmp1, Tmp2);
9203e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
921edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman    case Expand:
9223e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      SDOperand LHSLo, LHSHi, RHSLo, RHSHi;
9233e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ExpandOp(Node->getOperand(0), LHSLo, LHSHi);
9243e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      ExpandOp(Node->getOperand(1), RHSLo, RHSHi);
9253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      switch (cast<SetCCSDNode>(Node)->getCondition()) {
9263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case ISD::SETEQ:
9273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      case ISD::SETNE:
92808b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner        if (RHSLo == RHSHi)
92908b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner          if (ConstantSDNode *RHSCST = dyn_cast<ConstantSDNode>(RHSLo))
93008b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner            if (RHSCST->isAllOnesValue()) {
93108b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner              // Comparison to -1.
93208b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner              Tmp1 = DAG.getNode(ISD::AND, LHSLo.getValueType(), LHSLo, LHSHi);
933edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman              Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
93408b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner                                    Node->getValueType(0), Tmp1, RHSLo);
935edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman              break;
93608b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner            }
93708b698e38db5ab5db44c0472e2a7f4f780887629Chris Lattner
9383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp1 = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSLo, RHSLo);
9393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 = DAG.getNode(ISD::XOR, LHSLo.getValueType(), LHSHi, RHSHi);
9403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp1 = DAG.getNode(ISD::OR, Tmp1.getValueType(), Tmp1, Tmp2);
941edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
942f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                              Node->getValueType(0), Tmp1,
9433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                              DAG.getConstant(0, Tmp1.getValueType()));
9443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
9453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      default:
9465b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner        // If this is a comparison of the sign bit, just look at the top part.
9475b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner        // X > -1,  x < 0
9485b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner        if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(Node->getOperand(1)))
949edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman          if ((cast<SetCCSDNode>(Node)->getCondition() == ISD::SETLT &&
9505b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner               CST->getValue() == 0) ||              // X < 0
9515b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner              (cast<SetCCSDNode>(Node)->getCondition() == ISD::SETGT &&
9525b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner               (CST->isAllOnesValue())))             // X > -1
9535b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner            return DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
9545b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner                                Node->getValueType(0), LHSHi, RHSHi);
9555b95ed652fcfe578aa8af4e21318fca989164e21Chris Lattner
9563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // FIXME: This generated code sucks.
9573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        ISD::CondCode LowCC;
9583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        switch (cast<SetCCSDNode>(Node)->getCondition()) {
9593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        default: assert(0 && "Unknown integer setcc!");
9603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETLT:
9613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETULT: LowCC = ISD::SETULT; break;
9623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETGT:
9633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETUGT: LowCC = ISD::SETUGT; break;
9643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETLE:
9653e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETULE: LowCC = ISD::SETULE; break;
9663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETGE:
9673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        case ISD::SETUGE: LowCC = ISD::SETUGE; break;
9683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        }
969edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
9703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // Tmp1 = lo(op1) < lo(op2)   // Always unsigned comparison
9713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // Tmp2 = hi(op1) < hi(op2)   // Signedness depends on operands
9723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // dest = hi(op1) == hi(op2) ? Tmp1 : Tmp2;
9733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
9743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // NOTE: on targets without efficient SELECT of bools, we can always use
9753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3)
976f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner        Tmp1 = DAG.getSetCC(LowCC, Node->getValueType(0), LHSLo, RHSLo);
9773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
978f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                            Node->getValueType(0), LHSHi, RHSHi);
979f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner        Result = DAG.getSetCC(ISD::SETEQ, Node->getValueType(0), LHSHi, RHSHi);
980f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner        Result = DAG.getNode(ISD::SELECT, Tmp1.getValueType(),
981f30b73b1c6b6ca8453dc61eb3777b4e4414d3839Chris Lattner                             Result, Tmp1, Tmp2);
9823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        break;
9833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      }
9843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
9853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
9863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
987e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  case ISD::MEMSET:
988e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  case ISD::MEMCPY:
989e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  case ISD::MEMMOVE: {
990deb692e756cd3826e4ecc6eaec3397177c8b89ceChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));      // Chain
991e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));      // Pointer
992e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner
993e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    if (Node->getOpcode() == ISD::MEMSET) {      // memset = ubyte
994e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      switch (getTypeAction(Node->getOperand(2).getValueType())) {
995e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      case Expand: assert(0 && "Cannot expand a byte!");
996e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      case Legal:
997deb692e756cd3826e4ecc6eaec3397177c8b89ceChris Lattner        Tmp3 = LegalizeOp(Node->getOperand(2));
998e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner        break;
999e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      case Promote:
1000deb692e756cd3826e4ecc6eaec3397177c8b89ceChris Lattner        Tmp3 = PromoteOp(Node->getOperand(2));
1001e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner        break;
1002e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      }
1003e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    } else {
1004edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman      Tmp3 = LegalizeOp(Node->getOperand(2));    // memcpy/move = pointer,
1005e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    }
1006272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner
1007272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    SDOperand Tmp4;
1008272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    switch (getTypeAction(Node->getOperand(3).getValueType())) {
10096814f1522dd7cdeb4674a9ad199f482a2e7aaea1Chris Lattner    case Expand: {
10106814f1522dd7cdeb4674a9ad199f482a2e7aaea1Chris Lattner      // Length is too big, just take the lo-part of the length.
10116814f1522dd7cdeb4674a9ad199f482a2e7aaea1Chris Lattner      SDOperand HiPart;
10126814f1522dd7cdeb4674a9ad199f482a2e7aaea1Chris Lattner      ExpandOp(Node->getOperand(3), HiPart, Tmp4);
10136814f1522dd7cdeb4674a9ad199f482a2e7aaea1Chris Lattner      break;
10146814f1522dd7cdeb4674a9ad199f482a2e7aaea1Chris Lattner    }
1015e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    case Legal:
1016e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      Tmp4 = LegalizeOp(Node->getOperand(3));
1017e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      break;
1018e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    case Promote:
1019e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      Tmp4 = PromoteOp(Node->getOperand(3));
1020272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner      break;
1021272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    }
1022272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner
1023272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    SDOperand Tmp5;
1024272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    switch (getTypeAction(Node->getOperand(4).getValueType())) {  // uint
1025272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    case Expand: assert(0 && "Cannot expand this yet!");
1026272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    case Legal:
1027272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner      Tmp5 = LegalizeOp(Node->getOperand(4));
1028272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner      break;
1029272455b404eabe70ce9e033ba19ec1b6cfe603a5Chris Lattner    case Promote:
1030e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      Tmp5 = PromoteOp(Node->getOperand(4));
1031e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner      break;
1032e560521f1af300a10717ca5c73d42df9ffb1b121Chris Lattner    }
103355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner
103455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), MVT::Other)) {
103555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    default: assert(0 && "This action not implemented for this operation!");
103655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Legal:
1037e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
1038e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner          Tmp3 != Node->getOperand(2) || Tmp4 != Node->getOperand(3) ||
1039e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner          Tmp5 != Node->getOperand(4)) {
1040e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        std::vector<SDOperand> Ops;
1041e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Ops.push_back(Tmp1); Ops.push_back(Tmp2); Ops.push_back(Tmp3);
1042e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Ops.push_back(Tmp4); Ops.push_back(Tmp5);
1043e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Result = DAG.getNode(Node->getOpcode(), MVT::Other, Ops);
1044e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      }
104555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
104655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Expand: {
1047e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      // Otherwise, the target does not support this operation.  Lower the
1048e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      // operation to an explicit libcall as appropriate.
1049e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      MVT::ValueType IntPtr = TLI.getPointerTy();
1050e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      const Type *IntPtrTy = TLI.getTargetData().getIntPtrType();
1051e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      std::vector<std::pair<SDOperand, const Type*> > Args;
1052e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner
10533bfbf4ea990930d153e58e153f319408341a94feReid Spencer      const char *FnName = 0;
1054e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      if (Node->getOpcode() == ISD::MEMSET) {
1055e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp2, IntPtrTy));
1056e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        // Extend the ubyte argument to be an int value for the call.
1057e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Tmp3 = DAG.getNode(ISD::ZERO_EXTEND, MVT::i32, Tmp3);
1058e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp3, Type::IntTy));
1059e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp4, IntPtrTy));
1060e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner
1061e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        FnName = "memset";
1062e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      } else if (Node->getOpcode() == ISD::MEMCPY ||
1063e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner                 Node->getOpcode() == ISD::MEMMOVE) {
1064e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp2, IntPtrTy));
1065e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp3, IntPtrTy));
1066e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        Args.push_back(std::make_pair(Tmp4, IntPtrTy));
1067e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        FnName = Node->getOpcode() == ISD::MEMMOVE ? "memmove" : "memcpy";
1068e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      } else {
1069e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner        assert(0 && "Unknown op!");
1070e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      }
107145982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner
1072e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner      std::pair<SDOperand,SDOperand> CallResult =
1073adf6a965a321372c640845407195594835921eb4Chris Lattner        TLI.LowerCallTo(Tmp1, Type::VoidTy, false, CallingConv::C, false,
1074e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner                        DAG.getExternalSymbol(FnName, IntPtr), Args, DAG);
1075c087a435109cdc943da094a21371f7d66d5b0e54Chris Lattner      Result = CallResult.second;
1076c087a435109cdc943da094a21371f7d66d5b0e54Chris Lattner      NeedsAnotherIteration = true;
107755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
107855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    }
107955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Custom:
108055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      std::vector<SDOperand> Ops;
108155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Ops.push_back(Tmp1); Ops.push_back(Tmp2); Ops.push_back(Tmp3);
108255ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Ops.push_back(Tmp4); Ops.push_back(Tmp5);
108355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = DAG.getNode(Node->getOpcode(), MVT::Other, Ops);
108450381b6c4180e9a2b983d4623da2e485cd768632Chris Lattner      Result = TLI.LowerOperation(Result, DAG);
108555ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      Result = LegalizeOp(Result);
108655ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
1087e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner    }
1088e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner    break;
1089e1bd822ddb0099406d9f280535461033dfeeb190Chris Lattner  }
109052d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner
109152d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner  case ISD::READPORT:
109252d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
109352d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
10946d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner
10953e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) {
10963e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner      std::vector<MVT::ValueType> VTs(Node->value_begin(), Node->value_end());
10973e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner      std::vector<SDOperand> Ops;
10983e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner      Ops.push_back(Tmp1);
10993e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner      Ops.push_back(Tmp2);
11003e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner      Result = DAG.getNode(ISD::READPORT, VTs, Ops);
11013e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner    } else
110252d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner      Result = SDOperand(Node, 0);
110352d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    // Since these produce two values, make sure to remember that we legalized
110452d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    // both of them.
110552d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    AddLegalizedOperand(SDOperand(Node, 0), Result);
110652d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
110752d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    return Result.getValue(Op.ResNo);
110852d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner  case ISD::WRITEPORT:
110952d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
111052d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
111152d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));
111252d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
111352d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner        Tmp3 != Node->getOperand(2))
111452d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner      Result = DAG.getNode(Node->getOpcode(), MVT::Other, Tmp1, Tmp2, Tmp3);
111552d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner    break;
111652d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner
11176d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner  case ISD::READIO:
11186d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
11196d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
11206d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner
11216d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
11226d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    case TargetLowering::Custom:
11236d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    default: assert(0 && "This action not implemented for this operation!");
11246d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    case TargetLowering::Legal:
11253e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1)) {
11263e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner        std::vector<MVT::ValueType> VTs(Node->value_begin(), Node->value_end());
11273e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner        std::vector<SDOperand> Ops;
11283e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner        Ops.push_back(Tmp1);
11293e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner        Ops.push_back(Tmp2);
11303e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner        Result = DAG.getNode(ISD::READPORT, VTs, Ops);
11313e01136f9fc2e1db9207d278002e76e6175783e9Chris Lattner      } else
11326d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner        Result = SDOperand(Node, 0);
11336d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      break;
11346d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    case TargetLowering::Expand:
11356d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      // Replace this with a load from memory.
11366d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      Result = DAG.getLoad(Node->getValueType(0), Node->getOperand(0),
11376d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner                           Node->getOperand(1), DAG.getSrcValue(NULL));
11386d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      Result = LegalizeOp(Result);
11396d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      break;
11406d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    }
11416d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner
11426d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    // Since these produce two values, make sure to remember that we legalized
11436d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    // both of them.
11446d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    AddLegalizedOperand(SDOperand(Node, 0), Result);
11456d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    AddLegalizedOperand(SDOperand(Node, 1), Result.getValue(1));
11466d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    return Result.getValue(Op.ResNo);
11476d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner
11486d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner  case ISD::WRITEIO:
11496d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
11506d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
11516d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    Tmp3 = LegalizeOp(Node->getOperand(2));
11526d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner
11536d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    switch (TLI.getOperationAction(Node->getOpcode(),
11546d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner                                   Node->getOperand(1).getValueType())) {
11556d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    case TargetLowering::Custom:
11566d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    default: assert(0 && "This action not implemented for this operation!");
11576d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    case TargetLowering::Legal:
11586d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      if (Tmp1 != Node->getOperand(0) || Tmp2 != Node->getOperand(1) ||
11596d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner          Tmp3 != Node->getOperand(2))
11606d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner        Result = DAG.getNode(Node->getOpcode(), MVT::Other, Tmp1, Tmp2, Tmp3);
11616d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      break;
11626d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    case TargetLowering::Expand:
11636d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      // Replace this with a store to memory.
11646d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      Result = DAG.getNode(ISD::STORE, MVT::Other, Node->getOperand(0),
11656d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner                           Node->getOperand(1), Node->getOperand(2),
11666d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner                           DAG.getSrcValue(NULL));
11676d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      Result = LegalizeOp(Result);
11686d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner      break;
11696d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    }
11706d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner    break;
11716d5b8e16462859333db9ad984f05ec2ed1f48f4aChris Lattner
117284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  case ISD::ADD_PARTS:
11735b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  case ISD::SUB_PARTS:
11745b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  case ISD::SHL_PARTS:
11755b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  case ISD::SRA_PARTS:
11765b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  case ISD::SRL_PARTS: {
117784f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    std::vector<SDOperand> Ops;
117884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    bool Changed = false;
117984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
118084f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
118184f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner      Changed |= Ops.back() != Node->getOperand(i);
118284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    }
1183e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner    if (Changed) {
1184e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      std::vector<MVT::ValueType> VTs(Node->value_begin(), Node->value_end());
1185e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      Result = DAG.getNode(Node->getOpcode(), VTs, Ops);
1186e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner    }
11872c8086f4b9916b2d02842be5e375276023225fbaChris Lattner
11882c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // Since these produce multiple values, make sure to remember that we
11892c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // legalized all of them.
11902c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    for (unsigned i = 0, e = Node->getNumValues(); i != e; ++i)
11912c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      AddLegalizedOperand(SDOperand(Node, i), Result.getValue(i));
11922c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    return Result.getValue(Op.ResNo);
119384f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  }
11942c8086f4b9916b2d02842be5e375276023225fbaChris Lattner
11952c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // Binary operators
11963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ADD:
11973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SUB:
11983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::MUL:
1199c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman  case ISD::MULHS:
1200c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman  case ISD::MULHU:
12013e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::UDIV:
12023e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SDIV:
12033e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::AND:
12043e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::OR:
12053e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::XOR:
120603c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::SHL:
120703c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::SRL:
120803c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::SRA:
12093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));   // LHS
1210f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth    switch (getTypeAction(Node->getOperand(1).getValueType())) {
1211f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth    case Expand: assert(0 && "Not possible");
1212f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth    case Legal:
1213f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth      Tmp2 = LegalizeOp(Node->getOperand(1)); // Legalize the RHS.
1214f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth      break;
1215f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth    case Promote:
1216f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth      Tmp2 = PromoteOp(Node->getOperand(1));  // Promote the RHS.
1217f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth      break;
1218f2eb1396b8fe7b5b1c4bd5f27903209cfa4d20aeAndrew Lenharth    }
12193e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (Tmp1 != Node->getOperand(0) ||
12203e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Tmp2 != Node->getOperand(1))
12213e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,Tmp2);
12223e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
1223edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
1224c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman  case ISD::UREM:
1225c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman  case ISD::SREM:
1226c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    Tmp1 = LegalizeOp(Node->getOperand(0));   // LHS
1227c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    Tmp2 = LegalizeOp(Node->getOperand(1));   // RHS
1228c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
1229c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    case TargetLowering::Legal:
1230c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      if (Tmp1 != Node->getOperand(0) ||
1231c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman          Tmp2 != Node->getOperand(1))
1232edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,
1233c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman                             Tmp2);
1234c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      break;
1235c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    case TargetLowering::Promote:
1236c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    case TargetLowering::Custom:
1237c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      assert(0 && "Cannot promote/custom handle this yet!");
1238c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    case TargetLowering::Expand: {
1239c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      MVT::ValueType VT = Node->getValueType(0);
1240c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      unsigned Opc = (Node->getOpcode() == ISD::UREM) ? ISD::UDIV : ISD::SDIV;
1241c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      Result = DAG.getNode(Opc, VT, Tmp1, Tmp2);
1242c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      Result = DAG.getNode(ISD::MUL, VT, Result, Tmp2);
1243c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      Result = DAG.getNode(ISD::SUB, VT, Tmp1, Result);
1244c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      }
1245c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman      break;
1246c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    }
1247c105e19864f2792c52bc6bb765d365308f38f461Nate Begeman    break;
12482c8086f4b9916b2d02842be5e375276023225fbaChris Lattner
1249691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  case ISD::CTPOP:
1250691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  case ISD::CTTZ:
1251691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth  case ISD::CTLZ:
1252691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    Tmp1 = LegalizeOp(Node->getOperand(0));   // Op
1253691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
1254691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    case TargetLowering::Legal:
1255691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      if (Tmp1 != Node->getOperand(0))
1256691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1);
1257691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      break;
1258691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    case TargetLowering::Promote: {
1259691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      MVT::ValueType OVT = Tmp1.getValueType();
1260691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      MVT::ValueType NVT = TLI.getTypeToPromoteTo(Node->getOpcode(), OVT);
1261edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner
1262edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner      // Zero extend the argument.
1263691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, NVT, Tmp1);
1264691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      // Perform the larger operation, then subtract if needed.
1265691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      Tmp1 = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1);
1266691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      switch(Node->getOpcode())
1267691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      {
1268691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      case ISD::CTPOP:
1269691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        Result = Tmp1;
1270691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        break;
1271691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      case ISD::CTTZ:
1272691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        //if Tmp1 == sizeinbits(NVT) then Tmp1 = sizeinbits(Old VT)
127339a8f336305a492fc6d2625f39f08968185616d2Chris Lattner        Tmp2 = DAG.getSetCC(ISD::SETEQ, TLI.getSetCCResultTy(), Tmp1,
1274691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth                            DAG.getConstant(getSizeInBits(NVT), NVT));
1275691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        Result = DAG.getNode(ISD::SELECT, NVT, Tmp2,
1276691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth                           DAG.getConstant(getSizeInBits(OVT),NVT), Tmp1);
1277691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        break;
1278691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      case ISD::CTLZ:
1279691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        //Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT))
1280691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        Result = DAG.getNode(ISD::SUB, NVT, Tmp1,
1281691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth                             DAG.getConstant(getSizeInBits(NVT) -
1282691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth                                             getSizeInBits(OVT), NVT));
1283691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth        break;
1284691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      }
1285691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      break;
1286691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    }
1287691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    case TargetLowering::Custom:
1288691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      assert(0 && "Cannot custom handle this yet!");
1289691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    case TargetLowering::Expand:
1290ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth      switch(Node->getOpcode())
1291ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth      {
1292ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth      case ISD::CTPOP: {
1293e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner        static const uint64_t mask[6] = {
1294e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner          0x5555555555555555ULL, 0x3333333333333333ULL,
1295e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner          0x0F0F0F0F0F0F0F0FULL, 0x00FF00FF00FF00FFULL,
1296e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner          0x0000FFFF0000FFFFULL, 0x00000000FFFFFFFFULL
1297e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner        };
1298ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth        MVT::ValueType VT = Tmp1.getValueType();
1299e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner        MVT::ValueType ShVT = TLI.getShiftAmountTy();
1300e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner        unsigned len = getSizeInBits(VT);
1301e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner        for (unsigned i = 0; (1U << i) <= (len / 2); ++i) {
1302ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth          //x = (x & mask[i][len/8]) + (x >> (1 << i) & mask[i][len/8])
1303e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner          Tmp2 = DAG.getConstant(mask[i], VT);
1304e3ef0a8b9f79d77116e888ffe51730c8279b7363Chris Lattner          Tmp3 = DAG.getConstant(1ULL << i, ShVT);
1305ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth          Tmp1 = DAG.getNode(ISD::ADD, VT,
1306ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth                             DAG.getNode(ISD::AND, VT, Tmp1, Tmp2),
1307ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth                             DAG.getNode(ISD::AND, VT,
1308ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth                                         DAG.getNode(ISD::SRL, VT, Tmp1, Tmp3),
1309ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth                                         Tmp2));
1310ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth        }
1311ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth        Result = Tmp1;
1312ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth        break;
1313ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth      }
131457ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina      case ISD::CTLZ: {
131557ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina        /* for now, we do this:
13165c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner           x = x | (x >> 1);
13175c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner           x = x | (x >> 2);
13185c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner           ...
13195c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner           x = x | (x >>16);
13205c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner           x = x | (x >>32); // for 64-bit input
13215c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner           return popcount(~x);
132257ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina
13235c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner           but see also: http://www.hackersdelight.org/HDcode/nlz.cc */
13245c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner        MVT::ValueType VT = Tmp1.getValueType();
132557ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina        MVT::ValueType ShVT = TLI.getShiftAmountTy();
132657ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina        unsigned len = getSizeInBits(VT);
132757ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina        for (unsigned i = 0; (1U << i) <= (len / 2); ++i) {
132857ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina          Tmp3 = DAG.getConstant(1ULL << i, ShVT);
132957ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina          Tmp1 = DAG.getNode(ISD::OR, VT, Tmp1,
133057ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina                             DAG.getNode(ISD::SRL, VT, Tmp1, Tmp3));
133157ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina        }
133257ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina        Tmp3 = DAG.getNode(ISD::XOR, VT, Tmp1, DAG.getConstant(~0ULL, VT));
13335c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner        Result = LegalizeOp(DAG.getNode(ISD::CTPOP, VT, Tmp3));
133418aa680a96c49cf9e28b52f5ab3f2c4f98793636Chris Lattner        break;
133557ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina      }
133657ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina      case ISD::CTTZ: {
1337d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        // for now, we use: { return popcount(~x & (x - 1)); }
1338d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        // unless the target has ctlz but not ctpop, in which case we use:
1339d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        // { return 32 - nlz(~x & (x-1)); }
1340d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        // see also http://www.hackersdelight.org/HDcode/ntz.cc
13415c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner        MVT::ValueType VT = Tmp1.getValueType();
13425c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner        Tmp2 = DAG.getConstant(~0ULL, VT);
13435c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner        Tmp3 = DAG.getNode(ISD::AND, VT,
13445c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner                           DAG.getNode(ISD::XOR, VT, Tmp1, Tmp2),
13455c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner                           DAG.getNode(ISD::SUB, VT, Tmp1,
13465c33c9a166c2d68d64c68d8097598d09d9af6c20Chris Lattner                                       DAG.getConstant(1, VT)));
1347d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        // If ISD::CTLZ is legal and CTPOP isn't, then do that instead
1348d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        if (TLI.getOperationAction(ISD::CTPOP, VT) != TargetLowering::Legal &&
1349d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman            TLI.getOperationAction(ISD::CTLZ, VT) == TargetLowering::Legal) {
1350d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman          Result = LegalizeOp(DAG.getNode(ISD::SUB, VT,
1351d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman                                        DAG.getConstant(getSizeInBits(VT), VT),
1352d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman                                        DAG.getNode(ISD::CTLZ, VT, Tmp3)));
1353d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        } else {
1354d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman          Result = LegalizeOp(DAG.getNode(ISD::CTPOP, VT, Tmp3));
1355d7c4a4a6c048d4174b8795598f50fd76c30731edNate Begeman        }
135618aa680a96c49cf9e28b52f5ab3f2c4f98793636Chris Lattner        break;
135757ff7e5f6479b43828406a6723b7dde6f673f48cDuraid Madina      }
1358ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth      default:
1359ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth        assert(0 && "Cannot expand this yet!");
1360ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth        break;
1361ded10bfb46aeacf02acec0018a0b970c1f932a32Andrew Lenharth      }
1362691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth      break;
1363691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    }
1364691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth    break;
1365691ef2ba066dda14ae4ac0ad645054fbc967785aAndrew Lenharth
13662c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // Unary operators
13672c8086f4b9916b2d02842be5e375276023225fbaChris Lattner  case ISD::FABS:
13682c8086f4b9916b2d02842be5e375276023225fbaChris Lattner  case ISD::FNEG:
1369da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner  case ISD::FSQRT:
1370da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner  case ISD::FSIN:
1371da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner  case ISD::FCOS:
13722c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
13732c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), Node->getValueType(0))) {
13742c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    case TargetLowering::Legal:
13752c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      if (Tmp1 != Node->getOperand(0))
13762c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1);
13772c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      break;
13782c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    case TargetLowering::Promote:
13792c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    case TargetLowering::Custom:
13802c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      assert(0 && "Cannot promote/custom handle this yet!");
13812c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    case TargetLowering::Expand:
1382f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      switch(Node->getOpcode()) {
1383f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      case ISD::FNEG: {
13842c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        // Expand Y = FNEG(X) ->  Y = SUB -0.0, X
13852c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        Tmp2 = DAG.getConstantFP(-0.0, Node->getValueType(0));
13862c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        Result = LegalizeOp(DAG.getNode(ISD::SUB, Node->getValueType(0),
13872c8086f4b9916b2d02842be5e375276023225fbaChris Lattner                                        Tmp2, Tmp1));
1388f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        break;
1389f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      }
1390f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      case ISD::FABS: {
13914af6e0d7836126630f579b0a34f054321187f00bChris Lattner        // Expand Y = FABS(X) -> Y = (X >u 0.0) ? X : fneg(X).
13924af6e0d7836126630f579b0a34f054321187f00bChris Lattner        MVT::ValueType VT = Node->getValueType(0);
13934af6e0d7836126630f579b0a34f054321187f00bChris Lattner        Tmp2 = DAG.getConstantFP(0.0, VT);
13944af6e0d7836126630f579b0a34f054321187f00bChris Lattner        Tmp2 = DAG.getSetCC(ISD::SETUGT, TLI.getSetCCResultTy(), Tmp1, Tmp2);
13954af6e0d7836126630f579b0a34f054321187f00bChris Lattner        Tmp3 = DAG.getNode(ISD::FNEG, VT, Tmp1);
13964af6e0d7836126630f579b0a34f054321187f00bChris Lattner        Result = DAG.getNode(ISD::SELECT, VT, Tmp2, Tmp1, Tmp3);
13974af6e0d7836126630f579b0a34f054321187f00bChris Lattner        Result = LegalizeOp(Result);
1398f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        break;
1399f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      }
1400f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      case ISD::FSQRT:
1401f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      case ISD::FSIN:
1402f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      case ISD::FCOS: {
1403f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        MVT::ValueType VT = Node->getValueType(0);
1404f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        Type *T = VT == MVT::f32 ? Type::FloatTy : Type::DoubleTy;
1405f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        const char *FnName = 0;
1406f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        switch(Node->getOpcode()) {
1407f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        case ISD::FSQRT: FnName = VT == MVT::f32 ? "sqrtf" : "sqrt"; break;
1408f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        case ISD::FSIN:  FnName = VT == MVT::f32 ? "sinf"  : "sin"; break;
1409f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        case ISD::FCOS:  FnName = VT == MVT::f32 ? "cosf"  : "cos"; break;
1410f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        default: assert(0 && "Unreachable!");
1411f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        }
1412f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        std::vector<std::pair<SDOperand, const Type*> > Args;
1413f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        Args.push_back(std::make_pair(Tmp1, T));
14140d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner        // FIXME: should use ExpandLibCall!
1415f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        std::pair<SDOperand,SDOperand> CallResult =
1416adf6a965a321372c640845407195594835921eb4Chris Lattner          TLI.LowerCallTo(DAG.getEntryNode(), T, false, CallingConv::C, true,
1417f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner                          DAG.getExternalSymbol(FnName, VT), Args, DAG);
1418f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        Result = LegalizeOp(CallResult.first);
1419f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner        break;
1420f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      }
1421f76e7dc8d8ac1855ef59698e82c757548ef4ca65Chris Lattner      default:
14224af6e0d7836126630f579b0a34f054321187f00bChris Lattner        assert(0 && "Unreachable!");
14232c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      }
14242c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      break;
14252c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    }
14262c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    break;
14272c8086f4b9916b2d02842be5e375276023225fbaChris Lattner
14282c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // Conversion operators.  The source and destination have different types.
14293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::ZERO_EXTEND:
14303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SIGN_EXTEND:
14317cc4777a263f6a52877d29201311fde5f6edb632Chris Lattner  case ISD::TRUNCATE:
143203c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::FP_EXTEND:
143303c0cf822e9a57109d1b4e6a2705d68852c93e1dChris Lattner  case ISD::FP_ROUND:
1434ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::FP_TO_SINT:
1435ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::FP_TO_UINT:
1436ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::SINT_TO_FP:
1437ae0aacb8331e1227abea6601e531a10d0e65fdcaChris Lattner  case ISD::UINT_TO_FP:
14383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
14393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    case Legal:
1440f4b3278aeba23efbeacf6be5c33273e2945be2f2Andrew Lenharth      //still made need to expand if the op is illegal, but the types are legal
1441cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner      if (Node->getOpcode() == ISD::UINT_TO_FP) {
1442cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        switch (TLI.getOperationAction(Node->getOpcode(),
1443cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                       Node->getOperand(0).getValueType())) {
1444cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        default: assert(0 && "Unknown operation action!");
1445cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        case TargetLowering::Expand:
1446cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          Result = ExpandLegalUINT_TO_FP(LegalizeOp(Node->getOperand(0)),
1447cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                         Node->getValueType(0));
1448cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          AddLegalizedOperand(Op, Result);
1449cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          return Result;
1450cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        case TargetLowering::Promote:
1451cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          Result = PromoteLegalUINT_TO_FP(LegalizeOp(Node->getOperand(0)),
1452cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner                                          Node->getValueType(0));
1453cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          AddLegalizedOperand(Op, Result);
1454cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          return Result;
1455cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner        case TargetLowering::Legal:
1456cad063f1a8ecda4fd556a733dc5eaa8a96acb80dChris Lattner          break;
1457f4b3278aeba23efbeacf6be5c33273e2945be2f2Andrew Lenharth        }
1458f4b3278aeba23efbeacf6be5c33273e2945be2f2Andrew Lenharth      }
14593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));
14603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      if (Tmp1 != Node->getOperand(0))
14613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner        Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1);
14623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      break;
1463b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner    case Expand:
146477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      if (Node->getOpcode() == ISD::SINT_TO_FP ||
146577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner          Node->getOpcode() == ISD::UINT_TO_FP) {
146677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner        Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP,
146777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                               Node->getValueType(0), Node->getOperand(0));
146877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner        break;
14692c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      } else if (Node->getOpcode() == ISD::TRUNCATE) {
14702c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        // In the expand case, we must be dealing with a truncate, because
14712c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        // otherwise the result would be larger than the source.
14722c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        ExpandOp(Node->getOperand(0), Tmp1, Tmp2);
1473edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
14742c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        // Since the result is legal, we should just be able to truncate the low
14752c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        // part of the source.
14762c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        Result = DAG.getNode(ISD::TRUNCATE, Node->getValueType(0), Tmp1);
14772c8086f4b9916b2d02842be5e375276023225fbaChris Lattner        break;
147877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      }
14792c8086f4b9916b2d02842be5e375276023225fbaChris Lattner      assert(0 && "Shouldn't need to expand other operators here!");
1480b00a6425de1ef8668b63f29927c38da8a19ce904Chris Lattner
148103c8546ec57523970874917854a2fb77b1ff598eChris Lattner    case Promote:
148203c8546ec57523970874917854a2fb77b1ff598eChris Lattner      switch (Node->getOpcode()) {
14831713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner      case ISD::ZERO_EXTEND:
14841713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
148547e9223e06390897c3834f8c527001df392570ffChris Lattner        // NOTE: Any extend would work here...
148647e9223e06390897c3834f8c527001df392570ffChris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND, Op.getValueType(), Result);
148723993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner        Result = DAG.getZeroExtendInReg(Result,
148823993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner                                        Node->getOperand(0).getValueType());
148903c8546ec57523970874917854a2fb77b1ff598eChris Lattner        break;
149003c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::SIGN_EXTEND:
14911713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
149247e9223e06390897c3834f8c527001df392570ffChris Lattner        // NOTE: Any extend would work here...
1493d5d56825123665b60d4eada0a4ad7d0adc5cf3a3Chris Lattner        Result = DAG.getNode(ISD::ZERO_EXTEND, Op.getValueType(), Result);
14941713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(),
149515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                             Result,
149615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                          DAG.getValueType(Node->getOperand(0).getValueType()));
14971713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        break;
149803c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::TRUNCATE:
14991713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
15001713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = DAG.getNode(ISD::TRUNCATE, Op.getValueType(), Result);
15011713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        break;
150203c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_EXTEND:
15031713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        Result = PromoteOp(Node->getOperand(0));
15041713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        if (Result.getValueType() != Op.getValueType())
15051713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner          // Dynamically dead while we have only 2 FP types.
15061713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner          Result = DAG.getNode(ISD::FP_EXTEND, Op.getValueType(), Result);
15071713e73b8ac53f045150cb2a7d7ba9781dc35ef8Chris Lattner        break;
150803c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_ROUND:
150903c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_TO_SINT:
151003c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::FP_TO_UINT:
1511f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = PromoteOp(Node->getOperand(0));
1512f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(Node->getOpcode(), Op.getValueType(), Result);
1513f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        break;
151403c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::SINT_TO_FP:
1515f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = PromoteOp(Node->getOperand(0));
1516f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(),
151715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                             Result,
151815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                         DAG.getValueType(Node->getOperand(0).getValueType()));
1519f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::SINT_TO_FP, Op.getValueType(), Result);
1520f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        break;
152103c8546ec57523970874917854a2fb77b1ff598eChris Lattner      case ISD::UINT_TO_FP:
1522f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = PromoteOp(Node->getOperand(0));
152323993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner        Result = DAG.getZeroExtendInReg(Result,
152423993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner                                        Node->getOperand(0).getValueType());
1525f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        Result = DAG.getNode(ISD::UINT_TO_FP, Op.getValueType(), Result);
1526f8161d83f0201a32a33a0c875eb43df81d8586abChris Lattner        break;
152703c8546ec57523970874917854a2fb77b1ff598eChris Lattner      }
15283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
15293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
15300f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::FP_ROUND_INREG:
153123993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner  case ISD::SIGN_EXTEND_INREG: {
15320f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));
153315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner    MVT::ValueType ExtraVT = cast<VTSDNode>(Node->getOperand(1))->getVT();
153445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner
153545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner    // If this operation is not supported, convert it to a shl/shr or load/store
153645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner    // pair.
153755ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    switch (TLI.getOperationAction(Node->getOpcode(), ExtraVT)) {
153855ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    default: assert(0 && "This action not supported for this op yet!");
153955ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Legal:
154055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      if (Tmp1 != Node->getOperand(0))
154155ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner        Result = DAG.getNode(Node->getOpcode(), Node->getValueType(0), Tmp1,
15425f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                             DAG.getValueType(ExtraVT));
154355ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
154455ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner    case TargetLowering::Expand:
154545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      // If this is an integer extend and shifts are supported, do that.
154623993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner      if (Node->getOpcode() == ISD::SIGN_EXTEND_INREG) {
154745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // NOTE: we could fall back on load/store here too for targets without
154845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // SAR.  However, it is doubtful that any exist.
154945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        unsigned BitsDiff = MVT::getSizeInBits(Node->getValueType(0)) -
155045b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                            MVT::getSizeInBits(ExtraVT);
155127ff112948d059524e5f4ebe249a1da0b7c710e8Chris Lattner        SDOperand ShiftCst = DAG.getConstant(BitsDiff, TLI.getShiftAmountTy());
155245b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::SHL, Node->getValueType(0),
155345b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                             Node->getOperand(0), ShiftCst);
155445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::SRA, Node->getValueType(0),
155545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner                             Result, ShiftCst);
155645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      } else if (Node->getOpcode() == ISD::FP_ROUND_INREG) {
155745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // The only way we can lower this is to turn it into a STORETRUNC,
155845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // EXTLOAD pair, targetting a temporary location (a stack slot).
155945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner
156045b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // NOTE: there is a choice here between constantly creating new stack
156145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // slots and always reusing the same one.  We currently always create
156245b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        // new ones, as reuse may inhibit scheduling.
156345b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        const Type *Ty = MVT::getTypeForValueType(ExtraVT);
156445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        unsigned TySize = (unsigned)TLI.getTargetData().getTypeSize(Ty);
156545b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        unsigned Align  = TLI.getTargetData().getTypeAlignment(Ty);
156645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        MachineFunction &MF = DAG.getMachineFunction();
1567edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        int SSFI =
156845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner          MF.getFrameInfo()->CreateStackObject((unsigned)TySize, Align);
156945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        SDOperand StackSlot = DAG.getFrameIndex(SSFI, TLI.getPointerTy());
157045b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        Result = DAG.getNode(ISD::TRUNCSTORE, MVT::Other, DAG.getEntryNode(),
157152d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                             Node->getOperand(0), StackSlot,
15729fadb4c1c0a6d223aa468f9f72f8c2562dc66839Chris Lattner                             DAG.getSrcValue(NULL), DAG.getValueType(ExtraVT));
15735f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner        Result = DAG.getExtLoad(ISD::EXTLOAD, Node->getValueType(0),
15745f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                                Result, StackSlot, DAG.getSrcValue(NULL),
15755f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                                ExtraVT);
157645b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      } else {
157745b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner        assert(0 && "Unknown op");
157845b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      }
157945b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner      Result = LegalizeOp(Result);
158055ba8fba750ee0a51a9d74fa33b7242d24a4ff35Chris Lattner      break;
158145b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner    }
15820f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    break;
15833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
158445b8caf1c5a1fd8337038d64c6da8fba2d299fdfChris Lattner  }
15853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
158645982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  // Note that LegalizeOp may be reentered even from single-use nodes, which
158745982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  // means that we always must cache transformed nodes.
158845982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  AddLegalizedOperand(Op, Result);
15893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  return Result;
15903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
15913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
15928b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// PromoteOp - Given an operation that produces a value in an invalid type,
15938b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// promote it to compute the value into a larger type.  The produced value will
15948b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// have the correct bits for the low portion of the register, but no guarantee
15958b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner/// is made about the top bits: it may be zero, sign-extended, or garbage.
159603c8546ec57523970874917854a2fb77b1ff598eChris LattnerSDOperand SelectionDAGLegalize::PromoteOp(SDOperand Op) {
159703c8546ec57523970874917854a2fb77b1ff598eChris Lattner  MVT::ValueType VT = Op.getValueType();
159871c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner  MVT::ValueType NVT = TLI.getTypeToTransformTo(VT);
159903c8546ec57523970874917854a2fb77b1ff598eChris Lattner  assert(getTypeAction(VT) == Promote &&
160003c8546ec57523970874917854a2fb77b1ff598eChris Lattner         "Caller should expand or legalize operands that are not promotable!");
160103c8546ec57523970874917854a2fb77b1ff598eChris Lattner  assert(NVT > VT && MVT::isInteger(NVT) == MVT::isInteger(VT) &&
160203c8546ec57523970874917854a2fb77b1ff598eChris Lattner         "Cannot promote to smaller type!");
160303c8546ec57523970874917854a2fb77b1ff598eChris Lattner
160403c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDOperand Tmp1, Tmp2, Tmp3;
160503c8546ec57523970874917854a2fb77b1ff598eChris Lattner
160603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDOperand Result;
160703c8546ec57523970874917854a2fb77b1ff598eChris Lattner  SDNode *Node = Op.Val;
160803c8546ec57523970874917854a2fb77b1ff598eChris Lattner
160945982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  if (!Node->hasOneUse()) {
161045982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    std::map<SDOperand, SDOperand>::iterator I = PromotedNodes.find(Op);
161145982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    if (I != PromotedNodes.end()) return I->second;
161245982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  } else {
161345982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    assert(!PromotedNodes.count(Op) && "Repromoted this node??");
161445982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  }
161545982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner
16160f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  // Promotion needs an optimization step to clean up after it, and is not
16170f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  // careful to avoid operations the target does not support.  Make sure that
16180f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  // all generated operations are legalized in the next iteration.
16190f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  NeedsAnotherIteration = true;
16200f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
162103c8546ec57523970874917854a2fb77b1ff598eChris Lattner  switch (Node->getOpcode()) {
162203c8546ec57523970874917854a2fb77b1ff598eChris Lattner  default:
162303c8546ec57523970874917854a2fb77b1ff598eChris Lattner    std::cerr << "NODE: "; Node->dump(); std::cerr << "\n";
162403c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(0 && "Do not know how to promote this operator!");
162503c8546ec57523970874917854a2fb77b1ff598eChris Lattner    abort();
1626fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  case ISD::UNDEF:
1627fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    Result = DAG.getNode(ISD::UNDEF, NVT);
1628fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    break;
162903c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::Constant:
163003c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Result = DAG.getNode(ISD::ZERO_EXTEND, NVT, Op);
163103c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(isa<ConstantSDNode>(Result) && "Didn't constant fold zext?");
163203c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
163303c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::ConstantFP:
163403c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Result = DAG.getNode(ISD::FP_EXTEND, NVT, Op);
163503c8546ec57523970874917854a2fb77b1ff598eChris Lattner    assert(isa<ConstantFPSDNode>(Result) && "Didn't constant fold fp_extend?");
163603c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
1637ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner  case ISD::CopyFromReg:
1638ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    Result = DAG.getCopyFromReg(cast<RegSDNode>(Node)->getReg(), NVT,
1639ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner                                Node->getOperand(0));
1640ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    // Remember that we legalized the chain.
1641ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
1642ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner    break;
1643ef5cd1d3cf7d0b20987a545fcd2d0af2bfe6c422Chris Lattner
164482fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner  case ISD::SETCC:
164582fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    assert(getTypeAction(TLI.getSetCCResultTy()) == Legal &&
164682fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner           "SetCC type is not legal??");
164782fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    Result = DAG.getSetCC(cast<SetCCSDNode>(Node)->getCondition(),
164882fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner                          TLI.getSetCCResultTy(), Node->getOperand(0),
164982fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner                          Node->getOperand(1));
165082fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    Result = LegalizeOp(Result);
165182fbfb6984c1feb7d44a077ac2dc031f4a950005Chris Lattner    break;
165203c8546ec57523970874917854a2fb77b1ff598eChris Lattner
165303c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::TRUNCATE:
165403c8546ec57523970874917854a2fb77b1ff598eChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
165503c8546ec57523970874917854a2fb77b1ff598eChris Lattner    case Legal:
165603c8546ec57523970874917854a2fb77b1ff598eChris Lattner      Result = LegalizeOp(Node->getOperand(0));
165703c8546ec57523970874917854a2fb77b1ff598eChris Lattner      assert(Result.getValueType() >= NVT &&
165803c8546ec57523970874917854a2fb77b1ff598eChris Lattner             "This truncation doesn't make sense!");
165903c8546ec57523970874917854a2fb77b1ff598eChris Lattner      if (Result.getValueType() > NVT)    // Truncate to NVT instead of VT
166003c8546ec57523970874917854a2fb77b1ff598eChris Lattner        Result = DAG.getNode(ISD::TRUNCATE, NVT, Result);
166103c8546ec57523970874917854a2fb77b1ff598eChris Lattner      break;
1662e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner    case Promote:
1663e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      // The truncation is not required, because we don't guarantee anything
1664e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      // about high bits anyway.
1665e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      Result = PromoteOp(Node->getOperand(0));
1666e76ad6de40b5e4c0399257b0438914c8c85ceaa1Chris Lattner      break;
166703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    case Expand:
166879e46acd35df36477029e9f534ab1a366a98df56Nate Begeman      ExpandOp(Node->getOperand(0), Tmp1, Tmp2);
166979e46acd35df36477029e9f534ab1a366a98df56Nate Begeman      // Truncate the low part of the expanded value to the result type
1670edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman      Result = DAG.getNode(ISD::TRUNCATE, VT, Tmp1);
167103c8546ec57523970874917854a2fb77b1ff598eChris Lattner    }
167203c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
16738b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SIGN_EXTEND:
16748b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::ZERO_EXTEND:
16758b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
16768b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand: assert(0 && "BUG: Smaller reg should have been promoted!");
16778b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
16788b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // Input is legal?  Just do extend all the way to the larger type.
16798b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = LegalizeOp(Node->getOperand(0));
16808b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = DAG.getNode(Node->getOpcode(), NVT, Result);
16818b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
16828b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:
16838b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // Promote the reg if it's smaller.
16848b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = PromoteOp(Node->getOperand(0));
16858b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // The high bits are not guaranteed to be anything.  Insert an extend.
16868b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      if (Node->getOpcode() == ISD::SIGN_EXTEND)
1687595dc5408ad809b9a9a417db275c43242e54b8dcChris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Result,
168815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                         DAG.getValueType(Node->getOperand(0).getValueType()));
16898b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      else
169023993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner        Result = DAG.getZeroExtendInReg(Result,
169123993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner                                        Node->getOperand(0).getValueType());
16928b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
16938b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
16948b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
16958b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
16968b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_EXTEND:
16978b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    assert(0 && "Case not implemented.  Dynamically dead with 2 FP types!");
16988b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_ROUND:
16998b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
17008b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand: assert(0 && "BUG: Cannot expand FP regs!");
17018b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:  assert(0 && "Unreachable with 2 FP types!");
17028b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
17038b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // Input is legal?  Do an FP_ROUND_INREG.
17048b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = LegalizeOp(Node->getOperand(0));
170515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner      Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result,
170615e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                           DAG.getValueType(VT));
17078b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
17088b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
17098b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
17108b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
17118b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SINT_TO_FP:
17128b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::UINT_TO_FP:
17138b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
17148b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
17158b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = LegalizeOp(Node->getOperand(0));
171677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      // No extra round required here.
171777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Result = DAG.getNode(Node->getOpcode(), NVT, Result);
17188b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
17198b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
17208b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:
17218b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Result = PromoteOp(Node->getOperand(0));
17228b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      if (Node->getOpcode() == ISD::SINT_TO_FP)
17238b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner        Result = DAG.getNode(ISD::SIGN_EXTEND_INREG, Result.getValueType(),
172415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                             Result,
172515e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                         DAG.getValueType(Node->getOperand(0).getValueType()));
17268b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      else
172723993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner        Result = DAG.getZeroExtendInReg(Result,
172823993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner                                        Node->getOperand(0).getValueType());
172977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      // No extra round required here.
173077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Result = DAG.getNode(Node->getOpcode(), NVT, Result);
17318b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
17328b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand:
173377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Result = ExpandIntToFP(Node->getOpcode() == ISD::SINT_TO_FP, NVT,
173477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                             Node->getOperand(0));
173577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      // Round if we cannot tolerate excess precision.
173677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      if (NoExcessFPPrecision)
173715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner        Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result,
173815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                             DAG.getValueType(VT));
173977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      break;
17408b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
17418b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
17428b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
17438b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_TO_SINT:
17448b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::FP_TO_UINT:
17458b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
17468b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Legal:
17478b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));
17488b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
17498b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Promote:
17508b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // The input result is prerounded, so we don't have to do anything
17518b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      // special.
17528b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0));
17538b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      break;
17548b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    case Expand:
17558b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner      assert(0 && "not implemented");
17568b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
17578b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
17588b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
17598b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
17602c8086f4b9916b2d02842be5e375276023225fbaChris Lattner  case ISD::FABS:
17612c8086f4b9916b2d02842be5e375276023225fbaChris Lattner  case ISD::FNEG:
17622c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
17632c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    assert(Tmp1.getValueType() == NVT);
17642c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
17652c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // NOTE: we do not have to do any extra rounding here for
17662c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // NoExcessFPPrecision, because we know the input will have the appropriate
17672c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    // precision, and these operations don't modify precision at all.
17682c8086f4b9916b2d02842be5e375276023225fbaChris Lattner    break;
17692c8086f4b9916b2d02842be5e375276023225fbaChris Lattner
1770da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner  case ISD::FSQRT:
1771da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner  case ISD::FSIN:
1772da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner  case ISD::FCOS:
1773da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
1774da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner    assert(Tmp1.getValueType() == NVT);
1775da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
1776da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner    if(NoExcessFPPrecision)
177715e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner      Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result,
177815e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                           DAG.getValueType(VT));
1779da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner    break;
1780da6ba87d234a934409e8d8d5b131b7341ab4bf97Chris Lattner
178103c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::AND:
178203c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::OR:
178303c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::XOR:
17840f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::ADD:
17858b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SUB:
17860f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner  case ISD::MUL:
17870f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // The input may have strange things in the top bits of the registers, but
17880f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // these operations don't care.  They may have wierd bits going out, but
17890f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // that too is okay if they are integer operations.
17900f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
17910f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));
17920f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    assert(Tmp1.getValueType() == NVT && Tmp2.getValueType() == NVT);
17930f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1, Tmp2);
17940f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
17950f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // However, if this is a floating point operation, they will give excess
17960f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // precision that we may not be able to tolerate.  If we DO allow excess
17970f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    // precision, just leave it, otherwise excise it.
17988b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // FIXME: Why would we need to round FP ops more than integer ones?
17998b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    //     Is Round(Add(Add(A,B),C)) != Round(Add(Round(Add(A,B)), C))
18000f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    if (MVT::isFloatingPoint(NVT) && NoExcessFPPrecision)
180115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner      Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result,
180215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                           DAG.getValueType(VT));
18030f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner    break;
18040f69b2910810b7c0971a739f18b37fae2a20eca5Chris Lattner
18058b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SDIV:
18068b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SREM:
18078b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // These operators require that their input be sign extended.
18088b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
18098b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));
18108b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    if (MVT::isInteger(NVT)) {
181115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner      Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp1,
181215e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                         DAG.getValueType(VT));
181315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner      Tmp2 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp2,
181415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                         DAG.getValueType(VT));
18158b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    }
18168b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1, Tmp2);
18178b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
18188b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // Perform FP_ROUND: this is probably overly pessimistic.
18198b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    if (MVT::isFloatingPoint(NVT) && NoExcessFPPrecision)
182015e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner      Result = DAG.getNode(ISD::FP_ROUND_INREG, NVT, Result,
182115e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                           DAG.getValueType(VT));
18228b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
18238b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
18248b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::UDIV:
18258b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::UREM:
18268b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // These operators require that their input be zero extended.
18278b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
18288b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));
18298b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    assert(MVT::isInteger(NVT) && "Operators don't apply to FP!");
183023993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner    Tmp1 = DAG.getZeroExtendInReg(Tmp1, VT);
183123993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner    Tmp2 = DAG.getZeroExtendInReg(Tmp2, VT);
18328b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(Node->getOpcode(), NVT, Tmp1, Tmp2);
18338b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
18348b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner
18358b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SHL:
18368b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
18378b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
18388b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(ISD::SHL, NVT, Tmp1, Tmp2);
18398b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
18408b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SRA:
18418b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // The input value must be properly sign extended.
18428b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
184315e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner    Tmp1 = DAG.getNode(ISD::SIGN_EXTEND_INREG, NVT, Tmp1,
184415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                       DAG.getValueType(VT));
18458b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
18468b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(ISD::SRA, NVT, Tmp1, Tmp2);
18478b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
18488b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner  case ISD::SRL:
18498b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    // The input value must be properly zero extended.
18508b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp1 = PromoteOp(Node->getOperand(0));
185123993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner    Tmp1 = DAG.getZeroExtendInReg(Tmp1, VT);
18528b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));
18538b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    Result = DAG.getNode(ISD::SRL, NVT, Tmp1, Tmp2);
18548b6fa22e722e1de7522aae51d6cdd0f552d489daChris Lattner    break;
185503c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::LOAD:
185603c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));   // Legalize the chain.
185703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));   // Legalize the pointer.
1858232ee95a09a583b7d66b90ee7ddf7fdb9c194a04Chris Lattner    // FIXME: When the DAG combiner exists, change this to use EXTLOAD!
18596841dec8c1c071b5a417fb4172633c68301be36cChris Lattner    if (MVT::isInteger(NVT))
18605f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner      Result = DAG.getExtLoad(ISD::ZEXTLOAD, NVT, Tmp1, Tmp2,
18615f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                              Node->getOperand(2), VT);
18626841dec8c1c071b5a417fb4172633c68301be36cChris Lattner    else
18635f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner      Result = DAG.getExtLoad(ISD::EXTLOAD, NVT, Tmp1, Tmp2,
18645f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                              Node->getOperand(2), VT);
186503c8546ec57523970874917854a2fb77b1ff598eChris Lattner
186603c8546ec57523970874917854a2fb77b1ff598eChris Lattner    // Remember that we legalized the chain.
186703c8546ec57523970874917854a2fb77b1ff598eChris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
186803c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
186903c8546ec57523970874917854a2fb77b1ff598eChris Lattner  case ISD::SELECT:
187047e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
187147e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
187247e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
187347e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = LegalizeOp(Node->getOperand(0));// Legalize the condition.
187447e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
187547e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
187647e9223e06390897c3834f8c527001df392570ffChris Lattner      Tmp1 = PromoteOp(Node->getOperand(0)); // Promote the condition.
187747e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
187847e9223e06390897c3834f8c527001df392570ffChris Lattner    }
187903c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp2 = PromoteOp(Node->getOperand(1));   // Legalize the op0
188003c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Tmp3 = PromoteOp(Node->getOperand(2));   // Legalize the op1
188103c8546ec57523970874917854a2fb77b1ff598eChris Lattner    Result = DAG.getNode(ISD::SELECT, NVT, Tmp1, Tmp2, Tmp3);
188203c8546ec57523970874917854a2fb77b1ff598eChris Lattner    break;
1883d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner  case ISD::TAILCALL:
18848ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner  case ISD::CALL: {
18858ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    Tmp1 = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
18868ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    Tmp2 = LegalizeOp(Node->getOperand(1));  // Legalize the callee.
18878ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner
18883d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    std::vector<SDOperand> Ops;
18893d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i)
18903d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
18913d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
18928ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    assert(Node->getNumValues() == 2 && Op.ResNo == 0 &&
18938ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner           "Can only promote single result calls");
18948ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    std::vector<MVT::ValueType> RetTyVTs;
18958ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    RetTyVTs.reserve(2);
18968ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    RetTyVTs.push_back(NVT);
18978ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    RetTyVTs.push_back(MVT::Other);
1898d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner    SDNode *NC = DAG.getCall(RetTyVTs, Tmp1, Tmp2, Ops,
1899d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner                             Node->getOpcode() == ISD::TAILCALL);
19008ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    Result = SDOperand(NC, 0);
19018ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner
19028ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    // Insert the new chain mapping.
19038ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    AddLegalizedOperand(Op.getValue(1), Result.getValue(1));
19048ac532c55eb7f8698466f25d1a8a01240c44ec7dChris Lattner    break;
1905edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman  }
1906fecf095292991bdf9396fec474011446107f9813Andrew Lenharth  case ISD::CTPOP:
1907fecf095292991bdf9396fec474011446107f9813Andrew Lenharth  case ISD::CTTZ:
1908fecf095292991bdf9396fec474011446107f9813Andrew Lenharth  case ISD::CTLZ:
1909fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    Tmp1 = Node->getOperand(0);
1910fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    //Zero extend the argument
1911fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    Tmp1 = DAG.getNode(ISD::ZERO_EXTEND, NVT, Tmp1);
1912fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    // Perform the larger operation, then subtract if needed.
1913fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    Tmp1 = DAG.getNode(Node->getOpcode(), NVT, Tmp1);
1914fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    switch(Node->getOpcode())
1915fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    {
1916fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    case ISD::CTPOP:
1917fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      Result = Tmp1;
1918fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      break;
1919fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    case ISD::CTTZ:
1920fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      //if Tmp1 == sizeinbits(NVT) then Tmp1 = sizeinbits(Old VT)
1921fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      Tmp2 = DAG.getSetCC(ISD::SETEQ, MVT::i1, Tmp1,
1922fecf095292991bdf9396fec474011446107f9813Andrew Lenharth                          DAG.getConstant(getSizeInBits(NVT), NVT));
1923fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      Result = DAG.getNode(ISD::SELECT, NVT, Tmp2,
1924fecf095292991bdf9396fec474011446107f9813Andrew Lenharth                           DAG.getConstant(getSizeInBits(VT),NVT), Tmp1);
1925fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      break;
1926fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    case ISD::CTLZ:
1927fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      //Tmp1 = Tmp1 - (sizeinbits(NVT) - sizeinbits(Old VT))
1928fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      Result = DAG.getNode(ISD::SUB, NVT, Tmp1,
1929fecf095292991bdf9396fec474011446107f9813Andrew Lenharth                           DAG.getConstant(getSizeInBits(NVT) -
1930fecf095292991bdf9396fec474011446107f9813Andrew Lenharth                                           getSizeInBits(VT), NVT));
1931fecf095292991bdf9396fec474011446107f9813Andrew Lenharth      break;
1932fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    }
1933fecf095292991bdf9396fec474011446107f9813Andrew Lenharth    break;
193403c8546ec57523970874917854a2fb77b1ff598eChris Lattner  }
193503c8546ec57523970874917854a2fb77b1ff598eChris Lattner
193603c8546ec57523970874917854a2fb77b1ff598eChris Lattner  assert(Result.Val && "Didn't set a result!");
193703c8546ec57523970874917854a2fb77b1ff598eChris Lattner  AddPromotedOperand(Op, Result);
193803c8546ec57523970874917854a2fb77b1ff598eChris Lattner  return Result;
193903c8546ec57523970874917854a2fb77b1ff598eChris Lattner}
19403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
194184f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner/// ExpandAddSub - Find a clever way to expand this add operation into
194284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner/// subcomponents.
19434759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattnervoid SelectionDAGLegalize::
19444759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris LattnerExpandByParts(unsigned NodeOp, SDOperand LHS, SDOperand RHS,
19454759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner              SDOperand &Lo, SDOperand &Hi) {
194684f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  // Expand the subcomponents.
194784f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  SDOperand LHSL, LHSH, RHSL, RHSH;
194884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  ExpandOp(LHS, LHSL, LHSH);
194984f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  ExpandOp(RHS, RHSL, RHSH);
195084f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner
1951bd0781ed12dd817f760065e3ac2dcff12fb29440Chris Lattner  // FIXME: this should be moved to the dag combiner someday.
1952e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  assert(NodeOp == ISD::ADD_PARTS || NodeOp == ISD::SUB_PARTS);
1953e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  if (LHSL.getValueType() == MVT::i32) {
1954e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner    SDOperand LowEl;
1955e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(LHSL))
1956e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      if (C->getValue() == 0)
1957e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner        LowEl = RHSL;
1958e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner    if (ConstantSDNode *C = dyn_cast<ConstantSDNode>(RHSL))
1959e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      if (C->getValue() == 0)
1960e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner        LowEl = LHSL;
1961e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner    if (LowEl.Val) {
1962e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      // Turn this into an add/sub of the high part only.
1963e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      SDOperand HiEl =
1964e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner        DAG.getNode(NodeOp == ISD::ADD_PARTS ? ISD::ADD : ISD::SUB,
1965e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner                    LowEl.getValueType(), LHSH, RHSH);
1966e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      Lo = LowEl;
1967e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      Hi = HiEl;
1968e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner      return;
1969bd0781ed12dd817f760065e3ac2dcff12fb29440Chris Lattner    }
1970e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  }
1971bd0781ed12dd817f760065e3ac2dcff12fb29440Chris Lattner
197284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  std::vector<SDOperand> Ops;
197384f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(LHSL);
197484f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(LHSH);
197584f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(RHSL);
197684f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Ops.push_back(RHSH);
1977e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner
1978e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  std::vector<MVT::ValueType> VTs(2, LHSL.getValueType());
1979e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  Lo = DAG.getNode(NodeOp, VTs, Ops);
198084f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  Hi = Lo.getValue(1);
198184f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner}
198284f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner
19835b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattnervoid SelectionDAGLegalize::ExpandShiftParts(unsigned NodeOp,
19845b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner                                            SDOperand Op, SDOperand Amt,
19855b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner                                            SDOperand &Lo, SDOperand &Hi) {
19865b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  // Expand the subcomponents.
19875b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  SDOperand LHSL, LHSH;
19885b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  ExpandOp(Op, LHSL, LHSH);
19895b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner
19905b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  std::vector<SDOperand> Ops;
19915b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  Ops.push_back(LHSL);
19925b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  Ops.push_back(LHSH);
19935b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  Ops.push_back(Amt);
1994e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  std::vector<MVT::ValueType> VTs;
1995e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  VTs.push_back(LHSL.getValueType());
1996e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  VTs.push_back(LHSH.getValueType());
1997e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  VTs.push_back(Amt.getValueType());
1998e89083a9300dc463e3b79eabe2b9913d85338d28Chris Lattner  Lo = DAG.getNode(NodeOp, VTs, Ops);
19995b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner  Hi = Lo.getValue(1);
20005b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner}
20015b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner
20025b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner
2003e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// ExpandShift - Try to find a clever way to expand this shift operation out to
2004e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// smaller elements.  If we can't find a way that is more efficient than a
2005e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// libcall on this target, return false.  Otherwise, return true with the
2006e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner/// low-parts expanded into Lo and Hi.
2007e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattnerbool SelectionDAGLegalize::ExpandShift(unsigned Opc, SDOperand Op,SDOperand Amt,
2008e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                                       SDOperand &Lo, SDOperand &Hi) {
2009e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  assert((Opc == ISD::SHL || Opc == ISD::SRA || Opc == ISD::SRL) &&
2010e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner         "This is not a shift!");
2011f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman
2012e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  MVT::ValueType NVT = TLI.getTypeToTransformTo(Op.getValueType());
2013f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  SDOperand ShAmt = LegalizeOp(Amt);
2014f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  MVT::ValueType ShTy = ShAmt.getValueType();
2015f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  unsigned VTBits = MVT::getSizeInBits(Op.getValueType());
2016f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  unsigned NVTBits = MVT::getSizeInBits(NVT);
2017f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman
2018f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  // Handle the case when Amt is an immediate.  Other cases are currently broken
2019f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  // and are disabled.
2020f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Amt.Val)) {
2021f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    unsigned Cst = CN->getValue();
2022f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    // Expand the incoming operand to be shifted, so that we have its parts
2023f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    SDOperand InL, InH;
2024f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    ExpandOp(Op, InL, InH);
2025f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    switch(Opc) {
2026f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    case ISD::SHL:
2027f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      if (Cst > VTBits) {
2028f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Lo = DAG.getConstant(0, NVT);
2029f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Hi = DAG.getConstant(0, NVT);
2030f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      } else if (Cst > NVTBits) {
2031f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Lo = DAG.getConstant(0, NVT);
2032f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Hi = DAG.getNode(ISD::SHL, NVT, InL, DAG.getConstant(Cst-NVTBits,ShTy));
2033ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner      } else if (Cst == NVTBits) {
2034ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner        Lo = DAG.getConstant(0, NVT);
2035ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner        Hi = InL;
2036f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      } else {
2037f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Lo = DAG.getNode(ISD::SHL, NVT, InL, DAG.getConstant(Cst, ShTy));
2038f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Hi = DAG.getNode(ISD::OR, NVT,
2039f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman           DAG.getNode(ISD::SHL, NVT, InH, DAG.getConstant(Cst, ShTy)),
2040f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman           DAG.getNode(ISD::SRL, NVT, InL, DAG.getConstant(NVTBits-Cst, ShTy)));
2041f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      }
2042f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      return true;
2043f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    case ISD::SRL:
2044f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      if (Cst > VTBits) {
2045f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Lo = DAG.getConstant(0, NVT);
2046f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Hi = DAG.getConstant(0, NVT);
2047f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      } else if (Cst > NVTBits) {
2048f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Lo = DAG.getNode(ISD::SRL, NVT, InH, DAG.getConstant(Cst-NVTBits,ShTy));
2049f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Hi = DAG.getConstant(0, NVT);
2050ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner      } else if (Cst == NVTBits) {
2051ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner        Lo = InH;
2052ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner        Hi = DAG.getConstant(0, NVT);
2053f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      } else {
2054f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Lo = DAG.getNode(ISD::OR, NVT,
2055f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman           DAG.getNode(ISD::SRL, NVT, InL, DAG.getConstant(Cst, ShTy)),
2056f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman           DAG.getNode(ISD::SHL, NVT, InH, DAG.getConstant(NVTBits-Cst, ShTy)));
2057f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Hi = DAG.getNode(ISD::SRL, NVT, InH, DAG.getConstant(Cst, ShTy));
2058f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      }
2059f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      return true;
2060f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    case ISD::SRA:
2061f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      if (Cst > VTBits) {
2062edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        Hi = Lo = DAG.getNode(ISD::SRA, NVT, InH,
2063f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman                              DAG.getConstant(NVTBits-1, ShTy));
2064f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      } else if (Cst > NVTBits) {
2065edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        Lo = DAG.getNode(ISD::SRA, NVT, InH,
2066f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman                           DAG.getConstant(Cst-NVTBits, ShTy));
2067edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        Hi = DAG.getNode(ISD::SRA, NVT, InH,
2068f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman                              DAG.getConstant(NVTBits-1, ShTy));
2069ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner      } else if (Cst == NVTBits) {
2070ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner        Lo = InH;
2071edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman        Hi = DAG.getNode(ISD::SRA, NVT, InH,
2072ee27f57a6a4dd7fa9259b3604f563907da1f65efChris Lattner                              DAG.getConstant(NVTBits-1, ShTy));
2073f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      } else {
2074f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Lo = DAG.getNode(ISD::OR, NVT,
2075f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman           DAG.getNode(ISD::SRL, NVT, InL, DAG.getConstant(Cst, ShTy)),
2076f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman           DAG.getNode(ISD::SHL, NVT, InH, DAG.getConstant(NVTBits-Cst, ShTy)));
2077f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman        Hi = DAG.getNode(ISD::SRA, NVT, InH, DAG.getConstant(Cst, ShTy));
2078f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      }
2079f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman      return true;
2080f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman    }
2081f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  }
2082f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  // FIXME: The following code for expanding shifts using ISD::SELECT is buggy,
2083f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  // so disable it for now.  Currently targets are handling this via SHL_PARTS
2084f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  // and friends.
2085f1fe32e337cf825a27a57bb3e9fb847bc91a26ceNate Begeman  return false;
2086e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2087e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  // If we have an efficient select operation (or if the selects will all fold
2088e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  // away), lower to some complex code, otherwise just emit the libcall.
2089e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  if (TLI.getOperationAction(ISD::SELECT, NVT) != TargetLowering::Legal &&
2090e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      !isa<ConstantSDNode>(Amt))
2091e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    return false;
2092e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2093e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  SDOperand InL, InH;
2094e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  ExpandOp(Op, InL, InH);
2095e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  SDOperand NAmt = DAG.getNode(ISD::SUB, ShTy,           // NAmt = 32-ShAmt
2096e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getConstant(NVTBits, ShTy), ShAmt);
2097e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2098e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner  // Compare the unmasked shift amount against 32.
2099e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner  SDOperand Cond = DAG.getSetCC(ISD::SETGE, TLI.getSetCCResultTy(), ShAmt,
2100e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner                                DAG.getConstant(NVTBits, ShTy));
2101e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner
2102e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  if (TLI.getShiftAmountFlavor() != TargetLowering::Mask) {
2103e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    ShAmt = DAG.getNode(ISD::AND, ShTy, ShAmt,             // ShAmt &= 31
2104e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                        DAG.getConstant(NVTBits-1, ShTy));
2105e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    NAmt  = DAG.getNode(ISD::AND, ShTy, NAmt,              // NAmt &= 31
2106e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                        DAG.getConstant(NVTBits-1, ShTy));
2107e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  }
2108e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2109e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  if (Opc == ISD::SHL) {
2110e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    SDOperand T1 = DAG.getNode(ISD::OR, NVT,// T1 = (Hi << Amt) | (Lo >> NAmt)
2111e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getNode(ISD::SHL, NVT, InH, ShAmt),
2112e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getNode(ISD::SRL, NVT, InL, NAmt));
2113e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner    SDOperand T2 = DAG.getNode(ISD::SHL, NVT, InL, ShAmt); // T2 = Lo << Amt&31
2114edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
2115e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    Hi = DAG.getNode(ISD::SELECT, NVT, Cond, T2, T1);
2116e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, Cond, DAG.getConstant(0, NVT), T2);
2117e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  } else {
211877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    SDOperand HiLoPart = DAG.getNode(ISD::SELECT, NVT,
211977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                     DAG.getSetCC(ISD::SETEQ,
212077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                                  TLI.getSetCCResultTy(), NAmt,
212177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                                  DAG.getConstant(32, ShTy)),
212277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                     DAG.getConstant(0, NVT),
212377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                     DAG.getNode(ISD::SHL, NVT, InH, NAmt));
2124e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    SDOperand T1 = DAG.getNode(ISD::OR, NVT,// T1 = (Hi << NAmt) | (Lo >> Amt)
212577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                               HiLoPart,
2126e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner                               DAG.getNode(ISD::SRL, NVT, InL, ShAmt));
2127e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner    SDOperand T2 = DAG.getNode(Opc, NVT, InH, ShAmt);  // T2 = InH >> ShAmt&31
2128e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2129e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    SDOperand HiPart;
213077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (Opc == ISD::SRA)
213177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      HiPart = DAG.getNode(ISD::SRA, NVT, InH,
213277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                           DAG.getConstant(NVTBits-1, ShTy));
2133e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    else
2134e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      HiPart = DAG.getConstant(0, NVT);
2135e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, Cond, T2, T1);
2136e5544f851a2a3f7b06339b132e60ad2f2d53e7b8Chris Lattner    Hi = DAG.getNode(ISD::SELECT, NVT, Cond, HiPart, T2);
2137e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  }
2138e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  return true;
2139e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner}
214077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
21419530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner/// FindLatestCallSeqStart - Scan up the dag to find the latest (highest
21429530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner/// NodeDepth) node that is an CallSeqStart operation and occurs later than
21439c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// Found.
21449530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattnerstatic void FindLatestCallSeqStart(SDNode *Node, SDNode *&Found) {
21459c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Node->getNodeDepth() <= Found->getNodeDepth()) return;
21469c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
214716cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  // If we found an CALLSEQ_START, we already know this node occurs later
21489c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // than the Found node. Just remember this node and return.
214916cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  if (Node->getOpcode() == ISD::CALLSEQ_START) {
21509c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    Found = Node;
21519c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    return;
21529c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  }
21539c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21549c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Otherwise, scan the operands of Node to see if any of them is a call.
21559c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  assert(Node->getNumOperands() != 0 &&
21569c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner         "All leaves should have depth equal to the entry node!");
21579c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  for (unsigned i = 0, e = Node->getNumOperands()-1; i != e; ++i)
21589530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner    FindLatestCallSeqStart(Node->getOperand(i).Val, Found);
21599c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21609c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Tail recurse for the last iteration.
21619530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  FindLatestCallSeqStart(Node->getOperand(Node->getNumOperands()-1).Val,
21629c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner                             Found);
21639c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
21649c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21659c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21669530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner/// FindEarliestCallSeqEnd - Scan down the dag to find the earliest (lowest
21679530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner/// NodeDepth) node that is an CallSeqEnd operation and occurs more recent
21689c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// than Found.
21699530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattnerstatic void FindEarliestCallSeqEnd(SDNode *Node, SDNode *&Found) {
21709c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Found && Node->getNodeDepth() >= Found->getNodeDepth()) return;
21719c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
217216cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  // If we found an CALLSEQ_END, we already know this node occurs earlier
21739c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // than the Found node. Just remember this node and return.
217416cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  if (Node->getOpcode() == ISD::CALLSEQ_END) {
21759c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    Found = Node;
21769c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    return;
21779c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  }
21789c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21799c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Otherwise, scan the operands of Node to see if any of them is a call.
21809c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode::use_iterator UI = Node->use_begin(), E = Node->use_end();
21819c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (UI == E) return;
21829c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  for (--E; UI != E; ++UI)
21839530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner    FindEarliestCallSeqEnd(*UI, Found);
21849c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21859c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  // Tail recurse for the last iteration.
21869530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  FindEarliestCallSeqEnd(*UI, Found);
21879c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
21889c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21899530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner/// FindCallSeqEnd - Given a chained node that is part of a call sequence,
219016cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner/// find the CALLSEQ_END node that terminates the call sequence.
21919530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattnerstatic SDNode *FindCallSeqEnd(SDNode *Node) {
219216cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  if (Node->getOpcode() == ISD::CALLSEQ_END)
21939c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    return Node;
2194f4b457987fca50a1dc86e1a60dad2cff2b060945Chris Lattner  if (Node->use_empty())
21959530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner    return 0;   // No CallSeqEnd
21969c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
21979c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  if (Node->hasOneUse())  // Simple case, only has one user to check.
21989530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner    return FindCallSeqEnd(*Node->use_begin());
2199edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
22009c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDOperand TheChain(Node, Node->getNumValues()-1);
22012789bde57f4245f4418a2d8d54e7f372b71f0a7dChris Lattner  if (TheChain.getValueType() != MVT::Other)
22022789bde57f4245f4418a2d8d54e7f372b71f0a7dChris Lattner    TheChain = SDOperand(Node, 0);
22039c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  assert(TheChain.getValueType() == MVT::Other && "Is not a token chain!");
2204edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
2205edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman  for (SDNode::use_iterator UI = Node->use_begin(),
22069c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner         E = Node->use_end(); ; ++UI) {
220716cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner    assert(UI != E && "Didn't find a user of the tokchain, no CALLSEQ_END!");
2208edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
22099c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    // Make sure to only follow users of our token chain.
22109c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    SDNode *User = *UI;
22119c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner    for (unsigned i = 0, e = User->getNumOperands(); i != e; ++i)
22129c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner      if (User->getOperand(i) == TheChain)
2213eb516e7f0aa3223eab7967f4c0f8132d82efd841Chris Lattner        if (SDNode *Result = FindCallSeqEnd(User))
2214eb516e7f0aa3223eab7967f4c0f8132d82efd841Chris Lattner          return Result;
22159c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  }
22169c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  assert(0 && "Unreachable");
22179c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  abort();
22189c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
22199c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
22209530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner/// FindCallSeqStart - Given a chained node that is part of a call sequence,
222116cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner/// find the CALLSEQ_START node that initiates the call sequence.
22229530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattnerstatic SDNode *FindCallSeqStart(SDNode *Node) {
22239530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  assert(Node && "Didn't find callseq_start for a call??");
222416cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  if (Node->getOpcode() == ISD::CALLSEQ_START) return Node;
22250d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
22260d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  assert(Node->getOperand(0).getValueType() == MVT::Other &&
22270d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner         "Node doesn't have a token chain argument!");
22289530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  return FindCallSeqStart(Node->getOperand(0).Val);
22290d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner}
22300d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
22310d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
22329c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// FindInputOutputChains - If we are replacing an operation with a call we need
22339c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner/// to find the call that occurs before and the call that occurs after it to
22340d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner/// properly serialize the calls in the block.  The returned operand is the
22350d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner/// input chain value for the new call (e.g. the entry node or the previous
22360d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner/// call), and OutChain is set to be the chain node to update to point to the
22370d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner/// end of the call chain.
22389c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattnerstatic SDOperand FindInputOutputChains(SDNode *OpNode, SDNode *&OutChain,
22399c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner                                       SDOperand Entry) {
22409530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  SDNode *LatestCallSeqStart = Entry.Val;
22419530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  SDNode *LatestCallSeqEnd = 0;
22429530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  FindLatestCallSeqStart(OpNode, LatestCallSeqStart);
22439530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  //std::cerr<<"Found node: "; LatestCallSeqStart->dump(); std::cerr <<"\n";
2244edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
224516cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  // It is possible that no ISD::CALLSEQ_START was found because there is no
2246c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman  // previous call in the function.  LatestCallStackDown may in that case be
224716cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  // the entry node itself.  Do not attempt to find a matching CALLSEQ_END
224816cd04d26c53c6f81313cafb85f6c0e7a07cdff6Chris Lattner  // unless LatestCallStackDown is an CALLSEQ_START.
22499530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  if (LatestCallSeqStart->getOpcode() == ISD::CALLSEQ_START)
22509530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner    LatestCallSeqEnd = FindCallSeqEnd(LatestCallSeqStart);
2251c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman  else
22529530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner    LatestCallSeqEnd = Entry.Val;
22539530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  assert(LatestCallSeqEnd && "NULL return from FindCallSeqEnd");
2254edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
22550d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  // Finally, find the first call that this must come before, first we find the
22569530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  // CallSeqEnd that ends the call.
22570d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  OutChain = 0;
22589530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  FindEarliestCallSeqEnd(OpNode, OutChain);
22599c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
22609530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  // If we found one, translate from the adj up to the callseq_start.
22610d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  if (OutChain)
22629530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner    OutChain = FindCallSeqStart(OutChain);
22639c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
22649530ddcc605cb65d0a19bbfbfb8b73b09c4e4cfaChris Lattner  return SDOperand(LatestCallSeqEnd, 0);
22659c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner}
22669c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
22670d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner/// SpliceCallInto - Given the result chain of a libcall (CallResult), and a
2268b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattnervoid SelectionDAGLegalize::SpliceCallInto(const SDOperand &CallResult,
2269b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattner                                          SDNode *OutChain) {
22700d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  // Nothing to splice it into?
22710d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  if (OutChain == 0) return;
22720d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
22730d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  assert(OutChain->getOperand(0).getValueType() == MVT::Other);
22740d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  //OutChain->dump();
22750d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
22760d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  // Form a token factor node merging the old inval and the new inval.
22770d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  SDOperand InToken = DAG.getNode(ISD::TokenFactor, MVT::Other, CallResult,
22780d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner                                  OutChain->getOperand(0));
22790d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  // Change the node to refer to the new token.
22800d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  OutChain->setAdjCallChain(InToken);
22810d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner}
22829c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
22839c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
228477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// ExpandLibCall - Expand a node into a call to a libcall.  If the result value
228577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// does not fit into a register, return the lo part and set the hi part to the
228677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// by-reg argument.  If it does fit into a single register, return the result
228777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner// and leave the Hi part unset.
228877e77a6aa0ab25a812947aed477220dd11220a18Chris LattnerSDOperand SelectionDAGLegalize::ExpandLibCall(const char *Name, SDNode *Node,
228977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner                                              SDOperand &Hi) {
22909c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDNode *OutChain;
22919c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SDOperand InChain = FindInputOutputChains(Node, OutChain,
22929c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner                                            DAG.getEntryNode());
2293f4b457987fca50a1dc86e1a60dad2cff2b060945Chris Lattner  if (InChain.Val == 0)
2294f4b457987fca50a1dc86e1a60dad2cff2b060945Chris Lattner    InChain = DAG.getEntryNode();
22959c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
229677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  TargetLowering::ArgListTy Args;
229777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  for (unsigned i = 0, e = Node->getNumOperands(); i != e; ++i) {
229877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    MVT::ValueType ArgVT = Node->getOperand(i).getValueType();
229977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    const Type *ArgTy = MVT::getTypeForValueType(ArgVT);
230077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Args.push_back(std::make_pair(Node->getOperand(i), ArgTy));
230177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  }
230277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand Callee = DAG.getExternalSymbol(Name, TLI.getPointerTy());
2303edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
23040d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  // Splice the libcall in wherever FindInputOutputChains tells us to.
230577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  const Type *RetTy = MVT::getTypeForValueType(Node->getValueType(0));
23060d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  std::pair<SDOperand,SDOperand> CallInfo =
2307adf6a965a321372c640845407195594835921eb4Chris Lattner    TLI.LowerCallTo(InChain, RetTy, false, CallingConv::C, false,
2308adf6a965a321372c640845407195594835921eb4Chris Lattner                    Callee, Args, DAG);
2309b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattner  SpliceCallInto(CallInfo.second, OutChain);
2310b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattner
2311b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattner  NeedsAnotherIteration = true;
23120d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
23130d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  switch (getTypeAction(CallInfo.first.getValueType())) {
231477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  default: assert(0 && "Unknown thing");
231577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case Legal:
23160d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner    return CallInfo.first;
231777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case Promote:
231877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    assert(0 && "Cannot promote this yet!");
231977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case Expand:
232077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    SDOperand Lo;
23210d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner    ExpandOp(CallInfo.first, Lo, Hi);
232277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    return Lo;
232377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  }
232477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner}
232577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
23269c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner
232777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner/// ExpandIntToFP - Expand a [US]INT_TO_FP operation, assuming that the
232877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner/// destination type is legal.
232977e77a6aa0ab25a812947aed477220dd11220a18Chris LattnerSDOperand SelectionDAGLegalize::
233077e77a6aa0ab25a812947aed477220dd11220a18Chris LattnerExpandIntToFP(bool isSigned, MVT::ValueType DestTy, SDOperand Source) {
233177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  assert(getTypeAction(DestTy) == Legal && "Destination type is not legal!");
233277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  assert(getTypeAction(Source.getValueType()) == Expand &&
233377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner         "This is not an expansion!");
233477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  assert(Source.getValueType() == MVT::i64 && "Only handle expand from i64!");
233577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
23360d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  if (!isSigned) {
2337e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    assert(Source.getValueType() == MVT::i64 &&
2338e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner           "This only works for 64-bit -> FP");
2339e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    // The 64-bit value loaded will be incorrectly if the 'sign bit' of the
2340e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    // incoming integer is set.  To handle this, we dynamically test to see if
2341e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    // it is set, and, if so, add a fudge factor.
2342e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    SDOperand Lo, Hi;
2343e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    ExpandOp(Source, Lo, Hi);
2344e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner
234566de05b606cf31f1f23ed0c4eb1f097738cd1506Chris Lattner    // If this is unsigned, and not supported, first perform the conversion to
234666de05b606cf31f1f23ed0c4eb1f097738cd1506Chris Lattner    // signed, then adjust the result if the sign bit is set.
234766de05b606cf31f1f23ed0c4eb1f097738cd1506Chris Lattner    SDOperand SignedConv = ExpandIntToFP(true, DestTy,
234866de05b606cf31f1f23ed0c4eb1f097738cd1506Chris Lattner                   DAG.getNode(ISD::BUILD_PAIR, Source.getValueType(), Lo, Hi));
234966de05b606cf31f1f23ed0c4eb1f097738cd1506Chris Lattner
2350e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    SDOperand SignSet = DAG.getSetCC(ISD::SETLT, TLI.getSetCCResultTy(), Hi,
2351e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner                                     DAG.getConstant(0, Hi.getValueType()));
2352e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    SDOperand Zero = getIntPtrConstant(0), Four = getIntPtrConstant(4);
2353e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    SDOperand CstOffset = DAG.getNode(ISD::SELECT, Zero.getValueType(),
2354e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner                                      SignSet, Four, Zero);
2355383203b0036b8fdeef8119975fdbbd528b760adbChris Lattner    uint64_t FF = 0x5f800000ULL;
2356383203b0036b8fdeef8119975fdbbd528b760adbChris Lattner    if (TLI.isLittleEndian()) FF <<= 32;
2357383203b0036b8fdeef8119975fdbbd528b760adbChris Lattner    static Constant *FudgeFactor = ConstantUInt::get(Type::ULongTy, FF);
2358e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner
2359e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    MachineConstantPool *CP = DAG.getMachineFunction().getConstantPool();
2360e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    SDOperand CPIdx = DAG.getConstantPool(CP->getConstantPoolIndex(FudgeFactor),
2361e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner                                          TLI.getPointerTy());
2362e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    CPIdx = DAG.getNode(ISD::ADD, TLI.getPointerTy(), CPIdx, CstOffset);
2363e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    SDOperand FudgeInReg;
2364e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    if (DestTy == MVT::f32)
236552d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner      FudgeInReg = DAG.getLoad(MVT::f32, DAG.getEntryNode(), CPIdx,
236652d08bd9d8a8dcc06148525c7fad6f2ebcad0a42Chris Lattner                               DAG.getSrcValue(NULL));
2367e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    else {
2368e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner      assert(DestTy == MVT::f64 && "Unexpected conversion");
23695f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner      FudgeInReg = DAG.getExtLoad(ISD::EXTLOAD, MVT::f64, DAG.getEntryNode(),
23705f056bf4b862a7c31388a68711dd3b3ed5de2be8Chris Lattner                                  CPIdx, DAG.getSrcValue(NULL), MVT::f32);
2371e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    }
2372e9c35e7309a8293852ba71d874fa4dc99e07e6feChris Lattner    return DAG.getNode(ISD::ADD, DestTy, SignedConv, FudgeInReg);
237377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  }
23740d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
2375a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner  // Check to see if the target has a custom way to lower this.  If so, use it.
2376a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner  switch (TLI.getOperationAction(ISD::SINT_TO_FP, Source.getValueType())) {
2377a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner  default: assert(0 && "This action not implemented for this operation!");
2378a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner  case TargetLowering::Legal:
2379a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner  case TargetLowering::Expand:
2380a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner    break;   // This case is handled below.
2381a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner  case TargetLowering::Custom:
2382a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner    Source = DAG.getNode(ISD::SINT_TO_FP, DestTy, Source);
238350381b6c4180e9a2b983d4623da2e485cd768632Chris Lattner    return LegalizeOp(TLI.LowerOperation(Source, DAG));
2384a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner  }
2385a88a260dbd874a3bdd3e47f4f15ab0d7c7803044Chris Lattner
238613689e2009e71f7982d1313ed699e0e6a50157d0Chris Lattner  // Expand the source, then glue it back together for the call.  We must expand
238713689e2009e71f7982d1313ed699e0e6a50157d0Chris Lattner  // the source in case it is shared (this pass of legalize must traverse it).
238813689e2009e71f7982d1313ed699e0e6a50157d0Chris Lattner  SDOperand SrcLo, SrcHi;
238913689e2009e71f7982d1313ed699e0e6a50157d0Chris Lattner  ExpandOp(Source, SrcLo, SrcHi);
239013689e2009e71f7982d1313ed699e0e6a50157d0Chris Lattner  Source = DAG.getNode(ISD::BUILD_PAIR, Source.getValueType(), SrcLo, SrcHi);
239113689e2009e71f7982d1313ed699e0e6a50157d0Chris Lattner
23920d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  SDNode *OutChain = 0;
23930d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  SDOperand InChain = FindInputOutputChains(Source.Val, OutChain,
23940d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner                                            DAG.getEntryNode());
23950d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  const char *FnName = 0;
23960d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  if (DestTy == MVT::f32)
23970d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner    FnName = "__floatdisf";
23980d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  else {
23990d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner    assert(DestTy == MVT::f64 && "Unknown fp value type!");
24000d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner    FnName = "__floatdidf";
24010d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  }
24020d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
240377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  SDOperand Callee = DAG.getExternalSymbol(FnName, TLI.getPointerTy());
240477e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
240577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  TargetLowering::ArgListTy Args;
240677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  const Type *ArgTy = MVT::getTypeForValueType(Source.getValueType());
240744d105b7faf5672a2af61a3f0fdfed0d437d5777Chris Lattner
240877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  Args.push_back(std::make_pair(Source, ArgTy));
240977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner
241077e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // We don't care about token chains for libcalls.  We just use the entry
241177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // node as our input and ignore the output chain.  This allows us to place
241277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  // calls wherever we need them to satisfy data dependences.
241377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  const Type *RetTy = MVT::getTypeForValueType(DestTy);
24140d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
24150d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  std::pair<SDOperand,SDOperand> CallResult =
2416adf6a965a321372c640845407195594835921eb4Chris Lattner    TLI.LowerCallTo(InChain, RetTy, false, CallingConv::C, true,
2417adf6a965a321372c640845407195594835921eb4Chris Lattner                    Callee, Args, DAG);
24180d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner
2419b9fa3bc8f39bf1e8df48b85eae4563032dd20bfcChris Lattner  SpliceCallInto(CallResult.second, OutChain);
24200d67f0c80f0295aa44f826ec1402ea73d6b4bd22Chris Lattner  return CallResult.first;
242177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner}
2422edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
2423e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2424e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
24253e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// ExpandOp - Expand the specified SDOperand into its two component pieces
24263e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// Lo&Hi.  Note that the Op MUST be an expanded type.  As a result of this, the
24273e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// LegalizeNodes map is filled in for any results that are not expanded, the
24283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// ExpandedNodes map is filled in for any results that are expanded, and the
24293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner/// Lo/Hi values are returned.
24303e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattnervoid SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
24313e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  MVT::ValueType VT = Op.getValueType();
243271c42a0190300a8903aaea80467b88f15f327ea9Chris Lattner  MVT::ValueType NVT = TLI.getTypeToTransformTo(VT);
24333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  SDNode *Node = Op.Val;
24343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(getTypeAction(VT) == Expand && "Not an expanded type!");
24353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(MVT::isInteger(VT) && "Cannot expand FP values!");
24363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  assert(MVT::isInteger(NVT) && NVT < VT &&
24373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner         "Cannot expand to FP value or to larger int value!");
24383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
24393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // If there is more than one use of this, see if we already expanded it.
24403e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // There is no use remembering values that only have a single use, as the map
24413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // entries will never be reused.
24423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  if (!Node->hasOneUse()) {
24433e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::map<SDOperand, std::pair<SDOperand, SDOperand> >::iterator I
24443e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      = ExpandedNodes.find(Op);
24453e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (I != ExpandedNodes.end()) {
24463e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Lo = I->second.first;
24473e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      Hi = I->second.second;
24483e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      return;
24493e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    }
245045982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner  } else {
245145982dad53cd184fe8947a1b0206b0b16964f359Chris Lattner    assert(!ExpandedNodes.count(Op) && "Re-expanding a node!");
24523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
24533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
24544e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  // Expanding to multiple registers needs to perform an optimization step, and
24554e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  // is not careful to avoid operations the target does not support.  Make sure
24564e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  // that all generated operations are legalized in the next iteration.
24574e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  NeedsAnotherIteration = true;
24583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
24593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  switch (Node->getOpcode()) {
24603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  default:
24613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::cerr << "NODE: "; Node->dump(); std::cerr << "\n";
24623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(0 && "Do not know how to expand this operator!");
24633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    abort();
2464fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman  case ISD::UNDEF:
2465fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    Lo = DAG.getNode(ISD::UNDEF, NVT);
2466fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    Hi = DAG.getNode(ISD::UNDEF, NVT);
2467fc1b1dad88a256ab5ab16dd548ad82df8efa2ca9Nate Begeman    break;
24683e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::Constant: {
24693e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    uint64_t Cst = cast<ConstantSDNode>(Node)->getValue();
24703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getConstant(Cst, NVT);
24713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getConstant(Cst >> MVT::getSizeInBits(NVT), NVT);
24723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
24733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
24743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
24753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::CopyFromReg: {
247618c2f13e0f9d0e5d6227cf6d1881e9ee3d1b6109Chris Lattner    unsigned Reg = cast<RegSDNode>(Node)->getReg();
24773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Aggregate register values are always in consequtive pairs.
247869a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    Lo = DAG.getCopyFromReg(Reg, NVT, Node->getOperand(0));
247969a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    Hi = DAG.getCopyFromReg(Reg+1, NVT, Lo.getValue(1));
2480edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
248169a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    // Remember that we legalized the chain.
248269a52155d2eff066b49dbac385113002fd9dba14Chris Lattner    AddLegalizedOperand(Op.getValue(1), Hi.getValue(1));
248369a52155d2eff066b49dbac385113002fd9dba14Chris Lattner
24843e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(isTypeLegal(NVT) && "Cannot expand this multiple times yet!");
24853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
24863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
24873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2488d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner  case ISD::BUILD_PAIR:
2489d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    // Legalize both operands.  FIXME: in the future we should handle the case
2490d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    // where the two elements are not legal.
2491d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    assert(isTypeLegal(NVT) && "Cannot expand this multiple times yet!");
2492d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    Lo = LegalizeOp(Node->getOperand(0));
2493d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    Hi = LegalizeOp(Node->getOperand(1));
2494d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner    break;
2495d4e50bb2e23b8f9ddde629a28dab3bcdaf0633e4Chris Lattner
2496edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner  case ISD::CTPOP:
2497edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner    ExpandOp(Node->getOperand(0), Lo, Hi);
24989b583b49103f21888ac3de3f7941a98a63a23aeaChris Lattner    Lo = DAG.getNode(ISD::ADD, NVT,          // ctpop(HL) -> ctpop(H)+ctpop(L)
24999b583b49103f21888ac3de3f7941a98a63a23aeaChris Lattner                     DAG.getNode(ISD::CTPOP, NVT, Lo),
25009b583b49103f21888ac3de3f7941a98a63a23aeaChris Lattner                     DAG.getNode(ISD::CTPOP, NVT, Hi));
2501edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner    Hi = DAG.getConstant(0, NVT);
2502edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner    break;
2503edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner
250439a8f336305a492fc6d2625f39f08968185616d2Chris Lattner  case ISD::CTLZ: {
250539a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    // ctlz (HL) -> ctlz(H) != 32 ? ctlz(H) : (ctlz(L)+32)
25063becf2026bec881a60cbbe0031d8c51f4d6d4e28Chris Lattner    ExpandOp(Node->getOperand(0), Lo, Hi);
250739a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand BitsC = DAG.getConstant(MVT::getSizeInBits(NVT), NVT);
250839a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand HLZ = DAG.getNode(ISD::CTLZ, NVT, Hi);
250939a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand TopNotZero = DAG.getSetCC(ISD::SETNE, TLI.getSetCCResultTy(),
251039a8f336305a492fc6d2625f39f08968185616d2Chris Lattner                                        HLZ, BitsC);
251139a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand LowPart = DAG.getNode(ISD::CTLZ, NVT, Lo);
251239a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    LowPart = DAG.getNode(ISD::ADD, NVT, LowPart, BitsC);
251339a8f336305a492fc6d2625f39f08968185616d2Chris Lattner
251439a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, TopNotZero, HLZ, LowPart);
251539a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    Hi = DAG.getConstant(0, NVT);
251639a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    break;
251739a8f336305a492fc6d2625f39f08968185616d2Chris Lattner  }
251839a8f336305a492fc6d2625f39f08968185616d2Chris Lattner
251939a8f336305a492fc6d2625f39f08968185616d2Chris Lattner  case ISD::CTTZ: {
252039a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    // cttz (HL) -> cttz(L) != 32 ? cttz(L) : (cttz(H)+32)
25213becf2026bec881a60cbbe0031d8c51f4d6d4e28Chris Lattner    ExpandOp(Node->getOperand(0), Lo, Hi);
252239a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand BitsC = DAG.getConstant(MVT::getSizeInBits(NVT), NVT);
252339a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand LTZ = DAG.getNode(ISD::CTTZ, NVT, Lo);
252439a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand BotNotZero = DAG.getSetCC(ISD::SETNE, TLI.getSetCCResultTy(),
252539a8f336305a492fc6d2625f39f08968185616d2Chris Lattner                                        LTZ, BitsC);
252639a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    SDOperand HiPart = DAG.getNode(ISD::CTTZ, NVT, Hi);
252739a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    HiPart = DAG.getNode(ISD::ADD, NVT, HiPart, BitsC);
252839a8f336305a492fc6d2625f39f08968185616d2Chris Lattner
252939a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, BotNotZero, LTZ, HiPart);
253039a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    Hi = DAG.getConstant(0, NVT);
253139a8f336305a492fc6d2625f39f08968185616d2Chris Lattner    break;
253239a8f336305a492fc6d2625f39f08968185616d2Chris Lattner  }
2533edb1add9a093efa266c94b6d0a34c26f5b2d5d7bChris Lattner
25343e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::LOAD: {
25353e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Ch = LegalizeOp(Node->getOperand(0));   // Legalize the chain.
25363e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Ptr = LegalizeOp(Node->getOperand(1));  // Legalize the pointer.
25372d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth    Lo = DAG.getLoad(NVT, Ch, Ptr, Node->getOperand(2));
25383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
25393e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Increment the pointer to the other half.
254038d6be5d49e61e4be9bb12ee3cedf2a4fcddb8f3Chris Lattner    unsigned IncrementSize = MVT::getSizeInBits(Lo.getValueType())/8;
25413e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Ptr = DAG.getNode(ISD::ADD, Ptr.getValueType(), Ptr,
25423e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                      getIntPtrConstant(IncrementSize));
25432d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth    //Is this safe?  declaring that the two parts of the split load
25442d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth    //are from the same instruction?
25452d86ea21dd76647cb054fd5d27df9e49efc672b6Andrew Lenharth    Hi = DAG.getLoad(NVT, Ch, Ptr, Node->getOperand(2));
2546ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner
2547ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    // Build a factor node to remember that this load is independent of the
2548ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    // other one.
2549ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    SDOperand TF = DAG.getNode(ISD::TokenFactor, MVT::Other, Lo.getValue(1),
2550ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner                               Hi.getValue(1));
2551edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
25523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Remember that we legalized the chain.
2553ec39a45bdb1eca0cfe77be6a05cc43e16f2338ebChris Lattner    AddLegalizedOperand(Op.getValue(1), TF);
25543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    if (!TLI.isLittleEndian())
25553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner      std::swap(Lo, Hi);
25563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
25573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
2558d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner  case ISD::TAILCALL:
25593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::CALL: {
25603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Chain  = LegalizeOp(Node->getOperand(0));  // Legalize the chain.
25613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand Callee = LegalizeOp(Node->getOperand(1));  // Legalize the callee.
25623e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
25633d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    bool Changed = false;
25643d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    std::vector<SDOperand> Ops;
25653d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    for (unsigned i = 2, e = Node->getNumOperands(); i != e; ++i) {
25663d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Ops.push_back(LegalizeOp(Node->getOperand(i)));
25673d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner      Changed |= Ops.back() != Node->getOperand(i);
25683d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner    }
25693d9dffc5863d0319aa9c5cb156045ae6778cba01Chris Lattner
25703e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(Node->getNumValues() == 2 && Op.ResNo == 0 &&
25713e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner           "Can only expand a call once so far, not i64 -> i16!");
25723e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
25733e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    std::vector<MVT::ValueType> RetTyVTs;
25743e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.reserve(3);
25753e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.push_back(NVT);
25763e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.push_back(NVT);
25773e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    RetTyVTs.push_back(MVT::Other);
2578d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner    SDNode *NC = DAG.getCall(RetTyVTs, Chain, Callee, Ops,
2579d71c04199c447de39a2cab240c2fb7f717973e20Chris Lattner                             Node->getOpcode() == ISD::TAILCALL);
25803e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = SDOperand(NC, 0);
25813e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = SDOperand(NC, 1);
25823e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
25833e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // Insert the new chain mapping.
2584e3304a3d24afc952d3cb415d1b504d973573c5c5Chris Lattner    AddLegalizedOperand(Op.getValue(1), Hi.getValue(2));
25853e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
25863e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
25873e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::AND:
25883e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::OR:
25893e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::XOR: {   // Simple logical operators -> two trivial pieces.
25903e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand LL, LH, RL, RH;
25913e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(0), LL, LH);
25923e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(1), RL, RH);
25933e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getNode(Node->getOpcode(), NVT, LL, RL);
25943e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getNode(Node->getOpcode(), NVT, LH, RH);
25953e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
25963e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
25973e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SELECT: {
25983e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    SDOperand C, LL, LH, RL, RH;
259947e9223e06390897c3834f8c527001df392570ffChris Lattner
260047e9223e06390897c3834f8c527001df392570ffChris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
260147e9223e06390897c3834f8c527001df392570ffChris Lattner    case Expand: assert(0 && "It's impossible to expand bools");
260247e9223e06390897c3834f8c527001df392570ffChris Lattner    case Legal:
260347e9223e06390897c3834f8c527001df392570ffChris Lattner      C = LegalizeOp(Node->getOperand(0)); // Legalize the condition.
260447e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
260547e9223e06390897c3834f8c527001df392570ffChris Lattner    case Promote:
260647e9223e06390897c3834f8c527001df392570ffChris Lattner      C = PromoteOp(Node->getOperand(0));  // Promote the condition.
260747e9223e06390897c3834f8c527001df392570ffChris Lattner      break;
260847e9223e06390897c3834f8c527001df392570ffChris Lattner    }
26093e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(1), LL, LH);
26103e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    ExpandOp(Node->getOperand(2), RL, RH);
26113e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Lo = DAG.getNode(ISD::SELECT, NVT, C, LL, RL);
26123e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getNode(ISD::SELECT, NVT, C, LH, RH);
26133e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
26143e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
26153e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  case ISD::SIGN_EXTEND: {
261606098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    SDOperand In;
261706098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
261806098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    case Expand: assert(0 && "expand-expand not implemented yet!");
261906098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    case Legal: In = LegalizeOp(Node->getOperand(0)); break;
262006098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    case Promote:
262106098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner      In = PromoteOp(Node->getOperand(0));
262206098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner      // Emit the appropriate sign_extend_inreg to get the value we want.
262306098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner      In = DAG.getNode(ISD::SIGN_EXTEND_INREG, In.getValueType(), In,
262415e4b01920d6a0ffbe35d3e5aa88a4b42970b6a7Chris Lattner                       DAG.getValueType(Node->getOperand(0).getValueType()));
262506098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner      break;
262606098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    }
262706098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner
26283e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The low part is just a sign extension of the input (which degenerates to
26293e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // a copy).
263006098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    Lo = DAG.getNode(ISD::SIGN_EXTEND, NVT, In);
2631edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
26323e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The high part is obtained by SRA'ing all but one of the bits of the lo
26333e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // part.
26342dad454af674cb41a14a85ad6ce5c85c43959acdChris Lattner    unsigned LoSize = MVT::getSizeInBits(Lo.getValueType());
263527ff112948d059524e5f4ebe249a1da0b7c710e8Chris Lattner    Hi = DAG.getNode(ISD::SRA, NVT, Lo, DAG.getConstant(LoSize-1,
263627ff112948d059524e5f4ebe249a1da0b7c710e8Chris Lattner                                                       TLI.getShiftAmountTy()));
26373e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
26383e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
263906098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner  case ISD::ZERO_EXTEND: {
264006098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    SDOperand In;
264106098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    switch (getTypeAction(Node->getOperand(0).getValueType())) {
264206098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    case Expand: assert(0 && "expand-expand not implemented yet!");
264306098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    case Legal: In = LegalizeOp(Node->getOperand(0)); break;
264406098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    case Promote:
264506098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner      In = PromoteOp(Node->getOperand(0));
264606098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner      // Emit the appropriate zero_extend_inreg to get the value we want.
264723993561e24b2a6eaf0e036062522ab825c30d3fChris Lattner      In = DAG.getZeroExtendInReg(In, Node->getOperand(0).getValueType());
264806098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner      break;
264906098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner    }
265006098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner
26513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The low part is just a zero extension of the input (which degenerates to
26523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // a copy).
2653dea29e25c32d2651e2efaff67bc30803ea24d991Chris Lattner    Lo = DAG.getNode(ISD::ZERO_EXTEND, NVT, In);
2654edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman
26553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    // The high part is just a zero.
26563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    Hi = DAG.getConstant(0, NVT);
26573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    break;
265806098e0e9bd542f227aa3802768d1416e79e9f45Chris Lattner  }
26594e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    // These operators cannot be expanded directly, emit them as calls to
26604e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    // library functions.
26614e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  case ISD::FP_TO_SINT:
26624e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    if (Node->getOperand(0).getValueType() == MVT::f32)
266377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixsfdi", Node, Hi);
26644e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    else
266577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixdfdi", Node, Hi);
26664e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    break;
26674e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner  case ISD::FP_TO_UINT:
26684e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    if (Node->getOperand(0).getValueType() == MVT::f32)
266977e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixunssfdi", Node, Hi);
26704e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    else
267177e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner      Lo = ExpandLibCall("__fixunsdfdi", Node, Hi);
26724e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner    break;
26734e6c74689944be1de80c99dc0688ec0bcbd743aaChris Lattner
2674e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  case ISD::SHL:
2675e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // If we can emit an efficient shift operation, do so now.
267677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (ExpandShift(ISD::SHL, Node->getOperand(0), Node->getOperand(1), Lo, Hi))
2677e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      break;
26784759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner
26794759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    // If this target supports SHL_PARTS, use it.
26804759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    if (TLI.getOperationAction(ISD::SHL_PARTS, NVT) == TargetLowering::Legal) {
26815b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner      ExpandShiftParts(ISD::SHL_PARTS, Node->getOperand(0), Node->getOperand(1),
26825b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner                       Lo, Hi);
26834759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner      break;
26844759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    }
26854759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner
2686e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // Otherwise, emit a libcall.
268777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Lo = ExpandLibCall("__ashldi3", Node, Hi);
2688e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    break;
2689e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2690e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  case ISD::SRA:
2691e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // If we can emit an efficient shift operation, do so now.
269277e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (ExpandShift(ISD::SRA, Node->getOperand(0), Node->getOperand(1), Lo, Hi))
2693e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      break;
26944759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner
26954759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    // If this target supports SRA_PARTS, use it.
26964759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    if (TLI.getOperationAction(ISD::SRA_PARTS, NVT) == TargetLowering::Legal) {
26975b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner      ExpandShiftParts(ISD::SRA_PARTS, Node->getOperand(0), Node->getOperand(1),
26985b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner                       Lo, Hi);
26994759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner      break;
27004759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    }
27014759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner
2702e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // Otherwise, emit a libcall.
270377e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Lo = ExpandLibCall("__ashrdi3", Node, Hi);
2704e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    break;
2705e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner  case ISD::SRL:
2706e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // If we can emit an efficient shift operation, do so now.
270777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    if (ExpandShift(ISD::SRL, Node->getOperand(0), Node->getOperand(1), Lo, Hi))
2708e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner      break;
27094759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner
27104759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    // If this target supports SRL_PARTS, use it.
27114759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    if (TLI.getOperationAction(ISD::SRL_PARTS, NVT) == TargetLowering::Legal) {
27125b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner      ExpandShiftParts(ISD::SRL_PARTS, Node->getOperand(0), Node->getOperand(1),
27135b359c6c4f052e41579ad7da9af37db4f54207d9Chris Lattner                       Lo, Hi);
27144759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner      break;
27154759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    }
27164759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner
2717e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    // Otherwise, emit a libcall.
271877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner    Lo = ExpandLibCall("__lshrdi3", Node, Hi);
2719e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner    break;
2720e34b396ab7d28469bf3d9679a748b643d8e30458Chris Lattner
2721edf128a7fa90f2b0b7ee24741a04a7ae1ecd6f7eMisha Brukman  case ISD::ADD:
27224759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    ExpandByParts(ISD::ADD_PARTS, Node->getOperand(0), Node->getOperand(1),
27234759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner                  Lo, Hi);
272484f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    break;
272584f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner  case ISD::SUB:
27264759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner    ExpandByParts(ISD::SUB_PARTS, Node->getOperand(0), Node->getOperand(1),
27274759982a2d4ab597fb69d4a1113d0f35e673a4e1Chris Lattner                  Lo, Hi);
272884f6788044f9b1b47945e98ce23a6cf4d7d32579Chris Lattner    break;
2729c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman  case ISD::MUL: {
2730c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman    if (TLI.getOperationAction(ISD::MULHU, NVT) == TargetLowering::Legal) {
2731c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      SDOperand LL, LH, RL, RH;
2732c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      ExpandOp(Node->getOperand(0), LL, LH);
2733c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      ExpandOp(Node->getOperand(1), RL, RH);
2734c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      Hi = DAG.getNode(ISD::MULHU, NVT, LL, RL);
2735c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      RH = DAG.getNode(ISD::MUL, NVT, LL, RH);
2736c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      LH = DAG.getNode(ISD::MUL, NVT, LH, RL);
2737c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      Hi = DAG.getNode(ISD::ADD, NVT, Hi, RH);
2738c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      Hi = DAG.getNode(ISD::ADD, NVT, Hi, LH);
2739c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      Lo = DAG.getNode(ISD::MUL, NVT, LL, RL);
2740c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman    } else {
2741c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman      Lo = ExpandLibCall("__muldi3" , Node, Hi); break;
2742c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman    }
2743c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman    break;
2744c7c16575fea9aeffe8a63ddabe7c3c25f81ed799Nate Begeman  }
274577e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::SDIV: Lo = ExpandLibCall("__divdi3" , Node, Hi); break;
274677e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::UDIV: Lo = ExpandLibCall("__udivdi3", Node, Hi); break;
274777e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::SREM: Lo = ExpandLibCall("__moddi3" , Node, Hi); break;
274877e77a6aa0ab25a812947aed477220dd11220a18Chris Lattner  case ISD::UREM: Lo = ExpandLibCall("__umoddi3", Node, Hi); break;
27493e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
27503e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
27513e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  // Remember in a map if the values will be reused later.
27523e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  if (!Node->hasOneUse()) {
27533e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    bool isNew = ExpandedNodes.insert(std::make_pair(Op,
27543e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner                                            std::make_pair(Lo, Hi))).second;
27553e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner    assert(isNew && "Value already expanded?!?");
27563e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  }
27573e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
27583e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
27593e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
27603e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner// SelectionDAG::Legalize - This is the entry point for the file.
27613e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner//
27629c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattnervoid SelectionDAG::Legalize() {
27633e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  /// run - This is the main entry point to this class.
27643e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner  ///
27659c32d3b798dc6caeebe6cea2effe80ca5e84e66eChris Lattner  SelectionDAGLegalize(*this).Run();
27663e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner}
27673e928bbd6153eb08641cbd0ad7d8487378a8b12aChris Lattner
2768