LegalizeIntegerTypes.cpp revision b300d2aa3ef08b5074449e2c05804717f488f4e4
169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//===----- LegalizeIntegerTypes.cpp - Legalization of integer types -------===//
2cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//
3cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//                     The LLVM Compiler Infrastructure
4cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details.
7cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//
8cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
9cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//
1069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands// This file implements integer type expansion and promotion for LegalizeTypes.
1169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands// Promotion is the act of changing a computation in an illegal type into a
1269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands// computation in a larger type.  For example, implementing i8 arithmetic in an
1369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands// i32 register (often needed on powerpc).
1469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands// Expansion is the act of changing a computation in an illegal type into a
1578cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands// computation in two identical registers of a smaller type.  For example,
1669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands// implementing i64 arithmetic in two i32 registers (often needed on 32-bit
1769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands// targets).
18cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//
19cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
20cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
21cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner#include "LegalizeTypes.h"
22c82bf9b268eb63f7cf6f435d9ea222ddb8e3c5a8Mon P Wang#include "llvm/CodeGen/PseudoSourceValue.h"
23cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattnerusing namespace llvm;
24cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
25cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
2669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//  Integer Result Promotion
27cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
28cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// PromoteIntegerResult - This method is called when a result of a node is
3069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// found to be in need of promotion to a larger type.  At this point, the node
3169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// may also have invalid operands or may have other results that need
3269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// expansion, we just know that (at least) one result needs promotion.
3369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
3469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  DEBUG(cerr << "Promote integer result: "; N->dump(&DAG); cerr << "\n");
359fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  SDValue Res = SDValue();
3669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
37126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands  // See if the target wants to custom expand this node.
389fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (CustomLowerResults(N, N->getValueType(ResNo), true))
391607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    return;
40126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands
4169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  switch (N->getOpcode()) {
4269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  default:
4369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands#ifndef NDEBUG
4469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    cerr << "PromoteIntegerResult #" << ResNo << ": ";
4569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    N->dump(&DAG); cerr << "\n";
4669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands#endif
4769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    assert(0 && "Do not know how to promote this operator!");
4869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    abort();
499fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::AssertSext:  Res = PromoteIntRes_AssertSext(N); break;
509fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::AssertZext:  Res = PromoteIntRes_AssertZext(N); break;
519fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::BIT_CONVERT: Res = PromoteIntRes_BIT_CONVERT(N); break;
529fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::BSWAP:       Res = PromoteIntRes_BSWAP(N); break;
539fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::BUILD_PAIR:  Res = PromoteIntRes_BUILD_PAIR(N); break;
549fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::Constant:    Res = PromoteIntRes_Constant(N); break;
5500ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang  case ISD::CONVERT_RNDSAT:
569fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands                         Res = PromoteIntRes_CONVERT_RNDSAT(N); break;
579fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::CTLZ:        Res = PromoteIntRes_CTLZ(N); break;
589fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::CTPOP:       Res = PromoteIntRes_CTPOP(N); break;
599fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::CTTZ:        Res = PromoteIntRes_CTTZ(N); break;
60bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case ISD::EXTRACT_VECTOR_ELT:
619fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands                         Res = PromoteIntRes_EXTRACT_VECTOR_ELT(N); break;
629fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::LOAD:        Res = PromoteIntRes_LOAD(cast<LoadSDNode>(N));break;
639fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SELECT:      Res = PromoteIntRes_SELECT(N); break;
649fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SELECT_CC:   Res = PromoteIntRes_SELECT_CC(N); break;
659fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SETCC:       Res = PromoteIntRes_SETCC(N); break;
669fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SHL:         Res = PromoteIntRes_SHL(N); break;
678d56a6f4d8b010d4c582225a08ece971613f6fe3Duncan Sands  case ISD::SIGN_EXTEND_INREG:
689fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands                         Res = PromoteIntRes_SIGN_EXTEND_INREG(N); break;
699fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SRA:         Res = PromoteIntRes_SRA(N); break;
709fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SRL:         Res = PromoteIntRes_SRL(N); break;
719fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::TRUNCATE:    Res = PromoteIntRes_TRUNCATE(N); break;
729fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::UNDEF:       Res = PromoteIntRes_UNDEF(N); break;
739fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::VAARG:       Res = PromoteIntRes_VAARG(N); break;
74bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
7569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SIGN_EXTEND:
7669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::ZERO_EXTEND:
779fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::ANY_EXTEND:  Res = PromoteIntRes_INT_EXTEND(N); break;
78bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
7969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::FP_TO_SINT:
809fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::FP_TO_UINT:  Res = PromoteIntRes_FP_TO_XINT(N); break;
8169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
8269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::AND:
8369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::OR:
8469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::XOR:
8569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::ADD:
8669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SUB:
879fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::MUL:         Res = PromoteIntRes_SimpleIntBinOp(N); break;
8869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
8969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SDIV:
909fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SREM:        Res = PromoteIntRes_SDIV(N); break;
9169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
9269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::UDIV:
939fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::UREM:        Res = PromoteIntRes_UDIV(N); break;
948ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
95253174bf50c932abaa680f465e2888c0e5272267Bill Wendling  case ISD::SADDO:
969fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SSUBO:       Res = PromoteIntRes_SADDSUBO(N, ResNo); break;
9774c376529101acbe141a256d0bf23a44eb454c84Bill Wendling  case ISD::UADDO:
989fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::USUBO:       Res = PromoteIntRes_UADDSUBO(N, ResNo); break;
9974c376529101acbe141a256d0bf23a44eb454c84Bill Wendling  case ISD::SMULO:
1009fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::UMULO:       Res = PromoteIntRes_XMULO(N, ResNo); break;
101b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
1020b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_ADD:
1030b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_SUB:
1040b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_AND:
1050b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_OR:
1060b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_XOR:
1070b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_NAND:
1080b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_MIN:
1090b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_MAX:
1100b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_UMIN:
1110b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_UMAX:
1120b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_SWAP:
1139fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands    Res = PromoteIntRes_Atomic1(cast<AtomicSDNode>(N)); break;
114b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
1150b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_CMP_SWAP:
1169fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands    Res = PromoteIntRes_Atomic2(cast<AtomicSDNode>(N)); break;
11769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
11869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1199fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  // If the result is null then the sub-method took care of registering it.
1209fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (Res.getNode())
1219fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands    SetPromotedInteger(SDValue(N, ResNo), Res);
12269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
12369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
124475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_AssertSext(SDNode *N) {
12595db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  // Sign-extend the new bits, and continue the assertion.
126c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = SExtPromotedInteger(N->getOperand(0));
127786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::AssertSext, N->getDebugLoc(),
128786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Op.getValueType(), Op, N->getOperand(1));
12995db39a9de48f69f4d764335b492b83a698c7854Duncan Sands}
13095db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
131475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_AssertZext(SDNode *N) {
13295db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  // Zero the new bits, and continue the assertion.
133c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
134786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::AssertZext, N->getDebugLoc(),
135786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Op.getValueType(), Op, N->getOperand(1));
13695db39a9de48f69f4d764335b492b83a698c7854Duncan Sands}
13795db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
138b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_Atomic1(AtomicSDNode *N) {
139b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  SDValue Op2 = GetPromotedInteger(N->getOperand(2));
1407fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands  SDValue Res = DAG.getAtomic(N->getOpcode(), N->getDebugLoc(),
141786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                              N->getMemoryVT(),
1420b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman                              N->getChain(), N->getBasePtr(),
143b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands                              Op2, N->getSrcValue(), N->getAlignment());
144b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // Legalized the chain result - switch anything that used the old chain to
145b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // use the new one.
146b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
147b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  return Res;
148b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands}
149b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
150b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_Atomic2(AtomicSDNode *N) {
151b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  SDValue Op2 = GetPromotedInteger(N->getOperand(2));
152b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  SDValue Op3 = GetPromotedInteger(N->getOperand(3));
153f8d3ec2c5725a2010f11de4ba78f6127712a5fe7Dale Johannesen  SDValue Res = DAG.getAtomic(N->getOpcode(), N->getDebugLoc(),
154f8d3ec2c5725a2010f11de4ba78f6127712a5fe7Dale Johannesen                              N->getMemoryVT(), N->getChain(), N->getBasePtr(),
155b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands                              Op2, Op3, N->getSrcValue(), N->getAlignment());
156b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // Legalized the chain result - switch anything that used the old chain to
157b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // use the new one.
158b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
159b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  return Res;
160b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands}
161b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
162475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_BIT_CONVERT(SDNode *N) {
163475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InOp = N->getOperand(0);
16469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT InVT = InOp.getValueType();
16569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT NInVT = TLI.getTypeToTransformTo(InVT);
16647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  MVT OutVT = N->getValueType(0);
16747d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  MVT NOutVT = TLI.getTypeToTransformTo(OutVT);
168786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
16969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
17069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  switch (getTypeAction(InVT)) {
17169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  default:
17269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    assert(false && "Unknown type action!");
17369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
17469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case Legal:
17569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
17669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case PromoteInteger:
17747d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands    if (NOutVT.bitsEq(NInVT))
17869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands      // The input promotes to the same size.  Convert the promoted value.
1797fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      return DAG.getNode(ISD::BIT_CONVERT, dl,
180786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                         NOutVT, GetPromotedInteger(InOp));
18169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
1824fc4fd657d4266059dac3849133a3a351b03d99dDuncan Sands  case SoftenFloat:
18369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Promote the integer operand by hand.
184786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, GetSoftenedFloat(InOp));
18569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ExpandInteger:
18669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ExpandFloat:
18769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
188f4e4629ee8c218f892ad8ae3e182fe40bc160895Duncan Sands  case ScalarizeVector:
18969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Convert the element to an integer and promote it by hand.
190786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
19169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                       BitConvertToInteger(GetScalarizedVector(InOp)));
19287c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang  case SplitVector: {
19369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // For example, i32 = BIT_CONVERT v2i16 on alpha.  Convert the split
19469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // pieces of the input into integers and reassemble in the final type.
195475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Lo, Hi;
19669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetSplitVector(N->getOperand(0), Lo, Hi);
19769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    Lo = BitConvertToInteger(Lo);
19869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    Hi = BitConvertToInteger(Hi);
19969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
20069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    if (TLI.isBigEndian())
20169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands      std::swap(Lo, Hi);
20269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
203786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    InOp = DAG.getNode(ISD::ANY_EXTEND, dl,
20447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands                       MVT::getIntegerVT(NOutVT.getSizeInBits()),
20569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                       JoinIntegers(Lo, Hi));
206786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::BIT_CONVERT, dl, NOutVT, InOp);
20769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
20887c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang  case WidenVector:
20987c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang    if (OutVT.bitsEq(NInVT))
21087c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang      // The input is widened to the same size.  Convert to the widened value.
211786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      return DAG.getNode(ISD::BIT_CONVERT, dl, OutVT, GetWidenedVector(InOp));
21287c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang  }
21369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
21447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // Otherwise, lower the bit-convert to a store/load from the stack.
21547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // Create the stack frame object.  Make sure it is aligned for both
21647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // the source and destination types.
21747d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  SDValue FIPtr = DAG.CreateStackTemporary(InVT, OutVT);
218c82bf9b268eb63f7cf6f435d9ea222ddb8e3c5a8Mon P Wang  int FI = cast<FrameIndexSDNode>(FIPtr.getNode())->getIndex();
219c82bf9b268eb63f7cf6f435d9ea222ddb8e3c5a8Mon P Wang  const Value *SV = PseudoSourceValue::getFixedStack(FI);
22047d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
22147d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // Emit a store to the stack slot.
222c82bf9b268eb63f7cf6f435d9ea222ddb8e3c5a8Mon P Wang  SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, InOp, FIPtr, SV, 0);
22347d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
22447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // Result is an extending load from the stack slot.
225c82bf9b268eb63f7cf6f435d9ea222ddb8e3c5a8Mon P Wang  return DAG.getExtLoad(ISD::EXTLOAD, dl, NOutVT, Store, FIPtr, SV, 0, OutVT);
22669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
22769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
228475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_BSWAP(SDNode *N) {
229475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
230c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands  MVT OVT = N->getValueType(0);
231c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands  MVT NVT = Op.getValueType();
232786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
233c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands
234c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands  unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits();
235786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op),
23692abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                     DAG.getConstant(DiffBits, TLI.getPointerTy()));
237c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands}
238c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands
239475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) {
240bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The pair element type may be legal, or may not promote to the same type as
241bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // the result, for example i14 = BUILD_PAIR (i7, i7).  Handle all cases.
242786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::ANY_EXTEND, N->getDebugLoc(),
243bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     TLI.getTypeToTransformTo(N->getValueType(0)),
244bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     JoinIntegers(N->getOperand(0), N->getOperand(1)));
24569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
24669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
247475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_Constant(SDNode *N) {
24869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT VT = N->getValueType(0);
249b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  // FIXME there is no actual debug info here
250b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  DebugLoc dl = N->getDebugLoc();
251bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Zero extend things like i1, sign extend everything else.  It shouldn't
252bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // matter in theory which one we pick, but this tends to give better code?
253bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  unsigned Opc = VT.isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
254b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  SDValue Result = DAG.getNode(Opc, dl, TLI.getTypeToTransformTo(VT),
255a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands                               SDValue(N, 0));
256bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(isa<ConstantSDNode>(Result) && "Didn't constant fold ext?");
257bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  return Result;
25869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
25969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
26000ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P WangSDValue DAGTypeLegalizer::PromoteIntRes_CONVERT_RNDSAT(SDNode *N) {
26100ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang  ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
26200ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang  assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
26300ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang           CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
26400ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang           CvtCode == ISD::CVT_SF || CvtCode == ISD::CVT_UF) &&
26500ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang          "can only promote integers");
26600ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang  MVT OutVT = TLI.getTypeToTransformTo(N->getValueType(0));
267c460ae90019ddb19d4c07b2cd2fbaecfa7adf67dDale Johannesen  return DAG.getConvertRndSat(OutVT, N->getDebugLoc(), N->getOperand(0),
26800ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang                              N->getOperand(1), N->getOperand(2),
26900ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang                              N->getOperand(3), N->getOperand(4), CvtCode);
27000ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang}
27100ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang
272475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
273c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  // Zero extend to the promoted type and do the count there.
274c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
275b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  DebugLoc dl = N->getDebugLoc();
27669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT OVT = N->getValueType(0);
27769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT NVT = Op.getValueType();
278b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  Op = DAG.getNode(ISD::CTLZ, dl, NVT, Op);
27969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Subtract off the extra leading bits in the bigger type.
280b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  return DAG.getNode(ISD::SUB, dl, NVT, Op,
28169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                     DAG.getConstant(NVT.getSizeInBits() -
28269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                     OVT.getSizeInBits(), NVT));
28369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
28469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
285475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_CTPOP(SDNode *N) {
28669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Zero extend to the promoted type and do the count there.
287c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
288786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::CTPOP, N->getDebugLoc(), Op.getValueType(), Op);
28969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
29069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
291475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
292475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
29369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT OVT = N->getValueType(0);
29469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT NVT = Op.getValueType();
295786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
29669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // The count is the same in the promoted type except if the original
29769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // value was zero.  This can be handled by setting the bit just off
29869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // the top of the original type.
29903dc093a2e63d20984c8fd67809fa762f1e31f1aDuncan Sands  APInt TopBit(NVT.getSizeInBits(), 0);
30003dc093a2e63d20984c8fd67809fa762f1e31f1aDuncan Sands  TopBit.set(OVT.getSizeInBits());
301786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, NVT));
302786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::CTTZ, dl, NVT, Op);
30369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
30469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
305475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N) {
30669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT OldVT = N->getValueType(0);
307475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue OldVec = N->getOperand(0);
308f7eef6811c8b701b815c64e754a174691953a35fMon P Wang  if (getTypeAction(OldVec.getValueType()) == WidenVector)
309f7eef6811c8b701b815c64e754a174691953a35fMon P Wang    OldVec = GetWidenedVector(N->getOperand(0));
31069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  unsigned OldElts = OldVec.getValueType().getVectorNumElements();
311786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
31269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
31369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  if (OldElts == 1) {
31469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    assert(!isTypeLegal(OldVec.getValueType()) &&
31569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands           "Legal one-element vector of a type needing promotion!");
31669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // It is tempting to follow GetScalarizedVector by a call to
31769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // GetPromotedInteger, but this would be wrong because the
31869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // scalarized value may not yet have been processed.
319786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::ANY_EXTEND, dl, TLI.getTypeToTransformTo(OldVT),
32069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                       GetScalarizedVector(OldVec));
32169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
32269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
32369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Convert to a vector half as long with an element type of twice the width,
32469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // for example <4 x i16> -> <2 x i32>.
32569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  assert(!(OldElts & 1) && "Odd length vectors not supported!");
32669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT NewVT = MVT::getIntegerVT(2 * OldVT.getSizeInBits());
32769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  assert(OldVT.isSimple() && NewVT.isSimple());
32869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
329786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue NewVec = DAG.getNode(ISD::BIT_CONVERT, dl,
33069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                 MVT::getVectorVT(NewVT, OldElts / 2),
33169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                 OldVec);
33269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
33369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Extract the element at OldIdx / 2 from the new vector.
334475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue OldIdx = N->getOperand(1);
335786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue NewIdx = DAG.getNode(ISD::SRL, dl, OldIdx.getValueType(), OldIdx,
33692abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                               DAG.getConstant(1, TLI.getPointerTy()));
337786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Elt = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, NewVec, NewIdx);
33869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
33969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Select the appropriate half of the element: Lo if OldIdx was even,
34069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Hi if it was odd.
341475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Lo = Elt;
342786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Hi = DAG.getNode(ISD::SRL, dl, NewVT, Elt,
3436959b2bb6521baca57e5507ca039e51002d4a971Duncan Sands                           DAG.getConstant(OldVT.getSizeInBits(),
34492abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                           TLI.getPointerTy()));
34569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  if (TLI.isBigEndian())
34669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    std::swap(Lo, Hi);
34769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
348042fb3199f480cd8096d9c51ba1aceecd9af6f0eDuncan Sands  // Extend to the promoted type.
349786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Odd = DAG.getNode(ISD::TRUNCATE, dl, MVT::i1, OldIdx);
350786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(ISD::SELECT, dl, NewVT, Odd, Hi, Lo);
351786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::ANY_EXTEND, dl, TLI.getTypeToTransformTo(OldVT), Res);
35269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
35369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
354475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
355bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
356a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  unsigned NewOpc = N->getOpcode();
357786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
358d3ca9fc9984d036146886a40ad3f73aaf7a424ebDuncan Sands
359bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // If we're promoting a UINT to a larger size, check to see if the new node
360bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // will be legal.  If it isn't, check to see if FP_TO_SINT is legal, since
361bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // we can use that instead.  This allows us to generate better code for
362bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // FP_TO_UINT for small destination sizes on targets where FP_TO_UINT is not
363bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // legal, such as PowerPC.
364a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  if (N->getOpcode() == ISD::FP_TO_UINT &&
365f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman      !TLI.isOperationLegalOrCustom(ISD::FP_TO_UINT, NVT) &&
366f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman      TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NVT))
367a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands    NewOpc = ISD::FP_TO_SINT;
368a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands
369786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(NewOpc, dl, NVT, N->getOperand(0));
370a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands
371a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  // Assert that the converted value fits in the original type.  If it doesn't
372a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  // (eg: because the value being converted is too big), then the result of the
373a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  // original operation was undefined anyway, so the assert is still correct.
374a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  return DAG.getNode(N->getOpcode() == ISD::FP_TO_UINT ?
375786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     ISD::AssertZext : ISD::AssertSext, dl,
376a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands                     NVT, Res, DAG.getValueType(N->getValueType(0)));
377d3ca9fc9984d036146886a40ad3f73aaf7a424ebDuncan Sands}
378d3ca9fc9984d036146886a40ad3f73aaf7a424ebDuncan Sands
379475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) {
380bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
381786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
382be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands
383bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  if (getTypeAction(N->getOperand(0).getValueType()) == PromoteInteger) {
384475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(N->getOperand(0));
3856959b2bb6521baca57e5507ca039e51002d4a971Duncan Sands    assert(Res.getValueType().bitsLE(NVT) && "Extension doesn't make sense!");
386126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands
387bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    // If the result and operand types are the same after promotion, simplify
388bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    // to an in-register extension.
389bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    if (NVT == Res.getValueType()) {
390bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      // The high bits are not guaranteed to be anything.  Insert an extend.
391bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      if (N->getOpcode() == ISD::SIGN_EXTEND)
392786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
393bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                           DAG.getValueType(N->getOperand(0).getValueType()));
394bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      if (N->getOpcode() == ISD::ZERO_EXTEND)
3954be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen        return DAG.getZeroExtendInReg(Res, dl, N->getOperand(0).getValueType());
396bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      assert(N->getOpcode() == ISD::ANY_EXTEND && "Unknown integer extension!");
397bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      return Res;
398126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands    }
39969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
40069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
401bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Otherwise, just extend the original operand all the way to the larger type.
402786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0));
403bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
40469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
405475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) {
406bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
407bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
408bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  ISD::LoadExtType ExtType =
409bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    ISD::isNON_EXTLoad(N) ? ISD::EXTLOAD : N->getExtensionType();
410786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
411786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getExtLoad(ExtType, dl, NVT, N->getChain(), N->getBasePtr(),
41247d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands                               N->getSrcValue(), N->getSrcValueOffset(),
41347d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands                               N->getMemoryVT(), N->isVolatile(),
41447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands                               N->getAlignment());
41569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
416bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Legalized the chain result - switch anything that used the old chain to
417bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // use the new one.
418475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
419bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  return Res;
42069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
42169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
422ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands/// Promote the overflow flag of an overflowing arithmetic node.
423ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_Overflow(SDNode *N) {
424ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Simply change the return type of the boolean result.
425ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(1));
426ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  MVT ValueVTs[] = { N->getValueType(0), NVT };
427ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue Ops[] = { N->getOperand(0), N->getOperand(1) };
428786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(N->getOpcode(), N->getDebugLoc(),
429786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                            DAG.getVTList(ValueVTs, 2), Ops, 2);
430ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
431ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Modified the sum result - switch anything that used the old sum to use
432ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // the new one.
433ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  ReplaceValueWith(SDValue(N, 0), Res);
434ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
435ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return SDValue(Res.getNode(), 1);
436ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
437ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
438ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo) {
439ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  if (ResNo == 1)
440ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands    return PromoteIntRes_Overflow(N);
441ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
442ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // The operation overflowed iff the result in the larger type is not the
443ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // sign extension of its truncation to the original type.
444ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue LHS = SExtPromotedInteger(N->getOperand(0));
445ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue RHS = SExtPromotedInteger(N->getOperand(1));
446ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  MVT OVT = N->getOperand(0).getValueType();
447ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  MVT NVT = LHS.getValueType();
448786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
449ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
450ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Do the arithmetic in the larger type.
451ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  unsigned Opcode = N->getOpcode() == ISD::SADDO ? ISD::ADD : ISD::SUB;
452786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
453ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
454ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Calculate the overflow flag: sign extend the arithmetic result from
455ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // the original type.
456786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Ofl = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
457ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands                            DAG.getValueType(OVT));
458ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Overflowed if and only if this is not equal to Res.
459786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE);
460ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
461ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Use the calculated overflow everywhere.
462ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  ReplaceValueWith(SDValue(N, 1), Ofl);
463ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
464ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return Res;
465ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
466ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
467475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SDIV(SDNode *N) {
468bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Sign extend the input.
469c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue LHS = SExtPromotedInteger(N->getOperand(0));
470c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue RHS = SExtPromotedInteger(N->getOperand(1));
471786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), N->getDebugLoc(),
472786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), LHS, RHS);
47369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
47469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
475475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SELECT(SDNode *N) {
476475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = GetPromotedInteger(N->getOperand(1));
477475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = GetPromotedInteger(N->getOperand(2));
478786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SELECT, N->getDebugLoc(),
479786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), N->getOperand(0),LHS,RHS);
48069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
48169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
482475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SELECT_CC(SDNode *N) {
483475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = GetPromotedInteger(N->getOperand(2));
484475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = GetPromotedInteger(N->getOperand(3));
485786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SELECT_CC, N->getDebugLoc(),
486786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), N->getOperand(0),
487bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     N->getOperand(1), LHS, RHS, N->getOperand(4));
48869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
48969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
490475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
4915480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  MVT SVT = TLI.getSetCCResultType(N->getOperand(0).getValueType());
4927e4982287591945c4e42ba8470a978e629789c76Duncan Sands  assert(isTypeLegal(SVT) && "Illegal SetCC type!");
493786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
4947e4982287591945c4e42ba8470a978e629789c76Duncan Sands
4957e4982287591945c4e42ba8470a978e629789c76Duncan Sands  // Get the SETCC result using the canonical SETCC type.
496786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue SetCC = DAG.getNode(ISD::SETCC, dl, SVT, N->getOperand(0),
4977e4982287591945c4e42ba8470a978e629789c76Duncan Sands                              N->getOperand(1), N->getOperand(2));
4987e4982287591945c4e42ba8470a978e629789c76Duncan Sands
4997e4982287591945c4e42ba8470a978e629789c76Duncan Sands  // Convert to the expected type.
5007e4982287591945c4e42ba8470a978e629789c76Duncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
5016959b2bb6521baca57e5507ca039e51002d4a971Duncan Sands  assert(NVT.bitsLE(SVT) && "Integer type overpromoted?");
502786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, dl, NVT, SetCC);
50369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
50469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
505475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) {
506786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SHL, N->getDebugLoc(),
507786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     TLI.getTypeToTransformTo(N->getValueType(0)),
508bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     GetPromotedInteger(N->getOperand(0)), N->getOperand(1));
50969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
51069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
511475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) {
512475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
513786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SIGN_EXTEND_INREG, N->getDebugLoc(),
514786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Op.getValueType(), Op, N->getOperand(1));
5158d56a6f4d8b010d4c582225a08ece971613f6fe3Duncan Sands}
5168d56a6f4d8b010d4c582225a08ece971613f6fe3Duncan Sands
517475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
518bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The input may have strange things in the top bits of the registers, but
519bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // these operations don't care.  They may have weird bits going out, but
520bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // that too is okay if they are integer operations.
521475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = GetPromotedInteger(N->getOperand(0));
522475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = GetPromotedInteger(N->getOperand(1));
523786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), N->getDebugLoc(),
524786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                    LHS.getValueType(), LHS, RHS);
52569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
52669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
527475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) {
528bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The input value must be properly sign extended.
529c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Res = SExtPromotedInteger(N->getOperand(0));
530786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SRA, N->getDebugLoc(),
531786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Res.getValueType(), Res, N->getOperand(1));
532bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
53369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
534475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
535bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The input value must be properly zero extended.
536bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  MVT VT = N->getValueType(0);
537bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(VT);
538475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res = ZExtPromotedInteger(N->getOperand(0));
539786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SRL, N->getDebugLoc(), NVT, Res, N->getOperand(1));
54069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
54169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
542475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
5436959b2bb6521baca57e5507ca039e51002d4a971Duncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
544475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res;
54569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
546bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  switch (getTypeAction(N->getOperand(0).getValueType())) {
547bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  default: assert(0 && "Unknown type action!");
548bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case Legal:
549bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case ExpandInteger:
550bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    Res = N->getOperand(0);
551bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    break;
552bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case PromoteInteger:
553bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    Res = GetPromotedInteger(N->getOperand(0));
554bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    break;
555bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  }
556bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
557bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Truncate to NVT instead of VT
558786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), NVT, Res);
55969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
56069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
561ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo) {
562ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  if (ResNo == 1)
563ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands    return PromoteIntRes_Overflow(N);
564ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
565ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // The operation overflowed iff the result in the larger type is not the
566ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // zero extension of its truncation to the original type.
567c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
568c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
569ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  MVT OVT = N->getOperand(0).getValueType();
570ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  MVT NVT = LHS.getValueType();
571786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
57269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
573ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Do the arithmetic in the larger type.
574ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  unsigned Opcode = N->getOpcode() == ISD::UADDO ? ISD::ADD : ISD::SUB;
575786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
5768ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
577ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Calculate the overflow flag: zero extend the arithmetic result from
578ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // the original type.
5794be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT);
580ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Overflowed if and only if this is not equal to Res.
581786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE);
5828ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
583ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Use the calculated overflow everywhere.
584ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  ReplaceValueWith(SDValue(N, 1), Ofl);
5858ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
586ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return Res;
587ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
588ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
589ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_UDIV(SDNode *N) {
590ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Zero extend the input.
591ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
592ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
593786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), N->getDebugLoc(),
594786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), LHS, RHS);
5958ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling}
5968ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
597475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_UNDEF(SDNode *N) {
598e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen  return DAG.getUNDEF(TLI.getTypeToTransformTo(N->getValueType(0)));
59969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
60069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
601475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {
602475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Chain = N->getOperand(0); // Get the chain.
603475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ptr = N->getOperand(1); // Get the pointer.
604bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  MVT VT = N->getValueType(0);
605786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
60669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
607d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  MVT RegVT = TLI.getRegisterType(VT);
608d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  unsigned NumRegs = TLI.getNumRegisters(VT);
609d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // The argument is passed as NumRegs registers of type RegVT.
610d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands
611d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  SmallVector<SDValue, 8> Parts(NumRegs);
612d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  for (unsigned i = 0; i < NumRegs; ++i) {
613c460ae90019ddb19d4c07b2cd2fbaecfa7adf67dDale Johannesen    Parts[i] = DAG.getVAArg(RegVT, dl, Chain, Ptr, N->getOperand(2));
614d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands    Chain = Parts[i].getValue(1);
615d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  }
61669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
617d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // Handle endianness of the load.
618d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  if (TLI.isBigEndian())
619d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands    std::reverse(Parts.begin(), Parts.end());
62069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
621d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // Assemble the parts in the promoted type.
622d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
623786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[0]);
624d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  for (unsigned i = 1; i < NumRegs; ++i) {
625786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue Part = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[i]);
626d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands    // Shift it to the right position and "or" it in.
627786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Part = DAG.getNode(ISD::SHL, dl, NVT, Part,
628d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands                       DAG.getConstant(i * RegVT.getSizeInBits(),
62992abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                       TLI.getPointerTy()));
630786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Res = DAG.getNode(ISD::OR, dl, NVT, Res, Part);
631d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  }
63269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
633d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // Modified the chain result - switch anything that used the old chain to
634bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // use the new one.
635d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  ReplaceValueWith(SDValue(N, 1), Chain);
636d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands
637d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  return Res;
63869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
63969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
640ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_XMULO(SDNode *N, unsigned ResNo) {
641ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  assert(ResNo == 1 && "Only boolean result promotion currently supported!");
642ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return PromoteIntRes_Overflow(N);
643ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
6447fc8ab81f5f46dcba0f76b1c546a1d11ccbebe26Duncan Sands
645bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands//===----------------------------------------------------------------------===//
646bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands//  Integer Operand Promotion
647bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands//===----------------------------------------------------------------------===//
6487fc8ab81f5f46dcba0f76b1c546a1d11ccbebe26Duncan Sands
649bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// PromoteIntegerOperand - This method is called when the specified operand of
650bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// the specified node is found to need promotion.  At this point, all of the
651bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// result types of the node are known to be legal, but other operands of the
652bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// node may need promotion or expansion as well as the specified one.
653bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sandsbool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
654bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  DEBUG(cerr << "Promote integer operand: "; N->dump(&DAG); cerr << "\n");
655475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res = SDValue();
6567fc8ab81f5f46dcba0f76b1c546a1d11ccbebe26Duncan Sands
6579fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (CustomLowerResults(N, N->getOperand(OpNo).getValueType(), false))
658bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    return false;
65969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
660bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  switch (N->getOpcode()) {
661bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    default:
662bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  #ifndef NDEBUG
663bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    cerr << "PromoteIntegerOperand Op #" << OpNo << ": ";
664bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    N->dump(&DAG); cerr << "\n";
665bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  #endif
666bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    assert(0 && "Do not know how to promote this operator's operand!");
667bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    abort();
668bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
669bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::ANY_EXTEND:   Res = PromoteIntOp_ANY_EXTEND(N); break;
670bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BR_CC:        Res = PromoteIntOp_BR_CC(N, OpNo); break;
671bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BRCOND:       Res = PromoteIntOp_BRCOND(N, OpNo); break;
672bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BUILD_PAIR:   Res = PromoteIntOp_BUILD_PAIR(N); break;
673bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BUILD_VECTOR: Res = PromoteIntOp_BUILD_VECTOR(N); break;
674bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::CONVERT_RNDSAT:
675bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta                          Res = PromoteIntOp_CONVERT_RNDSAT(N); break;
676bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::INSERT_VECTOR_ELT:
677bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta                          Res = PromoteIntOp_INSERT_VECTOR_ELT(N, OpNo);break;
678bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::MEMBARRIER:   Res = PromoteIntOp_MEMBARRIER(N); break;
679bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SELECT:       Res = PromoteIntOp_SELECT(N, OpNo); break;
680bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SELECT_CC:    Res = PromoteIntOp_SELECT_CC(N, OpNo); break;
681bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SETCC:        Res = PromoteIntOp_SETCC(N, OpNo); break;
682bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SIGN_EXTEND:  Res = PromoteIntOp_SIGN_EXTEND(N); break;
683bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SINT_TO_FP:   Res = PromoteIntOp_SINT_TO_FP(N); break;
684bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::STORE:        Res = PromoteIntOp_STORE(cast<StoreSDNode>(N),
685bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta                                                   OpNo); break;
686bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::TRUNCATE:     Res = PromoteIntOp_TRUNCATE(N); break;
687bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::UINT_TO_FP:   Res = PromoteIntOp_UINT_TO_FP(N); break;
688bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::ZERO_EXTEND:  Res = PromoteIntOp_ZERO_EXTEND(N); break;
68955467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
69055467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SHL:
69155467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRA:
69255467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRL:
69355467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::ROTL:
69455467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::ROTR: Res = PromoteIntOp_Shift(N); break;
695bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  }
6969fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands
697bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // If the result is null, the sub-method took care of registering results etc.
6989fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (!Res.getNode()) return false;
69947d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
70047d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // If the result is N, the sub-method updated N in place.  Tell the legalizer
70147d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // core about this.
70247d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  if (Res.getNode() == N)
703bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    return true;
704bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
705bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
706bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands         "Invalid operand expansion");
707bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
708475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 0), Res);
709bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  return false;
71069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
71169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
71269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// PromoteSetCCOperands - Promote the operands of a comparison.  This code is
71369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// shared among BR_CC, SELECT_CC, and SETCC handlers.
714475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::PromoteSetCCOperands(SDValue &NewLHS,SDValue &NewRHS,
71569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                            ISD::CondCode CCCode) {
716cff50d9e20d7bbc3acf4845fe826bfb3095126c4Duncan Sands  // We have to insert explicit sign or zero extends.  Note that we could
717cff50d9e20d7bbc3acf4845fe826bfb3095126c4Duncan Sands  // insert sign extends for ALL conditions, but zero extend is cheaper on
718cff50d9e20d7bbc3acf4845fe826bfb3095126c4Duncan Sands  // many machines (an AND instead of two shifts), so prefer it.
71969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  switch (CCCode) {
72069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  default: assert(0 && "Unknown integer comparison!");
72169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETEQ:
72269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETNE:
72369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETUGE:
72469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETUGT:
72569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETULE:
72669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETULT:
72769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // ALL of these operations will work if we either sign or zero extend
72869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // the operands (including the unsigned comparisons!).  Zero extend is
72969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // usually a simpler/cheaper operation, so prefer it.
730c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewLHS = ZExtPromotedInteger(NewLHS);
731c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewRHS = ZExtPromotedInteger(NewRHS);
73211ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    break;
73369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETGE:
73469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETGT:
73569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETLT:
73669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETLE:
737c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewLHS = SExtPromotedInteger(NewLHS);
738c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewRHS = SExtPromotedInteger(NewRHS);
73911ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    break;
74069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
74169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
74269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
743475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND(SDNode *N) {
744475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
745786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::ANY_EXTEND, N->getDebugLoc(), N->getValueType(0), Op);
746bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
74769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
748475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo) {
749bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 2 && "Don't know how to promote this operand!");
75069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
751475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = N->getOperand(2);
752475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = N->getOperand(3);
753bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(1))->get());
75469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
755bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The chain (Op#0), CC (#1) and basic block destination (Op#4) are always
756bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // legal types.
757475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
758bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                                N->getOperand(1), LHS, RHS, N->getOperand(4));
759bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
760bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
761475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) {
762bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 1 && "only know how to promote condition");
763bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
764b6e223a9e806921183da972253c49082a2e07944Duncan Sands  // Promote all the way up to the canonical SetCC type.
7655480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  MVT SVT = TLI.getSetCCResultType(MVT::Other);
766b6e223a9e806921183da972253c49082a2e07944Duncan Sands  SDValue Cond = PromoteTargetBoolean(N->getOperand(1), SVT);
767bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
768bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The chain (Op#0) and basic block destination (Op#2) are always legal types.
769475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0), Cond,
770bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                                N->getOperand(2));
771bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
772bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
773475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) {
774bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Since the result type is legal, the operands must promote to it.
775bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  MVT OVT = N->getOperand(0).getValueType();
776c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Lo = ZExtPromotedInteger(N->getOperand(0));
777475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Hi = GetPromotedInteger(N->getOperand(1));
778bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(Lo.getValueType() == N->getValueType(0) && "Operand over promoted?");
779786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
780bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
781786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::SHL, dl, N->getValueType(0), Hi,
78292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                   DAG.getConstant(OVT.getSizeInBits(), TLI.getPointerTy()));
783786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::OR, dl, N->getValueType(0), Lo, Hi);
78469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
78569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
786475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) {
78769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // The vector type is legal but the element type is not.  This implies
78869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // that the vector is a power-of-two in length and that the element
78969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // type does not have a strange size (eg: it is not i1).
79069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT VecVT = N->getValueType(0);
79169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  unsigned NumElts = VecVT.getVectorNumElements();
79269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  assert(!(NumElts & 1) && "Legal vector of one illegal element?");
793786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
79469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
79569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Build a vector of half the length out of elements of twice the bitwidth.
79669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // For example <4 x i16> -> <2 x i32>.
79769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT OldVT = N->getOperand(0).getValueType();
79869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  MVT NewVT = MVT::getIntegerVT(2 * OldVT.getSizeInBits());
79969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  assert(OldVT.isSimple() && NewVT.isSimple());
80069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
801475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  std::vector<SDValue> NewElts;
80269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  NewElts.reserve(NumElts/2);
80369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
80469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  for (unsigned i = 0; i < NumElts; i += 2) {
80569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Combine two successive elements into one promoted element.
806475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Lo = N->getOperand(i);
807475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Hi = N->getOperand(i+1);
80869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    if (TLI.isBigEndian())
80969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands      std::swap(Lo, Hi);
81069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    NewElts.push_back(JoinIntegers(Lo, Hi));
81169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
81269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
813786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue NewVec = DAG.getNode(ISD::BUILD_VECTOR, dl,
81469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                 MVT::getVectorVT(NewVT, NewElts.size()),
81569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                 &NewElts[0], NewElts.size());
81669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
81769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Convert the new vector to the old vector type.
818786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::BIT_CONVERT, dl, VecVT, NewVec);
81969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
82069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
82128088d3c049017a131aa7b07201c6e19c0227cefMon P WangSDValue DAGTypeLegalizer::PromoteIntOp_CONVERT_RNDSAT(SDNode *N) {
82228088d3c049017a131aa7b07201c6e19c0227cefMon P Wang  ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
82328088d3c049017a131aa7b07201c6e19c0227cefMon P Wang  assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
82428088d3c049017a131aa7b07201c6e19c0227cefMon P Wang           CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
82528088d3c049017a131aa7b07201c6e19c0227cefMon P Wang           CvtCode == ISD::CVT_FS || CvtCode == ISD::CVT_FU) &&
82628088d3c049017a131aa7b07201c6e19c0227cefMon P Wang           "can only promote integer arguments");
82728088d3c049017a131aa7b07201c6e19c0227cefMon P Wang  SDValue InOp = GetPromotedInteger(N->getOperand(0));
828c460ae90019ddb19d4c07b2cd2fbaecfa7adf67dDale Johannesen  return DAG.getConvertRndSat(N->getValueType(0), N->getDebugLoc(), InOp,
82928088d3c049017a131aa7b07201c6e19c0227cefMon P Wang                              N->getOperand(1), N->getOperand(2),
83028088d3c049017a131aa7b07201c6e19c0227cefMon P Wang                              N->getOperand(3), N->getOperand(4), CvtCode);
83128088d3c049017a131aa7b07201c6e19c0227cefMon P Wang}
83228088d3c049017a131aa7b07201c6e19c0227cefMon P Wang
833475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
834475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                         unsigned OpNo) {
83569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  if (OpNo == 1) {
83669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Promote the inserted value.  This is valid because the type does not
83769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // have to match the vector element type.
83869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
83969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Check that any extra bits introduced will be truncated away.
84069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    assert(N->getOperand(1).getValueType().getSizeInBits() >=
84169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands           N->getValueType(0).getVectorElementType().getSizeInBits() &&
84269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands           "Type of inserted value narrower than vector element type!");
843475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
84469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                  GetPromotedInteger(N->getOperand(1)),
84569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                  N->getOperand(2));
84669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
84769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
84869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  assert(OpNo == 2 && "Different operand and result vector types?");
84969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
85069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Promote the index.
851c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Idx = ZExtPromotedInteger(N->getOperand(2));
852475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
85369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                N->getOperand(1), Idx);
85469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
85569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
856475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_MEMBARRIER(SDNode *N) {
857475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewOps[6];
8584be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  DebugLoc dl = N->getDebugLoc();
85969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  NewOps[0] = N->getOperand(0);
86069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  for (unsigned i = 1; i < array_lengthof(NewOps); ++i) {
861475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Flag = GetPromotedInteger(N->getOperand(i));
8624be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen    NewOps[i] = DAG.getZeroExtendInReg(Flag, dl, MVT::i1);
86369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
864475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue (N, 0), NewOps,
86569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                array_lengthof(NewOps));
86669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
86769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
868475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
869bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 0 && "Only know how to promote condition");
8707e4982287591945c4e42ba8470a978e629789c76Duncan Sands
871b6e223a9e806921183da972253c49082a2e07944Duncan Sands  // Promote all the way up to the canonical SetCC type.
8725480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  MVT SVT = TLI.getSetCCResultType(N->getOperand(1).getValueType());
873b6e223a9e806921183da972253c49082a2e07944Duncan Sands  SDValue Cond = PromoteTargetBoolean(N->getOperand(0), SVT);
874bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
8757e4982287591945c4e42ba8470a978e629789c76Duncan Sands  return DAG.UpdateNodeOperands(SDValue(N, 0), Cond,
8767e4982287591945c4e42ba8470a978e629789c76Duncan Sands                                N->getOperand(1), N->getOperand(2));
877bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
878bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
879475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo) {
880bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 0 && "Don't know how to promote this operand!");
881bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
882475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = N->getOperand(0);
883475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = N->getOperand(1);
884bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(4))->get());
885bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
886bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The CC (#4) and the possible return values (#2 and #3) have legal types.
887475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), LHS, RHS, N->getOperand(2),
888bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                                N->getOperand(3), N->getOperand(4));
889bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
890bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
891475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SETCC(SDNode *N, unsigned OpNo) {
892bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 0 && "Don't know how to promote this operand!");
893bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
894475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = N->getOperand(0);
895475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = N->getOperand(1);
896bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(2))->get());
897bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
898bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The CC (#2) is always legal.
899475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), LHS, RHS, N->getOperand(2));
900bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
901bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
90255467af31620c9d027e071ebcd9746b7593cff17Sanjiv GuptaSDValue DAGTypeLegalizer::PromoteIntOp_Shift(SDNode *N) {
90355467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
90455467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta                                ZExtPromotedInteger(N->getOperand(1)));
90555467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta}
90655467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
907475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SIGN_EXTEND(SDNode *N) {
908475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
909786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
910786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op);
911786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Op.getValueType(),
912bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     Op, DAG.getValueType(N->getOperand(0).getValueType()));
913bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
914bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
915c08468774b65dc288c44076d428f4beddabe58e2Duncan SandsSDValue DAGTypeLegalizer::PromoteIntOp_SINT_TO_FP(SDNode *N) {
916c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  return DAG.UpdateNodeOperands(SDValue(N, 0),
917c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands                                SExtPromotedInteger(N->getOperand(0)));
918c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands}
919c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands
920475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
921bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
922475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ch = N->getChain(), Ptr = N->getBasePtr();
923bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  int SVOffset = N->getSrcValueOffset();
924bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  unsigned Alignment = N->getAlignment();
925bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  bool isVolatile = N->isVolatile();
926786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
927bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
928475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Val = GetPromotedInteger(N->getValue());  // Get promoted value.
929bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
930bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Truncate the value and store the result.
931786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getTruncStore(Ch, dl, Val, Ptr, N->getSrcValue(),
932bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                           SVOffset, N->getMemoryVT(),
933bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                           isVolatile, Alignment);
934bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
935bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
936475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) {
937475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
938786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), N->getValueType(0), Op);
939bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
940bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
941c08468774b65dc288c44076d428f4beddabe58e2Duncan SandsSDValue DAGTypeLegalizer::PromoteIntOp_UINT_TO_FP(SDNode *N) {
942c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  return DAG.UpdateNodeOperands(SDValue(N, 0),
943c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands                                ZExtPromotedInteger(N->getOperand(0)));
944c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands}
945c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands
946475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) {
9474be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  DebugLoc dl = N->getDebugLoc();
948475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
9494be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op);
9504be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  return DAG.getZeroExtendInReg(Op, dl, N->getOperand(0).getValueType());
951bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
952bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
95369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
95469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//===----------------------------------------------------------------------===//
95569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//  Integer Result Expansion
95669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//===----------------------------------------------------------------------===//
95769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
95869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// ExpandIntegerResult - This method is called when the specified result of the
959cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner/// specified node is found to need expansion.  At this point, the node may also
960cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner/// have invalid operands or may have other results that need promotion, we just
961cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner/// know that (at least) one result needs expansion.
96269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
96369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  DEBUG(cerr << "Expand integer result: "; N->dump(&DAG); cerr << "\n");
964475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Lo, Hi;
965475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  Lo = Hi = SDValue();
966cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
967cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // See if the target wants to custom expand this node.
9689fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (CustomLowerResults(N, N->getValueType(ResNo), true))
9691607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    return;
970cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
971cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  switch (N->getOpcode()) {
972cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  default:
973cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner#ifndef NDEBUG
97469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    cerr << "ExpandIntegerResult #" << ResNo << ": ";
975cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    N->dump(&DAG); cerr << "\n";
976cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner#endif
97778cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands    assert(0 && "Do not know how to expand the result of this operator!");
978cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    abort();
97969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
98078cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::MERGE_VALUES: SplitRes_MERGE_VALUES(N, Lo, Hi); break;
98178cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::SELECT:       SplitRes_SELECT(N, Lo, Hi); break;
98278cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::SELECT_CC:    SplitRes_SELECT_CC(N, Lo, Hi); break;
98378cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::UNDEF:        SplitRes_UNDEF(N, Lo, Hi); break;
98478cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
98578cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::BIT_CONVERT:        ExpandRes_BIT_CONVERT(N, Lo, Hi); break;
98678cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::BUILD_PAIR:         ExpandRes_BUILD_PAIR(N, Lo, Hi); break;
9874a307ecce68f90e0eebf1ded52b947816cdc2304Duncan Sands  case ISD::EXTRACT_ELEMENT:    ExpandRes_EXTRACT_ELEMENT(N, Lo, Hi); break;
98878cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::EXTRACT_VECTOR_ELT: ExpandRes_EXTRACT_VECTOR_ELT(N, Lo, Hi); break;
98921c2972f7d24680f6475877a3398b7f8cf515b33Duncan Sands  case ISD::VAARG:              ExpandRes_VAARG(N, Lo, Hi); break;
99078cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
99169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::ANY_EXTEND:  ExpandIntRes_ANY_EXTEND(N, Lo, Hi); break;
99295db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  case ISD::AssertSext:  ExpandIntRes_AssertSext(N, Lo, Hi); break;
99369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::AssertZext:  ExpandIntRes_AssertZext(N, Lo, Hi); break;
99405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::BSWAP:       ExpandIntRes_BSWAP(N, Lo, Hi); break;
99505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::Constant:    ExpandIntRes_Constant(N, Lo, Hi); break;
99605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::CTLZ:        ExpandIntRes_CTLZ(N, Lo, Hi); break;
99705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::CTPOP:       ExpandIntRes_CTPOP(N, Lo, Hi); break;
99805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::CTTZ:        ExpandIntRes_CTTZ(N, Lo, Hi); break;
99969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::FP_TO_SINT:  ExpandIntRes_FP_TO_SINT(N, Lo, Hi); break;
100069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::FP_TO_UINT:  ExpandIntRes_FP_TO_UINT(N, Lo, Hi); break;
100169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::LOAD:        ExpandIntRes_LOAD(cast<LoadSDNode>(N), Lo, Hi); break;
100205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::MUL:         ExpandIntRes_MUL(N, Lo, Hi); break;
100305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SDIV:        ExpandIntRes_SDIV(N, Lo, Hi); break;
100405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SIGN_EXTEND: ExpandIntRes_SIGN_EXTEND(N, Lo, Hi); break;
100505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SIGN_EXTEND_INREG: ExpandIntRes_SIGN_EXTEND_INREG(N, Lo, Hi); break;
100605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SREM:        ExpandIntRes_SREM(N, Lo, Hi); break;
100705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::TRUNCATE:    ExpandIntRes_TRUNCATE(N, Lo, Hi); break;
100805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::UDIV:        ExpandIntRes_UDIV(N, Lo, Hi); break;
100905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::UREM:        ExpandIntRes_UREM(N, Lo, Hi); break;
101005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::ZERO_EXTEND: ExpandIntRes_ZERO_EXTEND(N, Lo, Hi); break;
101169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1012cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::AND:
1013cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::OR:
101405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::XOR: ExpandIntRes_Logical(N, Lo, Hi); break;
101505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1016cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::ADD:
101705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SUB: ExpandIntRes_ADDSUB(N, Lo, Hi); break;
101805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1019cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::ADDC:
102005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SUBC: ExpandIntRes_ADDSUBC(N, Lo, Hi); break;
102105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1022cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::ADDE:
102305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SUBE: ExpandIntRes_ADDSUBE(N, Lo, Hi); break;
102405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1025cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SHL:
1026cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SRA:
102705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SRL: ExpandIntRes_Shift(N, Lo, Hi); break;
1028cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
1029d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
1030cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If Lo/Hi is null, the sub-method took care of registering results etc.
1031ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (Lo.getNode())
1032475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SetExpandedInteger(SDValue(N, ResNo), Lo, Hi);
1033cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1034cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
103505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// ExpandShiftByConstant - N is a shift by a value that needs to be expanded,
103605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// and the shift amount is a constant 'Amt'.  Expand the operation.
103705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,
1038475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                             SDValue &Lo, SDValue &Hi) {
1039786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
104005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the incoming operand to be shifted, so that we have its parts
1041475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InL, InH;
104205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), InL, InH);
1043cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
104405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = InL.getValueType();
104505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned VTBits = N->getValueType(0).getSizeInBits();
104605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned NVTBits = NVT.getSizeInBits();
104705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT ShTy = N->getOperand(1).getValueType();
1048cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
104905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (N->getOpcode() == ISD::SHL) {
105005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    if (Amt > VTBits) {
105105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = Hi = DAG.getConstant(0, NVT);
105205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt > NVTBits) {
105305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);
10547fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      Hi = DAG.getNode(ISD::SHL, dl,
1055786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       NVT, InL, DAG.getConstant(Amt-NVTBits,ShTy));
105605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt == NVTBits) {
105705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);
105805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = InL;
1059104de6cf7b80ec5e9beb502a069f376810a0a1e3Richard Osborne    } else if (Amt == 1 &&
1060f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman               TLI.isOperationLegalOrCustom(ISD::ADDC,
1061f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman                                            TLI.getTypeToExpandTo(NVT))) {
106205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      // Emit this X << 1 as X+X.
106305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
1064475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue LoOps[2] = { InL, InL };
1065786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2);
1066475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue HiOps[3] = { InH, InH, Lo.getValue(1) };
1067786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3);
106805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else {
1069786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SHL, dl, NVT, InL, DAG.getConstant(Amt, ShTy));
1070786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::OR, dl, NVT,
1071786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SHL, dl, NVT, InH,
107205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(Amt, ShTy)),
1073786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SRL, dl, NVT, InL,
107405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(NVTBits-Amt, ShTy)));
107505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
107605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return;
1077cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
1078cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
107905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (N->getOpcode() == ISD::SRL) {
108005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    if (Amt > VTBits) {
108105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);
108205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);
108305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt > NVTBits) {
10847fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      Lo = DAG.getNode(ISD::SRL, dl,
1085786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       NVT, InH, DAG.getConstant(Amt-NVTBits,ShTy));
108605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);
108705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt == NVTBits) {
108805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = InH;
108905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);
109005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else {
1091786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::OR, dl, NVT,
1092786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SRL, dl, NVT, InL,
109305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(Amt, ShTy)),
1094786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SHL, dl, NVT, InH,
109505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(NVTBits-Amt, ShTy)));
1096786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SRL, dl, NVT, InH, DAG.getConstant(Amt, ShTy));
109705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
109805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return;
1099cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
1100d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands
110105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
110205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Amt > VTBits) {
1103786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = Lo = DAG.getNode(ISD::SRA, dl, NVT, InH,
110405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                          DAG.getConstant(NVTBits-1, ShTy));
110505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else if (Amt > NVTBits) {
1106786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SRA, dl, NVT, InH,
110705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(Amt-NVTBits, ShTy));
1108786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, InH,
110905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(NVTBits-1, ShTy));
111005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else if (Amt == NVTBits) {
111105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Lo = InH;
1112786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, InH,
111305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(NVTBits-1, ShTy));
1114d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands  } else {
1115de06470330260f5937e7ca558f5f5b3e171f2ee5Dale Johannesen    Lo = DAG.getNode(ISD::OR, dl, NVT,
1116786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     DAG.getNode(ISD::SRL, dl, NVT, InL,
111705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 DAG.getConstant(Amt, ShTy)),
1118786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     DAG.getNode(ISD::SHL, dl, NVT, InH,
111905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 DAG.getConstant(NVTBits-Amt, ShTy)));
1120786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, DAG.getConstant(Amt, ShTy));
1121d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands  }
1122d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands}
1123d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands
112405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// ExpandShiftWithKnownAmountBit - Try to determine whether we can simplify
112505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// this shift based on knowledge of the high bit of the shift amount.  If we
112605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// can tell this, we know that it is >= 32 or < 32, without knowing the actual
112705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// shift amount.
112805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsbool DAGTypeLegalizer::
1129475871a144eb604ddaf37503397ba0941442e5fbDan GohmanExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
1130475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Amt = N->getOperand(1);
113183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
113205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT ShTy = Amt.getValueType();
113305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned ShBits = ShTy.getSizeInBits();
113405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned NVTBits = NVT.getSizeInBits();
113505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(isPowerOf2_32(NVTBits) &&
113605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Expanded integer type size not a power of two!");
1137786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1138cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
113905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  APInt HighBitMask = APInt::getHighBitsSet(ShBits, ShBits - Log2_32(NVTBits));
114005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  APInt KnownZero, KnownOne;
114105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  DAG.ComputeMaskedBits(N->getOperand(1), HighBitMask, KnownZero, KnownOne);
1142cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
114305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If we don't know anything about the high bits, exit.
114405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (((KnownZero|KnownOne) & HighBitMask) == 0)
114505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return false;
1146cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
114705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Get the incoming operand to be shifted.
1148475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InL, InH;
114905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), InL, InH);
1150be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands
115105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If we know that any of the high bits of the shift amount are one, then we
115205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // can do this as a couple of simple shifts.
115305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (KnownOne.intersects(HighBitMask)) {
115405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Mask out the high bit, which we know is set.
1155786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Amt = DAG.getNode(ISD::AND, dl, ShTy, Amt,
115605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                      DAG.getConstant(~HighBitMask, ShTy));
115705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
115805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    switch (N->getOpcode()) {
115905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    default: assert(0 && "Unknown shift");
116005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SHL:
116105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);              // Low part is zero.
1162786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt); // High part from Lo part.
116305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      return true;
116405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRL:
116505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);              // Hi part is zero.
1166786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt); // Lo part from Hi part.
116705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      return true;
116805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRA:
1169786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SRA, dl, NVT, InH,       // Sign extend high part.
117005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                       DAG.getConstant(NVTBits-1, ShTy));
1171786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt); // Lo part from Hi part.
117205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      return true;
117305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
117405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
117505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
117628dc98f7521933872b93156e3ebf5c9f8327b2b3Eli Friedman#if 0
117728dc98f7521933872b93156e3ebf5c9f8327b2b3Eli Friedman  // FIXME: This code is broken for shifts with a zero amount!
117805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If we know that all of the high bits of the shift amount are zero, then we
117905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // can do this as a couple of simple shifts.
118005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if ((KnownZero & HighBitMask) == HighBitMask) {
118105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Compute 32-amt.
1182475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Amt2 = DAG.getNode(ISD::SUB, ShTy,
118305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 DAG.getConstant(NVTBits, ShTy),
118405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 Amt);
118505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned Op1, Op2;
118605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    switch (N->getOpcode()) {
118705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    default: assert(0 && "Unknown shift");
118805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SHL:  Op1 = ISD::SHL; Op2 = ISD::SRL; break;
118905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRL:
119005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRA:  Op1 = ISD::SRL; Op2 = ISD::SHL; break;
119105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
119205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
119305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Lo = DAG.getNode(N->getOpcode(), NVT, InL, Amt);
119405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Hi = DAG.getNode(ISD::OR, NVT,
119505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getNode(Op1, NVT, InH, Amt),
119605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getNode(Op2, NVT, InL, Amt2));
119705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return true;
119805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
119928dc98f7521933872b93156e3ebf5c9f8327b2b3Eli Friedman#endif
120005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
120105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  return false;
120205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
120305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
120405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,
1205475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                           SDValue &Lo, SDValue &Hi) {
1206786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
120705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the subcomponents.
1208475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSL, LHSH, RHSL, RHSH;
120905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
121005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
121129a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands
121229a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  MVT NVT = LHSL.getValueType();
1213475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LoOps[2] = { LHSL, RHSL };
1214475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue HiOps[3] = { LHSH, RHSH };
121505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
121629a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // Do not generate ADDC/ADDE or SUBC/SUBE if the target does not support
121729a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // them.  TODO: Teach operation legalization how to expand unsupported
121829a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // ADDC/ADDE/SUBC/SUBE.  The problem is that these operations generate
121929a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // a carry of type MVT::Flag, but there doesn't seem to be any way to
122029a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // generate a value of this type in the expanded code sequence.
122129a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  bool hasCarry =
1222f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman    TLI.isOperationLegalOrCustom(N->getOpcode() == ISD::ADD ?
1223f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman                                   ISD::ADDC : ISD::SUBC,
1224f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman                                 TLI.getTypeToExpandTo(NVT));
122529a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands
122629a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  if (hasCarry) {
1227245146b58a2188eb69bcb34fc2bdf57ebbcfb278Duncan Sands    SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
122829a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    if (N->getOpcode() == ISD::ADD) {
1229786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2);
123029a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands      HiOps[2] = Lo.getValue(1);
1231786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3);
123229a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    } else {
1233786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps, 2);
123429a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands      HiOps[2] = Lo.getValue(1);
1235786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps, 3);
123629a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    }
123705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
123829a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    if (N->getOpcode() == ISD::ADD) {
1239786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::ADD, dl, NVT, LoOps, 2);
1240786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, HiOps, 2);
1241786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Cmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Lo, LoOps[0],
124229a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                  ISD::SETULT);
1243786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Carry1 = DAG.getNode(ISD::SELECT, dl, NVT, Cmp1,
124429a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(1, NVT),
124529a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(0, NVT));
1246786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Cmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Lo, LoOps[1],
124729a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                  ISD::SETULT);
1248786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Carry2 = DAG.getNode(ISD::SELECT, dl, NVT, Cmp2,
124929a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(1, NVT), Carry1);
1250786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry2);
125129a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    } else {
1252786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SUB, dl, NVT, LoOps, 2);
1253786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SUB, dl, NVT, HiOps, 2);
12545480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands      SDValue Cmp =
1255f8d3ec2c5725a2010f11de4ba78f6127712a5fe7Dale Johannesen        DAG.getSetCC(dl, TLI.getSetCCResultType(LoOps[0].getValueType()),
12565480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                     LoOps[0], LoOps[1], ISD::SETULT);
1257786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Borrow = DAG.getNode(ISD::SELECT, dl, NVT, Cmp,
125829a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(1, NVT),
125929a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(0, NVT));
1260786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SUB, dl, NVT, Hi, Borrow);
126129a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    }
126205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
126305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
126405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
126505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ADDSUBC(SDNode *N,
1266475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                            SDValue &Lo, SDValue &Hi) {
126705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the subcomponents.
1268475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSL, LHSH, RHSL, RHSH;
1269786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
127005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
127105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
127205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag);
1273475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LoOps[2] = { LHSL, RHSL };
1274475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue HiOps[3] = { LHSH, RHSH };
127505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
127605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (N->getOpcode() == ISD::ADDC) {
1277786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2);
127805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    HiOps[2] = Lo.getValue(1);
1279786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3);
128005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
1281786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps, 2);
128205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    HiOps[2] = Lo.getValue(1);
1283786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps, 3);
128405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
128505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
128605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Legalized the flag result - switch anything that used the old flag to
128705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // use the new one.
1288475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
128905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
129005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
129105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ADDSUBE(SDNode *N,
1292475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                            SDValue &Lo, SDValue &Hi) {
129305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the subcomponents.
1294475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSL, LHSH, RHSL, RHSH;
1295786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
129605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
129705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
129805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag);
1299475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LoOps[3] = { LHSL, RHSL, N->getOperand(2) };
1300475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue HiOps[3] = { LHSH, RHSH };
130105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1302786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(N->getOpcode(), dl, VTList, LoOps, 3);
130305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  HiOps[2] = Lo.getValue(1);
1304786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(N->getOpcode(), dl, VTList, HiOps, 3);
130505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
130605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Legalized the flag result - switch anything that used the old flag to
130705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // use the new one.
1308475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
130905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
131005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
131105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(SDNode *N,
1312475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Lo, SDValue &Hi) {
131305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
1314786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1315475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
131605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Op.getValueType().bitsLE(NVT)) {
131705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The low part is any extension of the input (which degenerates to a copy).
1318786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Op);
1319e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen    Hi = DAG.getUNDEF(NVT);   // The high part is undefined.
132005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
132105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  The operand type necessarily
132205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // promotes to the result type, so will end up being expanded too.
132305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
132405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Only know how to promote this result!");
1325475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(Op);
132605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(Res.getValueType() == N->getValueType(0) &&
132705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Operand over promoted?");
132805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Split the promoted operand.  This will simplify when it is expanded.
132905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SplitInteger(Res, Lo, Hi);
133005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
133105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
133205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
133395db39a9de48f69f4d764335b492b83a698c7854Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_AssertSext(SDNode *N,
1334475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Lo, SDValue &Hi) {
1335786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
133695db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
133795db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  MVT NVT = Lo.getValueType();
133895db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  MVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
133995db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  unsigned NVTBits = NVT.getSizeInBits();
134095db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  unsigned EVTBits = EVT.getSizeInBits();
134195db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
134295db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  if (NVTBits < EVTBits) {
1343786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::AssertSext, dl, NVT, Hi,
134495db39a9de48f69f4d764335b492b83a698c7854Duncan Sands                     DAG.getValueType(MVT::getIntegerVT(EVTBits - NVTBits)));
134595db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  } else {
1346786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::AssertSext, dl, NVT, Lo, DAG.getValueType(EVT));
134795db39a9de48f69f4d764335b492b83a698c7854Duncan Sands    // The high part replicates the sign bit of Lo, make it explicit.
1348786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
134992abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                     DAG.getConstant(NVTBits-1, TLI.getPointerTy()));
135095db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  }
135195db39a9de48f69f4d764335b492b83a698c7854Duncan Sands}
135295db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
135305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_AssertZext(SDNode *N,
1354475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Lo, SDValue &Hi) {
1355786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
135605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
135705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = Lo.getValueType();
135805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
135905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned NVTBits = NVT.getSizeInBits();
136005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned EVTBits = EVT.getSizeInBits();
136105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
136205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (NVTBits < EVTBits) {
1363786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::AssertZext, dl, NVT, Hi,
136405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getValueType(MVT::getIntegerVT(EVTBits - NVTBits)));
136505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
1366786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::AssertZext, dl, NVT, Lo, DAG.getValueType(EVT));
136705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The high part must be zero, make it explicit.
136805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Hi = DAG.getConstant(0, NVT);
136905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
137005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
137105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
137205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_BSWAP(SDNode *N,
1373475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                          SDValue &Lo, SDValue &Hi) {
1374786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
137505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Hi, Lo);  // Note swapped operands.
1376786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::BSWAP, dl, Lo.getValueType(), Lo);
1377786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::BSWAP, dl, Hi.getValueType(), Hi);
137805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
137905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
138005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_Constant(SDNode *N,
1381475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                             SDValue &Lo, SDValue &Hi) {
138205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
138305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned NBitWidth = NVT.getSizeInBits();
138405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  const APInt &Cst = cast<ConstantSDNode>(N)->getAPIntValue();
138505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Lo = DAG.getConstant(APInt(Cst).trunc(NBitWidth), NVT);
138605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), NVT);
138705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
138805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
138905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_CTLZ(SDNode *N,
1390475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1391786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
139205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // ctlz (HiLo) -> Hi != 0 ? ctlz(Hi) : (ctlz(Lo)+32)
139305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
139405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = Lo.getValueType();
139505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1396786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue HiNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Hi,
1397ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                   DAG.getConstant(0, NVT), ISD::SETNE);
139805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1399786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue LoLZ = DAG.getNode(ISD::CTLZ, dl, NVT, Lo);
1400786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue HiLZ = DAG.getNode(ISD::CTLZ, dl, NVT, Hi);
140105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1402786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::SELECT, dl, NVT, HiNotZero, HiLZ,
1403786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   DAG.getNode(ISD::ADD, dl, NVT, LoLZ,
140405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                               DAG.getConstant(NVT.getSizeInBits(), NVT)));
140505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(0, NVT);
140605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
140705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
140805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_CTPOP(SDNode *N,
1409475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                          SDValue &Lo, SDValue &Hi) {
1410786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
141105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // ctpop(HiLo) -> ctpop(Hi)+ctpop(Lo)
141205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
141305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = Lo.getValueType();
1414b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  Lo = DAG.getNode(ISD::ADD, dl, NVT, DAG.getNode(ISD::CTPOP, dl, NVT, Lo),
1415786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   DAG.getNode(ISD::CTPOP, dl, NVT, Hi));
141605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(0, NVT);
141705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
141805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
141905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_CTTZ(SDNode *N,
1420475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1421786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
142205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // cttz (HiLo) -> Lo != 0 ? cttz(Lo) : (cttz(Hi)+32)
142305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
142405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = Lo.getValueType();
142505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1426786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue LoNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Lo,
1427ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                   DAG.getConstant(0, NVT), ISD::SETNE);
142805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1429786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue LoLZ = DAG.getNode(ISD::CTTZ, dl, NVT, Lo);
1430786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue HiLZ = DAG.getNode(ISD::CTTZ, dl, NVT, Hi);
143105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1432786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::SELECT, dl, NVT, LoNotZero, LoLZ,
1433786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   DAG.getNode(ISD::ADD, dl, NVT, HiLZ,
143405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                               DAG.getConstant(NVT.getSizeInBits(), NVT)));
143505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(0, NVT);
143605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
143705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1438475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::ExpandIntRes_FP_TO_SINT(SDNode *N, SDValue &Lo,
1439475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Hi) {
1440c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
144105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT VT = N->getValueType(0);
1442475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
1443b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getFPTOSINT(Op.getValueType(), VT);
1444be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-sint conversion!");
1445c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, &Op, 1, true/*irrelevant*/, dl), Lo, Hi);
1446ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands}
1447ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands
1448475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::ExpandIntRes_FP_TO_UINT(SDNode *N, SDValue &Lo,
1449475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Hi) {
1450c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
145183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT VT = N->getValueType(0);
1452475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
1453b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getFPTOUINT(Op.getValueType(), VT);
1454be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-uint conversion!");
1455c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, &Op, 1, false/*irrelevant*/, dl), Lo, Hi);
1456ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands}
1457ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands
145869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
1459475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1460ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands  if (ISD::isNormalLoad(N)) {
1461ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands    ExpandRes_NormalLoad(N, Lo, Hi);
146278cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands    return;
146378cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  }
146478cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
146578cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
146678cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
146783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT VT = N->getValueType(0);
146883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(VT);
1469475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ch  = N->getChain();
1470475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ptr = N->getBasePtr();
1471cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  ISD::LoadExtType ExtType = N->getExtensionType();
1472cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  int SVOffset = N->getSrcValueOffset();
1473cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  unsigned Alignment = N->getAlignment();
1474cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  bool isVolatile = N->isVolatile();
1475786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1476cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
147778cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  assert(NVT.isByteSized() && "Expanded type not byte sized!");
1478cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
147978cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  if (N->getMemoryVT().bitsLE(NVT)) {
148083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT EVT = N->getMemoryVT();
1481cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1482786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
1483786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                        EVT, isVolatile, Alignment);
1484cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1485cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Remember the chain.
1486cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    Ch = Lo.getValue(1);
1487cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1488cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    if (ExtType == ISD::SEXTLOAD) {
1489cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The high part is obtained by SRA'ing all but one of the bits of the
1490cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // lo part.
149183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      unsigned LoSize = Lo.getValueType().getSizeInBits();
1492786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
149392abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                       DAG.getConstant(LoSize-1, TLI.getPointerTy()));
1494cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    } else if (ExtType == ISD::ZEXTLOAD) {
1495cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The high part is just a zero.
1496cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Hi = DAG.getConstant(0, NVT);
1497cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    } else {
1498cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      assert(ExtType == ISD::EXTLOAD && "Unknown extload!");
1499cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The high part is undefined.
1500e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen      Hi = DAG.getUNDEF(NVT);
1501cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1502cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else if (TLI.isLittleEndian()) {
1503cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Little-endian - low bits are at low addresses.
1504786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getSrcValue(), SVOffset,
1505cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                     isVolatile, Alignment);
1506cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1507cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits =
150883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
150983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT NEVT = MVT::getIntegerVT(ExcessBits);
1510cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1511cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
151283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
1513786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
15140bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
1515786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(),
1516cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                        SVOffset+IncrementSize, NEVT,
1517cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                        isVolatile, MinAlign(Alignment, IncrementSize));
1518cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1519cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Build a factor node to remember that this load is independent of the
1520cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // other one.
1521786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
1522cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                     Hi.getValue(1));
1523cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else {
1524cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Big-endian - high bits are at low addresses.  Favor aligned loads at
1525cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // the cost of some bit-fiddling.
152683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT EVT = N->getMemoryVT();
152783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned EBytes = EVT.getStoreSizeInBits()/8;
152883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
1529cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits = (EBytes - IncrementSize)*8;
1530cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1531cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Load both the high bits and maybe some of the low bits.
1532786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
153383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                        MVT::getIntegerVT(EVT.getSizeInBits() - ExcessBits),
1534cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                        isVolatile, Alignment);
1535cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1536cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
1537786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
15380bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
1539cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Load the rest of the low bits.
1540786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, NVT, Ch, Ptr, N->getSrcValue(),
154183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                        SVOffset+IncrementSize,
154283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                        MVT::getIntegerVT(ExcessBits),
1543cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                        isVolatile, MinAlign(Alignment, IncrementSize));
1544cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1545cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Build a factor node to remember that this load is independent of the
1546cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // other one.
1547786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
1548cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                     Hi.getValue(1));
1549cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
155083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    if (ExcessBits < NVT.getSizeInBits()) {
1551cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Transfer low bits from the bottom of Hi to the top of Lo.
1552786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::OR, dl, NVT, Lo,
1553786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SHL, dl, NVT, Hi,
1554cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                                   DAG.getConstant(ExcessBits,
155592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                                   TLI.getPointerTy())));
1556cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Move high bits to the right position in Hi.
15577fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl,
1558786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       NVT, Hi,
155983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
156092abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                       TLI.getPointerTy()));
1561cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1562cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
1563cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1564cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Legalized the chain result - switch anything that used the old chain to
1565cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // use the new one.
1566475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Ch);
1567cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1568cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
156969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_Logical(SDNode *N,
1570475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                            SDValue &Lo, SDValue &Hi) {
1571786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1572475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LL, LH, RL, RH;
157369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(N->getOperand(0), LL, LH);
157469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(N->getOperand(1), RL, RH);
1575786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LL, RL);
1576786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LH, RH);
1577cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1578cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
157905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_MUL(SDNode *N,
1580475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                        SDValue &Lo, SDValue &Hi) {
158105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT VT = N->getValueType(0);
158205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(VT);
1583c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
158469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1585f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, NVT);
1586f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, NVT);
1587f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, NVT);
1588f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, NVT);
1589cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) {
1590475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LL, LH, RL, RH;
159169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getOperand(0), LL, LH);
159269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getOperand(1), RL, RH);
159383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned OuterBitSize = VT.getSizeInBits();
1594e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    unsigned InnerBitSize = NVT.getSizeInBits();
1595cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned LHSSB = DAG.ComputeNumSignBits(N->getOperand(0));
1596cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned RHSSB = DAG.ComputeNumSignBits(N->getOperand(1));
159769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1598e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    APInt HighMask = APInt::getHighBitsSet(OuterBitSize, InnerBitSize);
1599e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    if (DAG.MaskedValueIsZero(N->getOperand(0), HighMask) &&
1600e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands        DAG.MaskedValueIsZero(N->getOperand(1), HighMask)) {
1601cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The inputs are both zero-extended.
1602cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasUMUL_LOHI) {
1603cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a umul_lohi.
1604786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(NVT, NVT), LL, RL);
1605ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif        Hi = SDValue(Lo.getNode(), 1);
1606cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1607cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1608cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasMULHU) {
1609cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a mulhu+mul.
1610786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL);
1611786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Hi = DAG.getNode(ISD::MULHU, dl, NVT, LL, RL);
1612cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1613cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1614cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1615e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    if (LHSSB > InnerBitSize && RHSSB > InnerBitSize) {
1616cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The input values are both sign-extended.
1617cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasSMUL_LOHI) {
1618cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a smul_lohi.
1619786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::SMUL_LOHI, dl, DAG.getVTList(NVT, NVT), LL, RL);
1620ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif        Hi = SDValue(Lo.getNode(), 1);
1621cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1622cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1623cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasMULHS) {
1624cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a mulhs+mul.
1625786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL);
1626786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Hi = DAG.getNode(ISD::MULHS, dl, NVT, LL, RL);
1627cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1628cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1629cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1630cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    if (HasUMUL_LOHI) {
1631cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Lo,Hi = umul LHS, RHS.
1632786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue UMulLOHI = DAG.getNode(ISD::UMUL_LOHI, dl,
1633cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                                       DAG.getVTList(NVT, NVT), LL, RL);
1634cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Lo = UMulLOHI;
1635cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Hi = UMulLOHI.getValue(1);
1636786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      RH = DAG.getNode(ISD::MUL, dl, NVT, LL, RH);
1637786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      LH = DAG.getNode(ISD::MUL, dl, NVT, LH, RL);
1638786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, RH);
1639786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, LH);
1640cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      return;
1641cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1642e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    if (HasMULHU) {
1643786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL);
1644786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::MULHU, dl, NVT, LL, RL);
1645786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      RH = DAG.getNode(ISD::MUL, dl, NVT, LL, RH);
1646786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      LH = DAG.getNode(ISD::MUL, dl, NVT, LH, RL);
1647786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, RH);
1648786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, LH);
1649e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands      return;
1650e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    }
1651cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
165241edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
1653cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If nothing else, we can make a libcall.
16545ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
165515c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta  if (VT == MVT::i16)
165615c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    LC = RTLIB::MUL_I16;
165715c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta  else if (VT == MVT::i32)
16585ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::MUL_I32;
16595ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  else if (VT == MVT::i64)
1660e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    LC = RTLIB::MUL_I64;
16615ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  else if (VT == MVT::i128)
16625ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::MUL_I128;
16635ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported MUL!");
1664e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands
1665475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1666c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, true/*irrelevant*/, dl), Lo, Hi);
166741edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands}
1668cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
166969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_SDIV(SDNode *N,
1670475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
16715ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  MVT VT = N->getValueType(0);
1672c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
16735ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands
16745ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
16755ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  if (VT == MVT::i32)
16765ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::SDIV_I32;
16775ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  else if (VT == MVT::i64)
16785ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::SDIV_I64;
16795ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  else if (VT == MVT::i128)
16805ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::SDIV_I128;
16815ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SDIV!");
16825ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands
1683475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1684c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, true, dl), Lo, Hi);
1685ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands}
1686ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands
168769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,
1688475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                          SDValue &Lo, SDValue &Hi) {
168983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT VT = N->getValueType(0);
1690c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
169169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
169269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // If we can emit an efficient shift operation, do so now.  Check to see if
1693cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // the RHS is a constant.
1694cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1)))
1695f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman    return ExpandShiftByConstant(N, CN->getZExtValue(), Lo, Hi);
1696cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1697cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If we can determine that the high bit of the shift is zero or one, even if
1698cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // the low bits are variable, emit this shift in an optimized form.
1699cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (ExpandShiftWithKnownAmountBit(N, Lo, Hi))
1700cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
170169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1702cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If this target supports shift_PARTS, use it.  First, map to the _PARTS opc.
1703cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  unsigned PartsOpc;
170441edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  if (N->getOpcode() == ISD::SHL) {
1705cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    PartsOpc = ISD::SHL_PARTS;
170641edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else if (N->getOpcode() == ISD::SRL) {
1707cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    PartsOpc = ISD::SRL_PARTS;
170841edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else {
1709cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
1710cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    PartsOpc = ISD::SRA_PARTS;
1711cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
171269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1713cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Next check to see if the target supports this SHL_PARTS operation or if it
1714cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // will custom expand it.
171583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(VT);
1716cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  TargetLowering::LegalizeAction Action = TLI.getOperationAction(PartsOpc, NVT);
1717cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) ||
1718cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Action == TargetLowering::Custom) {
1719cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Expand the subcomponents.
1720475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LHSL, LHSH;
172169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
172269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1723475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { LHSL, LHSH, N->getOperand(1) };
172483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT VT = LHSL.getValueType();
1725786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(PartsOpc, dl, DAG.getNodeValueTypes(VT, VT), 2, Ops, 3);
1726cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    Hi = Lo.getValue(1);
1727cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
1728cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
172941edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
1730cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Otherwise, emit a libcall.
1731dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
173241edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  bool isSigned;
173341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  if (N->getOpcode() == ISD::SHL) {
173441edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    isSigned = false; /*sign irrelevant*/
173515c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    if (VT == MVT::i16)
173615c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta      LC = RTLIB::SHL_I16;
173715c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    else if (VT == MVT::i32)
1738dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SHL_I32;
1739dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands    else if (VT == MVT::i64)
1740dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SHL_I64;
1741dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands    else if (VT == MVT::i128)
1742dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SHL_I128;
174341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else if (N->getOpcode() == ISD::SRL) {
174441edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    isSigned = false;
174515c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    if (VT == MVT::i16)
174615c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta      LC = RTLIB::SRL_I16;
174715c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    else if (VT == MVT::i32)
1748dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRL_I32;
1749dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands    else if (VT == MVT::i64)
1750dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRL_I64;
1751dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands    else if (VT == MVT::i128)
1752dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRL_I128;
175341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else {
175441edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
175541edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    isSigned = true;
175615c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    if (VT == MVT::i16)
175715c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta      LC = RTLIB::SRA_I16;
175815c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    else if (VT == MVT::i32)
1759dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRA_I32;
1760dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands    else if (VT == MVT::i64)
1761dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRA_I64;
1762dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands    else if (VT == MVT::i128)
1763dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRA_I128;
176441edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  }
1765dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported shift!");
176641edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
1767475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1768c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, isSigned, dl), Lo, Hi);
176941edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands}
1770cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
177105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(SDNode *N,
1772475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                SDValue &Lo, SDValue &Hi) {
177305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
1774786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1775475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
177605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Op.getValueType().bitsLE(NVT)) {
1777b3bc6352defdf1a5c6b1b0770d0c4d603f6524a8Duncan Sands    // The low part is sign extension of the input (degenerates to a copy).
1778786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, N->getOperand(0));
177905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The high part is obtained by SRA'ing all but one of the bits of low part.
178005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned LoSize = NVT.getSizeInBits();
1781786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
178292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                     DAG.getConstant(LoSize-1, TLI.getPointerTy()));
178305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
178405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  The operand type necessarily
178505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // promotes to the result type, so will end up being expanded too.
178605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
178705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Only know how to promote this result!");
1788475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(Op);
178905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(Res.getValueType() == N->getValueType(0) &&
179005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Operand over promoted?");
179105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Split the promoted operand.  This will simplify when it is expanded.
179205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SplitInteger(Res, Lo, Hi);
179305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned ExcessBits =
179405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
1795786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi,
179605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getValueType(MVT::getIntegerVT(ExcessBits)));
179705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
179805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
179905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
180005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::
1801475871a144eb604ddaf37503397ba0941442e5fbDan GohmanExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) {
1802786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
180369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
180405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
1805d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
180605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (EVT.bitsLE(Lo.getValueType())) {
180705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // sext_inreg the low part if needed.
1808786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Lo.getValueType(), Lo,
180905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     N->getOperand(1));
1810d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
181105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The high part gets the sign extension from the lo-part.  This handles
181205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // things like sextinreg V:i64 from i8.
1813786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, Hi.getValueType(), Lo,
181405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(Hi.getValueType().getSizeInBits()-1,
181592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                     TLI.getPointerTy()));
181605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
181705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  Leave the low part alone,
181805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // sext_inreg the high part.
181905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned ExcessBits =
182005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      EVT.getSizeInBits() - Lo.getValueType().getSizeInBits();
1821786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi,
182205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getValueType(MVT::getIntegerVT(ExcessBits)));
182305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
182405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
1825d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
182605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_SREM(SDNode *N,
1827475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
182805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT VT = N->getValueType(0);
1829c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
183005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
183105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
183205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (VT == MVT::i32)
183305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::SREM_I32;
183405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  else if (VT == MVT::i64)
183505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::SREM_I64;
183605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  else if (VT == MVT::i128)
183705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::SREM_I128;
183805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SREM!");
183905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1840475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1841c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, true, dl), Lo, Hi);
1842d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands}
1843d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
184405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_TRUNCATE(SDNode *N,
1845475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                             SDValue &Lo, SDValue &Hi) {
184605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
1847786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1848786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::TRUNCATE, dl, NVT, N->getOperand(0));
1849786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::SRL, dl,
1850786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   N->getOperand(0).getValueType(), N->getOperand(0),
185192abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                   DAG.getConstant(NVT.getSizeInBits(), TLI.getPointerTy()));
1852786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::TRUNCATE, dl, NVT, Hi);
1853d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands}
1854d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
185505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_UDIV(SDNode *N,
1856475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
185705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT VT = N->getValueType(0);
1858c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1859d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
186005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
186105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (VT == MVT::i32)
186205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UDIV_I32;
186305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  else if (VT == MVT::i64)
186405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UDIV_I64;
186505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  else if (VT == MVT::i128)
186605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UDIV_I128;
186705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UDIV!");
1868d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
1869475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1870c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, false, dl), Lo, Hi);
1871d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands}
1872cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
187305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_UREM(SDNode *N,
1874475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
187505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT VT = N->getValueType(0);
1876c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
187769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
187805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
187905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (VT == MVT::i32)
188005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UREM_I32;
188105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  else if (VT == MVT::i64)
188205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UREM_I64;
188305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  else if (VT == MVT::i128)
188405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UREM_I128;
188505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UREM!");
1886cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1887475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1888c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, false, dl), Lo, Hi);
1889cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1890cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
189105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(SDNode *N,
1892475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                SDValue &Lo, SDValue &Hi) {
189383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(N->getValueType(0));
1894786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1895475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
189605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Op.getValueType().bitsLE(NVT)) {
1897b3bc6352defdf1a5c6b1b0770d0c4d603f6524a8Duncan Sands    // The low part is zero extension of the input (degenerates to a copy).
1898786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, N->getOperand(0));
189905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Hi = DAG.getConstant(0, NVT);   // The high part is just a zero.
190005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
190105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  The operand type necessarily
190205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // promotes to the result type, so will end up being expanded too.
190305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
190405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Only know how to promote this result!");
1905475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(Op);
190605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(Res.getValueType() == N->getValueType(0) &&
190705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Operand over promoted?");
190805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Split the promoted operand.  This will simplify when it is expanded.
190905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SplitInteger(Res, Lo, Hi);
191005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned ExcessBits =
191105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
19124be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen    Hi = DAG.getZeroExtendInReg(Hi, dl, MVT::getIntegerVT(ExcessBits));
19139e255b7df5a0a629920706e086e78ef89bf2f183Dan Gohman  }
1914cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1915cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1916cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1917cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
191869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//  Integer Operand Expansion
1919cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
1920cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
192105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// ExpandIntegerOperand - This method is called when the specified operand of
192205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// the specified node is found to need expansion.  At this point, all of the
192305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// result types of the node are known to be legal, but other operands of the
192405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// node may need promotion or expansion as well as the specified one.
192505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsbool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) {
192605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  DEBUG(cerr << "Expand integer operand: "; N->dump(&DAG); cerr << "\n");
1927475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res = SDValue();
1928051bb7b07504be9f848f7cce802e62ed24980bc5Duncan Sands
19299fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (CustomLowerResults(N, N->getOperand(OpNo).getValueType(), false))
1930bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    return false;
193111ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands
1932bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  switch (N->getOpcode()) {
1933bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  default:
193405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  #ifndef NDEBUG
1935bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    cerr << "ExpandIntegerOperand Op #" << OpNo << ": ";
1936bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    N->dump(&DAG); cerr << "\n";
193705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  #endif
1938bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    assert(0 && "Do not know how to expand this operator's operand!");
1939bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    abort();
1940bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta
1941bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BIT_CONVERT:       Res = ExpandOp_BIT_CONVERT(N); break;
194292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::BR_CC:             Res = ExpandIntOp_BR_CC(N); break;
194392abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::BUILD_VECTOR:      Res = ExpandOp_BUILD_VECTOR(N); break;
1944bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::EXTRACT_ELEMENT:   Res = ExpandOp_EXTRACT_ELEMENT(N); break;
1945bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::INSERT_VECTOR_ELT: Res = ExpandOp_INSERT_VECTOR_ELT(N); break;
1946bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SCALAR_TO_VECTOR:  Res = ExpandOp_SCALAR_TO_VECTOR(N); break;
194792abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::SELECT_CC:         Res = ExpandIntOp_SELECT_CC(N); break;
194892abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::SETCC:             Res = ExpandIntOp_SETCC(N); break;
194992abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::SINT_TO_FP:        Res = ExpandIntOp_SINT_TO_FP(N); break;
195092abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::STORE:   Res = ExpandIntOp_STORE(cast<StoreSDNode>(N), OpNo); break;
195192abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::TRUNCATE:          Res = ExpandIntOp_TRUNCATE(N); break;
195292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::UINT_TO_FP:        Res = ExpandIntOp_UINT_TO_FP(N); break;
195355467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
195455467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SHL:
195555467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRA:
195655467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRL:
195755467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::ROTL:
195855467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::ROTR: Res = ExpandIntOp_Shift(N); break;
195905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
196069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
196105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If the result is null, the sub-method took care of registering results etc.
1962ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!Res.getNode()) return false;
196347d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
196447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // If the result is N, the sub-method updated N in place.  Tell the legalizer
196547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // core about this.
196647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  if (Res.getNode() == N)
196705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return true;
1968cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
196905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
197005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Invalid operand expansion");
197105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1972475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 0), Res);
197305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  return false;
1974cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1975cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
197611ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands/// IntegerExpandSetCCOperands - Expand the operands of a comparison.  This code
197711ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands/// is shared among BR_CC, SELECT_CC, and SETCC handlers.
1978475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS,
1979475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                  SDValue &NewRHS,
1980c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen                                                  ISD::CondCode &CCCode,
1981c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen                                                  DebugLoc dl) {
1982475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSLo, LHSHi, RHSLo, RHSHi;
198369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(NewLHS, LHSLo, LHSHi);
198469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(NewRHS, RHSLo, RHSHi);
198541edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
198683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT VT = NewLHS.getValueType();
198741edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
1988cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (CCCode == ISD::SETEQ || CCCode == ISD::SETNE) {
198911ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    if (RHSLo == RHSHi) {
199011ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands      if (ConstantSDNode *RHSCST = dyn_cast<ConstantSDNode>(RHSLo)) {
1991cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        if (RHSCST->isAllOnesValue()) {
1992cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner          // Equality comparison to -1.
19937fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands          NewLHS = DAG.getNode(ISD::AND, dl,
1994786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                               LHSLo.getValueType(), LHSLo, LHSHi);
1995cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner          NewRHS = RHSLo;
1996cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner          return;
1997cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        }
199811ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands      }
199911ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    }
200069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2001786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewLHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSLo, RHSLo);
2002786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewRHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSHi, RHSHi);
2003786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewLHS = DAG.getNode(ISD::OR, dl, NewLHS.getValueType(), NewLHS, NewRHS);
2004cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
2005cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
2006cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
200769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2008cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If this is a comparison of the sign bit, just look at the top part.
2009cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // X > -1,  x < 0
2010cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(NewRHS))
2011002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman    if ((CCCode == ISD::SETLT && CST->isNullValue()) ||     // X < 0
2012cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        (CCCode == ISD::SETGT && CST->isAllOnesValue())) {  // X > -1
2013cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      NewLHS = LHSHi;
2014cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      NewRHS = RHSHi;
2015cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      return;
2016cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
201769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2018cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // FIXME: This generated code sucks.
2019cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  ISD::CondCode LowCC;
2020cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  switch (CCCode) {
2021cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  default: assert(0 && "Unknown integer setcc!");
2022cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETLT:
2023cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETULT: LowCC = ISD::SETULT; break;
2024cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETGT:
2025cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETUGT: LowCC = ISD::SETUGT; break;
2026cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETLE:
2027cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETULE: LowCC = ISD::SETULE; break;
2028cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETGE:
2029cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETUGE: LowCC = ISD::SETUGE; break;
2030cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
203169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2032cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Tmp1 = lo(op1) < lo(op2)   // Always unsigned comparison
2033cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Tmp2 = hi(op1) < hi(op2)   // Signedness depends on operands
2034cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // dest = hi(op1) == hi(op2) ? Tmp1 : Tmp2;
203569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2036cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // NOTE: on targets without efficient SELECT of bools, we can always use
2037cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3)
2038cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, false, true, NULL);
2039475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Tmp1, Tmp2;
20405480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  Tmp1 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSLo.getValueType()),
2041ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                           LHSLo, RHSLo, LowCC, false, DagCombineInfo, dl);
2042ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!Tmp1.getNode())
2043786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Tmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSLo.getValueType()),
20445480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                        LHSLo, RHSLo, LowCC);
20455480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  Tmp2 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi.getValueType()),
2046ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                           LHSHi, RHSHi, CCCode, false, DagCombineInfo, dl);
2047ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!Tmp2.getNode())
2048786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Tmp2 = DAG.getNode(ISD::SETCC, dl,
2049786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       TLI.getSetCCResultType(LHSHi.getValueType()),
20505480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                       LHSHi, RHSHi, DAG.getCondCode(CCCode));
205169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2052ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  ConstantSDNode *Tmp1C = dyn_cast<ConstantSDNode>(Tmp1.getNode());
2053ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  ConstantSDNode *Tmp2C = dyn_cast<ConstantSDNode>(Tmp2.getNode());
2054002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman  if ((Tmp1C && Tmp1C->isNullValue()) ||
2055002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman      (Tmp2C && Tmp2C->isNullValue() &&
2056cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner       (CCCode == ISD::SETLE || CCCode == ISD::SETGE ||
2057cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        CCCode == ISD::SETUGE || CCCode == ISD::SETULE)) ||
2058002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman      (Tmp2C && Tmp2C->getAPIntValue() == 1 &&
2059cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner       (CCCode == ISD::SETLT || CCCode == ISD::SETGT ||
2060cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        CCCode == ISD::SETUGT || CCCode == ISD::SETULT))) {
2061cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // low part is known false, returns high part.
2062cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // For LE / GE, if high part is known false, ignore the low part.
2063cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // For LT / GT, if high part is known true, ignore the low part.
2064cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    NewLHS = Tmp2;
2065475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    NewRHS = SDValue();
2066cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
2067cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
206869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
20695480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  NewLHS = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi.getValueType()),
2070ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                             LHSHi, RHSHi, ISD::SETEQ, false,
2071ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                             DagCombineInfo, dl);
2072ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!NewLHS.getNode())
2073786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewLHS = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSHi.getValueType()),
20745480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                          LHSHi, RHSHi, ISD::SETEQ);
2075786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  NewLHS = DAG.getNode(ISD::SELECT, dl, Tmp1.getValueType(),
2076cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                       NewLHS, Tmp1, Tmp2);
2077475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  NewRHS = SDValue();
2078cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
2079cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2080475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_BR_CC(SDNode *N) {
2081475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
208205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get();
2083c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, N->getDebugLoc());
208405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
208505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If ExpandSetCCOperands returned a scalar, we need to compare the result
208605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // against zero to select between true and false values.
2087ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (NewRHS.getNode() == 0) {
208805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
208905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    CCCode = ISD::SETNE;
209005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
209105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
209205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Update N to have the operands specified.
2093475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
209405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                DAG.getCondCode(CCCode), NewLHS, NewRHS,
209505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                N->getOperand(4));
209605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
209705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2098475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_SELECT_CC(SDNode *N) {
2099475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
210005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get();
2101c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, N->getDebugLoc());
210205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
210305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If ExpandSetCCOperands returned a scalar, we need to compare the result
210405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // against zero to select between true and false values.
2105ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (NewRHS.getNode() == 0) {
210605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
210705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    CCCode = ISD::SETNE;
210805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
210905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
211005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Update N to have the operands specified.
2111475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), NewLHS, NewRHS,
211205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                N->getOperand(2), N->getOperand(3),
211305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                DAG.getCondCode(CCCode));
211405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
211505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2116475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_SETCC(SDNode *N) {
2117475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
211805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get();
2119c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, N->getDebugLoc());
212005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
212105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If ExpandSetCCOperands returned a scalar, use it.
2122ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (NewRHS.getNode() == 0) {
212305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(NewLHS.getValueType() == N->getValueType(0) &&
212405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Unexpected setcc expansion!");
212505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return NewLHS;
212605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
212705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
212805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Otherwise, update N to have the operands specified.
2129475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), NewLHS, NewRHS,
213005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                DAG.getCondCode(CCCode));
213105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
213205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
213355467af31620c9d027e071ebcd9746b7593cff17Sanjiv GuptaSDValue DAGTypeLegalizer::ExpandIntOp_Shift(SDNode *N) {
213455467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  // The value being shifted is legal, but the shift amount is too big.
213555467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  // It follows that either the result of the shift is undefined, or the
213655467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  // upper half of the shift amount is zero.  Just use the lower half.
213755467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  SDValue Lo, Hi;
213855467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  GetExpandedInteger(N->getOperand(1), Lo, Hi);
213955467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0), Lo);
214055467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta}
214155467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
2142475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_SINT_TO_FP(SDNode *N) {
2143475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
214405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT DstVT = N->getValueType(0);
2145b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getSINTTOFP(Op.getValueType(), DstVT);
214605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL &&
214705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Don't know how to expand this SINT_TO_FP!");
2148c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  return MakeLibCall(LC, DstVT, &Op, 1, true, N->getDebugLoc());
214905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
215005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2151475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
2152ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands  if (ISD::isNormalStore(N))
2153ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands    return ExpandOp_NormalStore(N, OpNo);
215478cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
215578cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
2156cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  assert(OpNo == 1 && "Can only expand the stored value so far");
2157cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
215883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT VT = N->getOperand(1).getValueType();
215983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands  MVT NVT = TLI.getTypeToTransformTo(VT);
2160475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ch  = N->getChain();
2161475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ptr = N->getBasePtr();
2162cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  int SVOffset = N->getSrcValueOffset();
2163cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  unsigned Alignment = N->getAlignment();
2164cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  bool isVolatile = N->isVolatile();
2165786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
2166475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Lo, Hi;
2167cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2168a1ace76c70ae5332d6f33fce5c0c1e2fdb8cca11Duncan Sands  assert(NVT.isByteSized() && "Expanded type not byte sized!");
2169cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
217078cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  if (N->getMemoryVT().bitsLE(NVT)) {
217169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getValue(), Lo, Hi);
2172786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
2173b625f2f8960de32bc973092aaee8ac62863006feDan Gohman                             N->getMemoryVT(), isVolatile, Alignment);
2174cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else if (TLI.isLittleEndian()) {
2175cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Little-endian - low bits are at low addresses.
217669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getValue(), Lo, Hi);
2177cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2178786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
2179cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                      isVolatile, Alignment);
2180cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2181cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits =
218283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
218383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT NEVT = MVT::getIntegerVT(ExcessBits);
2184cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2185cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
218683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
2187786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
21880bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
2189786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(),
2190cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                           SVOffset+IncrementSize, NEVT,
2191cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                           isVolatile, MinAlign(Alignment, IncrementSize));
2192786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
2193cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else {
2194cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Big-endian - high bits are at low addresses.  Favor aligned stores at
2195cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // the cost of some bit-fiddling.
219669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getValue(), Lo, Hi);
2197cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
219883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT EVT = N->getMemoryVT();
219983ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned EBytes = EVT.getStoreSizeInBits()/8;
220083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
2201cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits = (EBytes - IncrementSize)*8;
220283ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    MVT HiVT = MVT::getIntegerVT(EVT.getSizeInBits() - ExcessBits);
2203cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
220483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    if (ExcessBits < NVT.getSizeInBits()) {
2205cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Transfer high bits from the top of Lo to the bottom of Hi.
2206786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi,
220783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
220892abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                       TLI.getPointerTy()));
2209786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::OR, dl, NVT, Hi,
2210de06470330260f5937e7ca558f5f5b3e171f2ee5Dale Johannesen                       DAG.getNode(ISD::SRL, dl, NVT, Lo,
2211cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                                   DAG.getConstant(ExcessBits,
221292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                                   TLI.getPointerTy())));
2213cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
2214cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2215cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Store both the high bits and maybe some of the low bits.
2216786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(),
2217cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                           SVOffset, HiVT, isVolatile, Alignment);
2218cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2219cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
2220786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
22210bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
2222cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Store the lowest ExcessBits bits in the second half.
2223786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(),
2224cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                           SVOffset+IncrementSize,
222583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                           MVT::getIntegerVT(ExcessBits),
2226cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                           isVolatile, MinAlign(Alignment, IncrementSize));
2227786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
2228cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
2229cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
223005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2231475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_TRUNCATE(SDNode *N) {
2232475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InL, InH;
223305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), InL, InH);
223405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Just truncate the low part of the source.
2235786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), N->getValueType(0), InL);
223605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
223705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2238475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
2239475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
224005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT SrcVT = Op.getValueType();
224105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  MVT DstVT = N->getValueType(0);
2242c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
224305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
224405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (TLI.getOperationAction(ISD::SINT_TO_FP, SrcVT) == TargetLowering::Custom){
224505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Do a signed conversion then adjust the result.
2246786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue SignedConv = DAG.getNode(ISD::SINT_TO_FP, dl, DstVT, Op);
224705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SignedConv = TLI.LowerOperation(SignedConv, DAG);
224805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
224905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The result of the signed conversion needs adjusting if the 'sign bit' of
225005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // the incoming integer was set.  To handle this, we dynamically test to see
225105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // if it is set, and, if so, add a fudge factor.
225205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
225305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    const uint64_t F32TwoE32  = 0x4F800000ULL;
225405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    const uint64_t F32TwoE64  = 0x5F800000ULL;
225505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    const uint64_t F32TwoE128 = 0x7F800000ULL;
225605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
225705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    APInt FF(32, 0);
225805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    if (SrcVT == MVT::i32)
225905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      FF = APInt(32, F32TwoE32);
226005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    else if (SrcVT == MVT::i64)
226105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      FF = APInt(32, F32TwoE64);
226205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    else if (SrcVT == MVT::i128)
226305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      FF = APInt(32, F32TwoE128);
226405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    else
226505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      assert(false && "Unsupported UINT_TO_FP!");
226605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
226705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Check whether the sign bit is set.
2268475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Lo, Hi;
226905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    GetExpandedInteger(Op, Lo, Hi);
22707fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands    SDValue SignSet = DAG.getSetCC(dl,
2271786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                                   TLI.getSetCCResultType(Hi.getValueType()),
22725480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                                   Hi, DAG.getConstant(0, Hi.getValueType()),
2273ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                   ISD::SETLT);
227405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
227505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
2276475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue FudgePtr = DAG.getConstantPool(ConstantInt::get(FF.zext(64)),
227749c18cce976c158e86f54c681dff21bb81640fb8Duncan Sands                                           TLI.getPointerTy());
227805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
227905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Get a pointer to FF if the sign bit was set, or to 0 otherwise.
2280475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Zero = DAG.getIntPtrConstant(0);
2281475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Four = DAG.getIntPtrConstant(4);
228205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    if (TLI.isBigEndian()) std::swap(Zero, Four);
2283786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue Offset = DAG.getNode(ISD::SELECT, dl, Zero.getValueType(), SignSet,
2284ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                 Zero, Four);
228587a0f10dc7eff8cf5e83a754f75adf9cb3991435Dan Gohman    unsigned Alignment =
228687a0f10dc7eff8cf5e83a754f75adf9cb3991435Dan Gohman      1 << cast<ConstantPoolSDNode>(FudgePtr)->getAlignment();
2287786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    FudgePtr = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(), FudgePtr, Offset);
228887a0f10dc7eff8cf5e83a754f75adf9cb3991435Dan Gohman    Alignment = std::min(Alignment, 4u);
228905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
229005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Load the value out, extending it from f32 to the destination float type.
229105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // FIXME: Avoid the extend by constructing the right constant pool?
2292786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue Fudge = DAG.getExtLoad(ISD::EXTLOAD, dl, DstVT, DAG.getEntryNode(),
229387a0f10dc7eff8cf5e83a754f75adf9cb3991435Dan Gohman                                   FudgePtr, NULL, 0, MVT::f32,
229487a0f10dc7eff8cf5e83a754f75adf9cb3991435Dan Gohman                                   false, Alignment);
2295786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::FADD, dl, DstVT, SignedConv, Fudge);
229605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
229705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
229805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Otherwise, use a libcall.
2299b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getUINTTOFP(SrcVT, DstVT);
230005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL &&
230105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Don't know how to expand this UINT_TO_FP!");
2302c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  return MakeLibCall(LC, DstVT, &Op, 1, true, dl);
230305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
2304