1//===----- LegalizeIntegerTypes.cpp - Legalization of integer types -------===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements integer type expansion and promotion for LegalizeTypes.
11// Promotion is the act of changing a computation in an illegal type into a
12// computation in a larger type.  For example, implementing i8 arithmetic in an
13// i32 register (often needed on powerpc).
14// Expansion is the act of changing a computation in an illegal type into a
15// computation in two identical registers of a smaller type.  For example,
16// implementing i64 arithmetic in two i32 registers (often needed on 32-bit
17// targets).
18//
19//===----------------------------------------------------------------------===//
20
21#include "LegalizeTypes.h"
22#include "llvm/IR/DerivedTypes.h"
23#include "llvm/Support/ErrorHandling.h"
24#include "llvm/Support/raw_ostream.h"
25using namespace llvm;
26
27#define DEBUG_TYPE "legalize-types"
28
29//===----------------------------------------------------------------------===//
30//  Integer Result Promotion
31//===----------------------------------------------------------------------===//
32
33/// PromoteIntegerResult - This method is called when a result of a node is
34/// found to be in need of promotion to a larger type.  At this point, the node
35/// may also have invalid operands or may have other results that need
36/// expansion, we just know that (at least) one result needs promotion.
37void DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
38  DEBUG(dbgs() << "Promote integer result: "; N->dump(&DAG); dbgs() << "\n");
39  SDValue Res = SDValue();
40
41  // See if the target wants to custom expand this node.
42  if (CustomLowerNode(N, N->getValueType(ResNo), true))
43    return;
44
45  switch (N->getOpcode()) {
46  default:
47#ifndef NDEBUG
48    dbgs() << "PromoteIntegerResult #" << ResNo << ": ";
49    N->dump(&DAG); dbgs() << "\n";
50#endif
51    llvm_unreachable("Do not know how to promote this operator!");
52  case ISD::MERGE_VALUES:Res = PromoteIntRes_MERGE_VALUES(N, ResNo); break;
53  case ISD::AssertSext:  Res = PromoteIntRes_AssertSext(N); break;
54  case ISD::AssertZext:  Res = PromoteIntRes_AssertZext(N); break;
55  case ISD::BITCAST:     Res = PromoteIntRes_BITCAST(N); break;
56  case ISD::BSWAP:       Res = PromoteIntRes_BSWAP(N); break;
57  case ISD::BUILD_PAIR:  Res = PromoteIntRes_BUILD_PAIR(N); break;
58  case ISD::Constant:    Res = PromoteIntRes_Constant(N); break;
59  case ISD::CONVERT_RNDSAT:
60                         Res = PromoteIntRes_CONVERT_RNDSAT(N); break;
61  case ISD::CTLZ_ZERO_UNDEF:
62  case ISD::CTLZ:        Res = PromoteIntRes_CTLZ(N); break;
63  case ISD::CTPOP:       Res = PromoteIntRes_CTPOP(N); break;
64  case ISD::CTTZ_ZERO_UNDEF:
65  case ISD::CTTZ:        Res = PromoteIntRes_CTTZ(N); break;
66  case ISD::EXTRACT_VECTOR_ELT:
67                         Res = PromoteIntRes_EXTRACT_VECTOR_ELT(N); break;
68  case ISD::LOAD:        Res = PromoteIntRes_LOAD(cast<LoadSDNode>(N));break;
69  case ISD::SELECT:      Res = PromoteIntRes_SELECT(N); break;
70  case ISD::VSELECT:     Res = PromoteIntRes_VSELECT(N); break;
71  case ISD::SELECT_CC:   Res = PromoteIntRes_SELECT_CC(N); break;
72  case ISD::SETCC:       Res = PromoteIntRes_SETCC(N); break;
73  case ISD::SHL:         Res = PromoteIntRes_SHL(N); break;
74  case ISD::SIGN_EXTEND_INREG:
75                         Res = PromoteIntRes_SIGN_EXTEND_INREG(N); break;
76  case ISD::SRA:         Res = PromoteIntRes_SRA(N); break;
77  case ISD::SRL:         Res = PromoteIntRes_SRL(N); break;
78  case ISD::TRUNCATE:    Res = PromoteIntRes_TRUNCATE(N); break;
79  case ISD::UNDEF:       Res = PromoteIntRes_UNDEF(N); break;
80  case ISD::VAARG:       Res = PromoteIntRes_VAARG(N); break;
81
82  case ISD::EXTRACT_SUBVECTOR:
83                         Res = PromoteIntRes_EXTRACT_SUBVECTOR(N); break;
84  case ISD::VECTOR_SHUFFLE:
85                         Res = PromoteIntRes_VECTOR_SHUFFLE(N); break;
86  case ISD::INSERT_VECTOR_ELT:
87                         Res = PromoteIntRes_INSERT_VECTOR_ELT(N); break;
88  case ISD::BUILD_VECTOR:
89                         Res = PromoteIntRes_BUILD_VECTOR(N); break;
90  case ISD::SCALAR_TO_VECTOR:
91                         Res = PromoteIntRes_SCALAR_TO_VECTOR(N); break;
92  case ISD::CONCAT_VECTORS:
93                         Res = PromoteIntRes_CONCAT_VECTORS(N); break;
94
95  case ISD::SIGN_EXTEND:
96  case ISD::ZERO_EXTEND:
97  case ISD::ANY_EXTEND:  Res = PromoteIntRes_INT_EXTEND(N); break;
98
99  case ISD::FP_TO_SINT:
100  case ISD::FP_TO_UINT:  Res = PromoteIntRes_FP_TO_XINT(N); break;
101
102  case ISD::FP32_TO_FP16:Res = PromoteIntRes_FP32_TO_FP16(N); break;
103
104  case ISD::AND:
105  case ISD::OR:
106  case ISD::XOR:
107  case ISD::ADD:
108  case ISD::SUB:
109  case ISD::MUL:         Res = PromoteIntRes_SimpleIntBinOp(N); break;
110
111  case ISD::SDIV:
112  case ISD::SREM:        Res = PromoteIntRes_SDIV(N); break;
113
114  case ISD::UDIV:
115  case ISD::UREM:        Res = PromoteIntRes_UDIV(N); break;
116
117  case ISD::SADDO:
118  case ISD::SSUBO:       Res = PromoteIntRes_SADDSUBO(N, ResNo); break;
119  case ISD::UADDO:
120  case ISD::USUBO:       Res = PromoteIntRes_UADDSUBO(N, ResNo); break;
121  case ISD::SMULO:
122  case ISD::UMULO:       Res = PromoteIntRes_XMULO(N, ResNo); break;
123
124  case ISD::ATOMIC_LOAD:
125    Res = PromoteIntRes_Atomic0(cast<AtomicSDNode>(N)); break;
126
127  case ISD::ATOMIC_LOAD_ADD:
128  case ISD::ATOMIC_LOAD_SUB:
129  case ISD::ATOMIC_LOAD_AND:
130  case ISD::ATOMIC_LOAD_OR:
131  case ISD::ATOMIC_LOAD_XOR:
132  case ISD::ATOMIC_LOAD_NAND:
133  case ISD::ATOMIC_LOAD_MIN:
134  case ISD::ATOMIC_LOAD_MAX:
135  case ISD::ATOMIC_LOAD_UMIN:
136  case ISD::ATOMIC_LOAD_UMAX:
137  case ISD::ATOMIC_SWAP:
138    Res = PromoteIntRes_Atomic1(cast<AtomicSDNode>(N)); break;
139
140  case ISD::ATOMIC_CMP_SWAP:
141  case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS:
142    Res = PromoteIntRes_AtomicCmpSwap(cast<AtomicSDNode>(N), ResNo);
143    break;
144  }
145
146  // If the result is null then the sub-method took care of registering it.
147  if (Res.getNode())
148    SetPromotedInteger(SDValue(N, ResNo), Res);
149}
150
151SDValue DAGTypeLegalizer::PromoteIntRes_MERGE_VALUES(SDNode *N,
152                                                     unsigned ResNo) {
153  SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
154  return GetPromotedInteger(Op);
155}
156
157SDValue DAGTypeLegalizer::PromoteIntRes_AssertSext(SDNode *N) {
158  // Sign-extend the new bits, and continue the assertion.
159  SDValue Op = SExtPromotedInteger(N->getOperand(0));
160  return DAG.getNode(ISD::AssertSext, SDLoc(N),
161                     Op.getValueType(), Op, N->getOperand(1));
162}
163
164SDValue DAGTypeLegalizer::PromoteIntRes_AssertZext(SDNode *N) {
165  // Zero the new bits, and continue the assertion.
166  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
167  return DAG.getNode(ISD::AssertZext, SDLoc(N),
168                     Op.getValueType(), Op, N->getOperand(1));
169}
170
171SDValue DAGTypeLegalizer::PromoteIntRes_Atomic0(AtomicSDNode *N) {
172  EVT ResVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
173  SDValue Res = DAG.getAtomic(N->getOpcode(), SDLoc(N),
174                              N->getMemoryVT(), ResVT,
175                              N->getChain(), N->getBasePtr(),
176                              N->getMemOperand(), N->getOrdering(),
177                              N->getSynchScope());
178  // Legalized the chain result - switch anything that used the old chain to
179  // use the new one.
180  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
181  return Res;
182}
183
184SDValue DAGTypeLegalizer::PromoteIntRes_Atomic1(AtomicSDNode *N) {
185  SDValue Op2 = GetPromotedInteger(N->getOperand(2));
186  SDValue Res = DAG.getAtomic(N->getOpcode(), SDLoc(N),
187                              N->getMemoryVT(),
188                              N->getChain(), N->getBasePtr(),
189                              Op2, N->getMemOperand(), N->getOrdering(),
190                              N->getSynchScope());
191  // Legalized the chain result - switch anything that used the old chain to
192  // use the new one.
193  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
194  return Res;
195}
196
197SDValue DAGTypeLegalizer::PromoteIntRes_AtomicCmpSwap(AtomicSDNode *N,
198                                                      unsigned ResNo) {
199  if (ResNo == 1) {
200    assert(N->getOpcode() == ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS);
201    EVT SVT = getSetCCResultType(N->getOperand(2).getValueType());
202    EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(1));
203
204    // Only use the result of getSetCCResultType if it is legal,
205    // otherwise just use the promoted result type (NVT).
206    if (!TLI.isTypeLegal(SVT))
207      SVT = NVT;
208
209    SDVTList VTs = DAG.getVTList(N->getValueType(0), SVT, MVT::Other);
210    SDValue Res = DAG.getAtomicCmpSwap(
211        ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, SDLoc(N), N->getMemoryVT(), VTs,
212        N->getChain(), N->getBasePtr(), N->getOperand(2), N->getOperand(3),
213        N->getMemOperand(), N->getSuccessOrdering(), N->getFailureOrdering(),
214        N->getSynchScope());
215    ReplaceValueWith(SDValue(N, 0), Res.getValue(0));
216    ReplaceValueWith(SDValue(N, 2), Res.getValue(2));
217    return Res.getValue(1);
218  }
219
220  SDValue Op2 = GetPromotedInteger(N->getOperand(2));
221  SDValue Op3 = GetPromotedInteger(N->getOperand(3));
222  SDVTList VTs =
223      DAG.getVTList(Op2.getValueType(), N->getValueType(1), MVT::Other);
224  SDValue Res = DAG.getAtomicCmpSwap(
225      N->getOpcode(), SDLoc(N), N->getMemoryVT(), VTs, N->getChain(),
226      N->getBasePtr(), Op2, Op3, N->getMemOperand(), N->getSuccessOrdering(),
227      N->getFailureOrdering(), N->getSynchScope());
228  // Legalized the chain result - switch anything that used the old chain to
229  // use the new one.
230  unsigned ChainOp = N->getNumValues() - 1;
231  ReplaceValueWith(SDValue(N, ChainOp), Res.getValue(ChainOp));
232  return Res;
233}
234
235SDValue DAGTypeLegalizer::PromoteIntRes_BITCAST(SDNode *N) {
236  SDValue InOp = N->getOperand(0);
237  EVT InVT = InOp.getValueType();
238  EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
239  EVT OutVT = N->getValueType(0);
240  EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
241  SDLoc dl(N);
242
243  switch (getTypeAction(InVT)) {
244  case TargetLowering::TypeLegal:
245    break;
246  case TargetLowering::TypePromoteInteger:
247    if (NOutVT.bitsEq(NInVT) && !NOutVT.isVector() && !NInVT.isVector())
248      // The input promotes to the same size.  Convert the promoted value.
249      return DAG.getNode(ISD::BITCAST, dl, NOutVT, GetPromotedInteger(InOp));
250    break;
251  case TargetLowering::TypeSoftenFloat:
252    // Promote the integer operand by hand.
253    return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, GetSoftenedFloat(InOp));
254  case TargetLowering::TypeExpandInteger:
255  case TargetLowering::TypeExpandFloat:
256    break;
257  case TargetLowering::TypeScalarizeVector:
258    // Convert the element to an integer and promote it by hand.
259    if (!NOutVT.isVector())
260      return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
261                         BitConvertToInteger(GetScalarizedVector(InOp)));
262    break;
263  case TargetLowering::TypeSplitVector: {
264    // For example, i32 = BITCAST v2i16 on alpha.  Convert the split
265    // pieces of the input into integers and reassemble in the final type.
266    SDValue Lo, Hi;
267    GetSplitVector(N->getOperand(0), Lo, Hi);
268    Lo = BitConvertToInteger(Lo);
269    Hi = BitConvertToInteger(Hi);
270
271    if (TLI.isBigEndian())
272      std::swap(Lo, Hi);
273
274    InOp = DAG.getNode(ISD::ANY_EXTEND, dl,
275                       EVT::getIntegerVT(*DAG.getContext(),
276                                         NOutVT.getSizeInBits()),
277                       JoinIntegers(Lo, Hi));
278    return DAG.getNode(ISD::BITCAST, dl, NOutVT, InOp);
279  }
280  case TargetLowering::TypeWidenVector:
281    // The input is widened to the same size. Convert to the widened value.
282    // Make sure that the outgoing value is not a vector, because this would
283    // make us bitcast between two vectors which are legalized in different ways.
284    if (NOutVT.bitsEq(NInVT) && !NOutVT.isVector())
285      return DAG.getNode(ISD::BITCAST, dl, NOutVT, GetWidenedVector(InOp));
286  }
287
288  return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
289                     CreateStackStoreLoad(InOp, OutVT));
290}
291
292SDValue DAGTypeLegalizer::PromoteIntRes_BSWAP(SDNode *N) {
293  SDValue Op = GetPromotedInteger(N->getOperand(0));
294  EVT OVT = N->getValueType(0);
295  EVT NVT = Op.getValueType();
296  SDLoc dl(N);
297
298  unsigned DiffBits = NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits();
299  return DAG.getNode(ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op),
300                     DAG.getConstant(DiffBits, TLI.getShiftAmountTy(NVT)));
301}
302
303SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) {
304  // The pair element type may be legal, or may not promote to the same type as
305  // the result, for example i14 = BUILD_PAIR (i7, i7).  Handle all cases.
306  return DAG.getNode(ISD::ANY_EXTEND, SDLoc(N),
307                     TLI.getTypeToTransformTo(*DAG.getContext(),
308                     N->getValueType(0)), JoinIntegers(N->getOperand(0),
309                     N->getOperand(1)));
310}
311
312SDValue DAGTypeLegalizer::PromoteIntRes_Constant(SDNode *N) {
313  EVT VT = N->getValueType(0);
314  // FIXME there is no actual debug info here
315  SDLoc dl(N);
316  // Zero extend things like i1, sign extend everything else.  It shouldn't
317  // matter in theory which one we pick, but this tends to give better code?
318  unsigned Opc = VT.isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
319  SDValue Result = DAG.getNode(Opc, dl,
320                               TLI.getTypeToTransformTo(*DAG.getContext(), VT),
321                               SDValue(N, 0));
322  assert(isa<ConstantSDNode>(Result) && "Didn't constant fold ext?");
323  return Result;
324}
325
326SDValue DAGTypeLegalizer::PromoteIntRes_CONVERT_RNDSAT(SDNode *N) {
327  ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
328  assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
329           CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
330           CvtCode == ISD::CVT_SF || CvtCode == ISD::CVT_UF) &&
331          "can only promote integers");
332  EVT OutVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
333  return DAG.getConvertRndSat(OutVT, SDLoc(N), N->getOperand(0),
334                              N->getOperand(1), N->getOperand(2),
335                              N->getOperand(3), N->getOperand(4), CvtCode);
336}
337
338SDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
339  // Zero extend to the promoted type and do the count there.
340  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
341  SDLoc dl(N);
342  EVT OVT = N->getValueType(0);
343  EVT NVT = Op.getValueType();
344  Op = DAG.getNode(N->getOpcode(), dl, NVT, Op);
345  // Subtract off the extra leading bits in the bigger type.
346  return DAG.getNode(
347      ISD::SUB, dl, NVT, Op,
348      DAG.getConstant(NVT.getScalarSizeInBits() - OVT.getScalarSizeInBits(),
349                      NVT));
350}
351
352SDValue DAGTypeLegalizer::PromoteIntRes_CTPOP(SDNode *N) {
353  // Zero extend to the promoted type and do the count there.
354  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
355  return DAG.getNode(ISD::CTPOP, SDLoc(N), Op.getValueType(), Op);
356}
357
358SDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
359  SDValue Op = GetPromotedInteger(N->getOperand(0));
360  EVT OVT = N->getValueType(0);
361  EVT NVT = Op.getValueType();
362  SDLoc dl(N);
363  if (N->getOpcode() == ISD::CTTZ) {
364    // The count is the same in the promoted type except if the original
365    // value was zero.  This can be handled by setting the bit just off
366    // the top of the original type.
367    auto TopBit = APInt::getOneBitSet(NVT.getScalarSizeInBits(),
368                                      OVT.getScalarSizeInBits());
369    Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, NVT));
370  }
371  return DAG.getNode(N->getOpcode(), dl, NVT, Op);
372}
373
374SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N) {
375  SDLoc dl(N);
376  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
377  return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NVT, N->getOperand(0),
378                     N->getOperand(1));
379}
380
381SDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
382  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
383  unsigned NewOpc = N->getOpcode();
384  SDLoc dl(N);
385
386  // If we're promoting a UINT to a larger size and the larger FP_TO_UINT is
387  // not Legal, check to see if we can use FP_TO_SINT instead.  (If both UINT
388  // and SINT conversions are Custom, there is no way to tell which is
389  // preferable. We choose SINT because that's the right thing on PPC.)
390  if (N->getOpcode() == ISD::FP_TO_UINT &&
391      !TLI.isOperationLegal(ISD::FP_TO_UINT, NVT) &&
392      TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NVT))
393    NewOpc = ISD::FP_TO_SINT;
394
395  SDValue Res = DAG.getNode(NewOpc, dl, NVT, N->getOperand(0));
396
397  // Assert that the converted value fits in the original type.  If it doesn't
398  // (eg: because the value being converted is too big), then the result of the
399  // original operation was undefined anyway, so the assert is still correct.
400  return DAG.getNode(N->getOpcode() == ISD::FP_TO_UINT ?
401                     ISD::AssertZext : ISD::AssertSext, dl, NVT, Res,
402                     DAG.getValueType(N->getValueType(0).getScalarType()));
403}
404
405SDValue DAGTypeLegalizer::PromoteIntRes_FP32_TO_FP16(SDNode *N) {
406  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
407  SDLoc dl(N);
408
409  SDValue Res = DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0));
410
411  return DAG.getNode(ISD::AssertZext, dl,
412                     NVT, Res, DAG.getValueType(N->getValueType(0)));
413}
414
415SDValue DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) {
416  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
417  SDLoc dl(N);
418
419  if (getTypeAction(N->getOperand(0).getValueType())
420      == TargetLowering::TypePromoteInteger) {
421    SDValue Res = GetPromotedInteger(N->getOperand(0));
422    assert(Res.getValueType().bitsLE(NVT) && "Extension doesn't make sense!");
423
424    // If the result and operand types are the same after promotion, simplify
425    // to an in-register extension.
426    if (NVT == Res.getValueType()) {
427      // The high bits are not guaranteed to be anything.  Insert an extend.
428      if (N->getOpcode() == ISD::SIGN_EXTEND)
429        return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
430                           DAG.getValueType(N->getOperand(0).getValueType()));
431      if (N->getOpcode() == ISD::ZERO_EXTEND)
432        return DAG.getZeroExtendInReg(Res, dl,
433                      N->getOperand(0).getValueType().getScalarType());
434      assert(N->getOpcode() == ISD::ANY_EXTEND && "Unknown integer extension!");
435      return Res;
436    }
437  }
438
439  // Otherwise, just extend the original operand all the way to the larger type.
440  return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0));
441}
442
443SDValue DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) {
444  assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
445  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
446  ISD::LoadExtType ExtType =
447    ISD::isNON_EXTLoad(N) ? ISD::EXTLOAD : N->getExtensionType();
448  SDLoc dl(N);
449  SDValue Res = DAG.getExtLoad(ExtType, dl, NVT, N->getChain(), N->getBasePtr(),
450                               N->getMemoryVT(), N->getMemOperand());
451
452  // Legalized the chain result - switch anything that used the old chain to
453  // use the new one.
454  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
455  return Res;
456}
457
458/// Promote the overflow flag of an overflowing arithmetic node.
459SDValue DAGTypeLegalizer::PromoteIntRes_Overflow(SDNode *N) {
460  // Simply change the return type of the boolean result.
461  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(1));
462  EVT ValueVTs[] = { N->getValueType(0), NVT };
463  SDValue Ops[] = { N->getOperand(0), N->getOperand(1) };
464  SDValue Res = DAG.getNode(N->getOpcode(), SDLoc(N),
465                            DAG.getVTList(ValueVTs), Ops);
466
467  // Modified the sum result - switch anything that used the old sum to use
468  // the new one.
469  ReplaceValueWith(SDValue(N, 0), Res);
470
471  return SDValue(Res.getNode(), 1);
472}
473
474SDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo) {
475  if (ResNo == 1)
476    return PromoteIntRes_Overflow(N);
477
478  // The operation overflowed iff the result in the larger type is not the
479  // sign extension of its truncation to the original type.
480  SDValue LHS = SExtPromotedInteger(N->getOperand(0));
481  SDValue RHS = SExtPromotedInteger(N->getOperand(1));
482  EVT OVT = N->getOperand(0).getValueType();
483  EVT NVT = LHS.getValueType();
484  SDLoc dl(N);
485
486  // Do the arithmetic in the larger type.
487  unsigned Opcode = N->getOpcode() == ISD::SADDO ? ISD::ADD : ISD::SUB;
488  SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
489
490  // Calculate the overflow flag: sign extend the arithmetic result from
491  // the original type.
492  SDValue Ofl = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
493                            DAG.getValueType(OVT));
494  // Overflowed if and only if this is not equal to Res.
495  Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE);
496
497  // Use the calculated overflow everywhere.
498  ReplaceValueWith(SDValue(N, 1), Ofl);
499
500  return Res;
501}
502
503SDValue DAGTypeLegalizer::PromoteIntRes_SDIV(SDNode *N) {
504  // Sign extend the input.
505  SDValue LHS = SExtPromotedInteger(N->getOperand(0));
506  SDValue RHS = SExtPromotedInteger(N->getOperand(1));
507  return DAG.getNode(N->getOpcode(), SDLoc(N),
508                     LHS.getValueType(), LHS, RHS);
509}
510
511SDValue DAGTypeLegalizer::PromoteIntRes_SELECT(SDNode *N) {
512  SDValue LHS = GetPromotedInteger(N->getOperand(1));
513  SDValue RHS = GetPromotedInteger(N->getOperand(2));
514  return DAG.getSelect(SDLoc(N),
515                       LHS.getValueType(), N->getOperand(0), LHS, RHS);
516}
517
518SDValue DAGTypeLegalizer::PromoteIntRes_VSELECT(SDNode *N) {
519  SDValue Mask = N->getOperand(0);
520  EVT OpTy = N->getOperand(1).getValueType();
521
522  // Promote all the way up to the canonical SetCC type.
523  Mask = PromoteTargetBoolean(Mask, OpTy);
524  SDValue LHS = GetPromotedInteger(N->getOperand(1));
525  SDValue RHS = GetPromotedInteger(N->getOperand(2));
526  return DAG.getNode(ISD::VSELECT, SDLoc(N),
527                     LHS.getValueType(), Mask, LHS, RHS);
528}
529
530SDValue DAGTypeLegalizer::PromoteIntRes_SELECT_CC(SDNode *N) {
531  SDValue LHS = GetPromotedInteger(N->getOperand(2));
532  SDValue RHS = GetPromotedInteger(N->getOperand(3));
533  return DAG.getNode(ISD::SELECT_CC, SDLoc(N),
534                     LHS.getValueType(), N->getOperand(0),
535                     N->getOperand(1), LHS, RHS, N->getOperand(4));
536}
537
538SDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
539  EVT SVT = getSetCCResultType(N->getOperand(0).getValueType());
540
541  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
542
543  // Only use the result of getSetCCResultType if it is legal,
544  // otherwise just use the promoted result type (NVT).
545  if (!TLI.isTypeLegal(SVT))
546    SVT = NVT;
547
548  SDLoc dl(N);
549  assert(SVT.isVector() == N->getOperand(0).getValueType().isVector() &&
550         "Vector compare must return a vector result!");
551
552  SDValue LHS = N->getOperand(0);
553  SDValue RHS = N->getOperand(1);
554  if (LHS.getValueType() != RHS.getValueType()) {
555    if (getTypeAction(LHS.getValueType()) == TargetLowering::TypePromoteInteger &&
556        !LHS.getValueType().isVector())
557      LHS = GetPromotedInteger(LHS);
558    if (getTypeAction(RHS.getValueType()) == TargetLowering::TypePromoteInteger &&
559        !RHS.getValueType().isVector())
560      RHS = GetPromotedInteger(RHS);
561  }
562
563  // Get the SETCC result using the canonical SETCC type.
564  SDValue SetCC = DAG.getNode(N->getOpcode(), dl, SVT, LHS, RHS,
565                              N->getOperand(2));
566
567  assert(NVT.bitsLE(SVT) && "Integer type overpromoted?");
568  // Convert to the expected type.
569  return DAG.getNode(ISD::TRUNCATE, dl, NVT, SetCC);
570}
571
572SDValue DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) {
573  SDValue Res = GetPromotedInteger(N->getOperand(0));
574  SDValue Amt = N->getOperand(1);
575  Amt = Amt.getValueType().isVector() ? ZExtPromotedInteger(Amt) : Amt;
576  return DAG.getNode(ISD::SHL, SDLoc(N), Res.getValueType(), Res, Amt);
577}
578
579SDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) {
580  SDValue Op = GetPromotedInteger(N->getOperand(0));
581  return DAG.getNode(ISD::SIGN_EXTEND_INREG, SDLoc(N),
582                     Op.getValueType(), Op, N->getOperand(1));
583}
584
585SDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
586  // The input may have strange things in the top bits of the registers, but
587  // these operations don't care.  They may have weird bits going out, but
588  // that too is okay if they are integer operations.
589  SDValue LHS = GetPromotedInteger(N->getOperand(0));
590  SDValue RHS = GetPromotedInteger(N->getOperand(1));
591  return DAG.getNode(N->getOpcode(), SDLoc(N),
592                     LHS.getValueType(), LHS, RHS);
593}
594
595SDValue DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) {
596  // The input value must be properly sign extended.
597  SDValue Res = SExtPromotedInteger(N->getOperand(0));
598  SDValue Amt = N->getOperand(1);
599  Amt = Amt.getValueType().isVector() ? ZExtPromotedInteger(Amt) : Amt;
600  return DAG.getNode(ISD::SRA, SDLoc(N), Res.getValueType(), Res, Amt);
601}
602
603SDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
604  // The input value must be properly zero extended.
605  SDValue Res = ZExtPromotedInteger(N->getOperand(0));
606  SDValue Amt = N->getOperand(1);
607  Amt = Amt.getValueType().isVector() ? ZExtPromotedInteger(Amt) : Amt;
608  return DAG.getNode(ISD::SRL, SDLoc(N), Res.getValueType(), Res, Amt);
609}
610
611SDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
612  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
613  SDValue Res;
614  SDValue InOp = N->getOperand(0);
615  SDLoc dl(N);
616
617  switch (getTypeAction(InOp.getValueType())) {
618  default: llvm_unreachable("Unknown type action!");
619  case TargetLowering::TypeLegal:
620  case TargetLowering::TypeExpandInteger:
621    Res = InOp;
622    break;
623  case TargetLowering::TypePromoteInteger:
624    Res = GetPromotedInteger(InOp);
625    break;
626  case TargetLowering::TypeSplitVector:
627    EVT InVT = InOp.getValueType();
628    assert(InVT.isVector() && "Cannot split scalar types");
629    unsigned NumElts = InVT.getVectorNumElements();
630    assert(NumElts == NVT.getVectorNumElements() &&
631           "Dst and Src must have the same number of elements");
632    assert(isPowerOf2_32(NumElts) &&
633           "Promoted vector type must be a power of two");
634
635    SDValue EOp1, EOp2;
636    GetSplitVector(InOp, EOp1, EOp2);
637
638    EVT HalfNVT = EVT::getVectorVT(*DAG.getContext(), NVT.getScalarType(),
639                                   NumElts/2);
640    EOp1 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp1);
641    EOp2 = DAG.getNode(ISD::TRUNCATE, dl, HalfNVT, EOp2);
642
643    return DAG.getNode(ISD::CONCAT_VECTORS, dl, NVT, EOp1, EOp2);
644  }
645
646  // Truncate to NVT instead of VT
647  return DAG.getNode(ISD::TRUNCATE, dl, NVT, Res);
648}
649
650SDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo) {
651  if (ResNo == 1)
652    return PromoteIntRes_Overflow(N);
653
654  // The operation overflowed iff the result in the larger type is not the
655  // zero extension of its truncation to the original type.
656  SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
657  SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
658  EVT OVT = N->getOperand(0).getValueType();
659  EVT NVT = LHS.getValueType();
660  SDLoc dl(N);
661
662  // Do the arithmetic in the larger type.
663  unsigned Opcode = N->getOpcode() == ISD::UADDO ? ISD::ADD : ISD::SUB;
664  SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
665
666  // Calculate the overflow flag: zero extend the arithmetic result from
667  // the original type.
668  SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT);
669  // Overflowed if and only if this is not equal to Res.
670  Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE);
671
672  // Use the calculated overflow everywhere.
673  ReplaceValueWith(SDValue(N, 1), Ofl);
674
675  return Res;
676}
677
678SDValue DAGTypeLegalizer::PromoteIntRes_XMULO(SDNode *N, unsigned ResNo) {
679  // Promote the overflow bit trivially.
680  if (ResNo == 1)
681    return PromoteIntRes_Overflow(N);
682
683  SDValue LHS = N->getOperand(0), RHS = N->getOperand(1);
684  SDLoc DL(N);
685  EVT SmallVT = LHS.getValueType();
686
687  // To determine if the result overflowed in a larger type, we extend the
688  // input to the larger type, do the multiply (checking if it overflows),
689  // then also check the high bits of the result to see if overflow happened
690  // there.
691  if (N->getOpcode() == ISD::SMULO) {
692    LHS = SExtPromotedInteger(LHS);
693    RHS = SExtPromotedInteger(RHS);
694  } else {
695    LHS = ZExtPromotedInteger(LHS);
696    RHS = ZExtPromotedInteger(RHS);
697  }
698  SDVTList VTs = DAG.getVTList(LHS.getValueType(), N->getValueType(1));
699  SDValue Mul = DAG.getNode(N->getOpcode(), DL, VTs, LHS, RHS);
700
701  // Overflow occurred if it occurred in the larger type, or if the high part
702  // of the result does not zero/sign-extend the low part.  Check this second
703  // possibility first.
704  SDValue Overflow;
705  if (N->getOpcode() == ISD::UMULO) {
706    // Unsigned overflow occurred if the high part is non-zero.
707    SDValue Hi = DAG.getNode(ISD::SRL, DL, Mul.getValueType(), Mul,
708                             DAG.getIntPtrConstant(SmallVT.getSizeInBits()));
709    Overflow = DAG.getSetCC(DL, N->getValueType(1), Hi,
710                            DAG.getConstant(0, Hi.getValueType()), ISD::SETNE);
711  } else {
712    // Signed overflow occurred if the high part does not sign extend the low.
713    SDValue SExt = DAG.getNode(ISD::SIGN_EXTEND_INREG, DL, Mul.getValueType(),
714                               Mul, DAG.getValueType(SmallVT));
715    Overflow = DAG.getSetCC(DL, N->getValueType(1), SExt, Mul, ISD::SETNE);
716  }
717
718  // The only other way for overflow to occur is if the multiplication in the
719  // larger type itself overflowed.
720  Overflow = DAG.getNode(ISD::OR, DL, N->getValueType(1), Overflow,
721                         SDValue(Mul.getNode(), 1));
722
723  // Use the calculated overflow everywhere.
724  ReplaceValueWith(SDValue(N, 1), Overflow);
725  return Mul;
726}
727
728SDValue DAGTypeLegalizer::PromoteIntRes_UDIV(SDNode *N) {
729  // Zero extend the input.
730  SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
731  SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
732  return DAG.getNode(N->getOpcode(), SDLoc(N),
733                     LHS.getValueType(), LHS, RHS);
734}
735
736SDValue DAGTypeLegalizer::PromoteIntRes_UNDEF(SDNode *N) {
737  return DAG.getUNDEF(TLI.getTypeToTransformTo(*DAG.getContext(),
738                                               N->getValueType(0)));
739}
740
741SDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {
742  SDValue Chain = N->getOperand(0); // Get the chain.
743  SDValue Ptr = N->getOperand(1); // Get the pointer.
744  EVT VT = N->getValueType(0);
745  SDLoc dl(N);
746
747  MVT RegVT = TLI.getRegisterType(*DAG.getContext(), VT);
748  unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), VT);
749  // The argument is passed as NumRegs registers of type RegVT.
750
751  SmallVector<SDValue, 8> Parts(NumRegs);
752  for (unsigned i = 0; i < NumRegs; ++i) {
753    Parts[i] = DAG.getVAArg(RegVT, dl, Chain, Ptr, N->getOperand(2),
754                            N->getConstantOperandVal(3));
755    Chain = Parts[i].getValue(1);
756  }
757
758  // Handle endianness of the load.
759  if (TLI.isBigEndian())
760    std::reverse(Parts.begin(), Parts.end());
761
762  // Assemble the parts in the promoted type.
763  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
764  SDValue Res = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[0]);
765  for (unsigned i = 1; i < NumRegs; ++i) {
766    SDValue Part = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[i]);
767    // Shift it to the right position and "or" it in.
768    Part = DAG.getNode(ISD::SHL, dl, NVT, Part,
769                       DAG.getConstant(i * RegVT.getSizeInBits(),
770                                       TLI.getPointerTy()));
771    Res = DAG.getNode(ISD::OR, dl, NVT, Res, Part);
772  }
773
774  // Modified the chain result - switch anything that used the old chain to
775  // use the new one.
776  ReplaceValueWith(SDValue(N, 1), Chain);
777
778  return Res;
779}
780
781//===----------------------------------------------------------------------===//
782//  Integer Operand Promotion
783//===----------------------------------------------------------------------===//
784
785/// PromoteIntegerOperand - This method is called when the specified operand of
786/// the specified node is found to need promotion.  At this point, all of the
787/// result types of the node are known to be legal, but other operands of the
788/// node may need promotion or expansion as well as the specified one.
789bool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
790  DEBUG(dbgs() << "Promote integer operand: "; N->dump(&DAG); dbgs() << "\n");
791  SDValue Res = SDValue();
792
793  if (CustomLowerNode(N, N->getOperand(OpNo).getValueType(), false))
794    return false;
795
796  switch (N->getOpcode()) {
797    default:
798  #ifndef NDEBUG
799    dbgs() << "PromoteIntegerOperand Op #" << OpNo << ": ";
800    N->dump(&DAG); dbgs() << "\n";
801  #endif
802    llvm_unreachable("Do not know how to promote this operator's operand!");
803
804  case ISD::ANY_EXTEND:   Res = PromoteIntOp_ANY_EXTEND(N); break;
805  case ISD::ATOMIC_STORE:
806    Res = PromoteIntOp_ATOMIC_STORE(cast<AtomicSDNode>(N));
807    break;
808  case ISD::BITCAST:      Res = PromoteIntOp_BITCAST(N); break;
809  case ISD::BR_CC:        Res = PromoteIntOp_BR_CC(N, OpNo); break;
810  case ISD::BRCOND:       Res = PromoteIntOp_BRCOND(N, OpNo); break;
811  case ISD::BUILD_PAIR:   Res = PromoteIntOp_BUILD_PAIR(N); break;
812  case ISD::BUILD_VECTOR: Res = PromoteIntOp_BUILD_VECTOR(N); break;
813  case ISD::CONCAT_VECTORS: Res = PromoteIntOp_CONCAT_VECTORS(N); break;
814  case ISD::EXTRACT_VECTOR_ELT: Res = PromoteIntOp_EXTRACT_VECTOR_ELT(N); break;
815  case ISD::CONVERT_RNDSAT:
816                          Res = PromoteIntOp_CONVERT_RNDSAT(N); break;
817  case ISD::INSERT_VECTOR_ELT:
818                          Res = PromoteIntOp_INSERT_VECTOR_ELT(N, OpNo);break;
819  case ISD::SCALAR_TO_VECTOR:
820                          Res = PromoteIntOp_SCALAR_TO_VECTOR(N); break;
821  case ISD::VSELECT:
822  case ISD::SELECT:       Res = PromoteIntOp_SELECT(N, OpNo); break;
823  case ISD::SELECT_CC:    Res = PromoteIntOp_SELECT_CC(N, OpNo); break;
824  case ISD::SETCC:        Res = PromoteIntOp_SETCC(N, OpNo); break;
825  case ISD::SIGN_EXTEND:  Res = PromoteIntOp_SIGN_EXTEND(N); break;
826  case ISD::SINT_TO_FP:   Res = PromoteIntOp_SINT_TO_FP(N); break;
827  case ISD::STORE:        Res = PromoteIntOp_STORE(cast<StoreSDNode>(N),
828                                                   OpNo); break;
829  case ISD::TRUNCATE:     Res = PromoteIntOp_TRUNCATE(N); break;
830  case ISD::FP16_TO_FP32:
831  case ISD::UINT_TO_FP:   Res = PromoteIntOp_UINT_TO_FP(N); break;
832  case ISD::ZERO_EXTEND:  Res = PromoteIntOp_ZERO_EXTEND(N); break;
833
834  case ISD::SHL:
835  case ISD::SRA:
836  case ISD::SRL:
837  case ISD::ROTL:
838  case ISD::ROTR: Res = PromoteIntOp_Shift(N); break;
839  }
840
841  // If the result is null, the sub-method took care of registering results etc.
842  if (!Res.getNode()) return false;
843
844  // If the result is N, the sub-method updated N in place.  Tell the legalizer
845  // core about this.
846  if (Res.getNode() == N)
847    return true;
848
849  assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
850         "Invalid operand expansion");
851
852  ReplaceValueWith(SDValue(N, 0), Res);
853  return false;
854}
855
856/// PromoteSetCCOperands - Promote the operands of a comparison.  This code is
857/// shared among BR_CC, SELECT_CC, and SETCC handlers.
858void DAGTypeLegalizer::PromoteSetCCOperands(SDValue &NewLHS,SDValue &NewRHS,
859                                            ISD::CondCode CCCode) {
860  // We have to insert explicit sign or zero extends.  Note that we could
861  // insert sign extends for ALL conditions, but zero extend is cheaper on
862  // many machines (an AND instead of two shifts), so prefer it.
863  switch (CCCode) {
864  default: llvm_unreachable("Unknown integer comparison!");
865  case ISD::SETEQ:
866  case ISD::SETNE:
867  case ISD::SETUGE:
868  case ISD::SETUGT:
869  case ISD::SETULE:
870  case ISD::SETULT:
871    // ALL of these operations will work if we either sign or zero extend
872    // the operands (including the unsigned comparisons!).  Zero extend is
873    // usually a simpler/cheaper operation, so prefer it.
874    NewLHS = ZExtPromotedInteger(NewLHS);
875    NewRHS = ZExtPromotedInteger(NewRHS);
876    break;
877  case ISD::SETGE:
878  case ISD::SETGT:
879  case ISD::SETLT:
880  case ISD::SETLE:
881    NewLHS = SExtPromotedInteger(NewLHS);
882    NewRHS = SExtPromotedInteger(NewRHS);
883    break;
884  }
885}
886
887SDValue DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND(SDNode *N) {
888  SDValue Op = GetPromotedInteger(N->getOperand(0));
889  return DAG.getNode(ISD::ANY_EXTEND, SDLoc(N), N->getValueType(0), Op);
890}
891
892SDValue DAGTypeLegalizer::PromoteIntOp_ATOMIC_STORE(AtomicSDNode *N) {
893  SDValue Op2 = GetPromotedInteger(N->getOperand(2));
894  return DAG.getAtomic(N->getOpcode(), SDLoc(N), N->getMemoryVT(),
895                       N->getChain(), N->getBasePtr(), Op2, N->getMemOperand(),
896                       N->getOrdering(), N->getSynchScope());
897}
898
899SDValue DAGTypeLegalizer::PromoteIntOp_BITCAST(SDNode *N) {
900  // This should only occur in unusual situations like bitcasting to an
901  // x86_fp80, so just turn it into a store+load
902  return CreateStackStoreLoad(N->getOperand(0), N->getValueType(0));
903}
904
905SDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo) {
906  assert(OpNo == 2 && "Don't know how to promote this operand!");
907
908  SDValue LHS = N->getOperand(2);
909  SDValue RHS = N->getOperand(3);
910  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(1))->get());
911
912  // The chain (Op#0), CC (#1) and basic block destination (Op#4) are always
913  // legal types.
914  return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0),
915                                N->getOperand(1), LHS, RHS, N->getOperand(4)),
916                 0);
917}
918
919SDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) {
920  assert(OpNo == 1 && "only know how to promote condition");
921
922  // Promote all the way up to the canonical SetCC type.
923  SDValue Cond = PromoteTargetBoolean(N->getOperand(1), MVT::Other);
924
925  // The chain (Op#0) and basic block destination (Op#2) are always legal types.
926  return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), Cond,
927                                        N->getOperand(2)), 0);
928}
929
930SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) {
931  // Since the result type is legal, the operands must promote to it.
932  EVT OVT = N->getOperand(0).getValueType();
933  SDValue Lo = ZExtPromotedInteger(N->getOperand(0));
934  SDValue Hi = GetPromotedInteger(N->getOperand(1));
935  assert(Lo.getValueType() == N->getValueType(0) && "Operand over promoted?");
936  SDLoc dl(N);
937
938  Hi = DAG.getNode(ISD::SHL, dl, N->getValueType(0), Hi,
939                   DAG.getConstant(OVT.getSizeInBits(), TLI.getPointerTy()));
940  return DAG.getNode(ISD::OR, dl, N->getValueType(0), Lo, Hi);
941}
942
943SDValue DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) {
944  // The vector type is legal but the element type is not.  This implies
945  // that the vector is a power-of-two in length and that the element
946  // type does not have a strange size (eg: it is not i1).
947  EVT VecVT = N->getValueType(0);
948  unsigned NumElts = VecVT.getVectorNumElements();
949  assert(!((NumElts & 1) && (!TLI.isTypeLegal(VecVT))) &&
950		 "Legal vector of one illegal element?");
951
952  // Promote the inserted value.  The type does not need to match the
953  // vector element type.  Check that any extra bits introduced will be
954  // truncated away.
955  assert(N->getOperand(0).getValueType().getSizeInBits() >=
956         N->getValueType(0).getVectorElementType().getSizeInBits() &&
957         "Type of inserted value narrower than vector element type!");
958
959  SmallVector<SDValue, 16> NewOps;
960  for (unsigned i = 0; i < NumElts; ++i)
961    NewOps.push_back(GetPromotedInteger(N->getOperand(i)));
962
963  return SDValue(DAG.UpdateNodeOperands(N, NewOps), 0);
964}
965
966SDValue DAGTypeLegalizer::PromoteIntOp_CONVERT_RNDSAT(SDNode *N) {
967  ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
968  assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
969           CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
970           CvtCode == ISD::CVT_FS || CvtCode == ISD::CVT_FU) &&
971           "can only promote integer arguments");
972  SDValue InOp = GetPromotedInteger(N->getOperand(0));
973  return DAG.getConvertRndSat(N->getValueType(0), SDLoc(N), InOp,
974                              N->getOperand(1), N->getOperand(2),
975                              N->getOperand(3), N->getOperand(4), CvtCode);
976}
977
978SDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
979                                                         unsigned OpNo) {
980  if (OpNo == 1) {
981    // Promote the inserted value.  This is valid because the type does not
982    // have to match the vector element type.
983
984    // Check that any extra bits introduced will be truncated away.
985    assert(N->getOperand(1).getValueType().getSizeInBits() >=
986           N->getValueType(0).getVectorElementType().getSizeInBits() &&
987           "Type of inserted value narrower than vector element type!");
988    return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0),
989                                  GetPromotedInteger(N->getOperand(1)),
990                                  N->getOperand(2)),
991                   0);
992  }
993
994  assert(OpNo == 2 && "Different operand and result vector types?");
995
996  // Promote the index.
997  SDValue Idx = DAG.getZExtOrTrunc(N->getOperand(2), SDLoc(N),
998                                   TLI.getVectorIdxTy());
999  return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0),
1000                                N->getOperand(1), Idx), 0);
1001}
1002
1003SDValue DAGTypeLegalizer::PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N) {
1004  // Integer SCALAR_TO_VECTOR operands are implicitly truncated, so just promote
1005  // the operand in place.
1006  return SDValue(DAG.UpdateNodeOperands(N,
1007                                GetPromotedInteger(N->getOperand(0))), 0);
1008}
1009
1010SDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
1011  assert(OpNo == 0 && "Only know how to promote the condition!");
1012  SDValue Cond = N->getOperand(0);
1013  EVT OpTy = N->getOperand(1).getValueType();
1014
1015  // Promote all the way up to the canonical SetCC type.
1016  EVT OpVT = N->getOpcode() == ISD::SELECT ? OpTy.getScalarType() : OpTy;
1017  Cond = PromoteTargetBoolean(Cond, OpVT);
1018
1019  return SDValue(DAG.UpdateNodeOperands(N, Cond, N->getOperand(1),
1020                                        N->getOperand(2)), 0);
1021}
1022
1023SDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo) {
1024  assert(OpNo == 0 && "Don't know how to promote this operand!");
1025
1026  SDValue LHS = N->getOperand(0);
1027  SDValue RHS = N->getOperand(1);
1028  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(4))->get());
1029
1030  // The CC (#4) and the possible return values (#2 and #3) have legal types.
1031  return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, N->getOperand(2),
1032                                N->getOperand(3), N->getOperand(4)), 0);
1033}
1034
1035SDValue DAGTypeLegalizer::PromoteIntOp_SETCC(SDNode *N, unsigned OpNo) {
1036  assert(OpNo == 0 && "Don't know how to promote this operand!");
1037
1038  SDValue LHS = N->getOperand(0);
1039  SDValue RHS = N->getOperand(1);
1040  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(2))->get());
1041
1042  // The CC (#2) is always legal.
1043  return SDValue(DAG.UpdateNodeOperands(N, LHS, RHS, N->getOperand(2)), 0);
1044}
1045
1046SDValue DAGTypeLegalizer::PromoteIntOp_Shift(SDNode *N) {
1047  return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0),
1048                                ZExtPromotedInteger(N->getOperand(1))), 0);
1049}
1050
1051SDValue DAGTypeLegalizer::PromoteIntOp_SIGN_EXTEND(SDNode *N) {
1052  SDValue Op = GetPromotedInteger(N->getOperand(0));
1053  SDLoc dl(N);
1054  Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op);
1055  return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Op.getValueType(),
1056                     Op, DAG.getValueType(N->getOperand(0).getValueType()));
1057}
1058
1059SDValue DAGTypeLegalizer::PromoteIntOp_SINT_TO_FP(SDNode *N) {
1060  return SDValue(DAG.UpdateNodeOperands(N,
1061                                SExtPromotedInteger(N->getOperand(0))), 0);
1062}
1063
1064SDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
1065  assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
1066  SDValue Ch = N->getChain(), Ptr = N->getBasePtr();
1067  SDLoc dl(N);
1068
1069  SDValue Val = GetPromotedInteger(N->getValue());  // Get promoted value.
1070
1071  // Truncate the value and store the result.
1072  return DAG.getTruncStore(Ch, dl, Val, Ptr,
1073                           N->getMemoryVT(), N->getMemOperand());
1074}
1075
1076SDValue DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) {
1077  SDValue Op = GetPromotedInteger(N->getOperand(0));
1078  return DAG.getNode(ISD::TRUNCATE, SDLoc(N), N->getValueType(0), Op);
1079}
1080
1081SDValue DAGTypeLegalizer::PromoteIntOp_UINT_TO_FP(SDNode *N) {
1082  return SDValue(DAG.UpdateNodeOperands(N,
1083                                ZExtPromotedInteger(N->getOperand(0))), 0);
1084}
1085
1086SDValue DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) {
1087  SDLoc dl(N);
1088  SDValue Op = GetPromotedInteger(N->getOperand(0));
1089  Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op);
1090  return DAG.getZeroExtendInReg(Op, dl,
1091                                N->getOperand(0).getValueType().getScalarType());
1092}
1093
1094
1095//===----------------------------------------------------------------------===//
1096//  Integer Result Expansion
1097//===----------------------------------------------------------------------===//
1098
1099/// ExpandIntegerResult - This method is called when the specified result of the
1100/// specified node is found to need expansion.  At this point, the node may also
1101/// have invalid operands or may have other results that need promotion, we just
1102/// know that (at least) one result needs expansion.
1103void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
1104  DEBUG(dbgs() << "Expand integer result: "; N->dump(&DAG); dbgs() << "\n");
1105  SDValue Lo, Hi;
1106  Lo = Hi = SDValue();
1107
1108  // See if the target wants to custom expand this node.
1109  if (CustomLowerNode(N, N->getValueType(ResNo), true))
1110    return;
1111
1112  switch (N->getOpcode()) {
1113  default:
1114#ifndef NDEBUG
1115    dbgs() << "ExpandIntegerResult #" << ResNo << ": ";
1116    N->dump(&DAG); dbgs() << "\n";
1117#endif
1118    llvm_unreachable("Do not know how to expand the result of this operator!");
1119
1120  case ISD::MERGE_VALUES: SplitRes_MERGE_VALUES(N, ResNo, Lo, Hi); break;
1121  case ISD::SELECT:       SplitRes_SELECT(N, Lo, Hi); break;
1122  case ISD::SELECT_CC:    SplitRes_SELECT_CC(N, Lo, Hi); break;
1123  case ISD::UNDEF:        SplitRes_UNDEF(N, Lo, Hi); break;
1124
1125  case ISD::BITCAST:            ExpandRes_BITCAST(N, Lo, Hi); break;
1126  case ISD::BUILD_PAIR:         ExpandRes_BUILD_PAIR(N, Lo, Hi); break;
1127  case ISD::EXTRACT_ELEMENT:    ExpandRes_EXTRACT_ELEMENT(N, Lo, Hi); break;
1128  case ISD::EXTRACT_VECTOR_ELT: ExpandRes_EXTRACT_VECTOR_ELT(N, Lo, Hi); break;
1129  case ISD::VAARG:              ExpandRes_VAARG(N, Lo, Hi); break;
1130
1131  case ISD::ANY_EXTEND:  ExpandIntRes_ANY_EXTEND(N, Lo, Hi); break;
1132  case ISD::AssertSext:  ExpandIntRes_AssertSext(N, Lo, Hi); break;
1133  case ISD::AssertZext:  ExpandIntRes_AssertZext(N, Lo, Hi); break;
1134  case ISD::BSWAP:       ExpandIntRes_BSWAP(N, Lo, Hi); break;
1135  case ISD::Constant:    ExpandIntRes_Constant(N, Lo, Hi); break;
1136  case ISD::CTLZ_ZERO_UNDEF:
1137  case ISD::CTLZ:        ExpandIntRes_CTLZ(N, Lo, Hi); break;
1138  case ISD::CTPOP:       ExpandIntRes_CTPOP(N, Lo, Hi); break;
1139  case ISD::CTTZ_ZERO_UNDEF:
1140  case ISD::CTTZ:        ExpandIntRes_CTTZ(N, Lo, Hi); break;
1141  case ISD::FP_TO_SINT:  ExpandIntRes_FP_TO_SINT(N, Lo, Hi); break;
1142  case ISD::FP_TO_UINT:  ExpandIntRes_FP_TO_UINT(N, Lo, Hi); break;
1143  case ISD::LOAD:        ExpandIntRes_LOAD(cast<LoadSDNode>(N), Lo, Hi); break;
1144  case ISD::MUL:         ExpandIntRes_MUL(N, Lo, Hi); break;
1145  case ISD::SDIV:        ExpandIntRes_SDIV(N, Lo, Hi); break;
1146  case ISD::SIGN_EXTEND: ExpandIntRes_SIGN_EXTEND(N, Lo, Hi); break;
1147  case ISD::SIGN_EXTEND_INREG: ExpandIntRes_SIGN_EXTEND_INREG(N, Lo, Hi); break;
1148  case ISD::SREM:        ExpandIntRes_SREM(N, Lo, Hi); break;
1149  case ISD::TRUNCATE:    ExpandIntRes_TRUNCATE(N, Lo, Hi); break;
1150  case ISD::UDIV:        ExpandIntRes_UDIV(N, Lo, Hi); break;
1151  case ISD::UREM:        ExpandIntRes_UREM(N, Lo, Hi); break;
1152  case ISD::ZERO_EXTEND: ExpandIntRes_ZERO_EXTEND(N, Lo, Hi); break;
1153  case ISD::ATOMIC_LOAD: ExpandIntRes_ATOMIC_LOAD(N, Lo, Hi); break;
1154
1155  case ISD::ATOMIC_LOAD_ADD:
1156  case ISD::ATOMIC_LOAD_SUB:
1157  case ISD::ATOMIC_LOAD_AND:
1158  case ISD::ATOMIC_LOAD_OR:
1159  case ISD::ATOMIC_LOAD_XOR:
1160  case ISD::ATOMIC_LOAD_NAND:
1161  case ISD::ATOMIC_LOAD_MIN:
1162  case ISD::ATOMIC_LOAD_MAX:
1163  case ISD::ATOMIC_LOAD_UMIN:
1164  case ISD::ATOMIC_LOAD_UMAX:
1165  case ISD::ATOMIC_SWAP:
1166  case ISD::ATOMIC_CMP_SWAP: {
1167    std::pair<SDValue, SDValue> Tmp = ExpandAtomic(N);
1168    SplitInteger(Tmp.first, Lo, Hi);
1169    ReplaceValueWith(SDValue(N, 1), Tmp.second);
1170    break;
1171  }
1172  case ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS: {
1173    AtomicSDNode *AN = cast<AtomicSDNode>(N);
1174    SDVTList VTs = DAG.getVTList(N->getValueType(0), MVT::Other);
1175    SDValue Tmp = DAG.getAtomicCmpSwap(
1176        ISD::ATOMIC_CMP_SWAP, SDLoc(N), AN->getMemoryVT(), VTs,
1177        N->getOperand(0), N->getOperand(1), N->getOperand(2), N->getOperand(3),
1178        AN->getMemOperand(), AN->getSuccessOrdering(), AN->getFailureOrdering(),
1179        AN->getSynchScope());
1180
1181    // Expanding to the strong ATOMIC_CMP_SWAP node means we can determine
1182    // success simply by comparing the loaded value against the ingoing
1183    // comparison.
1184    SDValue Success = DAG.getSetCC(SDLoc(N), N->getValueType(1), Tmp,
1185                                   N->getOperand(2), ISD::SETEQ);
1186
1187    SplitInteger(Tmp, Lo, Hi);
1188    ReplaceValueWith(SDValue(N, 1), Success);
1189    ReplaceValueWith(SDValue(N, 2), Tmp.getValue(1));
1190    break;
1191  }
1192
1193  case ISD::AND:
1194  case ISD::OR:
1195  case ISD::XOR: ExpandIntRes_Logical(N, Lo, Hi); break;
1196
1197  case ISD::ADD:
1198  case ISD::SUB: ExpandIntRes_ADDSUB(N, Lo, Hi); break;
1199
1200  case ISD::ADDC:
1201  case ISD::SUBC: ExpandIntRes_ADDSUBC(N, Lo, Hi); break;
1202
1203  case ISD::ADDE:
1204  case ISD::SUBE: ExpandIntRes_ADDSUBE(N, Lo, Hi); break;
1205
1206  case ISD::SHL:
1207  case ISD::SRA:
1208  case ISD::SRL: ExpandIntRes_Shift(N, Lo, Hi); break;
1209
1210  case ISD::SADDO:
1211  case ISD::SSUBO: ExpandIntRes_SADDSUBO(N, Lo, Hi); break;
1212  case ISD::UADDO:
1213  case ISD::USUBO: ExpandIntRes_UADDSUBO(N, Lo, Hi); break;
1214  case ISD::UMULO:
1215  case ISD::SMULO: ExpandIntRes_XMULO(N, Lo, Hi); break;
1216  }
1217
1218  // If Lo/Hi is null, the sub-method took care of registering results etc.
1219  if (Lo.getNode())
1220    SetExpandedInteger(SDValue(N, ResNo), Lo, Hi);
1221}
1222
1223/// Lower an atomic node to the appropriate builtin call.
1224std::pair <SDValue, SDValue> DAGTypeLegalizer::ExpandAtomic(SDNode *Node) {
1225  unsigned Opc = Node->getOpcode();
1226  MVT VT = cast<AtomicSDNode>(Node)->getMemoryVT().getSimpleVT();
1227  RTLIB::Libcall LC;
1228
1229  switch (Opc) {
1230  default:
1231    llvm_unreachable("Unhandled atomic intrinsic Expand!");
1232  case ISD::ATOMIC_SWAP:
1233    switch (VT.SimpleTy) {
1234    default: llvm_unreachable("Unexpected value type for atomic!");
1235    case MVT::i8:  LC = RTLIB::SYNC_LOCK_TEST_AND_SET_1; break;
1236    case MVT::i16: LC = RTLIB::SYNC_LOCK_TEST_AND_SET_2; break;
1237    case MVT::i32: LC = RTLIB::SYNC_LOCK_TEST_AND_SET_4; break;
1238    case MVT::i64: LC = RTLIB::SYNC_LOCK_TEST_AND_SET_8; break;
1239    case MVT::i128:LC = RTLIB::SYNC_LOCK_TEST_AND_SET_16;break;
1240    }
1241    break;
1242  case ISD::ATOMIC_CMP_SWAP:
1243    switch (VT.SimpleTy) {
1244    default: llvm_unreachable("Unexpected value type for atomic!");
1245    case MVT::i8:  LC = RTLIB::SYNC_VAL_COMPARE_AND_SWAP_1; break;
1246    case MVT::i16: LC = RTLIB::SYNC_VAL_COMPARE_AND_SWAP_2; break;
1247    case MVT::i32: LC = RTLIB::SYNC_VAL_COMPARE_AND_SWAP_4; break;
1248    case MVT::i64: LC = RTLIB::SYNC_VAL_COMPARE_AND_SWAP_8; break;
1249    case MVT::i128:LC = RTLIB::SYNC_VAL_COMPARE_AND_SWAP_16;break;
1250    }
1251    break;
1252  case ISD::ATOMIC_LOAD_ADD:
1253    switch (VT.SimpleTy) {
1254    default: llvm_unreachable("Unexpected value type for atomic!");
1255    case MVT::i8:  LC = RTLIB::SYNC_FETCH_AND_ADD_1; break;
1256    case MVT::i16: LC = RTLIB::SYNC_FETCH_AND_ADD_2; break;
1257    case MVT::i32: LC = RTLIB::SYNC_FETCH_AND_ADD_4; break;
1258    case MVT::i64: LC = RTLIB::SYNC_FETCH_AND_ADD_8; break;
1259    case MVT::i128:LC = RTLIB::SYNC_FETCH_AND_ADD_16;break;
1260    }
1261    break;
1262  case ISD::ATOMIC_LOAD_SUB:
1263    switch (VT.SimpleTy) {
1264    default: llvm_unreachable("Unexpected value type for atomic!");
1265    case MVT::i8:  LC = RTLIB::SYNC_FETCH_AND_SUB_1; break;
1266    case MVT::i16: LC = RTLIB::SYNC_FETCH_AND_SUB_2; break;
1267    case MVT::i32: LC = RTLIB::SYNC_FETCH_AND_SUB_4; break;
1268    case MVT::i64: LC = RTLIB::SYNC_FETCH_AND_SUB_8; break;
1269    case MVT::i128:LC = RTLIB::SYNC_FETCH_AND_SUB_16;break;
1270    }
1271    break;
1272  case ISD::ATOMIC_LOAD_AND:
1273    switch (VT.SimpleTy) {
1274    default: llvm_unreachable("Unexpected value type for atomic!");
1275    case MVT::i8:  LC = RTLIB::SYNC_FETCH_AND_AND_1; break;
1276    case MVT::i16: LC = RTLIB::SYNC_FETCH_AND_AND_2; break;
1277    case MVT::i32: LC = RTLIB::SYNC_FETCH_AND_AND_4; break;
1278    case MVT::i64: LC = RTLIB::SYNC_FETCH_AND_AND_8; break;
1279    case MVT::i128:LC = RTLIB::SYNC_FETCH_AND_AND_16;break;
1280    }
1281    break;
1282  case ISD::ATOMIC_LOAD_OR:
1283    switch (VT.SimpleTy) {
1284    default: llvm_unreachable("Unexpected value type for atomic!");
1285    case MVT::i8:  LC = RTLIB::SYNC_FETCH_AND_OR_1; break;
1286    case MVT::i16: LC = RTLIB::SYNC_FETCH_AND_OR_2; break;
1287    case MVT::i32: LC = RTLIB::SYNC_FETCH_AND_OR_4; break;
1288    case MVT::i64: LC = RTLIB::SYNC_FETCH_AND_OR_8; break;
1289    case MVT::i128:LC = RTLIB::SYNC_FETCH_AND_OR_16;break;
1290    }
1291    break;
1292  case ISD::ATOMIC_LOAD_XOR:
1293    switch (VT.SimpleTy) {
1294    default: llvm_unreachable("Unexpected value type for atomic!");
1295    case MVT::i8:  LC = RTLIB::SYNC_FETCH_AND_XOR_1; break;
1296    case MVT::i16: LC = RTLIB::SYNC_FETCH_AND_XOR_2; break;
1297    case MVT::i32: LC = RTLIB::SYNC_FETCH_AND_XOR_4; break;
1298    case MVT::i64: LC = RTLIB::SYNC_FETCH_AND_XOR_8; break;
1299    case MVT::i128:LC = RTLIB::SYNC_FETCH_AND_XOR_16;break;
1300    }
1301    break;
1302  case ISD::ATOMIC_LOAD_NAND:
1303    switch (VT.SimpleTy) {
1304    default: llvm_unreachable("Unexpected value type for atomic!");
1305    case MVT::i8:  LC = RTLIB::SYNC_FETCH_AND_NAND_1; break;
1306    case MVT::i16: LC = RTLIB::SYNC_FETCH_AND_NAND_2; break;
1307    case MVT::i32: LC = RTLIB::SYNC_FETCH_AND_NAND_4; break;
1308    case MVT::i64: LC = RTLIB::SYNC_FETCH_AND_NAND_8; break;
1309    case MVT::i128:LC = RTLIB::SYNC_FETCH_AND_NAND_16;break;
1310    }
1311    break;
1312  }
1313
1314  return ExpandChainLibCall(LC, Node, false);
1315}
1316
1317/// ExpandShiftByConstant - N is a shift by a value that needs to be expanded,
1318/// and the shift amount is a constant 'Amt'.  Expand the operation.
1319void DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,
1320                                             SDValue &Lo, SDValue &Hi) {
1321  assert(Amt && "Expected zero shifts to be already optimized away.");
1322  SDLoc DL(N);
1323  // Expand the incoming operand to be shifted, so that we have its parts
1324  SDValue InL, InH;
1325  GetExpandedInteger(N->getOperand(0), InL, InH);
1326
1327  EVT NVT = InL.getValueType();
1328  unsigned VTBits = N->getValueType(0).getSizeInBits();
1329  unsigned NVTBits = NVT.getSizeInBits();
1330  EVT ShTy = N->getOperand(1).getValueType();
1331
1332  if (N->getOpcode() == ISD::SHL) {
1333    if (Amt > VTBits) {
1334      Lo = Hi = DAG.getConstant(0, NVT);
1335    } else if (Amt > NVTBits) {
1336      Lo = DAG.getConstant(0, NVT);
1337      Hi = DAG.getNode(ISD::SHL, DL,
1338                       NVT, InL, DAG.getConstant(Amt-NVTBits, ShTy));
1339    } else if (Amt == NVTBits) {
1340      Lo = DAG.getConstant(0, NVT);
1341      Hi = InL;
1342    } else if (Amt == 1 &&
1343               TLI.isOperationLegalOrCustom(ISD::ADDC,
1344                              TLI.getTypeToExpandTo(*DAG.getContext(), NVT))) {
1345      // Emit this X << 1 as X+X.
1346      SDVTList VTList = DAG.getVTList(NVT, MVT::Glue);
1347      SDValue LoOps[2] = { InL, InL };
1348      Lo = DAG.getNode(ISD::ADDC, DL, VTList, LoOps);
1349      SDValue HiOps[3] = { InH, InH, Lo.getValue(1) };
1350      Hi = DAG.getNode(ISD::ADDE, DL, VTList, HiOps);
1351    } else {
1352      Lo = DAG.getNode(ISD::SHL, DL, NVT, InL, DAG.getConstant(Amt, ShTy));
1353      Hi = DAG.getNode(ISD::OR, DL, NVT,
1354                       DAG.getNode(ISD::SHL, DL, NVT, InH,
1355                                   DAG.getConstant(Amt, ShTy)),
1356                       DAG.getNode(ISD::SRL, DL, NVT, InL,
1357                                   DAG.getConstant(NVTBits-Amt, ShTy)));
1358    }
1359    return;
1360  }
1361
1362  if (N->getOpcode() == ISD::SRL) {
1363    if (Amt > VTBits) {
1364      Lo = DAG.getConstant(0, NVT);
1365      Hi = DAG.getConstant(0, NVT);
1366    } else if (Amt > NVTBits) {
1367      Lo = DAG.getNode(ISD::SRL, DL,
1368                       NVT, InH, DAG.getConstant(Amt-NVTBits,ShTy));
1369      Hi = DAG.getConstant(0, NVT);
1370    } else if (Amt == NVTBits) {
1371      Lo = InH;
1372      Hi = DAG.getConstant(0, NVT);
1373    } else {
1374      Lo = DAG.getNode(ISD::OR, DL, NVT,
1375                       DAG.getNode(ISD::SRL, DL, NVT, InL,
1376                                   DAG.getConstant(Amt, ShTy)),
1377                       DAG.getNode(ISD::SHL, DL, NVT, InH,
1378                                   DAG.getConstant(NVTBits-Amt, ShTy)));
1379      Hi = DAG.getNode(ISD::SRL, DL, NVT, InH, DAG.getConstant(Amt, ShTy));
1380    }
1381    return;
1382  }
1383
1384  assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
1385  if (Amt > VTBits) {
1386    Hi = Lo = DAG.getNode(ISD::SRA, DL, NVT, InH,
1387                          DAG.getConstant(NVTBits-1, ShTy));
1388  } else if (Amt > NVTBits) {
1389    Lo = DAG.getNode(ISD::SRA, DL, NVT, InH,
1390                     DAG.getConstant(Amt-NVTBits, ShTy));
1391    Hi = DAG.getNode(ISD::SRA, DL, NVT, InH,
1392                     DAG.getConstant(NVTBits-1, ShTy));
1393  } else if (Amt == NVTBits) {
1394    Lo = InH;
1395    Hi = DAG.getNode(ISD::SRA, DL, NVT, InH,
1396                     DAG.getConstant(NVTBits-1, ShTy));
1397  } else {
1398    Lo = DAG.getNode(ISD::OR, DL, NVT,
1399                     DAG.getNode(ISD::SRL, DL, NVT, InL,
1400                                 DAG.getConstant(Amt, ShTy)),
1401                     DAG.getNode(ISD::SHL, DL, NVT, InH,
1402                                 DAG.getConstant(NVTBits-Amt, ShTy)));
1403    Hi = DAG.getNode(ISD::SRA, DL, NVT, InH, DAG.getConstant(Amt, ShTy));
1404  }
1405}
1406
1407/// ExpandShiftWithKnownAmountBit - Try to determine whether we can simplify
1408/// this shift based on knowledge of the high bit of the shift amount.  If we
1409/// can tell this, we know that it is >= 32 or < 32, without knowing the actual
1410/// shift amount.
1411bool DAGTypeLegalizer::
1412ExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
1413  SDValue Amt = N->getOperand(1);
1414  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1415  EVT ShTy = Amt.getValueType();
1416  unsigned ShBits = ShTy.getScalarType().getSizeInBits();
1417  unsigned NVTBits = NVT.getScalarType().getSizeInBits();
1418  assert(isPowerOf2_32(NVTBits) &&
1419         "Expanded integer type size not a power of two!");
1420  SDLoc dl(N);
1421
1422  APInt HighBitMask = APInt::getHighBitsSet(ShBits, ShBits - Log2_32(NVTBits));
1423  APInt KnownZero, KnownOne;
1424  DAG.computeKnownBits(N->getOperand(1), KnownZero, KnownOne);
1425
1426  // If we don't know anything about the high bits, exit.
1427  if (((KnownZero|KnownOne) & HighBitMask) == 0)
1428    return false;
1429
1430  // Get the incoming operand to be shifted.
1431  SDValue InL, InH;
1432  GetExpandedInteger(N->getOperand(0), InL, InH);
1433
1434  // If we know that any of the high bits of the shift amount are one, then we
1435  // can do this as a couple of simple shifts.
1436  if (KnownOne.intersects(HighBitMask)) {
1437    // Mask out the high bit, which we know is set.
1438    Amt = DAG.getNode(ISD::AND, dl, ShTy, Amt,
1439                      DAG.getConstant(~HighBitMask, ShTy));
1440
1441    switch (N->getOpcode()) {
1442    default: llvm_unreachable("Unknown shift");
1443    case ISD::SHL:
1444      Lo = DAG.getConstant(0, NVT);              // Low part is zero.
1445      Hi = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt); // High part from Lo part.
1446      return true;
1447    case ISD::SRL:
1448      Hi = DAG.getConstant(0, NVT);              // Hi part is zero.
1449      Lo = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt); // Lo part from Hi part.
1450      return true;
1451    case ISD::SRA:
1452      Hi = DAG.getNode(ISD::SRA, dl, NVT, InH,       // Sign extend high part.
1453                       DAG.getConstant(NVTBits-1, ShTy));
1454      Lo = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt); // Lo part from Hi part.
1455      return true;
1456    }
1457  }
1458
1459  // If we know that all of the high bits of the shift amount are zero, then we
1460  // can do this as a couple of simple shifts.
1461  if ((KnownZero & HighBitMask) == HighBitMask) {
1462    // Calculate 31-x. 31 is used instead of 32 to avoid creating an undefined
1463    // shift if x is zero.  We can use XOR here because x is known to be smaller
1464    // than 32.
1465    SDValue Amt2 = DAG.getNode(ISD::XOR, dl, ShTy, Amt,
1466                               DAG.getConstant(NVTBits-1, ShTy));
1467
1468    unsigned Op1, Op2;
1469    switch (N->getOpcode()) {
1470    default: llvm_unreachable("Unknown shift");
1471    case ISD::SHL:  Op1 = ISD::SHL; Op2 = ISD::SRL; break;
1472    case ISD::SRL:
1473    case ISD::SRA:  Op1 = ISD::SRL; Op2 = ISD::SHL; break;
1474    }
1475
1476    // When shifting right the arithmetic for Lo and Hi is swapped.
1477    if (N->getOpcode() != ISD::SHL)
1478      std::swap(InL, InH);
1479
1480    // Use a little trick to get the bits that move from Lo to Hi. First
1481    // shift by one bit.
1482    SDValue Sh1 = DAG.getNode(Op2, dl, NVT, InL, DAG.getConstant(1, ShTy));
1483    // Then compute the remaining shift with amount-1.
1484    SDValue Sh2 = DAG.getNode(Op2, dl, NVT, Sh1, Amt2);
1485
1486    Lo = DAG.getNode(N->getOpcode(), dl, NVT, InL, Amt);
1487    Hi = DAG.getNode(ISD::OR, dl, NVT, DAG.getNode(Op1, dl, NVT, InH, Amt),Sh2);
1488
1489    if (N->getOpcode() != ISD::SHL)
1490      std::swap(Hi, Lo);
1491    return true;
1492  }
1493
1494  return false;
1495}
1496
1497/// ExpandShiftWithUnknownAmountBit - Fully general expansion of integer shift
1498/// of any size.
1499bool DAGTypeLegalizer::
1500ExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
1501  SDValue Amt = N->getOperand(1);
1502  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1503  EVT ShTy = Amt.getValueType();
1504  unsigned NVTBits = NVT.getSizeInBits();
1505  assert(isPowerOf2_32(NVTBits) &&
1506         "Expanded integer type size not a power of two!");
1507  SDLoc dl(N);
1508
1509  // Get the incoming operand to be shifted.
1510  SDValue InL, InH;
1511  GetExpandedInteger(N->getOperand(0), InL, InH);
1512
1513  SDValue NVBitsNode = DAG.getConstant(NVTBits, ShTy);
1514  SDValue AmtExcess = DAG.getNode(ISD::SUB, dl, ShTy, Amt, NVBitsNode);
1515  SDValue AmtLack = DAG.getNode(ISD::SUB, dl, ShTy, NVBitsNode, Amt);
1516  SDValue isShort = DAG.getSetCC(dl, getSetCCResultType(ShTy),
1517                                 Amt, NVBitsNode, ISD::SETULT);
1518
1519  SDValue LoS, HiS, LoL, HiL;
1520  switch (N->getOpcode()) {
1521  default: llvm_unreachable("Unknown shift");
1522  case ISD::SHL:
1523    // Short: ShAmt < NVTBits
1524    LoS = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt);
1525    HiS = DAG.getNode(ISD::OR, dl, NVT,
1526                      DAG.getNode(ISD::SHL, dl, NVT, InH, Amt),
1527    // FIXME: If Amt is zero, the following shift generates an undefined result
1528    // on some architectures.
1529                      DAG.getNode(ISD::SRL, dl, NVT, InL, AmtLack));
1530
1531    // Long: ShAmt >= NVTBits
1532    LoL = DAG.getConstant(0, NVT);                        // Lo part is zero.
1533    HiL = DAG.getNode(ISD::SHL, dl, NVT, InL, AmtExcess); // Hi from Lo part.
1534
1535    Lo = DAG.getSelect(dl, NVT, isShort, LoS, LoL);
1536    Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
1537    return true;
1538  case ISD::SRL:
1539    // Short: ShAmt < NVTBits
1540    HiS = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt);
1541    LoS = DAG.getNode(ISD::OR, dl, NVT,
1542                      DAG.getNode(ISD::SRL, dl, NVT, InL, Amt),
1543    // FIXME: If Amt is zero, the following shift generates an undefined result
1544    // on some architectures.
1545                      DAG.getNode(ISD::SHL, dl, NVT, InH, AmtLack));
1546
1547    // Long: ShAmt >= NVTBits
1548    HiL = DAG.getConstant(0, NVT);                        // Hi part is zero.
1549    LoL = DAG.getNode(ISD::SRL, dl, NVT, InH, AmtExcess); // Lo from Hi part.
1550
1551    Lo = DAG.getSelect(dl, NVT, isShort, LoS, LoL);
1552    Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
1553    return true;
1554  case ISD::SRA:
1555    // Short: ShAmt < NVTBits
1556    HiS = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt);
1557    LoS = DAG.getNode(ISD::OR, dl, NVT,
1558                      DAG.getNode(ISD::SRL, dl, NVT, InL, Amt),
1559    // FIXME: If Amt is zero, the following shift generates an undefined result
1560    // on some architectures.
1561                      DAG.getNode(ISD::SHL, dl, NVT, InH, AmtLack));
1562
1563    // Long: ShAmt >= NVTBits
1564    HiL = DAG.getNode(ISD::SRA, dl, NVT, InH,             // Sign of Hi part.
1565                      DAG.getConstant(NVTBits-1, ShTy));
1566    LoL = DAG.getNode(ISD::SRA, dl, NVT, InH, AmtExcess); // Lo from Hi part.
1567
1568    Lo = DAG.getSelect(dl, NVT, isShort, LoS, LoL);
1569    Hi = DAG.getSelect(dl, NVT, isShort, HiS, HiL);
1570    return true;
1571  }
1572}
1573
1574void DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,
1575                                           SDValue &Lo, SDValue &Hi) {
1576  SDLoc dl(N);
1577  // Expand the subcomponents.
1578  SDValue LHSL, LHSH, RHSL, RHSH;
1579  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
1580  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1581
1582  EVT NVT = LHSL.getValueType();
1583  SDValue LoOps[2] = { LHSL, RHSL };
1584  SDValue HiOps[3] = { LHSH, RHSH };
1585
1586  // Do not generate ADDC/ADDE or SUBC/SUBE if the target does not support
1587  // them.  TODO: Teach operation legalization how to expand unsupported
1588  // ADDC/ADDE/SUBC/SUBE.  The problem is that these operations generate
1589  // a carry of type MVT::Glue, but there doesn't seem to be any way to
1590  // generate a value of this type in the expanded code sequence.
1591  bool hasCarry =
1592    TLI.isOperationLegalOrCustom(N->getOpcode() == ISD::ADD ?
1593                                   ISD::ADDC : ISD::SUBC,
1594                                 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
1595
1596  if (hasCarry) {
1597    SDVTList VTList = DAG.getVTList(NVT, MVT::Glue);
1598    if (N->getOpcode() == ISD::ADD) {
1599      Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps);
1600      HiOps[2] = Lo.getValue(1);
1601      Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps);
1602    } else {
1603      Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps);
1604      HiOps[2] = Lo.getValue(1);
1605      Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps);
1606    }
1607    return;
1608  }
1609
1610  if (N->getOpcode() == ISD::ADD) {
1611    Lo = DAG.getNode(ISD::ADD, dl, NVT, LoOps);
1612    Hi = DAG.getNode(ISD::ADD, dl, NVT, makeArrayRef(HiOps, 2));
1613    SDValue Cmp1 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[0],
1614                                ISD::SETULT);
1615    SDValue Carry1 = DAG.getSelect(dl, NVT, Cmp1,
1616                                   DAG.getConstant(1, NVT),
1617                                   DAG.getConstant(0, NVT));
1618    SDValue Cmp2 = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo, LoOps[1],
1619                                ISD::SETULT);
1620    SDValue Carry2 = DAG.getSelect(dl, NVT, Cmp2,
1621                                   DAG.getConstant(1, NVT), Carry1);
1622    Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry2);
1623  } else {
1624    Lo = DAG.getNode(ISD::SUB, dl, NVT, LoOps);
1625    Hi = DAG.getNode(ISD::SUB, dl, NVT, makeArrayRef(HiOps, 2));
1626    SDValue Cmp =
1627      DAG.getSetCC(dl, getSetCCResultType(LoOps[0].getValueType()),
1628                   LoOps[0], LoOps[1], ISD::SETULT);
1629    SDValue Borrow = DAG.getSelect(dl, NVT, Cmp,
1630                                   DAG.getConstant(1, NVT),
1631                                   DAG.getConstant(0, NVT));
1632    Hi = DAG.getNode(ISD::SUB, dl, NVT, Hi, Borrow);
1633  }
1634}
1635
1636void DAGTypeLegalizer::ExpandIntRes_ADDSUBC(SDNode *N,
1637                                            SDValue &Lo, SDValue &Hi) {
1638  // Expand the subcomponents.
1639  SDValue LHSL, LHSH, RHSL, RHSH;
1640  SDLoc dl(N);
1641  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
1642  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1643  SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Glue);
1644  SDValue LoOps[2] = { LHSL, RHSL };
1645  SDValue HiOps[3] = { LHSH, RHSH };
1646
1647  if (N->getOpcode() == ISD::ADDC) {
1648    Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps);
1649    HiOps[2] = Lo.getValue(1);
1650    Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps);
1651  } else {
1652    Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps);
1653    HiOps[2] = Lo.getValue(1);
1654    Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps);
1655  }
1656
1657  // Legalized the flag result - switch anything that used the old flag to
1658  // use the new one.
1659  ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
1660}
1661
1662void DAGTypeLegalizer::ExpandIntRes_ADDSUBE(SDNode *N,
1663                                            SDValue &Lo, SDValue &Hi) {
1664  // Expand the subcomponents.
1665  SDValue LHSL, LHSH, RHSL, RHSH;
1666  SDLoc dl(N);
1667  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
1668  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1669  SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Glue);
1670  SDValue LoOps[3] = { LHSL, RHSL, N->getOperand(2) };
1671  SDValue HiOps[3] = { LHSH, RHSH };
1672
1673  Lo = DAG.getNode(N->getOpcode(), dl, VTList, LoOps);
1674  HiOps[2] = Lo.getValue(1);
1675  Hi = DAG.getNode(N->getOpcode(), dl, VTList, HiOps);
1676
1677  // Legalized the flag result - switch anything that used the old flag to
1678  // use the new one.
1679  ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
1680}
1681
1682void DAGTypeLegalizer::ExpandIntRes_MERGE_VALUES(SDNode *N, unsigned ResNo,
1683                                                 SDValue &Lo, SDValue &Hi) {
1684  SDValue Res = DisintegrateMERGE_VALUES(N, ResNo);
1685  SplitInteger(Res, Lo, Hi);
1686}
1687
1688void DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(SDNode *N,
1689                                               SDValue &Lo, SDValue &Hi) {
1690  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1691  SDLoc dl(N);
1692  SDValue Op = N->getOperand(0);
1693  if (Op.getValueType().bitsLE(NVT)) {
1694    // The low part is any extension of the input (which degenerates to a copy).
1695    Lo = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Op);
1696    Hi = DAG.getUNDEF(NVT);   // The high part is undefined.
1697  } else {
1698    // For example, extension of an i48 to an i64.  The operand type necessarily
1699    // promotes to the result type, so will end up being expanded too.
1700    assert(getTypeAction(Op.getValueType()) ==
1701           TargetLowering::TypePromoteInteger &&
1702           "Only know how to promote this result!");
1703    SDValue Res = GetPromotedInteger(Op);
1704    assert(Res.getValueType() == N->getValueType(0) &&
1705           "Operand over promoted?");
1706    // Split the promoted operand.  This will simplify when it is expanded.
1707    SplitInteger(Res, Lo, Hi);
1708  }
1709}
1710
1711void DAGTypeLegalizer::ExpandIntRes_AssertSext(SDNode *N,
1712                                               SDValue &Lo, SDValue &Hi) {
1713  SDLoc dl(N);
1714  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1715  EVT NVT = Lo.getValueType();
1716  EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
1717  unsigned NVTBits = NVT.getSizeInBits();
1718  unsigned EVTBits = EVT.getSizeInBits();
1719
1720  if (NVTBits < EVTBits) {
1721    Hi = DAG.getNode(ISD::AssertSext, dl, NVT, Hi,
1722                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(),
1723                                                        EVTBits - NVTBits)));
1724  } else {
1725    Lo = DAG.getNode(ISD::AssertSext, dl, NVT, Lo, DAG.getValueType(EVT));
1726    // The high part replicates the sign bit of Lo, make it explicit.
1727    Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
1728                     DAG.getConstant(NVTBits-1, TLI.getPointerTy()));
1729  }
1730}
1731
1732void DAGTypeLegalizer::ExpandIntRes_AssertZext(SDNode *N,
1733                                               SDValue &Lo, SDValue &Hi) {
1734  SDLoc dl(N);
1735  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1736  EVT NVT = Lo.getValueType();
1737  EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
1738  unsigned NVTBits = NVT.getSizeInBits();
1739  unsigned EVTBits = EVT.getSizeInBits();
1740
1741  if (NVTBits < EVTBits) {
1742    Hi = DAG.getNode(ISD::AssertZext, dl, NVT, Hi,
1743                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(),
1744                                                        EVTBits - NVTBits)));
1745  } else {
1746    Lo = DAG.getNode(ISD::AssertZext, dl, NVT, Lo, DAG.getValueType(EVT));
1747    // The high part must be zero, make it explicit.
1748    Hi = DAG.getConstant(0, NVT);
1749  }
1750}
1751
1752void DAGTypeLegalizer::ExpandIntRes_BSWAP(SDNode *N,
1753                                          SDValue &Lo, SDValue &Hi) {
1754  SDLoc dl(N);
1755  GetExpandedInteger(N->getOperand(0), Hi, Lo);  // Note swapped operands.
1756  Lo = DAG.getNode(ISD::BSWAP, dl, Lo.getValueType(), Lo);
1757  Hi = DAG.getNode(ISD::BSWAP, dl, Hi.getValueType(), Hi);
1758}
1759
1760void DAGTypeLegalizer::ExpandIntRes_Constant(SDNode *N,
1761                                             SDValue &Lo, SDValue &Hi) {
1762  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1763  unsigned NBitWidth = NVT.getSizeInBits();
1764  auto Constant = cast<ConstantSDNode>(N);
1765  const APInt &Cst = Constant->getAPIntValue();
1766  bool IsTarget = Constant->isTargetOpcode();
1767  bool IsOpaque = Constant->isOpaque();
1768  Lo = DAG.getConstant(Cst.trunc(NBitWidth), NVT, IsTarget, IsOpaque);
1769  Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), NVT, IsTarget,
1770                       IsOpaque);
1771}
1772
1773void DAGTypeLegalizer::ExpandIntRes_CTLZ(SDNode *N,
1774                                         SDValue &Lo, SDValue &Hi) {
1775  SDLoc dl(N);
1776  // ctlz (HiLo) -> Hi != 0 ? ctlz(Hi) : (ctlz(Lo)+32)
1777  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1778  EVT NVT = Lo.getValueType();
1779
1780  SDValue HiNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT), Hi,
1781                                   DAG.getConstant(0, NVT), ISD::SETNE);
1782
1783  SDValue LoLZ = DAG.getNode(N->getOpcode(), dl, NVT, Lo);
1784  SDValue HiLZ = DAG.getNode(ISD::CTLZ_ZERO_UNDEF, dl, NVT, Hi);
1785
1786  Lo = DAG.getSelect(dl, NVT, HiNotZero, HiLZ,
1787                     DAG.getNode(ISD::ADD, dl, NVT, LoLZ,
1788                                 DAG.getConstant(NVT.getSizeInBits(), NVT)));
1789  Hi = DAG.getConstant(0, NVT);
1790}
1791
1792void DAGTypeLegalizer::ExpandIntRes_CTPOP(SDNode *N,
1793                                          SDValue &Lo, SDValue &Hi) {
1794  SDLoc dl(N);
1795  // ctpop(HiLo) -> ctpop(Hi)+ctpop(Lo)
1796  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1797  EVT NVT = Lo.getValueType();
1798  Lo = DAG.getNode(ISD::ADD, dl, NVT, DAG.getNode(ISD::CTPOP, dl, NVT, Lo),
1799                   DAG.getNode(ISD::CTPOP, dl, NVT, Hi));
1800  Hi = DAG.getConstant(0, NVT);
1801}
1802
1803void DAGTypeLegalizer::ExpandIntRes_CTTZ(SDNode *N,
1804                                         SDValue &Lo, SDValue &Hi) {
1805  SDLoc dl(N);
1806  // cttz (HiLo) -> Lo != 0 ? cttz(Lo) : (cttz(Hi)+32)
1807  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1808  EVT NVT = Lo.getValueType();
1809
1810  SDValue LoNotZero = DAG.getSetCC(dl, getSetCCResultType(NVT), Lo,
1811                                   DAG.getConstant(0, NVT), ISD::SETNE);
1812
1813  SDValue LoLZ = DAG.getNode(ISD::CTTZ_ZERO_UNDEF, dl, NVT, Lo);
1814  SDValue HiLZ = DAG.getNode(N->getOpcode(), dl, NVT, Hi);
1815
1816  Lo = DAG.getSelect(dl, NVT, LoNotZero, LoLZ,
1817                     DAG.getNode(ISD::ADD, dl, NVT, HiLZ,
1818                                 DAG.getConstant(NVT.getSizeInBits(), NVT)));
1819  Hi = DAG.getConstant(0, NVT);
1820}
1821
1822void DAGTypeLegalizer::ExpandIntRes_FP_TO_SINT(SDNode *N, SDValue &Lo,
1823                                               SDValue &Hi) {
1824  SDLoc dl(N);
1825  EVT VT = N->getValueType(0);
1826  SDValue Op = N->getOperand(0);
1827  RTLIB::Libcall LC = RTLIB::getFPTOSINT(Op.getValueType(), VT);
1828  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-sint conversion!");
1829  SplitInteger(TLI.makeLibCall(DAG, LC, VT, &Op, 1, true/*irrelevant*/,
1830                               dl).first,
1831               Lo, Hi);
1832}
1833
1834void DAGTypeLegalizer::ExpandIntRes_FP_TO_UINT(SDNode *N, SDValue &Lo,
1835                                               SDValue &Hi) {
1836  SDLoc dl(N);
1837  EVT VT = N->getValueType(0);
1838  SDValue Op = N->getOperand(0);
1839  RTLIB::Libcall LC = RTLIB::getFPTOUINT(Op.getValueType(), VT);
1840  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-uint conversion!");
1841  SplitInteger(TLI.makeLibCall(DAG, LC, VT, &Op, 1, false/*irrelevant*/,
1842                               dl).first,
1843               Lo, Hi);
1844}
1845
1846void DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
1847                                         SDValue &Lo, SDValue &Hi) {
1848  if (ISD::isNormalLoad(N)) {
1849    ExpandRes_NormalLoad(N, Lo, Hi);
1850    return;
1851  }
1852
1853  assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
1854
1855  EVT VT = N->getValueType(0);
1856  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
1857  SDValue Ch  = N->getChain();
1858  SDValue Ptr = N->getBasePtr();
1859  ISD::LoadExtType ExtType = N->getExtensionType();
1860  unsigned Alignment = N->getAlignment();
1861  bool isVolatile = N->isVolatile();
1862  bool isNonTemporal = N->isNonTemporal();
1863  bool isInvariant = N->isInvariant();
1864  const MDNode *TBAAInfo = N->getTBAAInfo();
1865  SDLoc dl(N);
1866
1867  assert(NVT.isByteSized() && "Expanded type not byte sized!");
1868
1869  if (N->getMemoryVT().bitsLE(NVT)) {
1870    EVT MemVT = N->getMemoryVT();
1871
1872    Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getPointerInfo(),
1873                        MemVT, isVolatile, isNonTemporal, Alignment, TBAAInfo);
1874
1875    // Remember the chain.
1876    Ch = Lo.getValue(1);
1877
1878    if (ExtType == ISD::SEXTLOAD) {
1879      // The high part is obtained by SRA'ing all but one of the bits of the
1880      // lo part.
1881      unsigned LoSize = Lo.getValueType().getSizeInBits();
1882      Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
1883                       DAG.getConstant(LoSize-1, TLI.getPointerTy()));
1884    } else if (ExtType == ISD::ZEXTLOAD) {
1885      // The high part is just a zero.
1886      Hi = DAG.getConstant(0, NVT);
1887    } else {
1888      assert(ExtType == ISD::EXTLOAD && "Unknown extload!");
1889      // The high part is undefined.
1890      Hi = DAG.getUNDEF(NVT);
1891    }
1892  } else if (TLI.isLittleEndian()) {
1893    // Little-endian - low bits are at low addresses.
1894    Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getPointerInfo(),
1895                     isVolatile, isNonTemporal, isInvariant, Alignment,
1896                     TBAAInfo);
1897
1898    unsigned ExcessBits =
1899      N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
1900    EVT NEVT = EVT::getIntegerVT(*DAG.getContext(), ExcessBits);
1901
1902    // Increment the pointer to the other half.
1903    unsigned IncrementSize = NVT.getSizeInBits()/8;
1904    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
1905                      DAG.getConstant(IncrementSize, Ptr.getValueType()));
1906    Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr,
1907                        N->getPointerInfo().getWithOffset(IncrementSize), NEVT,
1908                        isVolatile, isNonTemporal,
1909                        MinAlign(Alignment, IncrementSize), TBAAInfo);
1910
1911    // Build a factor node to remember that this load is independent of the
1912    // other one.
1913    Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
1914                     Hi.getValue(1));
1915  } else {
1916    // Big-endian - high bits are at low addresses.  Favor aligned loads at
1917    // the cost of some bit-fiddling.
1918    EVT MemVT = N->getMemoryVT();
1919    unsigned EBytes = MemVT.getStoreSize();
1920    unsigned IncrementSize = NVT.getSizeInBits()/8;
1921    unsigned ExcessBits = (EBytes - IncrementSize)*8;
1922
1923    // Load both the high bits and maybe some of the low bits.
1924    Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getPointerInfo(),
1925                        EVT::getIntegerVT(*DAG.getContext(),
1926                                          MemVT.getSizeInBits() - ExcessBits),
1927                        isVolatile, isNonTemporal, Alignment, TBAAInfo);
1928
1929    // Increment the pointer to the other half.
1930    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
1931                      DAG.getConstant(IncrementSize, Ptr.getValueType()));
1932    // Load the rest of the low bits.
1933    Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, NVT, Ch, Ptr,
1934                        N->getPointerInfo().getWithOffset(IncrementSize),
1935                        EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
1936                        isVolatile, isNonTemporal,
1937                        MinAlign(Alignment, IncrementSize), TBAAInfo);
1938
1939    // Build a factor node to remember that this load is independent of the
1940    // other one.
1941    Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
1942                     Hi.getValue(1));
1943
1944    if (ExcessBits < NVT.getSizeInBits()) {
1945      // Transfer low bits from the bottom of Hi to the top of Lo.
1946      Lo = DAG.getNode(ISD::OR, dl, NVT, Lo,
1947                       DAG.getNode(ISD::SHL, dl, NVT, Hi,
1948                                   DAG.getConstant(ExcessBits,
1949                                                   TLI.getPointerTy())));
1950      // Move high bits to the right position in Hi.
1951      Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl,
1952                       NVT, Hi,
1953                       DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
1954                                       TLI.getPointerTy()));
1955    }
1956  }
1957
1958  // Legalized the chain result - switch anything that used the old chain to
1959  // use the new one.
1960  ReplaceValueWith(SDValue(N, 1), Ch);
1961}
1962
1963void DAGTypeLegalizer::ExpandIntRes_Logical(SDNode *N,
1964                                            SDValue &Lo, SDValue &Hi) {
1965  SDLoc dl(N);
1966  SDValue LL, LH, RL, RH;
1967  GetExpandedInteger(N->getOperand(0), LL, LH);
1968  GetExpandedInteger(N->getOperand(1), RL, RH);
1969  Lo = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LL, RL);
1970  Hi = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LH, RH);
1971}
1972
1973void DAGTypeLegalizer::ExpandIntRes_MUL(SDNode *N,
1974                                        SDValue &Lo, SDValue &Hi) {
1975  EVT VT = N->getValueType(0);
1976  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
1977  SDLoc dl(N);
1978
1979  SDValue LL, LH, RL, RH;
1980  GetExpandedInteger(N->getOperand(0), LL, LH);
1981  GetExpandedInteger(N->getOperand(1), RL, RH);
1982
1983  if (TLI.expandMUL(N, Lo, Hi, NVT, DAG, LL, LH, RL, RH))
1984    return;
1985
1986  // If nothing else, we can make a libcall.
1987  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1988  if (VT == MVT::i16)
1989    LC = RTLIB::MUL_I16;
1990  else if (VT == MVT::i32)
1991    LC = RTLIB::MUL_I32;
1992  else if (VT == MVT::i64)
1993    LC = RTLIB::MUL_I64;
1994  else if (VT == MVT::i128)
1995    LC = RTLIB::MUL_I128;
1996  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported MUL!");
1997
1998  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1999  SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, 2, true/*irrelevant*/,
2000                               dl).first,
2001               Lo, Hi);
2002}
2003
2004void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(SDNode *Node,
2005                                             SDValue &Lo, SDValue &Hi) {
2006  SDValue LHS = Node->getOperand(0);
2007  SDValue RHS = Node->getOperand(1);
2008  SDLoc dl(Node);
2009
2010  // Expand the result by simply replacing it with the equivalent
2011  // non-overflow-checking operation.
2012  SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::SADDO ?
2013                            ISD::ADD : ISD::SUB, dl, LHS.getValueType(),
2014                            LHS, RHS);
2015  SplitInteger(Sum, Lo, Hi);
2016
2017  // Compute the overflow.
2018  //
2019  //   LHSSign -> LHS >= 0
2020  //   RHSSign -> RHS >= 0
2021  //   SumSign -> Sum >= 0
2022  //
2023  //   Add:
2024  //   Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign)
2025  //   Sub:
2026  //   Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign)
2027  //
2028  EVT OType = Node->getValueType(1);
2029  SDValue Zero = DAG.getConstant(0, LHS.getValueType());
2030
2031  SDValue LHSSign = DAG.getSetCC(dl, OType, LHS, Zero, ISD::SETGE);
2032  SDValue RHSSign = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETGE);
2033  SDValue SignsMatch = DAG.getSetCC(dl, OType, LHSSign, RHSSign,
2034                                    Node->getOpcode() == ISD::SADDO ?
2035                                    ISD::SETEQ : ISD::SETNE);
2036
2037  SDValue SumSign = DAG.getSetCC(dl, OType, Sum, Zero, ISD::SETGE);
2038  SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE);
2039
2040  SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE);
2041
2042  // Use the calculated overflow everywhere.
2043  ReplaceValueWith(SDValue(Node, 1), Cmp);
2044}
2045
2046void DAGTypeLegalizer::ExpandIntRes_SDIV(SDNode *N,
2047                                         SDValue &Lo, SDValue &Hi) {
2048  EVT VT = N->getValueType(0);
2049  SDLoc dl(N);
2050
2051  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2052  if (VT == MVT::i16)
2053    LC = RTLIB::SDIV_I16;
2054  else if (VT == MVT::i32)
2055    LC = RTLIB::SDIV_I32;
2056  else if (VT == MVT::i64)
2057    LC = RTLIB::SDIV_I64;
2058  else if (VT == MVT::i128)
2059    LC = RTLIB::SDIV_I128;
2060  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SDIV!");
2061
2062  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2063  SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, 2, true, dl).first, Lo, Hi);
2064}
2065
2066void DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,
2067                                          SDValue &Lo, SDValue &Hi) {
2068  EVT VT = N->getValueType(0);
2069  SDLoc dl(N);
2070
2071  // If we can emit an efficient shift operation, do so now.  Check to see if
2072  // the RHS is a constant.
2073  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1)))
2074    return ExpandShiftByConstant(N, CN->getZExtValue(), Lo, Hi);
2075
2076  // If we can determine that the high bit of the shift is zero or one, even if
2077  // the low bits are variable, emit this shift in an optimized form.
2078  if (ExpandShiftWithKnownAmountBit(N, Lo, Hi))
2079    return;
2080
2081  // If this target supports shift_PARTS, use it.  First, map to the _PARTS opc.
2082  unsigned PartsOpc;
2083  if (N->getOpcode() == ISD::SHL) {
2084    PartsOpc = ISD::SHL_PARTS;
2085  } else if (N->getOpcode() == ISD::SRL) {
2086    PartsOpc = ISD::SRL_PARTS;
2087  } else {
2088    assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
2089    PartsOpc = ISD::SRA_PARTS;
2090  }
2091
2092  // Next check to see if the target supports this SHL_PARTS operation or if it
2093  // will custom expand it.
2094  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
2095  TargetLowering::LegalizeAction Action = TLI.getOperationAction(PartsOpc, NVT);
2096  if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) ||
2097      Action == TargetLowering::Custom) {
2098    // Expand the subcomponents.
2099    SDValue LHSL, LHSH;
2100    GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
2101    EVT VT = LHSL.getValueType();
2102
2103    // If the shift amount operand is coming from a vector legalization it may
2104    // have an illegal type.  Fix that first by casting the operand, otherwise
2105    // the new SHL_PARTS operation would need further legalization.
2106    SDValue ShiftOp = N->getOperand(1);
2107    EVT ShiftTy = TLI.getShiftAmountTy(VT);
2108    assert(ShiftTy.getScalarType().getSizeInBits() >=
2109           Log2_32_Ceil(VT.getScalarType().getSizeInBits()) &&
2110           "ShiftAmountTy is too small to cover the range of this type!");
2111    if (ShiftOp.getValueType() != ShiftTy)
2112      ShiftOp = DAG.getZExtOrTrunc(ShiftOp, dl, ShiftTy);
2113
2114    SDValue Ops[] = { LHSL, LHSH, ShiftOp };
2115    Lo = DAG.getNode(PartsOpc, dl, DAG.getVTList(VT, VT), Ops);
2116    Hi = Lo.getValue(1);
2117    return;
2118  }
2119
2120  // Otherwise, emit a libcall.
2121  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2122  bool isSigned;
2123  if (N->getOpcode() == ISD::SHL) {
2124    isSigned = false; /*sign irrelevant*/
2125    if (VT == MVT::i16)
2126      LC = RTLIB::SHL_I16;
2127    else if (VT == MVT::i32)
2128      LC = RTLIB::SHL_I32;
2129    else if (VT == MVT::i64)
2130      LC = RTLIB::SHL_I64;
2131    else if (VT == MVT::i128)
2132      LC = RTLIB::SHL_I128;
2133  } else if (N->getOpcode() == ISD::SRL) {
2134    isSigned = false;
2135    if (VT == MVT::i16)
2136      LC = RTLIB::SRL_I16;
2137    else if (VT == MVT::i32)
2138      LC = RTLIB::SRL_I32;
2139    else if (VT == MVT::i64)
2140      LC = RTLIB::SRL_I64;
2141    else if (VT == MVT::i128)
2142      LC = RTLIB::SRL_I128;
2143  } else {
2144    assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
2145    isSigned = true;
2146    if (VT == MVT::i16)
2147      LC = RTLIB::SRA_I16;
2148    else if (VT == MVT::i32)
2149      LC = RTLIB::SRA_I32;
2150    else if (VT == MVT::i64)
2151      LC = RTLIB::SRA_I64;
2152    else if (VT == MVT::i128)
2153      LC = RTLIB::SRA_I128;
2154  }
2155
2156  if (LC != RTLIB::UNKNOWN_LIBCALL && TLI.getLibcallName(LC)) {
2157    SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2158    SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, 2, isSigned, dl).first, Lo,
2159                 Hi);
2160    return;
2161  }
2162
2163  if (!ExpandShiftWithUnknownAmountBit(N, Lo, Hi))
2164    llvm_unreachable("Unsupported shift!");
2165}
2166
2167void DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(SDNode *N,
2168                                                SDValue &Lo, SDValue &Hi) {
2169  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
2170  SDLoc dl(N);
2171  SDValue Op = N->getOperand(0);
2172  if (Op.getValueType().bitsLE(NVT)) {
2173    // The low part is sign extension of the input (degenerates to a copy).
2174    Lo = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, N->getOperand(0));
2175    // The high part is obtained by SRA'ing all but one of the bits of low part.
2176    unsigned LoSize = NVT.getSizeInBits();
2177    Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
2178                     DAG.getConstant(LoSize-1, TLI.getPointerTy()));
2179  } else {
2180    // For example, extension of an i48 to an i64.  The operand type necessarily
2181    // promotes to the result type, so will end up being expanded too.
2182    assert(getTypeAction(Op.getValueType()) ==
2183           TargetLowering::TypePromoteInteger &&
2184           "Only know how to promote this result!");
2185    SDValue Res = GetPromotedInteger(Op);
2186    assert(Res.getValueType() == N->getValueType(0) &&
2187           "Operand over promoted?");
2188    // Split the promoted operand.  This will simplify when it is expanded.
2189    SplitInteger(Res, Lo, Hi);
2190    unsigned ExcessBits =
2191      Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
2192    Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi,
2193                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(),
2194                                                        ExcessBits)));
2195  }
2196}
2197
2198void DAGTypeLegalizer::
2199ExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) {
2200  SDLoc dl(N);
2201  GetExpandedInteger(N->getOperand(0), Lo, Hi);
2202  EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
2203
2204  if (EVT.bitsLE(Lo.getValueType())) {
2205    // sext_inreg the low part if needed.
2206    Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Lo.getValueType(), Lo,
2207                     N->getOperand(1));
2208
2209    // The high part gets the sign extension from the lo-part.  This handles
2210    // things like sextinreg V:i64 from i8.
2211    Hi = DAG.getNode(ISD::SRA, dl, Hi.getValueType(), Lo,
2212                     DAG.getConstant(Hi.getValueType().getSizeInBits()-1,
2213                                     TLI.getPointerTy()));
2214  } else {
2215    // For example, extension of an i48 to an i64.  Leave the low part alone,
2216    // sext_inreg the high part.
2217    unsigned ExcessBits =
2218      EVT.getSizeInBits() - Lo.getValueType().getSizeInBits();
2219    Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi,
2220                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(),
2221                                                        ExcessBits)));
2222  }
2223}
2224
2225void DAGTypeLegalizer::ExpandIntRes_SREM(SDNode *N,
2226                                         SDValue &Lo, SDValue &Hi) {
2227  EVT VT = N->getValueType(0);
2228  SDLoc dl(N);
2229
2230  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2231  if (VT == MVT::i16)
2232    LC = RTLIB::SREM_I16;
2233  else if (VT == MVT::i32)
2234    LC = RTLIB::SREM_I32;
2235  else if (VT == MVT::i64)
2236    LC = RTLIB::SREM_I64;
2237  else if (VT == MVT::i128)
2238    LC = RTLIB::SREM_I128;
2239  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SREM!");
2240
2241  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2242  SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, 2, true, dl).first, Lo, Hi);
2243}
2244
2245void DAGTypeLegalizer::ExpandIntRes_TRUNCATE(SDNode *N,
2246                                             SDValue &Lo, SDValue &Hi) {
2247  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
2248  SDLoc dl(N);
2249  Lo = DAG.getNode(ISD::TRUNCATE, dl, NVT, N->getOperand(0));
2250  Hi = DAG.getNode(ISD::SRL, dl,
2251                   N->getOperand(0).getValueType(), N->getOperand(0),
2252                   DAG.getConstant(NVT.getSizeInBits(), TLI.getPointerTy()));
2253  Hi = DAG.getNode(ISD::TRUNCATE, dl, NVT, Hi);
2254}
2255
2256void DAGTypeLegalizer::ExpandIntRes_UADDSUBO(SDNode *N,
2257                                             SDValue &Lo, SDValue &Hi) {
2258  SDValue LHS = N->getOperand(0);
2259  SDValue RHS = N->getOperand(1);
2260  SDLoc dl(N);
2261
2262  // Expand the result by simply replacing it with the equivalent
2263  // non-overflow-checking operation.
2264  SDValue Sum = DAG.getNode(N->getOpcode() == ISD::UADDO ?
2265                            ISD::ADD : ISD::SUB, dl, LHS.getValueType(),
2266                            LHS, RHS);
2267  SplitInteger(Sum, Lo, Hi);
2268
2269  // Calculate the overflow: addition overflows iff a + b < a, and subtraction
2270  // overflows iff a - b > a.
2271  SDValue Ofl = DAG.getSetCC(dl, N->getValueType(1), Sum, LHS,
2272                             N->getOpcode () == ISD::UADDO ?
2273                             ISD::SETULT : ISD::SETUGT);
2274
2275  // Use the calculated overflow everywhere.
2276  ReplaceValueWith(SDValue(N, 1), Ofl);
2277}
2278
2279void DAGTypeLegalizer::ExpandIntRes_XMULO(SDNode *N,
2280                                          SDValue &Lo, SDValue &Hi) {
2281  EVT VT = N->getValueType(0);
2282  SDLoc dl(N);
2283
2284  // A divide for UMULO should be faster than a function call.
2285  if (N->getOpcode() == ISD::UMULO) {
2286    SDValue LHS = N->getOperand(0), RHS = N->getOperand(1);
2287
2288    SDValue MUL = DAG.getNode(ISD::MUL, dl, LHS.getValueType(), LHS, RHS);
2289    SplitInteger(MUL, Lo, Hi);
2290
2291    // A divide for UMULO will be faster than a function call. Select to
2292    // make sure we aren't using 0.
2293    SDValue isZero = DAG.getSetCC(dl, getSetCCResultType(VT),
2294                                  RHS, DAG.getConstant(0, VT), ISD::SETEQ);
2295    SDValue NotZero = DAG.getSelect(dl, VT, isZero,
2296                                    DAG.getConstant(1, VT), RHS);
2297    SDValue DIV = DAG.getNode(ISD::UDIV, dl, VT, MUL, NotZero);
2298    SDValue Overflow = DAG.getSetCC(dl, N->getValueType(1), DIV, LHS,
2299                                    ISD::SETNE);
2300    Overflow = DAG.getSelect(dl, N->getValueType(1), isZero,
2301                             DAG.getConstant(0, N->getValueType(1)),
2302                             Overflow);
2303    ReplaceValueWith(SDValue(N, 1), Overflow);
2304    return;
2305  }
2306
2307  Type *RetTy = VT.getTypeForEVT(*DAG.getContext());
2308  EVT PtrVT = TLI.getPointerTy();
2309  Type *PtrTy = PtrVT.getTypeForEVT(*DAG.getContext());
2310
2311  // Replace this with a libcall that will check overflow.
2312  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2313  if (VT == MVT::i32)
2314    LC = RTLIB::MULO_I32;
2315  else if (VT == MVT::i64)
2316    LC = RTLIB::MULO_I64;
2317  else if (VT == MVT::i128)
2318    LC = RTLIB::MULO_I128;
2319  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported XMULO!");
2320
2321  SDValue Temp = DAG.CreateStackTemporary(PtrVT);
2322  // Temporary for the overflow value, default it to zero.
2323  SDValue Chain = DAG.getStore(DAG.getEntryNode(), dl,
2324                               DAG.getConstant(0, PtrVT), Temp,
2325                               MachinePointerInfo(), false, false, 0);
2326
2327  TargetLowering::ArgListTy Args;
2328  TargetLowering::ArgListEntry Entry;
2329  for (unsigned i = 0, e = N->getNumOperands(); i != e; ++i) {
2330    EVT ArgVT = N->getOperand(i).getValueType();
2331    Type *ArgTy = ArgVT.getTypeForEVT(*DAG.getContext());
2332    Entry.Node = N->getOperand(i);
2333    Entry.Ty = ArgTy;
2334    Entry.isSExt = true;
2335    Entry.isZExt = false;
2336    Args.push_back(Entry);
2337  }
2338
2339  // Also pass the address of the overflow check.
2340  Entry.Node = Temp;
2341  Entry.Ty = PtrTy->getPointerTo();
2342  Entry.isSExt = true;
2343  Entry.isZExt = false;
2344  Args.push_back(Entry);
2345
2346  SDValue Func = DAG.getExternalSymbol(TLI.getLibcallName(LC), PtrVT);
2347
2348  TargetLowering::CallLoweringInfo CLI(DAG);
2349  CLI.setDebugLoc(dl).setChain(Chain)
2350    .setCallee(TLI.getLibcallCallingConv(LC), RetTy, Func, std::move(Args), 0)
2351    .setSExtResult();
2352
2353  std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
2354
2355  SplitInteger(CallInfo.first, Lo, Hi);
2356  SDValue Temp2 = DAG.getLoad(PtrVT, dl, CallInfo.second, Temp,
2357                              MachinePointerInfo(), false, false, false, 0);
2358  SDValue Ofl = DAG.getSetCC(dl, N->getValueType(1), Temp2,
2359                             DAG.getConstant(0, PtrVT),
2360                             ISD::SETNE);
2361  // Use the overflow from the libcall everywhere.
2362  ReplaceValueWith(SDValue(N, 1), Ofl);
2363}
2364
2365void DAGTypeLegalizer::ExpandIntRes_UDIV(SDNode *N,
2366                                         SDValue &Lo, SDValue &Hi) {
2367  EVT VT = N->getValueType(0);
2368  SDLoc dl(N);
2369
2370  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2371  if (VT == MVT::i16)
2372    LC = RTLIB::UDIV_I16;
2373  else if (VT == MVT::i32)
2374    LC = RTLIB::UDIV_I32;
2375  else if (VT == MVT::i64)
2376    LC = RTLIB::UDIV_I64;
2377  else if (VT == MVT::i128)
2378    LC = RTLIB::UDIV_I128;
2379  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UDIV!");
2380
2381  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2382  SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, 2, false, dl).first, Lo, Hi);
2383}
2384
2385void DAGTypeLegalizer::ExpandIntRes_UREM(SDNode *N,
2386                                         SDValue &Lo, SDValue &Hi) {
2387  EVT VT = N->getValueType(0);
2388  SDLoc dl(N);
2389
2390  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2391  if (VT == MVT::i16)
2392    LC = RTLIB::UREM_I16;
2393  else if (VT == MVT::i32)
2394    LC = RTLIB::UREM_I32;
2395  else if (VT == MVT::i64)
2396    LC = RTLIB::UREM_I64;
2397  else if (VT == MVT::i128)
2398    LC = RTLIB::UREM_I128;
2399  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UREM!");
2400
2401  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2402  SplitInteger(TLI.makeLibCall(DAG, LC, VT, Ops, 2, false, dl).first, Lo, Hi);
2403}
2404
2405void DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(SDNode *N,
2406                                                SDValue &Lo, SDValue &Hi) {
2407  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
2408  SDLoc dl(N);
2409  SDValue Op = N->getOperand(0);
2410  if (Op.getValueType().bitsLE(NVT)) {
2411    // The low part is zero extension of the input (degenerates to a copy).
2412    Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, N->getOperand(0));
2413    Hi = DAG.getConstant(0, NVT);   // The high part is just a zero.
2414  } else {
2415    // For example, extension of an i48 to an i64.  The operand type necessarily
2416    // promotes to the result type, so will end up being expanded too.
2417    assert(getTypeAction(Op.getValueType()) ==
2418           TargetLowering::TypePromoteInteger &&
2419           "Only know how to promote this result!");
2420    SDValue Res = GetPromotedInteger(Op);
2421    assert(Res.getValueType() == N->getValueType(0) &&
2422           "Operand over promoted?");
2423    // Split the promoted operand.  This will simplify when it is expanded.
2424    SplitInteger(Res, Lo, Hi);
2425    unsigned ExcessBits =
2426      Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
2427    Hi = DAG.getZeroExtendInReg(Hi, dl,
2428                                EVT::getIntegerVT(*DAG.getContext(),
2429                                                  ExcessBits));
2430  }
2431}
2432
2433void DAGTypeLegalizer::ExpandIntRes_ATOMIC_LOAD(SDNode *N,
2434                                                SDValue &Lo, SDValue &Hi) {
2435  SDLoc dl(N);
2436  EVT VT = cast<AtomicSDNode>(N)->getMemoryVT();
2437  SDVTList VTs = DAG.getVTList(VT, MVT::i1, MVT::Other);
2438  SDValue Zero = DAG.getConstant(0, VT);
2439  SDValue Swap = DAG.getAtomicCmpSwap(
2440      ISD::ATOMIC_CMP_SWAP_WITH_SUCCESS, dl,
2441      cast<AtomicSDNode>(N)->getMemoryVT(), VTs, N->getOperand(0),
2442      N->getOperand(1), Zero, Zero, cast<AtomicSDNode>(N)->getMemOperand(),
2443      cast<AtomicSDNode>(N)->getOrdering(),
2444      cast<AtomicSDNode>(N)->getOrdering(),
2445      cast<AtomicSDNode>(N)->getSynchScope());
2446
2447  ReplaceValueWith(SDValue(N, 0), Swap.getValue(0));
2448  ReplaceValueWith(SDValue(N, 1), Swap.getValue(2));
2449}
2450
2451//===----------------------------------------------------------------------===//
2452//  Integer Operand Expansion
2453//===----------------------------------------------------------------------===//
2454
2455/// ExpandIntegerOperand - This method is called when the specified operand of
2456/// the specified node is found to need expansion.  At this point, all of the
2457/// result types of the node are known to be legal, but other operands of the
2458/// node may need promotion or expansion as well as the specified one.
2459bool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) {
2460  DEBUG(dbgs() << "Expand integer operand: "; N->dump(&DAG); dbgs() << "\n");
2461  SDValue Res = SDValue();
2462
2463  if (CustomLowerNode(N, N->getOperand(OpNo).getValueType(), false))
2464    return false;
2465
2466  switch (N->getOpcode()) {
2467  default:
2468  #ifndef NDEBUG
2469    dbgs() << "ExpandIntegerOperand Op #" << OpNo << ": ";
2470    N->dump(&DAG); dbgs() << "\n";
2471  #endif
2472    llvm_unreachable("Do not know how to expand this operator's operand!");
2473
2474  case ISD::BITCAST:           Res = ExpandOp_BITCAST(N); break;
2475  case ISD::BR_CC:             Res = ExpandIntOp_BR_CC(N); break;
2476  case ISD::BUILD_VECTOR:      Res = ExpandOp_BUILD_VECTOR(N); break;
2477  case ISD::EXTRACT_ELEMENT:   Res = ExpandOp_EXTRACT_ELEMENT(N); break;
2478  case ISD::INSERT_VECTOR_ELT: Res = ExpandOp_INSERT_VECTOR_ELT(N); break;
2479  case ISD::SCALAR_TO_VECTOR:  Res = ExpandOp_SCALAR_TO_VECTOR(N); break;
2480  case ISD::SELECT_CC:         Res = ExpandIntOp_SELECT_CC(N); break;
2481  case ISD::SETCC:             Res = ExpandIntOp_SETCC(N); break;
2482  case ISD::SINT_TO_FP:        Res = ExpandIntOp_SINT_TO_FP(N); break;
2483  case ISD::STORE:   Res = ExpandIntOp_STORE(cast<StoreSDNode>(N), OpNo); break;
2484  case ISD::TRUNCATE:          Res = ExpandIntOp_TRUNCATE(N); break;
2485  case ISD::UINT_TO_FP:        Res = ExpandIntOp_UINT_TO_FP(N); break;
2486
2487  case ISD::SHL:
2488  case ISD::SRA:
2489  case ISD::SRL:
2490  case ISD::ROTL:
2491  case ISD::ROTR:              Res = ExpandIntOp_Shift(N); break;
2492  case ISD::RETURNADDR:
2493  case ISD::FRAMEADDR:         Res = ExpandIntOp_RETURNADDR(N); break;
2494
2495  case ISD::ATOMIC_STORE:      Res = ExpandIntOp_ATOMIC_STORE(N); break;
2496  }
2497
2498  // If the result is null, the sub-method took care of registering results etc.
2499  if (!Res.getNode()) return false;
2500
2501  // If the result is N, the sub-method updated N in place.  Tell the legalizer
2502  // core about this.
2503  if (Res.getNode() == N)
2504    return true;
2505
2506  assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
2507         "Invalid operand expansion");
2508
2509  ReplaceValueWith(SDValue(N, 0), Res);
2510  return false;
2511}
2512
2513/// IntegerExpandSetCCOperands - Expand the operands of a comparison.  This code
2514/// is shared among BR_CC, SELECT_CC, and SETCC handlers.
2515void DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS,
2516                                                  SDValue &NewRHS,
2517                                                  ISD::CondCode &CCCode,
2518                                                  SDLoc dl) {
2519  SDValue LHSLo, LHSHi, RHSLo, RHSHi;
2520  GetExpandedInteger(NewLHS, LHSLo, LHSHi);
2521  GetExpandedInteger(NewRHS, RHSLo, RHSHi);
2522
2523  if (CCCode == ISD::SETEQ || CCCode == ISD::SETNE) {
2524    if (RHSLo == RHSHi) {
2525      if (ConstantSDNode *RHSCST = dyn_cast<ConstantSDNode>(RHSLo)) {
2526        if (RHSCST->isAllOnesValue()) {
2527          // Equality comparison to -1.
2528          NewLHS = DAG.getNode(ISD::AND, dl,
2529                               LHSLo.getValueType(), LHSLo, LHSHi);
2530          NewRHS = RHSLo;
2531          return;
2532        }
2533      }
2534    }
2535
2536    NewLHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSLo, RHSLo);
2537    NewRHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSHi, RHSHi);
2538    NewLHS = DAG.getNode(ISD::OR, dl, NewLHS.getValueType(), NewLHS, NewRHS);
2539    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
2540    return;
2541  }
2542
2543  // If this is a comparison of the sign bit, just look at the top part.
2544  // X > -1,  x < 0
2545  if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(NewRHS))
2546    if ((CCCode == ISD::SETLT && CST->isNullValue()) ||     // X < 0
2547        (CCCode == ISD::SETGT && CST->isAllOnesValue())) {  // X > -1
2548      NewLHS = LHSHi;
2549      NewRHS = RHSHi;
2550      return;
2551    }
2552
2553  // FIXME: This generated code sucks.
2554  ISD::CondCode LowCC;
2555  switch (CCCode) {
2556  default: llvm_unreachable("Unknown integer setcc!");
2557  case ISD::SETLT:
2558  case ISD::SETULT: LowCC = ISD::SETULT; break;
2559  case ISD::SETGT:
2560  case ISD::SETUGT: LowCC = ISD::SETUGT; break;
2561  case ISD::SETLE:
2562  case ISD::SETULE: LowCC = ISD::SETULE; break;
2563  case ISD::SETGE:
2564  case ISD::SETUGE: LowCC = ISD::SETUGE; break;
2565  }
2566
2567  // Tmp1 = lo(op1) < lo(op2)   // Always unsigned comparison
2568  // Tmp2 = hi(op1) < hi(op2)   // Signedness depends on operands
2569  // dest = hi(op1) == hi(op2) ? Tmp1 : Tmp2;
2570
2571  // NOTE: on targets without efficient SELECT of bools, we can always use
2572  // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3)
2573  TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, AfterLegalizeTypes, true,
2574                                                 nullptr);
2575  SDValue Tmp1, Tmp2;
2576  if (TLI.isTypeLegal(LHSLo.getValueType()) &&
2577      TLI.isTypeLegal(RHSLo.getValueType()))
2578    Tmp1 = TLI.SimplifySetCC(getSetCCResultType(LHSLo.getValueType()),
2579                             LHSLo, RHSLo, LowCC, false, DagCombineInfo, dl);
2580  if (!Tmp1.getNode())
2581    Tmp1 = DAG.getSetCC(dl, getSetCCResultType(LHSLo.getValueType()),
2582                        LHSLo, RHSLo, LowCC);
2583  if (TLI.isTypeLegal(LHSHi.getValueType()) &&
2584      TLI.isTypeLegal(RHSHi.getValueType()))
2585    Tmp2 = TLI.SimplifySetCC(getSetCCResultType(LHSHi.getValueType()),
2586                             LHSHi, RHSHi, CCCode, false, DagCombineInfo, dl);
2587  if (!Tmp2.getNode())
2588    Tmp2 = DAG.getNode(ISD::SETCC, dl,
2589                       getSetCCResultType(LHSHi.getValueType()),
2590                       LHSHi, RHSHi, DAG.getCondCode(CCCode));
2591
2592  ConstantSDNode *Tmp1C = dyn_cast<ConstantSDNode>(Tmp1.getNode());
2593  ConstantSDNode *Tmp2C = dyn_cast<ConstantSDNode>(Tmp2.getNode());
2594  if ((Tmp1C && Tmp1C->isNullValue()) ||
2595      (Tmp2C && Tmp2C->isNullValue() &&
2596       (CCCode == ISD::SETLE || CCCode == ISD::SETGE ||
2597        CCCode == ISD::SETUGE || CCCode == ISD::SETULE)) ||
2598      (Tmp2C && Tmp2C->getAPIntValue() == 1 &&
2599       (CCCode == ISD::SETLT || CCCode == ISD::SETGT ||
2600        CCCode == ISD::SETUGT || CCCode == ISD::SETULT))) {
2601    // low part is known false, returns high part.
2602    // For LE / GE, if high part is known false, ignore the low part.
2603    // For LT / GT, if high part is known true, ignore the low part.
2604    NewLHS = Tmp2;
2605    NewRHS = SDValue();
2606    return;
2607  }
2608
2609  NewLHS = TLI.SimplifySetCC(getSetCCResultType(LHSHi.getValueType()),
2610                             LHSHi, RHSHi, ISD::SETEQ, false,
2611                             DagCombineInfo, dl);
2612  if (!NewLHS.getNode())
2613    NewLHS = DAG.getSetCC(dl, getSetCCResultType(LHSHi.getValueType()),
2614                          LHSHi, RHSHi, ISD::SETEQ);
2615  NewLHS = DAG.getSelect(dl, Tmp1.getValueType(),
2616                         NewLHS, Tmp1, Tmp2);
2617  NewRHS = SDValue();
2618}
2619
2620SDValue DAGTypeLegalizer::ExpandIntOp_BR_CC(SDNode *N) {
2621  SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
2622  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get();
2623  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N));
2624
2625  // If ExpandSetCCOperands returned a scalar, we need to compare the result
2626  // against zero to select between true and false values.
2627  if (!NewRHS.getNode()) {
2628    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
2629    CCCode = ISD::SETNE;
2630  }
2631
2632  // Update N to have the operands specified.
2633  return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0),
2634                                DAG.getCondCode(CCCode), NewLHS, NewRHS,
2635                                N->getOperand(4)), 0);
2636}
2637
2638SDValue DAGTypeLegalizer::ExpandIntOp_SELECT_CC(SDNode *N) {
2639  SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
2640  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get();
2641  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N));
2642
2643  // If ExpandSetCCOperands returned a scalar, we need to compare the result
2644  // against zero to select between true and false values.
2645  if (!NewRHS.getNode()) {
2646    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
2647    CCCode = ISD::SETNE;
2648  }
2649
2650  // Update N to have the operands specified.
2651  return SDValue(DAG.UpdateNodeOperands(N, NewLHS, NewRHS,
2652                                N->getOperand(2), N->getOperand(3),
2653                                DAG.getCondCode(CCCode)), 0);
2654}
2655
2656SDValue DAGTypeLegalizer::ExpandIntOp_SETCC(SDNode *N) {
2657  SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
2658  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get();
2659  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, SDLoc(N));
2660
2661  // If ExpandSetCCOperands returned a scalar, use it.
2662  if (!NewRHS.getNode()) {
2663    assert(NewLHS.getValueType() == N->getValueType(0) &&
2664           "Unexpected setcc expansion!");
2665    return NewLHS;
2666  }
2667
2668  // Otherwise, update N to have the operands specified.
2669  return SDValue(DAG.UpdateNodeOperands(N, NewLHS, NewRHS,
2670                                DAG.getCondCode(CCCode)), 0);
2671}
2672
2673SDValue DAGTypeLegalizer::ExpandIntOp_Shift(SDNode *N) {
2674  // The value being shifted is legal, but the shift amount is too big.
2675  // It follows that either the result of the shift is undefined, or the
2676  // upper half of the shift amount is zero.  Just use the lower half.
2677  SDValue Lo, Hi;
2678  GetExpandedInteger(N->getOperand(1), Lo, Hi);
2679  return SDValue(DAG.UpdateNodeOperands(N, N->getOperand(0), Lo), 0);
2680}
2681
2682SDValue DAGTypeLegalizer::ExpandIntOp_RETURNADDR(SDNode *N) {
2683  // The argument of RETURNADDR / FRAMEADDR builtin is 32 bit contant.  This
2684  // surely makes pretty nice problems on 8/16 bit targets. Just truncate this
2685  // constant to valid type.
2686  SDValue Lo, Hi;
2687  GetExpandedInteger(N->getOperand(0), Lo, Hi);
2688  return SDValue(DAG.UpdateNodeOperands(N, Lo), 0);
2689}
2690
2691SDValue DAGTypeLegalizer::ExpandIntOp_SINT_TO_FP(SDNode *N) {
2692  SDValue Op = N->getOperand(0);
2693  EVT DstVT = N->getValueType(0);
2694  RTLIB::Libcall LC = RTLIB::getSINTTOFP(Op.getValueType(), DstVT);
2695  assert(LC != RTLIB::UNKNOWN_LIBCALL &&
2696         "Don't know how to expand this SINT_TO_FP!");
2697  return TLI.makeLibCall(DAG, LC, DstVT, &Op, 1, true, SDLoc(N)).first;
2698}
2699
2700SDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
2701  if (ISD::isNormalStore(N))
2702    return ExpandOp_NormalStore(N, OpNo);
2703
2704  assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
2705  assert(OpNo == 1 && "Can only expand the stored value so far");
2706
2707  EVT VT = N->getOperand(1).getValueType();
2708  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
2709  SDValue Ch  = N->getChain();
2710  SDValue Ptr = N->getBasePtr();
2711  unsigned Alignment = N->getAlignment();
2712  bool isVolatile = N->isVolatile();
2713  bool isNonTemporal = N->isNonTemporal();
2714  const MDNode *TBAAInfo = N->getTBAAInfo();
2715  SDLoc dl(N);
2716  SDValue Lo, Hi;
2717
2718  assert(NVT.isByteSized() && "Expanded type not byte sized!");
2719
2720  if (N->getMemoryVT().bitsLE(NVT)) {
2721    GetExpandedInteger(N->getValue(), Lo, Hi);
2722    return DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getPointerInfo(),
2723                             N->getMemoryVT(), isVolatile, isNonTemporal,
2724                             Alignment, TBAAInfo);
2725  }
2726
2727  if (TLI.isLittleEndian()) {
2728    // Little-endian - low bits are at low addresses.
2729    GetExpandedInteger(N->getValue(), Lo, Hi);
2730
2731    Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getPointerInfo(),
2732                      isVolatile, isNonTemporal, Alignment, TBAAInfo);
2733
2734    unsigned ExcessBits =
2735      N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
2736    EVT NEVT = EVT::getIntegerVT(*DAG.getContext(), ExcessBits);
2737
2738    // Increment the pointer to the other half.
2739    unsigned IncrementSize = NVT.getSizeInBits()/8;
2740    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
2741                      DAG.getConstant(IncrementSize, Ptr.getValueType()));
2742    Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr,
2743                           N->getPointerInfo().getWithOffset(IncrementSize),
2744                           NEVT, isVolatile, isNonTemporal,
2745                           MinAlign(Alignment, IncrementSize), TBAAInfo);
2746    return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
2747  }
2748
2749  // Big-endian - high bits are at low addresses.  Favor aligned stores at
2750  // the cost of some bit-fiddling.
2751  GetExpandedInteger(N->getValue(), Lo, Hi);
2752
2753  EVT ExtVT = N->getMemoryVT();
2754  unsigned EBytes = ExtVT.getStoreSize();
2755  unsigned IncrementSize = NVT.getSizeInBits()/8;
2756  unsigned ExcessBits = (EBytes - IncrementSize)*8;
2757  EVT HiVT = EVT::getIntegerVT(*DAG.getContext(),
2758                               ExtVT.getSizeInBits() - ExcessBits);
2759
2760  if (ExcessBits < NVT.getSizeInBits()) {
2761    // Transfer high bits from the top of Lo to the bottom of Hi.
2762    Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi,
2763                     DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
2764                                     TLI.getPointerTy()));
2765    Hi = DAG.getNode(ISD::OR, dl, NVT, Hi,
2766                     DAG.getNode(ISD::SRL, dl, NVT, Lo,
2767                                 DAG.getConstant(ExcessBits,
2768                                                 TLI.getPointerTy())));
2769  }
2770
2771  // Store both the high bits and maybe some of the low bits.
2772  Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getPointerInfo(),
2773                         HiVT, isVolatile, isNonTemporal, Alignment, TBAAInfo);
2774
2775  // Increment the pointer to the other half.
2776  Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
2777                    DAG.getConstant(IncrementSize, Ptr.getValueType()));
2778  // Store the lowest ExcessBits bits in the second half.
2779  Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr,
2780                         N->getPointerInfo().getWithOffset(IncrementSize),
2781                         EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
2782                         isVolatile, isNonTemporal,
2783                         MinAlign(Alignment, IncrementSize), TBAAInfo);
2784  return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
2785}
2786
2787SDValue DAGTypeLegalizer::ExpandIntOp_TRUNCATE(SDNode *N) {
2788  SDValue InL, InH;
2789  GetExpandedInteger(N->getOperand(0), InL, InH);
2790  // Just truncate the low part of the source.
2791  return DAG.getNode(ISD::TRUNCATE, SDLoc(N), N->getValueType(0), InL);
2792}
2793
2794SDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
2795  SDValue Op = N->getOperand(0);
2796  EVT SrcVT = Op.getValueType();
2797  EVT DstVT = N->getValueType(0);
2798  SDLoc dl(N);
2799
2800  // The following optimization is valid only if every value in SrcVT (when
2801  // treated as signed) is representable in DstVT.  Check that the mantissa
2802  // size of DstVT is >= than the number of bits in SrcVT -1.
2803  const fltSemantics &sem = DAG.EVTToAPFloatSemantics(DstVT);
2804  if (APFloat::semanticsPrecision(sem) >= SrcVT.getSizeInBits()-1 &&
2805      TLI.getOperationAction(ISD::SINT_TO_FP, SrcVT) == TargetLowering::Custom){
2806    // Do a signed conversion then adjust the result.
2807    SDValue SignedConv = DAG.getNode(ISD::SINT_TO_FP, dl, DstVT, Op);
2808    SignedConv = TLI.LowerOperation(SignedConv, DAG);
2809
2810    // The result of the signed conversion needs adjusting if the 'sign bit' of
2811    // the incoming integer was set.  To handle this, we dynamically test to see
2812    // if it is set, and, if so, add a fudge factor.
2813
2814    const uint64_t F32TwoE32  = 0x4F800000ULL;
2815    const uint64_t F32TwoE64  = 0x5F800000ULL;
2816    const uint64_t F32TwoE128 = 0x7F800000ULL;
2817
2818    APInt FF(32, 0);
2819    if (SrcVT == MVT::i32)
2820      FF = APInt(32, F32TwoE32);
2821    else if (SrcVT == MVT::i64)
2822      FF = APInt(32, F32TwoE64);
2823    else if (SrcVT == MVT::i128)
2824      FF = APInt(32, F32TwoE128);
2825    else
2826      llvm_unreachable("Unsupported UINT_TO_FP!");
2827
2828    // Check whether the sign bit is set.
2829    SDValue Lo, Hi;
2830    GetExpandedInteger(Op, Lo, Hi);
2831    SDValue SignSet = DAG.getSetCC(dl,
2832                                   getSetCCResultType(Hi.getValueType()),
2833                                   Hi, DAG.getConstant(0, Hi.getValueType()),
2834                                   ISD::SETLT);
2835
2836    // Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
2837    SDValue FudgePtr = DAG.getConstantPool(
2838                               ConstantInt::get(*DAG.getContext(), FF.zext(64)),
2839                                           TLI.getPointerTy());
2840
2841    // Get a pointer to FF if the sign bit was set, or to 0 otherwise.
2842    SDValue Zero = DAG.getIntPtrConstant(0);
2843    SDValue Four = DAG.getIntPtrConstant(4);
2844    if (TLI.isBigEndian()) std::swap(Zero, Four);
2845    SDValue Offset = DAG.getSelect(dl, Zero.getValueType(), SignSet,
2846                                   Zero, Four);
2847    unsigned Alignment = cast<ConstantPoolSDNode>(FudgePtr)->getAlignment();
2848    FudgePtr = DAG.getNode(ISD::ADD, dl, FudgePtr.getValueType(),
2849                           FudgePtr, Offset);
2850    Alignment = std::min(Alignment, 4u);
2851
2852    // Load the value out, extending it from f32 to the destination float type.
2853    // FIXME: Avoid the extend by constructing the right constant pool?
2854    SDValue Fudge = DAG.getExtLoad(ISD::EXTLOAD, dl, DstVT, DAG.getEntryNode(),
2855                                   FudgePtr,
2856                                   MachinePointerInfo::getConstantPool(),
2857                                   MVT::f32,
2858                                   false, false, Alignment);
2859    return DAG.getNode(ISD::FADD, dl, DstVT, SignedConv, Fudge);
2860  }
2861
2862  // Otherwise, use a libcall.
2863  RTLIB::Libcall LC = RTLIB::getUINTTOFP(SrcVT, DstVT);
2864  assert(LC != RTLIB::UNKNOWN_LIBCALL &&
2865         "Don't know how to expand this UINT_TO_FP!");
2866  return TLI.makeLibCall(DAG, LC, DstVT, &Op, 1, true, dl).first;
2867}
2868
2869SDValue DAGTypeLegalizer::ExpandIntOp_ATOMIC_STORE(SDNode *N) {
2870  SDLoc dl(N);
2871  SDValue Swap = DAG.getAtomic(ISD::ATOMIC_SWAP, dl,
2872                               cast<AtomicSDNode>(N)->getMemoryVT(),
2873                               N->getOperand(0),
2874                               N->getOperand(1), N->getOperand(2),
2875                               cast<AtomicSDNode>(N)->getMemOperand(),
2876                               cast<AtomicSDNode>(N)->getOrdering(),
2877                               cast<AtomicSDNode>(N)->getSynchScope());
2878  return Swap.getValue(1);
2879}
2880
2881
2882SDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_SUBVECTOR(SDNode *N) {
2883  SDValue InOp0 = N->getOperand(0);
2884  EVT InVT = InOp0.getValueType();
2885
2886  EVT OutVT = N->getValueType(0);
2887  EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
2888  assert(NOutVT.isVector() && "This type must be promoted to a vector type");
2889  unsigned OutNumElems = OutVT.getVectorNumElements();
2890  EVT NOutVTElem = NOutVT.getVectorElementType();
2891
2892  SDLoc dl(N);
2893  SDValue BaseIdx = N->getOperand(1);
2894
2895  SmallVector<SDValue, 8> Ops;
2896  Ops.reserve(OutNumElems);
2897  for (unsigned i = 0; i != OutNumElems; ++i) {
2898
2899    // Extract the element from the original vector.
2900    SDValue Index = DAG.getNode(ISD::ADD, dl, BaseIdx.getValueType(),
2901      BaseIdx, DAG.getConstant(i, BaseIdx.getValueType()));
2902    SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
2903      InVT.getVectorElementType(), N->getOperand(0), Index);
2904
2905    SDValue Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, Ext);
2906    // Insert the converted element to the new vector.
2907    Ops.push_back(Op);
2908  }
2909
2910  return DAG.getNode(ISD::BUILD_VECTOR, dl, NOutVT, Ops);
2911}
2912
2913
2914SDValue DAGTypeLegalizer::PromoteIntRes_VECTOR_SHUFFLE(SDNode *N) {
2915  ShuffleVectorSDNode *SV = cast<ShuffleVectorSDNode>(N);
2916  EVT VT = N->getValueType(0);
2917  SDLoc dl(N);
2918
2919  unsigned NumElts = VT.getVectorNumElements();
2920  SmallVector<int, 8> NewMask;
2921  for (unsigned i = 0; i != NumElts; ++i) {
2922    NewMask.push_back(SV->getMaskElt(i));
2923  }
2924
2925  SDValue V0 = GetPromotedInteger(N->getOperand(0));
2926  SDValue V1 = GetPromotedInteger(N->getOperand(1));
2927  EVT OutVT = V0.getValueType();
2928
2929  return DAG.getVectorShuffle(OutVT, dl, V0, V1, &NewMask[0]);
2930}
2931
2932
2933SDValue DAGTypeLegalizer::PromoteIntRes_BUILD_VECTOR(SDNode *N) {
2934  EVT OutVT = N->getValueType(0);
2935  EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
2936  assert(NOutVT.isVector() && "This type must be promoted to a vector type");
2937  unsigned NumElems = N->getNumOperands();
2938  EVT NOutVTElem = NOutVT.getVectorElementType();
2939
2940  SDLoc dl(N);
2941
2942  SmallVector<SDValue, 8> Ops;
2943  Ops.reserve(NumElems);
2944  for (unsigned i = 0; i != NumElems; ++i) {
2945    SDValue Op;
2946    // BUILD_VECTOR integer operand types are allowed to be larger than the
2947    // result's element type. This may still be true after the promotion. For
2948    // example, we might be promoting (<v?i1> = BV <i32>, <i32>, ...) to
2949    // (v?i16 = BV <i32>, <i32>, ...), and we can't any_extend <i32> to <i16>.
2950    if (N->getOperand(i).getValueType().bitsLT(NOutVTElem))
2951      Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, N->getOperand(i));
2952    else
2953      Op = N->getOperand(i);
2954    Ops.push_back(Op);
2955  }
2956
2957  return DAG.getNode(ISD::BUILD_VECTOR, dl, NOutVT, Ops);
2958}
2959
2960SDValue DAGTypeLegalizer::PromoteIntRes_SCALAR_TO_VECTOR(SDNode *N) {
2961
2962  SDLoc dl(N);
2963
2964  assert(!N->getOperand(0).getValueType().isVector() &&
2965         "Input must be a scalar");
2966
2967  EVT OutVT = N->getValueType(0);
2968  EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
2969  assert(NOutVT.isVector() && "This type must be promoted to a vector type");
2970  EVT NOutVTElem = NOutVT.getVectorElementType();
2971
2972  SDValue Op = DAG.getNode(ISD::ANY_EXTEND, dl, NOutVTElem, N->getOperand(0));
2973
2974  return DAG.getNode(ISD::SCALAR_TO_VECTOR, dl, NOutVT, Op);
2975}
2976
2977SDValue DAGTypeLegalizer::PromoteIntRes_CONCAT_VECTORS(SDNode *N) {
2978  SDLoc dl(N);
2979
2980  EVT OutVT = N->getValueType(0);
2981  EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
2982  assert(NOutVT.isVector() && "This type must be promoted to a vector type");
2983
2984  EVT InElemTy = OutVT.getVectorElementType();
2985  EVT OutElemTy = NOutVT.getVectorElementType();
2986
2987  unsigned NumElem = N->getOperand(0).getValueType().getVectorNumElements();
2988  unsigned NumOutElem = NOutVT.getVectorNumElements();
2989  unsigned NumOperands = N->getNumOperands();
2990  assert(NumElem * NumOperands == NumOutElem &&
2991         "Unexpected number of elements");
2992
2993  // Take the elements from the first vector.
2994  SmallVector<SDValue, 8> Ops(NumOutElem);
2995  for (unsigned i = 0; i < NumOperands; ++i) {
2996    SDValue Op = N->getOperand(i);
2997    for (unsigned j = 0; j < NumElem; ++j) {
2998      SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
2999                                InElemTy, Op, DAG.getConstant(j,
3000                                              TLI.getVectorIdxTy()));
3001      Ops[i * NumElem + j] = DAG.getNode(ISD::ANY_EXTEND, dl, OutElemTy, Ext);
3002    }
3003  }
3004
3005  return DAG.getNode(ISD::BUILD_VECTOR, dl, NOutVT, Ops);
3006}
3007
3008SDValue DAGTypeLegalizer::PromoteIntRes_INSERT_VECTOR_ELT(SDNode *N) {
3009  EVT OutVT = N->getValueType(0);
3010  EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
3011  assert(NOutVT.isVector() && "This type must be promoted to a vector type");
3012
3013  EVT NOutVTElem = NOutVT.getVectorElementType();
3014
3015  SDLoc dl(N);
3016  SDValue V0 = GetPromotedInteger(N->getOperand(0));
3017
3018  SDValue ConvElem = DAG.getNode(ISD::ANY_EXTEND, dl,
3019    NOutVTElem, N->getOperand(1));
3020  return DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NOutVT,
3021    V0, ConvElem, N->getOperand(2));
3022}
3023
3024SDValue DAGTypeLegalizer::PromoteIntOp_EXTRACT_VECTOR_ELT(SDNode *N) {
3025  SDLoc dl(N);
3026  SDValue V0 = GetPromotedInteger(N->getOperand(0));
3027  SDValue V1 = DAG.getZExtOrTrunc(N->getOperand(1), dl, TLI.getVectorIdxTy());
3028  SDValue Ext = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl,
3029    V0->getValueType(0).getScalarType(), V0, V1);
3030
3031  // EXTRACT_VECTOR_ELT can return types which are wider than the incoming
3032  // element types. If this is the case then we need to expand the outgoing
3033  // value and not truncate it.
3034  return DAG.getAnyExtOrTrunc(Ext, dl, N->getValueType(0));
3035}
3036
3037SDValue DAGTypeLegalizer::PromoteIntOp_CONCAT_VECTORS(SDNode *N) {
3038  SDLoc dl(N);
3039  unsigned NumElems = N->getNumOperands();
3040
3041  EVT RetSclrTy = N->getValueType(0).getVectorElementType();
3042
3043  SmallVector<SDValue, 8> NewOps;
3044  NewOps.reserve(NumElems);
3045
3046  // For each incoming vector
3047  for (unsigned VecIdx = 0; VecIdx != NumElems; ++VecIdx) {
3048    SDValue Incoming = GetPromotedInteger(N->getOperand(VecIdx));
3049    EVT SclrTy = Incoming->getValueType(0).getVectorElementType();
3050    unsigned NumElem = Incoming->getValueType(0).getVectorNumElements();
3051
3052    for (unsigned i=0; i<NumElem; ++i) {
3053      // Extract element from incoming vector
3054      SDValue Ex = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, SclrTy,
3055      Incoming, DAG.getConstant(i, TLI.getVectorIdxTy()));
3056      SDValue Tr = DAG.getNode(ISD::TRUNCATE, dl, RetSclrTy, Ex);
3057      NewOps.push_back(Tr);
3058    }
3059  }
3060
3061  return DAG.getNode(ISD::BUILD_VECTOR, dl,  N->getValueType(0), NewOps);
3062}
3063