LegalizeIntegerTypes.cpp revision 268637ed0f34e10e4125e94c44ff3e2975a19166
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"
237d696d80409aad20bb5da0fc4eccab941dd371d4Torok Edwin#include "llvm/Support/ErrorHandling.h"
24fd87a544c00c2ca04ee23aae67bbcad4dc852a54Dan Gohman#include "llvm/Support/raw_ostream.h"
25cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattnerusing namespace llvm;
26cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
27cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
2869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//  Integer Result Promotion
29cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
30cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
3169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// PromoteIntegerResult - This method is called when a result of a node is
3269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// found to be in need of promotion to a larger type.  At this point, the node
3369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// may also have invalid operands or may have other results that need
3469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// expansion, we just know that (at least) one result needs promotion.
3569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::PromoteIntegerResult(SDNode *N, unsigned ResNo) {
36d765353da89988e949fd4c021d8860f36ab7c392David Greene  DEBUG(dbgs() << "Promote integer result: "; N->dump(&DAG); dbgs() << "\n");
379fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  SDValue Res = SDValue();
3869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
39126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands  // See if the target wants to custom expand this node.
40f43071beddb7ed5b2fd7d2f06c4130460616a13dDuncan Sands  if (CustomLowerNode(N, N->getValueType(ResNo), true))
411607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    return;
42126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands
4369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  switch (N->getOpcode()) {
4469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  default:
4569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands#ifndef NDEBUG
46d765353da89988e949fd4c021d8860f36ab7c392David Greene    dbgs() << "PromoteIntegerResult #" << ResNo << ": ";
47d765353da89988e949fd4c021d8860f36ab7c392David Greene    N->dump(&DAG); dbgs() << "\n";
4869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands#endif
49c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Do not know how to promote this operator!");
509fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::AssertSext:  Res = PromoteIntRes_AssertSext(N); break;
519fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::AssertZext:  Res = PromoteIntRes_AssertZext(N); break;
529fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::BIT_CONVERT: Res = PromoteIntRes_BIT_CONVERT(N); break;
539fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::BSWAP:       Res = PromoteIntRes_BSWAP(N); break;
549fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::BUILD_PAIR:  Res = PromoteIntRes_BUILD_PAIR(N); break;
559fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::Constant:    Res = PromoteIntRes_Constant(N); break;
5600ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang  case ISD::CONVERT_RNDSAT:
579fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands                         Res = PromoteIntRes_CONVERT_RNDSAT(N); break;
589fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::CTLZ:        Res = PromoteIntRes_CTLZ(N); break;
599fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::CTPOP:       Res = PromoteIntRes_CTPOP(N); break;
609fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::CTTZ:        Res = PromoteIntRes_CTTZ(N); break;
61bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case ISD::EXTRACT_VECTOR_ELT:
629fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands                         Res = PromoteIntRes_EXTRACT_VECTOR_ELT(N); break;
639fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::LOAD:        Res = PromoteIntRes_LOAD(cast<LoadSDNode>(N));break;
649fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SELECT:      Res = PromoteIntRes_SELECT(N); break;
659fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SELECT_CC:   Res = PromoteIntRes_SELECT_CC(N); break;
669fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SETCC:       Res = PromoteIntRes_SETCC(N); break;
679fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SHL:         Res = PromoteIntRes_SHL(N); break;
688d56a6f4d8b010d4c582225a08ece971613f6fe3Duncan Sands  case ISD::SIGN_EXTEND_INREG:
699fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands                         Res = PromoteIntRes_SIGN_EXTEND_INREG(N); break;
709fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SRA:         Res = PromoteIntRes_SRA(N); break;
719fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SRL:         Res = PromoteIntRes_SRL(N); break;
729fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::TRUNCATE:    Res = PromoteIntRes_TRUNCATE(N); break;
739fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::UNDEF:       Res = PromoteIntRes_UNDEF(N); break;
749fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::VAARG:       Res = PromoteIntRes_VAARG(N); break;
75bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
7669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SIGN_EXTEND:
7769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::ZERO_EXTEND:
789fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::ANY_EXTEND:  Res = PromoteIntRes_INT_EXTEND(N); break;
79bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
8069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::FP_TO_SINT:
819fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::FP_TO_UINT:  Res = PromoteIntRes_FP_TO_XINT(N); break;
8269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
83927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov  case ISD::FP32_TO_FP16:Res = PromoteIntRes_FP32_TO_FP16(N); break;
84927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov
8569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::AND:
8669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::OR:
8769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::XOR:
8869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::ADD:
8969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SUB:
909fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::MUL:         Res = PromoteIntRes_SimpleIntBinOp(N); break;
9169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
9269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SDIV:
939fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SREM:        Res = PromoteIntRes_SDIV(N); break;
9469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
9569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::UDIV:
969fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::UREM:        Res = PromoteIntRes_UDIV(N); break;
978ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
98253174bf50c932abaa680f465e2888c0e5272267Bill Wendling  case ISD::SADDO:
999fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::SSUBO:       Res = PromoteIntRes_SADDSUBO(N, ResNo); break;
10074c376529101acbe141a256d0bf23a44eb454c84Bill Wendling  case ISD::UADDO:
1019fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::USUBO:       Res = PromoteIntRes_UADDSUBO(N, ResNo); break;
10274c376529101acbe141a256d0bf23a44eb454c84Bill Wendling  case ISD::SMULO:
1039fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  case ISD::UMULO:       Res = PromoteIntRes_XMULO(N, ResNo); break;
104b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
1050b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_ADD:
1060b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_SUB:
1070b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_AND:
1080b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_OR:
1090b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_XOR:
1100b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_NAND:
1110b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_MIN:
1120b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_MAX:
1130b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_UMIN:
1140b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_LOAD_UMAX:
1150b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_SWAP:
1169fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands    Res = PromoteIntRes_Atomic1(cast<AtomicSDNode>(N)); break;
117b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
1180b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman  case ISD::ATOMIC_CMP_SWAP:
1199fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands    Res = PromoteIntRes_Atomic2(cast<AtomicSDNode>(N)); break;
12069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
12169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1229fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  // If the result is null then the sub-method took care of registering it.
1239fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (Res.getNode())
1249fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands    SetPromotedInteger(SDValue(N, ResNo), Res);
12569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
12669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
127475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_AssertSext(SDNode *N) {
12895db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  // Sign-extend the new bits, and continue the assertion.
129c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = SExtPromotedInteger(N->getOperand(0));
130786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::AssertSext, N->getDebugLoc(),
131786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Op.getValueType(), Op, N->getOperand(1));
13295db39a9de48f69f4d764335b492b83a698c7854Duncan Sands}
13395db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
134475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_AssertZext(SDNode *N) {
13595db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  // Zero the new bits, and continue the assertion.
136c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
137786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::AssertZext, N->getDebugLoc(),
138786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Op.getValueType(), Op, N->getOperand(1));
13995db39a9de48f69f4d764335b492b83a698c7854Duncan Sands}
14095db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
141b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_Atomic1(AtomicSDNode *N) {
142b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  SDValue Op2 = GetPromotedInteger(N->getOperand(2));
1437fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands  SDValue Res = DAG.getAtomic(N->getOpcode(), N->getDebugLoc(),
144786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                              N->getMemoryVT(),
1450b1d4a798d1dd2f39521b6b381cd1c1911c9ab52Dan Gohman                              N->getChain(), N->getBasePtr(),
146b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands                              Op2, N->getSrcValue(), N->getAlignment());
147b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // Legalized the chain result - switch anything that used the old chain to
148b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // use the new one.
149b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
150b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  return Res;
151b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands}
152b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
153b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_Atomic2(AtomicSDNode *N) {
154b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  SDValue Op2 = GetPromotedInteger(N->getOperand(2));
155b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  SDValue Op3 = GetPromotedInteger(N->getOperand(3));
156fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel  SDValue Res = DAG.getAtomic(N->getOpcode(), N->getDebugLoc(),
157f8d3ec2c5725a2010f11de4ba78f6127712a5fe7Dale Johannesen                              N->getMemoryVT(), N->getChain(), N->getBasePtr(),
158b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands                              Op2, Op3, N->getSrcValue(), N->getAlignment());
159b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // Legalized the chain result - switch anything that used the old chain to
160b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  // use the new one.
161b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
162b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands  return Res;
163b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands}
164b5f68e241f9eb19e5694131df830acbfce20a6ebDuncan Sands
165475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_BIT_CONVERT(SDNode *N) {
166475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InOp = N->getOperand(0);
167e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT InVT = InOp.getValueType();
16823b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NInVT = TLI.getTypeToTransformTo(*DAG.getContext(), InVT);
169e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT OutVT = N->getValueType(0);
17023b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
171786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
17269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
17369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  switch (getTypeAction(InVT)) {
17469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  default:
17569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    assert(false && "Unknown type action!");
17669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
17769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case Legal:
17869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
17969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case PromoteInteger:
18047d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands    if (NOutVT.bitsEq(NInVT))
18169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands      // The input promotes to the same size.  Convert the promoted value.
1827fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      return DAG.getNode(ISD::BIT_CONVERT, dl,
183786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                         NOutVT, GetPromotedInteger(InOp));
18469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
1854fc4fd657d4266059dac3849133a3a351b03d99dDuncan Sands  case SoftenFloat:
18669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Promote the integer operand by hand.
187786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT, GetSoftenedFloat(InOp));
18869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ExpandInteger:
18969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ExpandFloat:
19069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    break;
191f4e4629ee8c218f892ad8ae3e182fe40bc160895Duncan Sands  case ScalarizeVector:
19269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Convert the element to an integer and promote it by hand.
193786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
19469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                       BitConvertToInteger(GetScalarizedVector(InOp)));
19587c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang  case SplitVector: {
19669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // For example, i32 = BIT_CONVERT v2i16 on alpha.  Convert the split
19769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // pieces of the input into integers and reassemble in the final type.
198475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Lo, Hi;
19969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetSplitVector(N->getOperand(0), Lo, Hi);
20069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    Lo = BitConvertToInteger(Lo);
20169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    Hi = BitConvertToInteger(Hi);
20269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
20369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    if (TLI.isBigEndian())
20469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands      std::swap(Lo, Hi);
20569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
206786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    InOp = DAG.getNode(ISD::ANY_EXTEND, dl,
207adf979900c84d00e1fe0872a68d2819c654b6f29Evan Cheng                       EVT::getIntegerVT(*DAG.getContext(),
208adf979900c84d00e1fe0872a68d2819c654b6f29Evan Cheng                                         NOutVT.getSizeInBits()),
20969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                       JoinIntegers(Lo, Hi));
210786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::BIT_CONVERT, dl, NOutVT, InOp);
21169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
21287c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang  case WidenVector:
21387c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang    if (OutVT.bitsEq(NInVT))
21487c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang      // The input is widened to the same size.  Convert to the widened value.
215786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      return DAG.getNode(ISD::BIT_CONVERT, dl, OutVT, GetWidenedVector(InOp));
21687c8a8f304d1ee72829086ce2c41a8fa3813ba6aMon P Wang  }
21769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
218aad3460086a1b29c55f7490c6d8743ea4e53f07dEli Friedman  return DAG.getNode(ISD::ANY_EXTEND, dl, NOutVT,
219aad3460086a1b29c55f7490c6d8743ea4e53f07dEli Friedman                     CreateStackStoreLoad(InOp, OutVT));
22069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
22169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
222475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_BSWAP(SDNode *N) {
223475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
224e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT OVT = N->getValueType(0);
225e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Op.getValueType();
226786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
227c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands
228c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands  unsigned DiffBits = NVT.getSizeInBits() - OVT.getSizeInBits();
229786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SRL, dl, NVT, DAG.getNode(ISD::BSWAP, dl, NVT, Op),
23092abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                     DAG.getConstant(DiffBits, TLI.getPointerTy()));
231c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands}
232c07e6e53f757da1a7c79c66ed53f2844de85a77eDuncan Sands
233475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_BUILD_PAIR(SDNode *N) {
234bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The pair element type may be legal, or may not promote to the same type as
235bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // the result, for example i14 = BUILD_PAIR (i7, i7).  Handle all cases.
236786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::ANY_EXTEND, N->getDebugLoc(),
23723b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson                     TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)),
238bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     JoinIntegers(N->getOperand(0), N->getOperand(1)));
23969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
24069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
241475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_Constant(SDNode *N) {
242e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
243b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  // FIXME there is no actual debug info here
244b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  DebugLoc dl = N->getDebugLoc();
245bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Zero extend things like i1, sign extend everything else.  It shouldn't
246bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // matter in theory which one we pick, but this tends to give better code?
247bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  unsigned Opc = VT.isByteSized() ? ISD::SIGN_EXTEND : ISD::ZERO_EXTEND;
24823b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  SDValue Result = DAG.getNode(Opc, dl, TLI.getTypeToTransformTo(*DAG.getContext(), VT),
249a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands                               SDValue(N, 0));
250bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(isa<ConstantSDNode>(Result) && "Didn't constant fold ext?");
251bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  return Result;
25269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
25369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
25400ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P WangSDValue DAGTypeLegalizer::PromoteIntRes_CONVERT_RNDSAT(SDNode *N) {
25500ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang  ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
25600ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang  assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
25700ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang           CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
25800ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang           CvtCode == ISD::CVT_SF || CvtCode == ISD::CVT_UF) &&
25900ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang          "can only promote integers");
26023b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT OutVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
261c460ae90019ddb19d4c07b2cd2fbaecfa7adf67dDale Johannesen  return DAG.getConvertRndSat(OutVT, N->getDebugLoc(), N->getOperand(0),
26200ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang                              N->getOperand(1), N->getOperand(2),
26300ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang                              N->getOperand(3), N->getOperand(4), CvtCode);
26400ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang}
26500ec49b6bafc33ee17d97ec1c723e1edb41d4c97Mon P Wang
266475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_CTLZ(SDNode *N) {
267c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  // Zero extend to the promoted type and do the count there.
268c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
269b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  DebugLoc dl = N->getDebugLoc();
270e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT OVT = N->getValueType(0);
271e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Op.getValueType();
272b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  Op = DAG.getNode(ISD::CTLZ, dl, NVT, Op);
27369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Subtract off the extra leading bits in the bigger type.
274b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  return DAG.getNode(ISD::SUB, dl, NVT, Op,
27569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                     DAG.getConstant(NVT.getSizeInBits() -
27669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                     OVT.getSizeInBits(), NVT));
27769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
27869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
279475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_CTPOP(SDNode *N) {
28069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Zero extend to the promoted type and do the count there.
281c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Op = ZExtPromotedInteger(N->getOperand(0));
282786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::CTPOP, N->getDebugLoc(), Op.getValueType(), Op);
28369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
28469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
285475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_CTTZ(SDNode *N) {
286475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
287e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT OVT = N->getValueType(0);
288e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Op.getValueType();
289786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
29069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // The count is the same in the promoted type except if the original
29169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // value was zero.  This can be handled by setting the bit just off
29269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // the top of the original type.
29303dc093a2e63d20984c8fd67809fa762f1e31f1aDuncan Sands  APInt TopBit(NVT.getSizeInBits(), 0);
29403dc093a2e63d20984c8fd67809fa762f1e31f1aDuncan Sands  TopBit.set(OVT.getSizeInBits());
295786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Op = DAG.getNode(ISD::OR, dl, NVT, Op, DAG.getConstant(TopBit, NVT));
296786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::CTTZ, dl, NVT, Op);
29769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
29869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
299475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_EXTRACT_VECTOR_ELT(SDNode *N) {
300786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
30123b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
302c680ac90032bf455b2bba77de538fccea08eb267Eli Friedman  return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NVT, N->getOperand(0),
303c680ac90032bf455b2bba77de538fccea08eb267Eli Friedman                     N->getOperand(1));
30469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
30569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
306475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_FP_TO_XINT(SDNode *N) {
30723b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
308a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  unsigned NewOpc = N->getOpcode();
309786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
310d3ca9fc9984d036146886a40ad3f73aaf7a424ebDuncan Sands
3114c9369df57a52cec5e1fc735e61a979766288074Dale Johannesen  // If we're promoting a UINT to a larger size and the larger FP_TO_UINT is
3124c9369df57a52cec5e1fc735e61a979766288074Dale Johannesen  // not Legal, check to see if we can use FP_TO_SINT instead.  (If both UINT
3134c9369df57a52cec5e1fc735e61a979766288074Dale Johannesen  // and SINT conversions are Custom, there is no way to tell which is preferable.
3148c899ee031481dbece5f111379a274c848cb5902Duncan Sands  // We choose SINT because that's the right thing on PPC.)
315a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  if (N->getOpcode() == ISD::FP_TO_UINT &&
3164c9369df57a52cec5e1fc735e61a979766288074Dale Johannesen      !TLI.isOperationLegal(ISD::FP_TO_UINT, NVT) &&
317f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman      TLI.isOperationLegalOrCustom(ISD::FP_TO_SINT, NVT))
318a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands    NewOpc = ISD::FP_TO_SINT;
319a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands
320786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(NewOpc, dl, NVT, N->getOperand(0));
321a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands
322a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  // Assert that the converted value fits in the original type.  If it doesn't
323a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  // (eg: because the value being converted is too big), then the result of the
324a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  // original operation was undefined anyway, so the assert is still correct.
325a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands  return DAG.getNode(N->getOpcode() == ISD::FP_TO_UINT ?
326786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     ISD::AssertZext : ISD::AssertSext, dl,
327a29c13086a3add78a3a79f744573fe09eaa9dc88Duncan Sands                     NVT, Res, DAG.getValueType(N->getValueType(0)));
328d3ca9fc9984d036146886a40ad3f73aaf7a424ebDuncan Sands}
329d3ca9fc9984d036146886a40ad3f73aaf7a424ebDuncan Sands
330927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton KorobeynikovSDValue DAGTypeLegalizer::PromoteIntRes_FP32_TO_FP16(SDNode *N) {
331927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
332927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov  DebugLoc dl = N->getDebugLoc();
333927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov
334927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov  SDValue Res = DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0));
335927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov
336927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov  return DAG.getNode(ISD::AssertZext, dl,
337927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov                     NVT, Res, DAG.getValueType(N->getValueType(0)));
338927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov}
339927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov
340475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_INT_EXTEND(SDNode *N) {
34123b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
342786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
343be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands
344bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  if (getTypeAction(N->getOperand(0).getValueType()) == PromoteInteger) {
345475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(N->getOperand(0));
3466959b2bb6521baca57e5507ca039e51002d4a971Duncan Sands    assert(Res.getValueType().bitsLE(NVT) && "Extension doesn't make sense!");
347126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands
348bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    // If the result and operand types are the same after promotion, simplify
349bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    // to an in-register extension.
350bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    if (NVT == Res.getValueType()) {
351bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      // The high bits are not guaranteed to be anything.  Insert an extend.
352bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      if (N->getOpcode() == ISD::SIGN_EXTEND)
353786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
354bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                           DAG.getValueType(N->getOperand(0).getValueType()));
355bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      if (N->getOpcode() == ISD::ZERO_EXTEND)
3564be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen        return DAG.getZeroExtendInReg(Res, dl, N->getOperand(0).getValueType());
357bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      assert(N->getOpcode() == ISD::ANY_EXTEND && "Unknown integer extension!");
358bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands      return Res;
359126d90770bdb17e6925b2fe26de99aa079b7b9b3Duncan Sands    }
36069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
36169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
362bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Otherwise, just extend the original operand all the way to the larger type.
363786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), dl, NVT, N->getOperand(0));
364bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
36569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
366475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_LOAD(LoadSDNode *N) {
367bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
36823b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
369bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  ISD::LoadExtType ExtType =
370bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    ISD::isNON_EXTLoad(N) ? ISD::EXTLOAD : N->getExtensionType();
371786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
372786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getExtLoad(ExtType, dl, NVT, N->getChain(), N->getBasePtr(),
37347d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands                               N->getSrcValue(), N->getSrcValueOffset(),
37447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands                               N->getMemoryVT(), N->isVolatile(),
3751e559443a17d1b335f697551c6263ba60d5dd827David Greene                               N->isNonTemporal(), N->getAlignment());
37669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
377bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Legalized the chain result - switch anything that used the old chain to
378bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // use the new one.
379475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Res.getValue(1));
380bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  return Res;
38169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
38269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
383874ae251c317788391f9c3f113957802d390a063Dale Johannesen/// Promote the overflow flag of an overflowing arithmetic node.
384ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_Overflow(SDNode *N) {
385ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Simply change the return type of the boolean result.
38623b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(1));
387e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT ValueVTs[] = { N->getValueType(0), NVT };
388ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue Ops[] = { N->getOperand(0), N->getOperand(1) };
389786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(N->getOpcode(), N->getDebugLoc(),
390786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                            DAG.getVTList(ValueVTs, 2), Ops, 2);
391ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
392ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Modified the sum result - switch anything that used the old sum to use
393ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // the new one.
394ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  ReplaceValueWith(SDValue(N, 0), Res);
395ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
396ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return SDValue(Res.getNode(), 1);
397ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
398ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
399ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_SADDSUBO(SDNode *N, unsigned ResNo) {
400ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  if (ResNo == 1)
401ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands    return PromoteIntRes_Overflow(N);
402ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
403ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // The operation overflowed iff the result in the larger type is not the
404ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // sign extension of its truncation to the original type.
405ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue LHS = SExtPromotedInteger(N->getOperand(0));
406ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue RHS = SExtPromotedInteger(N->getOperand(1));
407e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT OVT = N->getOperand(0).getValueType();
408e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = LHS.getValueType();
409786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
410ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
411ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Do the arithmetic in the larger type.
412ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  unsigned Opcode = N->getOpcode() == ISD::SADDO ? ISD::ADD : ISD::SUB;
413786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
414ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
415ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Calculate the overflow flag: sign extend the arithmetic result from
416ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // the original type.
417786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Ofl = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, NVT, Res,
418ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands                            DAG.getValueType(OVT));
419ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Overflowed if and only if this is not equal to Res.
420786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE);
421ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
422ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Use the calculated overflow everywhere.
423ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  ReplaceValueWith(SDValue(N, 1), Ofl);
424ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
425ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return Res;
426ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
427ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
428475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SDIV(SDNode *N) {
429bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Sign extend the input.
430c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue LHS = SExtPromotedInteger(N->getOperand(0));
431c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue RHS = SExtPromotedInteger(N->getOperand(1));
432786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), N->getDebugLoc(),
433786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), LHS, RHS);
43469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
43569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
436475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SELECT(SDNode *N) {
437475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = GetPromotedInteger(N->getOperand(1));
438475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = GetPromotedInteger(N->getOperand(2));
439786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SELECT, N->getDebugLoc(),
440786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), N->getOperand(0),LHS,RHS);
44169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
44269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
443475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SELECT_CC(SDNode *N) {
444475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = GetPromotedInteger(N->getOperand(2));
445475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = GetPromotedInteger(N->getOperand(3));
446786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SELECT_CC, N->getDebugLoc(),
447786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), N->getOperand(0),
448bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     N->getOperand(1), LHS, RHS, N->getOperand(4));
44969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
45069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
451475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SETCC(SDNode *N) {
452e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT SVT = TLI.getSetCCResultType(N->getOperand(0).getValueType());
4537e4982287591945c4e42ba8470a978e629789c76Duncan Sands  assert(isTypeLegal(SVT) && "Illegal SetCC type!");
454786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
4557e4982287591945c4e42ba8470a978e629789c76Duncan Sands
4567e4982287591945c4e42ba8470a978e629789c76Duncan Sands  // Get the SETCC result using the canonical SETCC type.
457786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue SetCC = DAG.getNode(ISD::SETCC, dl, SVT, N->getOperand(0),
4587e4982287591945c4e42ba8470a978e629789c76Duncan Sands                              N->getOperand(1), N->getOperand(2));
4597e4982287591945c4e42ba8470a978e629789c76Duncan Sands
4607e4982287591945c4e42ba8470a978e629789c76Duncan Sands  // Convert to the expected type.
46123b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
4626959b2bb6521baca57e5507ca039e51002d4a971Duncan Sands  assert(NVT.bitsLE(SVT) && "Integer type overpromoted?");
463786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, dl, NVT, SetCC);
46469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
46569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
466475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SHL(SDNode *N) {
467786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SHL, N->getDebugLoc(),
468182465c589f95ff165331d06035ec53ff05bf1f5Evan Cheng                TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0)),
469bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     GetPromotedInteger(N->getOperand(0)), N->getOperand(1));
47069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
47169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
472475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SIGN_EXTEND_INREG(SDNode *N) {
473475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
474786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SIGN_EXTEND_INREG, N->getDebugLoc(),
475786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Op.getValueType(), Op, N->getOperand(1));
4768d56a6f4d8b010d4c582225a08ece971613f6fe3Duncan Sands}
4778d56a6f4d8b010d4c582225a08ece971613f6fe3Duncan Sands
478475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SimpleIntBinOp(SDNode *N) {
479bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The input may have strange things in the top bits of the registers, but
480bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // these operations don't care.  They may have weird bits going out, but
481bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // that too is okay if they are integer operations.
482475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = GetPromotedInteger(N->getOperand(0));
483475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = GetPromotedInteger(N->getOperand(1));
484786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), N->getDebugLoc(),
485786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                    LHS.getValueType(), LHS, RHS);
48669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
48769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
488475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SRA(SDNode *N) {
489bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The input value must be properly sign extended.
490c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Res = SExtPromotedInteger(N->getOperand(0));
491786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SRA, N->getDebugLoc(),
492786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     Res.getValueType(), Res, N->getOperand(1));
493bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
49469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
495475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_SRL(SDNode *N) {
496bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The input value must be properly zero extended.
497e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
49823b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
499475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res = ZExtPromotedInteger(N->getOperand(0));
500786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SRL, N->getDebugLoc(), NVT, Res, N->getOperand(1));
50169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
50269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
503475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_TRUNCATE(SDNode *N) {
50423b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
505475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res;
50669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
507bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  switch (getTypeAction(N->getOperand(0).getValueType())) {
508c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown type action!");
509bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case Legal:
510bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case ExpandInteger:
511bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    Res = N->getOperand(0);
512bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    break;
513bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  case PromoteInteger:
514bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    Res = GetPromotedInteger(N->getOperand(0));
515bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    break;
516bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  }
517bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
518bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Truncate to NVT instead of VT
519786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), NVT, Res);
52069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
52169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
522ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_UADDSUBO(SDNode *N, unsigned ResNo) {
523ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  if (ResNo == 1)
524ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands    return PromoteIntRes_Overflow(N);
525ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
526ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // The operation overflowed iff the result in the larger type is not the
527ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // zero extension of its truncation to the original type.
528c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
529c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
530e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT OVT = N->getOperand(0).getValueType();
531e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = LHS.getValueType();
532786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
53369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
534ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Do the arithmetic in the larger type.
535ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  unsigned Opcode = N->getOpcode() == ISD::UADDO ? ISD::ADD : ISD::SUB;
536786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(Opcode, dl, NVT, LHS, RHS);
5378ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
538ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Calculate the overflow flag: zero extend the arithmetic result from
539ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // the original type.
5404be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  SDValue Ofl = DAG.getZeroExtendInReg(Res, dl, OVT);
541ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Overflowed if and only if this is not equal to Res.
542786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Ofl = DAG.getSetCC(dl, N->getValueType(1), Ofl, Res, ISD::SETNE);
5438ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
544ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Use the calculated overflow everywhere.
545ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  ReplaceValueWith(SDValue(N, 1), Ofl);
5468ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
547ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return Res;
548ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
549ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands
550ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_UDIV(SDNode *N) {
551ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  // Zero extend the input.
552ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue LHS = ZExtPromotedInteger(N->getOperand(0));
553ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  SDValue RHS = ZExtPromotedInteger(N->getOperand(1));
554786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(N->getOpcode(), N->getDebugLoc(),
555786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     LHS.getValueType(), LHS, RHS);
5568ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling}
5578ac0d4b4fb10406278cd600214cd3ee6d76620cdBill Wendling
558475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_UNDEF(SDNode *N) {
55953f6ed9560aa4586ba217fbf94acbfada52f561fEvan Cheng  return DAG.getUNDEF(TLI.getTypeToTransformTo(*DAG.getContext(),
56053f6ed9560aa4586ba217fbf94acbfada52f561fEvan Cheng                                               N->getValueType(0)));
56169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
56269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
563475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntRes_VAARG(SDNode *N) {
564475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Chain = N->getOperand(0); // Get the chain.
565475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ptr = N->getOperand(1); // Get the pointer.
566e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
567786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
56869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
56923b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT RegVT = TLI.getRegisterType(*DAG.getContext(), VT);
57023b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  unsigned NumRegs = TLI.getNumRegisters(*DAG.getContext(), VT);
571d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // The argument is passed as NumRegs registers of type RegVT.
572d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands
573d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  SmallVector<SDValue, 8> Parts(NumRegs);
574d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  for (unsigned i = 0; i < NumRegs; ++i) {
575c460ae90019ddb19d4c07b2cd2fbaecfa7adf67dDale Johannesen    Parts[i] = DAG.getVAArg(RegVT, dl, Chain, Ptr, N->getOperand(2));
576d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands    Chain = Parts[i].getValue(1);
577d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  }
57869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
579d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // Handle endianness of the load.
580d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  if (TLI.isBigEndian())
581d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands    std::reverse(Parts.begin(), Parts.end());
58269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
583d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // Assemble the parts in the promoted type.
58423b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
585786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue Res = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[0]);
586d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  for (unsigned i = 1; i < NumRegs; ++i) {
587786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue Part = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, Parts[i]);
588d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands    // Shift it to the right position and "or" it in.
589786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Part = DAG.getNode(ISD::SHL, dl, NVT, Part,
590d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands                       DAG.getConstant(i * RegVT.getSizeInBits(),
59192abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                       TLI.getPointerTy()));
592786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Res = DAG.getNode(ISD::OR, dl, NVT, Res, Part);
593d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  }
59469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
595d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  // Modified the chain result - switch anything that used the old chain to
596bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // use the new one.
597d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  ReplaceValueWith(SDValue(N, 1), Chain);
598d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands
599d821726a91000c1b2de7ca8aafdc27b1a311741bDuncan Sands  return Res;
60069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
60169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
602ab0c578bfd1380326830180a9209df6c5be58887Duncan SandsSDValue DAGTypeLegalizer::PromoteIntRes_XMULO(SDNode *N, unsigned ResNo) {
603ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  assert(ResNo == 1 && "Only boolean result promotion currently supported!");
604ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands  return PromoteIntRes_Overflow(N);
605ab0c578bfd1380326830180a9209df6c5be58887Duncan Sands}
6067fc8ab81f5f46dcba0f76b1c546a1d11ccbebe26Duncan Sands
607bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands//===----------------------------------------------------------------------===//
608bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands//  Integer Operand Promotion
609bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands//===----------------------------------------------------------------------===//
6107fc8ab81f5f46dcba0f76b1c546a1d11ccbebe26Duncan Sands
611bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// PromoteIntegerOperand - This method is called when the specified operand of
612bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// the specified node is found to need promotion.  At this point, all of the
613bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// result types of the node are known to be legal, but other operands of the
614bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands/// node may need promotion or expansion as well as the specified one.
615bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sandsbool DAGTypeLegalizer::PromoteIntegerOperand(SDNode *N, unsigned OpNo) {
616d765353da89988e949fd4c021d8860f36ab7c392David Greene  DEBUG(dbgs() << "Promote integer operand: "; N->dump(&DAG); dbgs() << "\n");
617475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res = SDValue();
6187fc8ab81f5f46dcba0f76b1c546a1d11ccbebe26Duncan Sands
619f43071beddb7ed5b2fd7d2f06c4130460616a13dDuncan Sands  if (CustomLowerNode(N, N->getOperand(OpNo).getValueType(), false))
620bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    return false;
62169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
622bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  switch (N->getOpcode()) {
623bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    default:
624bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  #ifndef NDEBUG
625d765353da89988e949fd4c021d8860f36ab7c392David Greene    dbgs() << "PromoteIntegerOperand Op #" << OpNo << ": ";
626d765353da89988e949fd4c021d8860f36ab7c392David Greene    N->dump(&DAG); dbgs() << "\n";
627bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  #endif
628c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Do not know how to promote this operator's operand!");
629bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
630bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::ANY_EXTEND:   Res = PromoteIntOp_ANY_EXTEND(N); break;
63127759f41ca1c930e2860275c9ba2567a5890d7d2Eli Friedman  case ISD::BIT_CONVERT:  Res = PromoteIntOp_BIT_CONVERT(N); break;
632bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BR_CC:        Res = PromoteIntOp_BR_CC(N, OpNo); break;
633bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BRCOND:       Res = PromoteIntOp_BRCOND(N, OpNo); break;
634bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BUILD_PAIR:   Res = PromoteIntOp_BUILD_PAIR(N); break;
635bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BUILD_VECTOR: Res = PromoteIntOp_BUILD_VECTOR(N); break;
636bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::CONVERT_RNDSAT:
637bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta                          Res = PromoteIntOp_CONVERT_RNDSAT(N); break;
638bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::INSERT_VECTOR_ELT:
639bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta                          Res = PromoteIntOp_INSERT_VECTOR_ELT(N, OpNo);break;
640bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::MEMBARRIER:   Res = PromoteIntOp_MEMBARRIER(N); break;
641aa9df0b0c3cef33514095bde2eedead986677955Mon P Wang  case ISD::SCALAR_TO_VECTOR:
642aa9df0b0c3cef33514095bde2eedead986677955Mon P Wang                          Res = PromoteIntOp_SCALAR_TO_VECTOR(N); break;
643bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SELECT:       Res = PromoteIntOp_SELECT(N, OpNo); break;
644bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SELECT_CC:    Res = PromoteIntOp_SELECT_CC(N, OpNo); break;
645bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SETCC:        Res = PromoteIntOp_SETCC(N, OpNo); break;
646bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SIGN_EXTEND:  Res = PromoteIntOp_SIGN_EXTEND(N); break;
647bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SINT_TO_FP:   Res = PromoteIntOp_SINT_TO_FP(N); break;
648bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::STORE:        Res = PromoteIntOp_STORE(cast<StoreSDNode>(N),
649bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta                                                   OpNo); break;
650bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::TRUNCATE:     Res = PromoteIntOp_TRUNCATE(N); break;
651927411b7ce0b7852fe4f392d8cd4faaa3881f852Anton Korobeynikov  case ISD::FP16_TO_FP32:
652bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::UINT_TO_FP:   Res = PromoteIntOp_UINT_TO_FP(N); break;
653bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::ZERO_EXTEND:  Res = PromoteIntOp_ZERO_EXTEND(N); break;
65455467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
65555467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SHL:
65655467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRA:
65755467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRL:
65855467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::ROTL:
65955467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::ROTR: Res = PromoteIntOp_Shift(N); break;
660bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  }
6619fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands
662bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // If the result is null, the sub-method took care of registering results etc.
6639fbc7e2e7a765298fb4326885b407e0962f7ab62Duncan Sands  if (!Res.getNode()) return false;
66447d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
66547d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // If the result is N, the sub-method updated N in place.  Tell the legalizer
66647d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // core about this.
66747d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  if (Res.getNode() == N)
668bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands    return true;
669bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
670bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
671bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands         "Invalid operand expansion");
672bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
673475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 0), Res);
674bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  return false;
67569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
67669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
67769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// PromoteSetCCOperands - Promote the operands of a comparison.  This code is
67869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// shared among BR_CC, SELECT_CC, and SETCC handlers.
679475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::PromoteSetCCOperands(SDValue &NewLHS,SDValue &NewRHS,
68069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                            ISD::CondCode CCCode) {
681cff50d9e20d7bbc3acf4845fe826bfb3095126c4Duncan Sands  // We have to insert explicit sign or zero extends.  Note that we could
682cff50d9e20d7bbc3acf4845fe826bfb3095126c4Duncan Sands  // insert sign extends for ALL conditions, but zero extend is cheaper on
683cff50d9e20d7bbc3acf4845fe826bfb3095126c4Duncan Sands  // many machines (an AND instead of two shifts), so prefer it.
68469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  switch (CCCode) {
685c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown integer comparison!");
68669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETEQ:
68769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETNE:
68869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETUGE:
68969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETUGT:
69069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETULE:
69169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETULT:
69269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // ALL of these operations will work if we either sign or zero extend
69369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // the operands (including the unsigned comparisons!).  Zero extend is
69469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // usually a simpler/cheaper operation, so prefer it.
695c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewLHS = ZExtPromotedInteger(NewLHS);
696c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewRHS = ZExtPromotedInteger(NewRHS);
69711ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    break;
69869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETGE:
69969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETGT:
70069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETLT:
70169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::SETLE:
702c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewLHS = SExtPromotedInteger(NewLHS);
703c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands    NewRHS = SExtPromotedInteger(NewRHS);
70411ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    break;
70569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
70669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
70769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
708475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_ANY_EXTEND(SDNode *N) {
709475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
710786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::ANY_EXTEND, N->getDebugLoc(), N->getValueType(0), Op);
711bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
71269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
71327759f41ca1c930e2860275c9ba2567a5890d7d2Eli FriedmanSDValue DAGTypeLegalizer::PromoteIntOp_BIT_CONVERT(SDNode *N) {
71427759f41ca1c930e2860275c9ba2567a5890d7d2Eli Friedman  // This should only occur in unusual situations like bitcasting to an
71527759f41ca1c930e2860275c9ba2567a5890d7d2Eli Friedman  // x86_fp80, so just turn it into a store+load
71627759f41ca1c930e2860275c9ba2567a5890d7d2Eli Friedman  return CreateStackStoreLoad(N->getOperand(0), N->getValueType(0));
71727759f41ca1c930e2860275c9ba2567a5890d7d2Eli Friedman}
71827759f41ca1c930e2860275c9ba2567a5890d7d2Eli Friedman
719475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BR_CC(SDNode *N, unsigned OpNo) {
720bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 2 && "Don't know how to promote this operand!");
72169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
722475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = N->getOperand(2);
723475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = N->getOperand(3);
724bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(1))->get());
72569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
726bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The chain (Op#0), CC (#1) and basic block destination (Op#4) are always
727bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // legal types.
728475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
729bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                                N->getOperand(1), LHS, RHS, N->getOperand(4));
730bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
731bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
732475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BRCOND(SDNode *N, unsigned OpNo) {
733bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 1 && "only know how to promote condition");
734bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
735b6e223a9e806921183da972253c49082a2e07944Duncan Sands  // Promote all the way up to the canonical SetCC type.
736825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  EVT SVT = TLI.getSetCCResultType(MVT::Other);
737b6e223a9e806921183da972253c49082a2e07944Duncan Sands  SDValue Cond = PromoteTargetBoolean(N->getOperand(1), SVT);
738bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
739bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The chain (Op#0) and basic block destination (Op#2) are always legal types.
740475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0), Cond,
741bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                                N->getOperand(2));
742bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
743bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
744475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BUILD_PAIR(SDNode *N) {
745bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Since the result type is legal, the operands must promote to it.
746e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT OVT = N->getOperand(0).getValueType();
747c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Lo = ZExtPromotedInteger(N->getOperand(0));
748475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Hi = GetPromotedInteger(N->getOperand(1));
749bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(Lo.getValueType() == N->getValueType(0) && "Operand over promoted?");
750786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
751bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
752786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::SHL, dl, N->getValueType(0), Hi,
75392abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                   DAG.getConstant(OVT.getSizeInBits(), TLI.getPointerTy()));
754786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::OR, dl, N->getValueType(0), Lo, Hi);
75569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
75669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
757475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_BUILD_VECTOR(SDNode *N) {
75869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // The vector type is legal but the element type is not.  This implies
75969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // that the vector is a power-of-two in length and that the element
76069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // type does not have a strange size (eg: it is not i1).
761e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VecVT = N->getValueType(0);
76269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  unsigned NumElts = VecVT.getVectorNumElements();
76369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  assert(!(NumElts & 1) && "Legal vector of one illegal element?");
76469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
765b1303d05a89972195de023fda432cc621375a27cBob Wilson  // Promote the inserted value.  The type does not need to match the
766b1303d05a89972195de023fda432cc621375a27cBob Wilson  // vector element type.  Check that any extra bits introduced will be
767b1303d05a89972195de023fda432cc621375a27cBob Wilson  // truncated away.
768b1303d05a89972195de023fda432cc621375a27cBob Wilson  assert(N->getOperand(0).getValueType().getSizeInBits() >=
769b1303d05a89972195de023fda432cc621375a27cBob Wilson         N->getValueType(0).getVectorElementType().getSizeInBits() &&
770b1303d05a89972195de023fda432cc621375a27cBob Wilson         "Type of inserted value narrower than vector element type!");
77169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
772b1303d05a89972195de023fda432cc621375a27cBob Wilson  SmallVector<SDValue, 16> NewOps;
773c885165e664f3b465403e1b6ce57ba63f57c5f0cBob Wilson  for (unsigned i = 0; i < NumElts; ++i)
774b1303d05a89972195de023fda432cc621375a27cBob Wilson    NewOps.push_back(GetPromotedInteger(N->getOperand(i)));
77569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
776b1303d05a89972195de023fda432cc621375a27cBob Wilson  return DAG.UpdateNodeOperands(SDValue(N, 0), &NewOps[0], NumElts);
77769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
77869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
77928088d3c049017a131aa7b07201c6e19c0227cefMon P WangSDValue DAGTypeLegalizer::PromoteIntOp_CONVERT_RNDSAT(SDNode *N) {
78028088d3c049017a131aa7b07201c6e19c0227cefMon P Wang  ISD::CvtCode CvtCode = cast<CvtRndSatSDNode>(N)->getCvtCode();
78128088d3c049017a131aa7b07201c6e19c0227cefMon P Wang  assert ((CvtCode == ISD::CVT_SS || CvtCode == ISD::CVT_SU ||
78228088d3c049017a131aa7b07201c6e19c0227cefMon P Wang           CvtCode == ISD::CVT_US || CvtCode == ISD::CVT_UU ||
78328088d3c049017a131aa7b07201c6e19c0227cefMon P Wang           CvtCode == ISD::CVT_FS || CvtCode == ISD::CVT_FU) &&
78428088d3c049017a131aa7b07201c6e19c0227cefMon P Wang           "can only promote integer arguments");
78528088d3c049017a131aa7b07201c6e19c0227cefMon P Wang  SDValue InOp = GetPromotedInteger(N->getOperand(0));
786c460ae90019ddb19d4c07b2cd2fbaecfa7adf67dDale Johannesen  return DAG.getConvertRndSat(N->getValueType(0), N->getDebugLoc(), InOp,
78728088d3c049017a131aa7b07201c6e19c0227cefMon P Wang                              N->getOperand(1), N->getOperand(2),
78828088d3c049017a131aa7b07201c6e19c0227cefMon P Wang                              N->getOperand(3), N->getOperand(4), CvtCode);
78928088d3c049017a131aa7b07201c6e19c0227cefMon P Wang}
79028088d3c049017a131aa7b07201c6e19c0227cefMon P Wang
791475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_INSERT_VECTOR_ELT(SDNode *N,
792475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                         unsigned OpNo) {
79369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  if (OpNo == 1) {
79469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Promote the inserted value.  This is valid because the type does not
79569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // have to match the vector element type.
79669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
79769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    // Check that any extra bits introduced will be truncated away.
79869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    assert(N->getOperand(1).getValueType().getSizeInBits() >=
79969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands           N->getValueType(0).getVectorElementType().getSizeInBits() &&
80069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands           "Type of inserted value narrower than vector element type!");
801475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
80269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                  GetPromotedInteger(N->getOperand(1)),
80369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                  N->getOperand(2));
80469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
80569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
80669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  assert(OpNo == 2 && "Different operand and result vector types?");
80769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
80869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // Promote the index.
809c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  SDValue Idx = ZExtPromotedInteger(N->getOperand(2));
810475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
81169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                N->getOperand(1), Idx);
81269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
81369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
814475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_MEMBARRIER(SDNode *N) {
815475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewOps[6];
8164be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  DebugLoc dl = N->getDebugLoc();
81769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  NewOps[0] = N->getOperand(0);
81869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  for (unsigned i = 1; i < array_lengthof(NewOps); ++i) {
819475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Flag = GetPromotedInteger(N->getOperand(i));
820825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    NewOps[i] = DAG.getZeroExtendInReg(Flag, dl, MVT::i1);
82169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  }
822475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue (N, 0), NewOps,
82369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands                                array_lengthof(NewOps));
82469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands}
82569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
826aa9df0b0c3cef33514095bde2eedead986677955Mon P WangSDValue DAGTypeLegalizer::PromoteIntOp_SCALAR_TO_VECTOR(SDNode *N) {
827b10b5ac8d9da43ca2db61401a20af6b676c98438Duncan Sands  // Integer SCALAR_TO_VECTOR operands are implicitly truncated, so just promote
828b10b5ac8d9da43ca2db61401a20af6b676c98438Duncan Sands  // the operand in place.
829b10b5ac8d9da43ca2db61401a20af6b676c98438Duncan Sands  return DAG.UpdateNodeOperands(SDValue(N, 0),
830b10b5ac8d9da43ca2db61401a20af6b676c98438Duncan Sands                                GetPromotedInteger(N->getOperand(0)));
831aa9df0b0c3cef33514095bde2eedead986677955Mon P Wang}
832aa9df0b0c3cef33514095bde2eedead986677955Mon P Wang
833475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SELECT(SDNode *N, unsigned OpNo) {
834bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 0 && "Only know how to promote condition");
8357e4982287591945c4e42ba8470a978e629789c76Duncan Sands
836b6e223a9e806921183da972253c49082a2e07944Duncan Sands  // Promote all the way up to the canonical SetCC type.
837e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT SVT = TLI.getSetCCResultType(N->getOperand(1).getValueType());
838b6e223a9e806921183da972253c49082a2e07944Duncan Sands  SDValue Cond = PromoteTargetBoolean(N->getOperand(0), SVT);
839bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
8407e4982287591945c4e42ba8470a978e629789c76Duncan Sands  return DAG.UpdateNodeOperands(SDValue(N, 0), Cond,
8417e4982287591945c4e42ba8470a978e629789c76Duncan Sands                                N->getOperand(1), N->getOperand(2));
842bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
843bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
844475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SELECT_CC(SDNode *N, unsigned OpNo) {
845bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 0 && "Don't know how to promote this operand!");
846bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
847475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = N->getOperand(0);
848475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = N->getOperand(1);
849bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(4))->get());
850bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
851bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The CC (#4) and the possible return values (#2 and #3) have legal types.
852475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), LHS, RHS, N->getOperand(2),
853bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                                N->getOperand(3), N->getOperand(4));
854bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
855bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
856475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SETCC(SDNode *N, unsigned OpNo) {
857bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(OpNo == 0 && "Don't know how to promote this operand!");
858bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
859475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHS = N->getOperand(0);
860475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue RHS = N->getOperand(1);
861bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  PromoteSetCCOperands(LHS, RHS, cast<CondCodeSDNode>(N->getOperand(2))->get());
862bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
863bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // The CC (#2) is always legal.
864475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), LHS, RHS, N->getOperand(2));
865bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
866bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
86755467af31620c9d027e071ebcd9746b7593cff17Sanjiv GuptaSDValue DAGTypeLegalizer::PromoteIntOp_Shift(SDNode *N) {
86855467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
86955467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta                                ZExtPromotedInteger(N->getOperand(1)));
87055467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta}
87155467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
872475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_SIGN_EXTEND(SDNode *N) {
873475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
874786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
875786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op);
876786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Op.getValueType(),
877bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                     Op, DAG.getValueType(N->getOperand(0).getValueType()));
878bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
879bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
880c08468774b65dc288c44076d428f4beddabe58e2Duncan SandsSDValue DAGTypeLegalizer::PromoteIntOp_SINT_TO_FP(SDNode *N) {
881c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  return DAG.UpdateNodeOperands(SDValue(N, 0),
882c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands                                SExtPromotedInteger(N->getOperand(0)));
883c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands}
884c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands
885475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_STORE(StoreSDNode *N, unsigned OpNo){
886bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
887475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ch = N->getChain(), Ptr = N->getBasePtr();
888bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  int SVOffset = N->getSrcValueOffset();
889bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  unsigned Alignment = N->getAlignment();
890bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  bool isVolatile = N->isVolatile();
8911e559443a17d1b335f697551c6263ba60d5dd827David Greene  bool isNonTemporal = N->isNonTemporal();
892786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
893bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
894475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Val = GetPromotedInteger(N->getValue());  // Get promoted value.
895bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
896bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands  // Truncate the value and store the result.
897786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getTruncStore(Ch, dl, Val, Ptr, N->getSrcValue(),
898bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands                           SVOffset, N->getMemoryVT(),
8991e559443a17d1b335f697551c6263ba60d5dd827David Greene                           isVolatile, isNonTemporal, Alignment);
900bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
901bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
902475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_TRUNCATE(SDNode *N) {
903475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
904786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), N->getValueType(0), Op);
905bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
906bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
907c08468774b65dc288c44076d428f4beddabe58e2Duncan SandsSDValue DAGTypeLegalizer::PromoteIntOp_UINT_TO_FP(SDNode *N) {
908c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands  return DAG.UpdateNodeOperands(SDValue(N, 0),
909c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands                                ZExtPromotedInteger(N->getOperand(0)));
910c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands}
911c08468774b65dc288c44076d428f4beddabe58e2Duncan Sands
912475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::PromoteIntOp_ZERO_EXTEND(SDNode *N) {
9134be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  DebugLoc dl = N->getDebugLoc();
914475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = GetPromotedInteger(N->getOperand(0));
9154be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  Op = DAG.getNode(ISD::ANY_EXTEND, dl, N->getValueType(0), Op);
9164be0bdf7c1162824927dd3de89e016ae4934d0d6Dale Johannesen  return DAG.getZeroExtendInReg(Op, dl, N->getOperand(0).getValueType());
917bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands}
918bf304c20651b80309af4c0fb3a14c0d73eaa984fDuncan Sands
91969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
92069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//===----------------------------------------------------------------------===//
92169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//  Integer Result Expansion
92269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//===----------------------------------------------------------------------===//
92369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
92469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands/// ExpandIntegerResult - This method is called when the specified result of the
925cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner/// specified node is found to need expansion.  At this point, the node may also
926cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner/// have invalid operands or may have other results that need promotion, we just
927cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner/// know that (at least) one result needs expansion.
92869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
929d765353da89988e949fd4c021d8860f36ab7c392David Greene  DEBUG(dbgs() << "Expand integer result: "; N->dump(&DAG); dbgs() << "\n");
930475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Lo, Hi;
931475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  Lo = Hi = SDValue();
932cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
933cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // See if the target wants to custom expand this node.
934f43071beddb7ed5b2fd7d2f06c4130460616a13dDuncan Sands  if (CustomLowerNode(N, N->getValueType(ResNo), true))
9351607f05cb7d77d01ce521a30232faa389dbed4e2Duncan Sands    return;
936cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
937cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  switch (N->getOpcode()) {
938cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  default:
939cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner#ifndef NDEBUG
940d765353da89988e949fd4c021d8860f36ab7c392David Greene    dbgs() << "ExpandIntegerResult #" << ResNo << ": ";
941d765353da89988e949fd4c021d8860f36ab7c392David Greene    N->dump(&DAG); dbgs() << "\n";
942cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner#endif
943c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Do not know how to expand the result of this operator!");
94469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
94578cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::MERGE_VALUES: SplitRes_MERGE_VALUES(N, Lo, Hi); break;
94678cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::SELECT:       SplitRes_SELECT(N, Lo, Hi); break;
94778cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::SELECT_CC:    SplitRes_SELECT_CC(N, Lo, Hi); break;
94878cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::UNDEF:        SplitRes_UNDEF(N, Lo, Hi); break;
94978cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
95078cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::BIT_CONVERT:        ExpandRes_BIT_CONVERT(N, Lo, Hi); break;
95178cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::BUILD_PAIR:         ExpandRes_BUILD_PAIR(N, Lo, Hi); break;
9524a307ecce68f90e0eebf1ded52b947816cdc2304Duncan Sands  case ISD::EXTRACT_ELEMENT:    ExpandRes_EXTRACT_ELEMENT(N, Lo, Hi); break;
95378cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  case ISD::EXTRACT_VECTOR_ELT: ExpandRes_EXTRACT_VECTOR_ELT(N, Lo, Hi); break;
95421c2972f7d24680f6475877a3398b7f8cf515b33Duncan Sands  case ISD::VAARG:              ExpandRes_VAARG(N, Lo, Hi); break;
95578cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
95669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::ANY_EXTEND:  ExpandIntRes_ANY_EXTEND(N, Lo, Hi); break;
95795db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  case ISD::AssertSext:  ExpandIntRes_AssertSext(N, Lo, Hi); break;
95869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::AssertZext:  ExpandIntRes_AssertZext(N, Lo, Hi); break;
95905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::BSWAP:       ExpandIntRes_BSWAP(N, Lo, Hi); break;
96005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::Constant:    ExpandIntRes_Constant(N, Lo, Hi); break;
96105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::CTLZ:        ExpandIntRes_CTLZ(N, Lo, Hi); break;
96205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::CTPOP:       ExpandIntRes_CTPOP(N, Lo, Hi); break;
96305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::CTTZ:        ExpandIntRes_CTTZ(N, Lo, Hi); break;
96469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::FP_TO_SINT:  ExpandIntRes_FP_TO_SINT(N, Lo, Hi); break;
96569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::FP_TO_UINT:  ExpandIntRes_FP_TO_UINT(N, Lo, Hi); break;
96669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  case ISD::LOAD:        ExpandIntRes_LOAD(cast<LoadSDNode>(N), Lo, Hi); break;
96705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::MUL:         ExpandIntRes_MUL(N, Lo, Hi); break;
96805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SDIV:        ExpandIntRes_SDIV(N, Lo, Hi); break;
96905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SIGN_EXTEND: ExpandIntRes_SIGN_EXTEND(N, Lo, Hi); break;
97005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SIGN_EXTEND_INREG: ExpandIntRes_SIGN_EXTEND_INREG(N, Lo, Hi); break;
97105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SREM:        ExpandIntRes_SREM(N, Lo, Hi); break;
97205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::TRUNCATE:    ExpandIntRes_TRUNCATE(N, Lo, Hi); break;
97305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::UDIV:        ExpandIntRes_UDIV(N, Lo, Hi); break;
97405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::UREM:        ExpandIntRes_UREM(N, Lo, Hi); break;
97505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::ZERO_EXTEND: ExpandIntRes_ZERO_EXTEND(N, Lo, Hi); break;
97669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
977cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::AND:
978cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::OR:
97905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::XOR: ExpandIntRes_Logical(N, Lo, Hi); break;
98005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
981cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::ADD:
98205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SUB: ExpandIntRes_ADDSUB(N, Lo, Hi); break;
98305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
984cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::ADDC:
98505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SUBC: ExpandIntRes_ADDSUBC(N, Lo, Hi); break;
98605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
987cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::ADDE:
98805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SUBE: ExpandIntRes_ADDSUBE(N, Lo, Hi); break;
98905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
990cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SHL:
991cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SRA:
99205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  case ISD::SRL: ExpandIntRes_Shift(N, Lo, Hi); break;
993268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
994268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  case ISD::SADDO:
995268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  case ISD::SSUBO: ExpandIntRes_SADDSUBO(N, Lo, Hi); break;
996268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  case ISD::UADDO:
997268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  case ISD::USUBO: ExpandIntRes_UADDSUBO(N, Lo, Hi); break;
998cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
999d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
1000cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If Lo/Hi is null, the sub-method took care of registering results etc.
1001ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (Lo.getNode())
1002475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SetExpandedInteger(SDValue(N, ResNo), Lo, Hi);
1003cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1004cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
100505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// ExpandShiftByConstant - N is a shift by a value that needs to be expanded,
100605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// and the shift amount is a constant 'Amt'.  Expand the operation.
100705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandShiftByConstant(SDNode *N, unsigned Amt,
1008475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                             SDValue &Lo, SDValue &Hi) {
1009786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
101005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the incoming operand to be shifted, so that we have its parts
1011475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InL, InH;
101205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), InL, InH);
1013cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1014e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = InL.getValueType();
101505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned VTBits = N->getValueType(0).getSizeInBits();
101605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned NVTBits = NVT.getSizeInBits();
1017e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT ShTy = N->getOperand(1).getValueType();
1018cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
101905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (N->getOpcode() == ISD::SHL) {
102005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    if (Amt > VTBits) {
102105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = Hi = DAG.getConstant(0, NVT);
102205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt > NVTBits) {
102305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);
10247fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      Hi = DAG.getNode(ISD::SHL, dl,
1025786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       NVT, InL, DAG.getConstant(Amt-NVTBits,ShTy));
102605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt == NVTBits) {
102705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);
102805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = InL;
1029104de6cf7b80ec5e9beb502a069f376810a0a1e3Richard Osborne    } else if (Amt == 1 &&
1030f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman               TLI.isOperationLegalOrCustom(ISD::ADDC,
1031bc7a902713c4e3f13a93c383e647d2a18712f447Dan Gohman                                            TLI.getTypeToExpandTo(*DAG.getContext(), NVT))) {
103205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      // Emit this X << 1 as X+X.
1033825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson      SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
1034475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue LoOps[2] = { InL, InL };
1035786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2);
1036475871a144eb604ddaf37503397ba0941442e5fbDan Gohman      SDValue HiOps[3] = { InH, InH, Lo.getValue(1) };
1037786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3);
103805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else {
1039786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SHL, dl, NVT, InL, DAG.getConstant(Amt, ShTy));
1040786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::OR, dl, NVT,
1041786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SHL, dl, NVT, InH,
104205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(Amt, ShTy)),
1043786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SRL, dl, NVT, InL,
104405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(NVTBits-Amt, ShTy)));
104505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
104605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return;
1047cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
1048cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
104905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (N->getOpcode() == ISD::SRL) {
105005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    if (Amt > VTBits) {
105105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);
105205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);
105305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt > NVTBits) {
10547fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      Lo = DAG.getNode(ISD::SRL, dl,
1055786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       NVT, InH, DAG.getConstant(Amt-NVTBits,ShTy));
105605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);
105705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else if (Amt == NVTBits) {
105805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = InH;
105905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);
106005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    } else {
1061786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::OR, dl, NVT,
1062786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SRL, dl, NVT, InL,
106305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(Amt, ShTy)),
1064786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SHL, dl, NVT, InH,
106505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                   DAG.getConstant(NVTBits-Amt, ShTy)));
1066786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SRL, dl, NVT, InH, DAG.getConstant(Amt, ShTy));
106705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
106805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return;
1069cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
1070d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands
107105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
107205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Amt > VTBits) {
1073786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = Lo = DAG.getNode(ISD::SRA, dl, NVT, InH,
107405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                          DAG.getConstant(NVTBits-1, ShTy));
107505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else if (Amt > NVTBits) {
1076786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SRA, dl, NVT, InH,
107705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(Amt-NVTBits, ShTy));
1078786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, InH,
107905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(NVTBits-1, ShTy));
108005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else if (Amt == NVTBits) {
108105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Lo = InH;
1082786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, InH,
108305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(NVTBits-1, ShTy));
1084d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands  } else {
1085de06470330260f5937e7ca558f5f5b3e171f2ee5Dale Johannesen    Lo = DAG.getNode(ISD::OR, dl, NVT,
1086786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     DAG.getNode(ISD::SRL, dl, NVT, InL,
108705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 DAG.getConstant(Amt, ShTy)),
1088786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                     DAG.getNode(ISD::SHL, dl, NVT, InH,
108905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 DAG.getConstant(NVTBits-Amt, ShTy)));
1090786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, InH, DAG.getConstant(Amt, ShTy));
1091d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands  }
1092d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands}
1093d885dbdf9eb7a51ebb9a15a85921f27d8219997cDuncan Sands
109405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// ExpandShiftWithKnownAmountBit - Try to determine whether we can simplify
109505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// this shift based on knowledge of the high bit of the shift amount.  If we
109605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// can tell this, we know that it is >= 32 or < 32, without knowing the actual
109705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// shift amount.
109805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsbool DAGTypeLegalizer::
1099475871a144eb604ddaf37503397ba0941442e5fbDan GohmanExpandShiftWithKnownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
1100475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Amt = N->getOperand(1);
110123b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1102e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT ShTy = Amt.getValueType();
11035b870aff81da0c07413f0241087bb3722954b83dDan Gohman  unsigned ShBits = ShTy.getScalarType().getSizeInBits();
11045b870aff81da0c07413f0241087bb3722954b83dDan Gohman  unsigned NVTBits = NVT.getScalarType().getSizeInBits();
110505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(isPowerOf2_32(NVTBits) &&
110605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Expanded integer type size not a power of two!");
1107786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1108cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
110905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  APInt HighBitMask = APInt::getHighBitsSet(ShBits, ShBits - Log2_32(NVTBits));
111005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  APInt KnownZero, KnownOne;
111105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  DAG.ComputeMaskedBits(N->getOperand(1), HighBitMask, KnownZero, KnownOne);
1112cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
111305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If we don't know anything about the high bits, exit.
111405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (((KnownZero|KnownOne) & HighBitMask) == 0)
111505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return false;
1116cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
111705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Get the incoming operand to be shifted.
1118475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InL, InH;
111905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), InL, InH);
1120be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands
112105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If we know that any of the high bits of the shift amount are one, then we
112205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // can do this as a couple of simple shifts.
112305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (KnownOne.intersects(HighBitMask)) {
112405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Mask out the high bit, which we know is set.
1125786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Amt = DAG.getNode(ISD::AND, dl, ShTy, Amt,
112605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                      DAG.getConstant(~HighBitMask, ShTy));
112705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
112805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    switch (N->getOpcode()) {
1129c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Unknown shift");
113005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SHL:
113105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Lo = DAG.getConstant(0, NVT);              // Low part is zero.
1132786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt); // High part from Lo part.
113305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      return true;
113405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRL:
113505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Hi = DAG.getConstant(0, NVT);              // Hi part is zero.
1136786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt); // Lo part from Hi part.
113705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      return true;
113805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRA:
1139786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SRA, dl, NVT, InH,       // Sign extend high part.
114005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                       DAG.getConstant(NVTBits-1, ShTy));
1141786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt); // Lo part from Hi part.
114205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      return true;
114305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
114405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
114505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
114628dc98f7521933872b93156e3ebf5c9f8327b2b3Eli Friedman#if 0
114728dc98f7521933872b93156e3ebf5c9f8327b2b3Eli Friedman  // FIXME: This code is broken for shifts with a zero amount!
114805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If we know that all of the high bits of the shift amount are zero, then we
114905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // can do this as a couple of simple shifts.
115005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if ((KnownZero & HighBitMask) == HighBitMask) {
115105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Compute 32-amt.
1152475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Amt2 = DAG.getNode(ISD::SUB, ShTy,
115305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 DAG.getConstant(NVTBits, ShTy),
115405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                 Amt);
115505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned Op1, Op2;
115605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    switch (N->getOpcode()) {
1157c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    default: llvm_unreachable("Unknown shift");
115805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SHL:  Op1 = ISD::SHL; Op2 = ISD::SRL; break;
115905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRL:
116005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    case ISD::SRA:  Op1 = ISD::SRL; Op2 = ISD::SHL; break;
116105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    }
116205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
116305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Lo = DAG.getNode(N->getOpcode(), NVT, InL, Amt);
116405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Hi = DAG.getNode(ISD::OR, NVT,
116505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getNode(Op1, NVT, InH, Amt),
116605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getNode(Op2, NVT, InL, Amt2));
116705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return true;
116805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
116928dc98f7521933872b93156e3ebf5c9f8327b2b3Eli Friedman#endif
117005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
117105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  return false;
117205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
117305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
11746fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng/// ExpandShiftWithUnknownAmountBit - Fully general expansion of integer shift
11756fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng/// of any size.
11766fb2168aaed06e4685d064b6f63dc4c668b42728Evan Chengbool DAGTypeLegalizer::
11776fb2168aaed06e4685d064b6f63dc4c668b42728Evan ChengExpandShiftWithUnknownAmountBit(SDNode *N, SDValue &Lo, SDValue &Hi) {
11786fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  SDValue Amt = N->getOperand(1);
117923b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1180e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT ShTy = Amt.getValueType();
11816fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  unsigned NVTBits = NVT.getSizeInBits();
11826fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  assert(isPowerOf2_32(NVTBits) &&
11836fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng         "Expanded integer type size not a power of two!");
11846fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  DebugLoc dl = N->getDebugLoc();
11856fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng
11866fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  // Get the incoming operand to be shifted.
11876fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  SDValue InL, InH;
11886fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  GetExpandedInteger(N->getOperand(0), InL, InH);
11896fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng
11906fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  SDValue NVBitsNode = DAG.getConstant(NVTBits, ShTy);
11919993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands  SDValue AmtExcess = DAG.getNode(ISD::SUB, dl, ShTy, Amt, NVBitsNode);
11929993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands  SDValue AmtLack = DAG.getNode(ISD::SUB, dl, ShTy, NVBitsNode, Amt);
11939993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands  SDValue isShort = DAG.getSetCC(dl, TLI.getSetCCResultType(ShTy),
11949993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands                                 Amt, NVBitsNode, ISD::SETULT);
11956fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng
11969993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands  SDValue LoS, HiS, LoL, HiL;
11976fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  switch (N->getOpcode()) {
1198c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown shift");
11996fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  case ISD::SHL:
12009993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    // Short: ShAmt < NVTBits
12019993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    LoS = DAG.getNode(ISD::SHL, dl, NVT, InL, Amt);
12029993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    HiS = DAG.getNode(ISD::OR, dl, NVT,
12036fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng                      DAG.getNode(ISD::SHL, dl, NVT, InH, Amt),
120436236b76a45be2a50315d1926c49bd3c63786b49Duncan Sands    // FIXME: If Amt is zero, the following shift generates an undefined result
120536236b76a45be2a50315d1926c49bd3c63786b49Duncan Sands    // on some architectures.
12069993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands                      DAG.getNode(ISD::SRL, dl, NVT, InL, AmtLack));
12079993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands
12089993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    // Long: ShAmt >= NVTBits
12099993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    LoL = DAG.getConstant(0, NVT);                        // Lo part is zero.
12109993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    HiL = DAG.getNode(ISD::SHL, dl, NVT, InL, AmtExcess); // Hi from Lo part.
12116fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng
12129993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    Lo = DAG.getNode(ISD::SELECT, dl, NVT, isShort, LoS, LoL);
12139993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    Hi = DAG.getNode(ISD::SELECT, dl, NVT, isShort, HiS, HiL);
12146fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng    return true;
12156fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  case ISD::SRL:
12169993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    // Short: ShAmt < NVTBits
12179993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    HiS = DAG.getNode(ISD::SRL, dl, NVT, InH, Amt);
12189993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    LoS = DAG.getNode(ISD::OR, dl, NVT,
12199993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands                      DAG.getNode(ISD::SRL, dl, NVT, InL, Amt),
122036236b76a45be2a50315d1926c49bd3c63786b49Duncan Sands    // FIXME: If Amt is zero, the following shift generates an undefined result
122136236b76a45be2a50315d1926c49bd3c63786b49Duncan Sands    // on some architectures.
12229993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands                      DAG.getNode(ISD::SHL, dl, NVT, InH, AmtLack));
12239993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands
12249993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    // Long: ShAmt >= NVTBits
12259993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    HiL = DAG.getConstant(0, NVT);                        // Hi part is zero.
12269993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    LoL = DAG.getNode(ISD::SRL, dl, NVT, InH, AmtExcess); // Lo from Hi part.
12279993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands
12289993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    Lo = DAG.getNode(ISD::SELECT, dl, NVT, isShort, LoS, LoL);
12299993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    Hi = DAG.getNode(ISD::SELECT, dl, NVT, isShort, HiS, HiL);
12306fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng    return true;
12316fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  case ISD::SRA:
12329993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    // Short: ShAmt < NVTBits
12339993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    HiS = DAG.getNode(ISD::SRA, dl, NVT, InH, Amt);
12349993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    LoS = DAG.getNode(ISD::OR, dl, NVT,
12356fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng                      DAG.getNode(ISD::SRL, dl, NVT, InL, Amt),
123636236b76a45be2a50315d1926c49bd3c63786b49Duncan Sands    // FIXME: If Amt is zero, the following shift generates an undefined result
123736236b76a45be2a50315d1926c49bd3c63786b49Duncan Sands    // on some architectures.
12389993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands                      DAG.getNode(ISD::SHL, dl, NVT, InH, AmtLack));
12399993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands
12409993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    // Long: ShAmt >= NVTBits
12419993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    HiL = DAG.getNode(ISD::SRA, dl, NVT, InH,             // Sign of Hi part.
12429993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands                      DAG.getConstant(NVTBits-1, ShTy));
12439993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    LoL = DAG.getNode(ISD::SRA, dl, NVT, InH, AmtExcess); // Lo from Hi part.
12446fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng
12459993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    Lo = DAG.getNode(ISD::SELECT, dl, NVT, isShort, LoS, LoL);
12469993b88f06fd54c0be31d35f0970ada70a4c0439Duncan Sands    Hi = DAG.getNode(ISD::SELECT, dl, NVT, isShort, HiS, HiL);
12476fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng    return true;
12486fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  }
12496fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng
12506fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  return false;
12516fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng}
12526fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng
125305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ADDSUB(SDNode *N,
1254475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                           SDValue &Lo, SDValue &Hi) {
1255786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
125605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the subcomponents.
1257475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSL, LHSH, RHSL, RHSH;
125805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
125905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
126029a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands
1261e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = LHSL.getValueType();
1262475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LoOps[2] = { LHSL, RHSL };
1263475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue HiOps[3] = { LHSH, RHSH };
126405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
126529a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // Do not generate ADDC/ADDE or SUBC/SUBE if the target does not support
126629a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // them.  TODO: Teach operation legalization how to expand unsupported
126729a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // ADDC/ADDE/SUBC/SUBE.  The problem is that these operations generate
1268825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  // a carry of type MVT::Flag, but there doesn't seem to be any way to
126929a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  // generate a value of this type in the expanded code sequence.
127029a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  bool hasCarry =
1271f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman    TLI.isOperationLegalOrCustom(N->getOpcode() == ISD::ADD ?
1272f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman                                   ISD::ADDC : ISD::SUBC,
1273bc7a902713c4e3f13a93c383e647d2a18712f447Dan Gohman                                 TLI.getTypeToExpandTo(*DAG.getContext(), NVT));
127429a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands
127529a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands  if (hasCarry) {
1276825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    SDVTList VTList = DAG.getVTList(NVT, MVT::Flag);
127729a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    if (N->getOpcode() == ISD::ADD) {
1278786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2);
127929a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands      HiOps[2] = Lo.getValue(1);
1280786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3);
128129a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    } else {
1282786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps, 2);
128329a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands      HiOps[2] = Lo.getValue(1);
1284786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps, 3);
128529a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    }
128605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
128729a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    if (N->getOpcode() == ISD::ADD) {
1288786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::ADD, dl, NVT, LoOps, 2);
1289786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, HiOps, 2);
1290786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Cmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Lo, LoOps[0],
129129a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                  ISD::SETULT);
1292786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Carry1 = DAG.getNode(ISD::SELECT, dl, NVT, Cmp1,
129329a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(1, NVT),
129429a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(0, NVT));
1295786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Cmp2 = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Lo, LoOps[1],
129629a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                  ISD::SETULT);
1297786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Carry2 = DAG.getNode(ISD::SELECT, dl, NVT, Cmp2,
129829a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(1, NVT), Carry1);
1299786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, Carry2);
130029a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    } else {
1301786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::SUB, dl, NVT, LoOps, 2);
1302786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SUB, dl, NVT, HiOps, 2);
13035480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands      SDValue Cmp =
1304f8d3ec2c5725a2010f11de4ba78f6127712a5fe7Dale Johannesen        DAG.getSetCC(dl, TLI.getSetCCResultType(LoOps[0].getValueType()),
13055480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                     LoOps[0], LoOps[1], ISD::SETULT);
1306786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue Borrow = DAG.getNode(ISD::SELECT, dl, NVT, Cmp,
130729a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(1, NVT),
130829a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands                                   DAG.getConstant(0, NVT));
1309786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SUB, dl, NVT, Hi, Borrow);
131029a2822f287275a0d4df49f98104409d8f97c5dfDuncan Sands    }
131105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
131205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
131305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
131405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ADDSUBC(SDNode *N,
1315475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                            SDValue &Lo, SDValue &Hi) {
131605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the subcomponents.
1317475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSL, LHSH, RHSL, RHSH;
1318786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
131905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
132005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1321825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag);
1322475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LoOps[2] = { LHSL, RHSL };
1323475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue HiOps[3] = { LHSH, RHSH };
132405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
132505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (N->getOpcode() == ISD::ADDC) {
1326786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::ADDC, dl, VTList, LoOps, 2);
132705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    HiOps[2] = Lo.getValue(1);
1328786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::ADDE, dl, VTList, HiOps, 3);
132905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
1330786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SUBC, dl, VTList, LoOps, 2);
133105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    HiOps[2] = Lo.getValue(1);
1332786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SUBE, dl, VTList, HiOps, 3);
133305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
133405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1335874ae251c317788391f9c3f113957802d390a063Dale Johannesen  // Legalized the flag result - switch anything that used the old flag to
1336874ae251c317788391f9c3f113957802d390a063Dale Johannesen  // use the new one.
1337475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
133805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
133905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
134005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ADDSUBE(SDNode *N,
1341475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                            SDValue &Lo, SDValue &Hi) {
134205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Expand the subcomponents.
1343475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSL, LHSH, RHSL, RHSH;
1344786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
134505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
134605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(1), RHSL, RHSH);
1347825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  SDVTList VTList = DAG.getVTList(LHSL.getValueType(), MVT::Flag);
1348475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LoOps[3] = { LHSL, RHSL, N->getOperand(2) };
1349475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue HiOps[3] = { LHSH, RHSH };
135005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1351786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(N->getOpcode(), dl, VTList, LoOps, 3);
135205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  HiOps[2] = Lo.getValue(1);
1353786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(N->getOpcode(), dl, VTList, HiOps, 3);
135405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1355874ae251c317788391f9c3f113957802d390a063Dale Johannesen  // Legalized the flag result - switch anything that used the old flag to
1356874ae251c317788391f9c3f113957802d390a063Dale Johannesen  // use the new one.
1357475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
135805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
135905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
136005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ANY_EXTEND(SDNode *N,
1361475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Lo, SDValue &Hi) {
136223b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1363786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1364475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
136505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Op.getValueType().bitsLE(NVT)) {
136605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The low part is any extension of the input (which degenerates to a copy).
1367786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::ANY_EXTEND, dl, NVT, Op);
1368e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen    Hi = DAG.getUNDEF(NVT);   // The high part is undefined.
136905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
137005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  The operand type necessarily
137105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // promotes to the result type, so will end up being expanded too.
137205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
137305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Only know how to promote this result!");
1374475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(Op);
137505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(Res.getValueType() == N->getValueType(0) &&
137605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Operand over promoted?");
137705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Split the promoted operand.  This will simplify when it is expanded.
137805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SplitInteger(Res, Lo, Hi);
137905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
138005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
138105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
138295db39a9de48f69f4d764335b492b83a698c7854Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_AssertSext(SDNode *N,
1383475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Lo, SDValue &Hi) {
1384786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
138595db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1386e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Lo.getValueType();
1387e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
138895db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  unsigned NVTBits = NVT.getSizeInBits();
138995db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  unsigned EVTBits = EVT.getSizeInBits();
139095db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
139195db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  if (NVTBits < EVTBits) {
1392786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::AssertSext, dl, NVT, Hi,
13934ff28527bb8e5ed4ae4b65f0fa6967eb79a05d4cEvan Cheng                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(),
13944ff28527bb8e5ed4ae4b65f0fa6967eb79a05d4cEvan Cheng                                                        EVTBits - NVTBits)));
139595db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  } else {
1396786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::AssertSext, dl, NVT, Lo, DAG.getValueType(EVT));
139795db39a9de48f69f4d764335b492b83a698c7854Duncan Sands    // The high part replicates the sign bit of Lo, make it explicit.
1398786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
139992abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                     DAG.getConstant(NVTBits-1, TLI.getPointerTy()));
140095db39a9de48f69f4d764335b492b83a698c7854Duncan Sands  }
140195db39a9de48f69f4d764335b492b83a698c7854Duncan Sands}
140295db39a9de48f69f4d764335b492b83a698c7854Duncan Sands
140305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_AssertZext(SDNode *N,
1404475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Lo, SDValue &Hi) {
1405786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
140605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1407e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Lo.getValueType();
1408e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
140905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned NVTBits = NVT.getSizeInBits();
141005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned EVTBits = EVT.getSizeInBits();
141105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
141205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (NVTBits < EVTBits) {
1413786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::AssertZext, dl, NVT, Hi,
1414285fb1cc4a7ea924b4d94e9c2cb890125d56a7e0Evan Cheng                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(),
1415285fb1cc4a7ea924b4d94e9c2cb890125d56a7e0Evan Cheng                                                        EVTBits - NVTBits)));
141605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
1417786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::AssertZext, dl, NVT, Lo, DAG.getValueType(EVT));
141805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The high part must be zero, make it explicit.
141905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Hi = DAG.getConstant(0, NVT);
142005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
142105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
142205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
142305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_BSWAP(SDNode *N,
1424475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                          SDValue &Lo, SDValue &Hi) {
1425786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
142605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Hi, Lo);  // Note swapped operands.
1427786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::BSWAP, dl, Lo.getValueType(), Lo);
1428786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::BSWAP, dl, Hi.getValueType(), Hi);
142905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
143005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
143105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_Constant(SDNode *N,
1432475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                             SDValue &Lo, SDValue &Hi) {
143323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
143405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  unsigned NBitWidth = NVT.getSizeInBits();
143505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  const APInt &Cst = cast<ConstantSDNode>(N)->getAPIntValue();
143605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Lo = DAG.getConstant(APInt(Cst).trunc(NBitWidth), NVT);
143705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(Cst.lshr(NBitWidth).trunc(NBitWidth), NVT);
143805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
143905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
144005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_CTLZ(SDNode *N,
1441475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1442786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
144305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // ctlz (HiLo) -> Hi != 0 ? ctlz(Hi) : (ctlz(Lo)+32)
144405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1445e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Lo.getValueType();
144605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1447786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue HiNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Hi,
1448ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                   DAG.getConstant(0, NVT), ISD::SETNE);
144905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1450786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue LoLZ = DAG.getNode(ISD::CTLZ, dl, NVT, Lo);
1451786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue HiLZ = DAG.getNode(ISD::CTLZ, dl, NVT, Hi);
145205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1453786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::SELECT, dl, NVT, HiNotZero, HiLZ,
1454786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   DAG.getNode(ISD::ADD, dl, NVT, LoLZ,
145505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                               DAG.getConstant(NVT.getSizeInBits(), NVT)));
145605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(0, NVT);
145705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
145805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
145905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_CTPOP(SDNode *N,
1460475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                          SDValue &Lo, SDValue &Hi) {
1461786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
146205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // ctpop(HiLo) -> ctpop(Hi)+ctpop(Lo)
146305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1464e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Lo.getValueType();
1465b300d2aa3ef08b5074449e2c05804717f488f4e4Dale Johannesen  Lo = DAG.getNode(ISD::ADD, dl, NVT, DAG.getNode(ISD::CTPOP, dl, NVT, Lo),
1466786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   DAG.getNode(ISD::CTPOP, dl, NVT, Hi));
146705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(0, NVT);
146805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
146905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
147005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_CTTZ(SDNode *N,
1471475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1472786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
147305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // cttz (HiLo) -> Lo != 0 ? cttz(Lo) : (cttz(Hi)+32)
147405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1475e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT NVT = Lo.getValueType();
147605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1477786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue LoNotZero = DAG.getSetCC(dl, TLI.getSetCCResultType(NVT), Lo,
1478ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                   DAG.getConstant(0, NVT), ISD::SETNE);
147905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1480786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue LoLZ = DAG.getNode(ISD::CTTZ, dl, NVT, Lo);
1481786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  SDValue HiLZ = DAG.getNode(ISD::CTTZ, dl, NVT, Hi);
148205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1483786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::SELECT, dl, NVT, LoNotZero, LoLZ,
1484786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   DAG.getNode(ISD::ADD, dl, NVT, HiLZ,
148505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                               DAG.getConstant(NVT.getSizeInBits(), NVT)));
148605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  Hi = DAG.getConstant(0, NVT);
148705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
148805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1489475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::ExpandIntRes_FP_TO_SINT(SDNode *N, SDValue &Lo,
1490475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Hi) {
1491c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1492e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
1493475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
1494b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getFPTOSINT(Op.getValueType(), VT);
1495be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-sint conversion!");
1496c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, &Op, 1, true/*irrelevant*/, dl), Lo, Hi);
1497ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands}
1498ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands
1499475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::ExpandIntRes_FP_TO_UINT(SDNode *N, SDValue &Lo,
1500475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                               SDValue &Hi) {
1501c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1502e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
1503475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
1504b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getFPTOUINT(Op.getValueType(), VT);
1505be1ad4de2900451626c8d4ace07b9ea16099ea1dDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unexpected fp-to-uint conversion!");
1506c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, &Op, 1, false/*irrelevant*/, dl), Lo, Hi);
1507ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands}
1508ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands
150969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_LOAD(LoadSDNode *N,
1510475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1511ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands  if (ISD::isNormalLoad(N)) {
1512ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands    ExpandRes_NormalLoad(N, Lo, Hi);
151378cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands    return;
151478cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  }
151578cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
151678cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  assert(ISD::isUNINDEXEDLoad(N) && "Indexed load during type legalization!");
151778cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
1518e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
151923b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
1520475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ch  = N->getChain();
1521475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ptr = N->getBasePtr();
1522cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  ISD::LoadExtType ExtType = N->getExtensionType();
1523cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  int SVOffset = N->getSrcValueOffset();
1524cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  unsigned Alignment = N->getAlignment();
1525cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  bool isVolatile = N->isVolatile();
15261e559443a17d1b335f697551c6263ba60d5dd827David Greene  bool isNonTemporal = N->isNonTemporal();
1527786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1528cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
152978cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  assert(NVT.isByteSized() && "Expanded type not byte sized!");
1530cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
153178cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  if (N->getMemoryVT().bitsLE(NVT)) {
15328a55ce4a392f07ac1f3c183100ac591b7ad7c693Dan Gohman    EVT MemVT = N->getMemoryVT();
1533cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1534786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
15351e559443a17d1b335f697551c6263ba60d5dd827David Greene                        MemVT, isVolatile, isNonTemporal, Alignment);
1536cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1537cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Remember the chain.
1538cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    Ch = Lo.getValue(1);
1539cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1540cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    if (ExtType == ISD::SEXTLOAD) {
1541cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The high part is obtained by SRA'ing all but one of the bits of the
1542cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // lo part.
154383ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      unsigned LoSize = Lo.getValueType().getSizeInBits();
1544786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
154592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                       DAG.getConstant(LoSize-1, TLI.getPointerTy()));
1546cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    } else if (ExtType == ISD::ZEXTLOAD) {
1547cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The high part is just a zero.
1548cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Hi = DAG.getConstant(0, NVT);
1549cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    } else {
1550cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      assert(ExtType == ISD::EXTLOAD && "Unknown extload!");
1551cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The high part is undefined.
1552e8d7230f480654cdb8ff1c3d0a38e1e9ab0bd55fDale Johannesen      Hi = DAG.getUNDEF(NVT);
1553cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1554cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else if (TLI.isLittleEndian()) {
1555cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Little-endian - low bits are at low addresses.
1556786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getLoad(NVT, dl, Ch, Ptr, N->getSrcValue(), SVOffset,
15571e559443a17d1b335f697551c6263ba60d5dd827David Greene                     isVolatile, isNonTemporal, Alignment);
1558cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1559cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits =
156083ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
156123b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson    EVT NEVT = EVT::getIntegerVT(*DAG.getContext(), ExcessBits);
1562cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1563cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
156483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
1565786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
15660bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
1567786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(),
1568cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                        SVOffset+IncrementSize, NEVT,
15691e559443a17d1b335f697551c6263ba60d5dd827David Greene                        isVolatile, isNonTemporal,
15701e559443a17d1b335f697551c6263ba60d5dd827David Greene                        MinAlign(Alignment, IncrementSize));
1571cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1572cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Build a factor node to remember that this load is independent of the
1573cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // other one.
1574825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
1575cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                     Hi.getValue(1));
1576cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else {
1577cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Big-endian - high bits are at low addresses.  Favor aligned loads at
1578cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // the cost of some bit-fiddling.
15798a55ce4a392f07ac1f3c183100ac591b7ad7c693Dan Gohman    EVT MemVT = N->getMemoryVT();
15804e918b2c8ca81edd63f6708e08835b2c14648615Dan Gohman    unsigned EBytes = MemVT.getStoreSize();
158183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
1582cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits = (EBytes - IncrementSize)*8;
1583cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1584cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Load both the high bits and maybe some of the low bits.
1585786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getExtLoad(ExtType, dl, NVT, Ch, Ptr, N->getSrcValue(), SVOffset,
15868a55ce4a392f07ac1f3c183100ac591b7ad7c693Dan Gohman                        EVT::getIntegerVT(*DAG.getContext(),
15878a55ce4a392f07ac1f3c183100ac591b7ad7c693Dan Gohman                                          MemVT.getSizeInBits() - ExcessBits),
15881e559443a17d1b335f697551c6263ba60d5dd827David Greene                        isVolatile, isNonTemporal, Alignment);
1589cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1590cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
1591786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
15920bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
1593cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Load the rest of the low bits.
1594786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getExtLoad(ISD::ZEXTLOAD, dl, NVT, Ch, Ptr, N->getSrcValue(),
159583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                        SVOffset+IncrementSize,
159623b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson                        EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
15971e559443a17d1b335f697551c6263ba60d5dd827David Greene                        isVolatile, isNonTemporal,
15981e559443a17d1b335f697551c6263ba60d5dd827David Greene                        MinAlign(Alignment, IncrementSize));
1599cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1600cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Build a factor node to remember that this load is independent of the
1601cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // other one.
1602825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    Ch = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
1603cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                     Hi.getValue(1));
1604cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
160583ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    if (ExcessBits < NVT.getSizeInBits()) {
1606cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Transfer low bits from the bottom of Hi to the top of Lo.
1607786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::OR, dl, NVT, Lo,
1608786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       DAG.getNode(ISD::SHL, dl, NVT, Hi,
1609cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                                   DAG.getConstant(ExcessBits,
161092abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                                   TLI.getPointerTy())));
1611cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Move high bits to the right position in Hi.
16127fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands      Hi = DAG.getNode(ExtType == ISD::SEXTLOAD ? ISD::SRA : ISD::SRL, dl,
1613786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       NVT, Hi,
161483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
161592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                       TLI.getPointerTy()));
1616cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1617cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
1618cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1619cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Legalized the chain result - switch anything that used the old chain to
1620cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // use the new one.
1621475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 1), Ch);
1622cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1623cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
162469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_Logical(SDNode *N,
1625475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                            SDValue &Lo, SDValue &Hi) {
1626786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1627475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LL, LH, RL, RH;
162869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(N->getOperand(0), LL, LH);
162969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(N->getOperand(1), RL, RH);
1630786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LL, RL);
1631786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), LH, RH);
1632cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
1633cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
163405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_MUL(SDNode *N,
1635475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                        SDValue &Lo, SDValue &Hi) {
1636e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
163723b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
1638c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
163969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1640f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasMULHS = TLI.isOperationLegalOrCustom(ISD::MULHS, NVT);
1641f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasMULHU = TLI.isOperationLegalOrCustom(ISD::MULHU, NVT);
1642f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasSMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::SMUL_LOHI, NVT);
1643f560ffae1f1f6591859c7b70636a3eca6c03f083Dan Gohman  bool HasUMUL_LOHI = TLI.isOperationLegalOrCustom(ISD::UMUL_LOHI, NVT);
1644cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (HasMULHU || HasMULHS || HasUMUL_LOHI || HasSMUL_LOHI) {
1645475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LL, LH, RL, RH;
164669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getOperand(0), LL, LH);
164769b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getOperand(1), RL, RH);
164883ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned OuterBitSize = VT.getSizeInBits();
1649e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    unsigned InnerBitSize = NVT.getSizeInBits();
1650cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned LHSSB = DAG.ComputeNumSignBits(N->getOperand(0));
1651cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned RHSSB = DAG.ComputeNumSignBits(N->getOperand(1));
165269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1653e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    APInt HighMask = APInt::getHighBitsSet(OuterBitSize, InnerBitSize);
1654e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    if (DAG.MaskedValueIsZero(N->getOperand(0), HighMask) &&
1655e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands        DAG.MaskedValueIsZero(N->getOperand(1), HighMask)) {
1656cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The inputs are both zero-extended.
1657cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasUMUL_LOHI) {
1658cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a umul_lohi.
1659786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::UMUL_LOHI, dl, DAG.getVTList(NVT, NVT), LL, RL);
1660ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif        Hi = SDValue(Lo.getNode(), 1);
1661cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1662cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1663cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasMULHU) {
1664cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a mulhu+mul.
1665786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL);
1666786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Hi = DAG.getNode(ISD::MULHU, dl, NVT, LL, RL);
1667cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1668cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1669cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1670e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    if (LHSSB > InnerBitSize && RHSSB > InnerBitSize) {
1671cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // The input values are both sign-extended.
1672cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasSMUL_LOHI) {
1673cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a smul_lohi.
1674786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::SMUL_LOHI, dl, DAG.getVTList(NVT, NVT), LL, RL);
1675ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif        Hi = SDValue(Lo.getNode(), 1);
1676cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1677cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1678cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      if (HasMULHS) {
1679cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        // We can emit a mulhs+mul.
1680786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL);
1681786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen        Hi = DAG.getNode(ISD::MULHS, dl, NVT, LL, RL);
1682cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        return;
1683cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      }
1684cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1685cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    if (HasUMUL_LOHI) {
1686cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Lo,Hi = umul LHS, RHS.
1687786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      SDValue UMulLOHI = DAG.getNode(ISD::UMUL_LOHI, dl,
1688cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                                       DAG.getVTList(NVT, NVT), LL, RL);
1689cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Lo = UMulLOHI;
1690cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Hi = UMulLOHI.getValue(1);
1691786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      RH = DAG.getNode(ISD::MUL, dl, NVT, LL, RH);
1692786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      LH = DAG.getNode(ISD::MUL, dl, NVT, LH, RL);
1693786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, RH);
1694786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, LH);
1695cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      return;
1696cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
1697e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    if (HasMULHU) {
1698786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Lo = DAG.getNode(ISD::MUL, dl, NVT, LL, RL);
1699786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::MULHU, dl, NVT, LL, RL);
1700786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      RH = DAG.getNode(ISD::MUL, dl, NVT, LL, RH);
1701786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      LH = DAG.getNode(ISD::MUL, dl, NVT, LH, RL);
1702786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, RH);
1703786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::ADD, dl, NVT, Hi, LH);
1704e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands      return;
1705e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    }
1706cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
170741edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
1708cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If nothing else, we can make a libcall.
17095ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1710825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (VT == MVT::i16)
171115c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta    LC = RTLIB::MUL_I16;
1712825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i32)
17135ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::MUL_I32;
1714825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i64)
1715e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands    LC = RTLIB::MUL_I64;
1716825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i128)
17175ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::MUL_I128;
17185ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported MUL!");
1719e9c80f4d576bf1ff682958d447c1a60fa9348da3Duncan Sands
1720475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1721c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, true/*irrelevant*/, dl), Lo, Hi);
172241edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands}
1723cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1724268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedmanvoid DAGTypeLegalizer::ExpandIntRes_SADDSUBO(SDNode *Node,
1725268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                                             SDValue &Lo, SDValue &Hi) {
1726268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue LHS = Node->getOperand(0);
1727268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue RHS = Node->getOperand(1);
1728268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  DebugLoc dl = Node->getDebugLoc();
1729268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1730268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // Expand the result by simply replacing it with the equivalent
1731268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // non-overflow-checking operation.
1732268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue Sum = DAG.getNode(Node->getOpcode() == ISD::SADDO ?
1733268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                            ISD::ADD : ISD::SUB, dl, LHS.getValueType(),
1734268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                            LHS, RHS);
1735268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SplitInteger(Sum, Lo, Hi);
1736268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1737268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // Compute the overflow.
1738268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //
1739268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //   LHSSign -> LHS >= 0
1740268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //   RHSSign -> RHS >= 0
1741268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //   SumSign -> Sum >= 0
1742268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //
1743268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //   Add:
1744268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //   Overflow -> (LHSSign == RHSSign) && (LHSSign != SumSign)
1745268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //   Sub:
1746268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //   Overflow -> (LHSSign != RHSSign) && (LHSSign != SumSign)
1747268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  //
1748268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  EVT OType = Node->getValueType(1);
1749268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue Zero = DAG.getConstant(0, LHS.getValueType());
1750268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1751268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue LHSSign = DAG.getSetCC(dl, OType, LHS, Zero, ISD::SETGE);
1752268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue RHSSign = DAG.getSetCC(dl, OType, RHS, Zero, ISD::SETGE);
1753268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue SignsMatch = DAG.getSetCC(dl, OType, LHSSign, RHSSign,
1754268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                                    Node->getOpcode() == ISD::SADDO ?
1755268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                                    ISD::SETEQ : ISD::SETNE);
1756268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1757268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue SumSign = DAG.getSetCC(dl, OType, Sum, Zero, ISD::SETGE);
1758268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue SumSignNE = DAG.getSetCC(dl, OType, LHSSign, SumSign, ISD::SETNE);
1759268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1760268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue Cmp = DAG.getNode(ISD::AND, dl, OType, SignsMatch, SumSignNE);
1761268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1762268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // Use the calculated overflow everywhere.
1763268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  ReplaceValueWith(SDValue(Node, 1), Cmp);
1764268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman}
1765268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
176669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_SDIV(SDNode *N,
1767475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1768e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
1769c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
17705ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands
17715ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1772825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (VT == MVT::i16)
1773a43a7aefd753fe7d6005cbebc9619268db4ae139Sanjiv Gupta    LC = RTLIB::SDIV_I16;
1774825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i32)
17755ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::SDIV_I32;
1776825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i64)
17775ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::SDIV_I64;
1778825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i128)
17795ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands    LC = RTLIB::SDIV_I128;
17805ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SDIV!");
17815ac319ac7125b009adddcc49294d2e040c4a91e5Duncan Sands
1782475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1783c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, true, dl), Lo, Hi);
1784ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands}
1785ddc016cc8592fe5c9379feb42a1fb4fb63164a91Duncan Sands
178669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_Shift(SDNode *N,
1787475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                          SDValue &Lo, SDValue &Hi) {
1788e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
1789c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
179069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
179169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  // If we can emit an efficient shift operation, do so now.  Check to see if
1792cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // the RHS is a constant.
1793cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(N->getOperand(1)))
1794f5aeb1a8e4cf272c7348376d185ef8d8267653e0Dan Gohman    return ExpandShiftByConstant(N, CN->getZExtValue(), Lo, Hi);
1795cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
1796cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If we can determine that the high bit of the shift is zero or one, even if
1797cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // the low bits are variable, emit this shift in an optimized form.
1798cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (ExpandShiftWithKnownAmountBit(N, Lo, Hi))
1799cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
180069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1801cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If this target supports shift_PARTS, use it.  First, map to the _PARTS opc.
1802cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  unsigned PartsOpc;
180341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  if (N->getOpcode() == ISD::SHL) {
1804cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    PartsOpc = ISD::SHL_PARTS;
180541edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else if (N->getOpcode() == ISD::SRL) {
1806cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    PartsOpc = ISD::SRL_PARTS;
180741edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else {
1808cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
1809cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    PartsOpc = ISD::SRA_PARTS;
1810cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
181169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1812cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Next check to see if the target supports this SHL_PARTS operation or if it
1813cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // will custom expand it.
181423b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
1815cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  TargetLowering::LegalizeAction Action = TLI.getOperationAction(PartsOpc, NVT);
1816cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if ((Action == TargetLowering::Legal && TLI.isTypeLegal(NVT)) ||
1817cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      Action == TargetLowering::Custom) {
1818cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Expand the subcomponents.
1819475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue LHSL, LHSH;
182069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getOperand(0), LHSL, LHSH);
182169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
1822475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Ops[] = { LHSL, LHSH, N->getOperand(1) };
1823e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT VT = LHSL.getValueType();
1824fc1665793e62eb4f26d24b8a19eecf59cd872e2aDan Gohman    Lo = DAG.getNode(PartsOpc, dl, DAG.getVTList(VT, VT), Ops, 3);
1825cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    Hi = Lo.getValue(1);
1826cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
1827cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
182841edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
1829cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Otherwise, emit a libcall.
1830dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
183141edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  bool isSigned;
183241edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  if (N->getOpcode() == ISD::SHL) {
183341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    isSigned = false; /*sign irrelevant*/
1834825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (VT == MVT::i16)
183515c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta      LC = RTLIB::SHL_I16;
1836825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i32)
1837dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SHL_I32;
1838825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i64)
1839dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SHL_I64;
1840825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i128)
1841dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SHL_I128;
184241edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else if (N->getOpcode() == ISD::SRL) {
184341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    isSigned = false;
1844825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (VT == MVT::i16)
184515c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta      LC = RTLIB::SRL_I16;
1846825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i32)
1847dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRL_I32;
1848825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i64)
1849dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRL_I64;
1850825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i128)
1851dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRL_I128;
185241edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  } else {
185341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    assert(N->getOpcode() == ISD::SRA && "Unknown shift!");
185441edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands    isSigned = true;
1855825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (VT == MVT::i16)
185615c94d08ab2be2e3d00de4edbfc7adde6545a7dbSanjiv Gupta      LC = RTLIB::SRA_I16;
1857825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i32)
1858dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRA_I32;
1859825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i64)
1860dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRA_I64;
1861825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (VT == MVT::i128)
1862dddc6291fb5274282a20d5923b50535d456d34a4Duncan Sands      LC = RTLIB::SRA_I128;
186341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands  }
18648c899ee031481dbece5f111379a274c848cb5902Duncan Sands
18656fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  if (LC != RTLIB::UNKNOWN_LIBCALL && TLI.getLibcallName(LC)) {
18666fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng    SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
18676fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng    SplitInteger(MakeLibCall(LC, VT, Ops, 2, isSigned, dl), Lo, Hi);
18686fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng    return;
18696fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  }
187041edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
18716fb2168aaed06e4685d064b6f63dc4c668b42728Evan Cheng  if (!ExpandShiftWithUnknownAmountBit(N, Lo, Hi))
1872c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Unsupported shift!");
187341edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands}
1874cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
187505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_SIGN_EXTEND(SDNode *N,
1876475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                SDValue &Lo, SDValue &Hi) {
187723b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1878786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1879475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
188005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Op.getValueType().bitsLE(NVT)) {
1881b3bc6352defdf1a5c6b1b0770d0c4d603f6524a8Duncan Sands    // The low part is sign extension of the input (degenerates to a copy).
1882786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SIGN_EXTEND, dl, NVT, N->getOperand(0));
188305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The high part is obtained by SRA'ing all but one of the bits of low part.
188405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned LoSize = NVT.getSizeInBits();
1885786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, NVT, Lo,
188692abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                     DAG.getConstant(LoSize-1, TLI.getPointerTy()));
188705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
188805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  The operand type necessarily
188905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // promotes to the result type, so will end up being expanded too.
189005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
189105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Only know how to promote this result!");
1892475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(Op);
189305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(Res.getValueType() == N->getValueType(0) &&
189405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Operand over promoted?");
189505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Split the promoted operand.  This will simplify when it is expanded.
189605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SplitInteger(Res, Lo, Hi);
189705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned ExcessBits =
189805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
1899786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi,
1900285fb1cc4a7ea924b4d94e9c2cb890125d56a7e0Evan Cheng                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(),
1901285fb1cc4a7ea924b4d94e9c2cb890125d56a7e0Evan Cheng                                                        ExcessBits)));
190205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
190305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
190405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
190505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::
1906475871a144eb604ddaf37503397ba0941442e5fbDan GohmanExpandIntRes_SIGN_EXTEND_INREG(SDNode *N, SDValue &Lo, SDValue &Hi) {
1907786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
190869b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(N->getOperand(0), Lo, Hi);
1909e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT EVT = cast<VTSDNode>(N->getOperand(1))->getVT();
1910d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
191105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (EVT.bitsLE(Lo.getValueType())) {
191205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // sext_inreg the low part if needed.
1913786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Lo.getValueType(), Lo,
191405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     N->getOperand(1));
1915d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
191605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The high part gets the sign extension from the lo-part.  This handles
191705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // things like sextinreg V:i64 from i8.
1918786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SRA, dl, Hi.getValueType(), Lo,
191905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                     DAG.getConstant(Hi.getValueType().getSizeInBits()-1,
192092abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                     TLI.getPointerTy()));
192105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
192205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  Leave the low part alone,
192305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // sext_inreg the high part.
192405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned ExcessBits =
192505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      EVT.getSizeInBits() - Lo.getValueType().getSizeInBits();
1926786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getNode(ISD::SIGN_EXTEND_INREG, dl, Hi.getValueType(), Hi,
192723b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson                     DAG.getValueType(EVT::getIntegerVT(*DAG.getContext(), ExcessBits)));
192805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
192905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
1930d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
193105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_SREM(SDNode *N,
1932475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1933e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
1934c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
193505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
193605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1937825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (VT == MVT::i16)
1938a43a7aefd753fe7d6005cbebc9619268db4ae139Sanjiv Gupta    LC = RTLIB::SREM_I16;
1939825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i32)
194005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::SREM_I32;
1941825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i64)
194205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::SREM_I64;
1943825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i128)
194405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::SREM_I128;
194505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported SREM!");
194605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
1947475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
1948c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, true, dl), Lo, Hi);
1949d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands}
1950d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
195105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_TRUNCATE(SDNode *N,
1952475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                             SDValue &Lo, SDValue &Hi) {
195323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
1954786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1955786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Lo = DAG.getNode(ISD::TRUNCATE, dl, NVT, N->getOperand(0));
1956786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::SRL, dl,
1957786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                   N->getOperand(0).getValueType(), N->getOperand(0),
195892abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                   DAG.getConstant(NVT.getSizeInBits(), TLI.getPointerTy()));
1959786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  Hi = DAG.getNode(ISD::TRUNCATE, dl, NVT, Hi);
1960d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands}
1961d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
1962268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedmanvoid DAGTypeLegalizer::ExpandIntRes_UADDSUBO(SDNode *N,
1963268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                                             SDValue &Lo, SDValue &Hi) {
1964268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue LHS = N->getOperand(0);
1965268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue RHS = N->getOperand(1);
1966268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  DebugLoc dl = N->getDebugLoc();
1967268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1968268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // Expand the result by simply replacing it with the equivalent
1969268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // non-overflow-checking operation.
1970268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue Sum = DAG.getNode(N->getOpcode() == ISD::UADDO ?
1971268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                            ISD::ADD : ISD::SUB, dl, LHS.getValueType(),
1972268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                            LHS, RHS);
1973268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SplitInteger(Sum, Lo, Hi);
1974268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1975268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // Calculate the overflow: addition overflows iff a + b < a, and subtraction
1976268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // overflows iff a - b > a.
1977268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  SDValue Ofl = DAG.getSetCC(dl, N->getValueType(1), Sum, LHS,
1978268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                             N->getOpcode () == ISD::UADDO ?
1979268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman                             ISD::SETULT : ISD::SETUGT);
1980268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
1981268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  // Use the calculated overflow everywhere.
1982268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman  ReplaceValueWith(SDValue(N, 1), Ofl);
1983268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman}
1984268637ed0f34e10e4125e94c44ff3e2975a19166Eli Friedman
198505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_UDIV(SDNode *N,
1986475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
1987e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
1988c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
1989d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
199005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
1991825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (VT == MVT::i16)
1992a43a7aefd753fe7d6005cbebc9619268db4ae139Sanjiv Gupta    LC = RTLIB::UDIV_I16;
1993825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i32)
199405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UDIV_I32;
1995825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i64)
199605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UDIV_I64;
1997825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i128)
199805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UDIV_I128;
199905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UDIV!");
2000d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands
2001475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2002c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, false, dl), Lo, Hi);
2003d462ba853981d45bf9c777564e79dc9e1c850ca6Duncan Sands}
2004cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
200505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_UREM(SDNode *N,
2006475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                         SDValue &Lo, SDValue &Hi) {
2007e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getValueType(0);
2008c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
200969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
201005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  RTLIB::Libcall LC = RTLIB::UNKNOWN_LIBCALL;
2011825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  if (VT == MVT::i16)
2012a43a7aefd753fe7d6005cbebc9619268db4ae139Sanjiv Gupta    LC = RTLIB::UREM_I16;
2013825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i32)
201405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UREM_I32;
2015825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i64)
201605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UREM_I64;
2017825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson  else if (VT == MVT::i128)
201805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    LC = RTLIB::UREM_I128;
201905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL && "Unsupported UREM!");
2020cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2021475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ops[2] = { N->getOperand(0), N->getOperand(1) };
2022c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  SplitInteger(MakeLibCall(LC, VT, Ops, 2, false, dl), Lo, Hi);
2023cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
2024cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
202505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsvoid DAGTypeLegalizer::ExpandIntRes_ZERO_EXTEND(SDNode *N,
2026475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                SDValue &Lo, SDValue &Hi) {
202723b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), N->getValueType(0));
2028786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
2029475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
203005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  if (Op.getValueType().bitsLE(NVT)) {
2031b3bc6352defdf1a5c6b1b0770d0c4d603f6524a8Duncan Sands    // The low part is zero extension of the input (degenerates to a copy).
2032786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getNode(ISD::ZERO_EXTEND, dl, NVT, N->getOperand(0));
203305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    Hi = DAG.getConstant(0, NVT);   // The high part is just a zero.
203405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  } else {
203505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // For example, extension of an i48 to an i64.  The operand type necessarily
203605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // promotes to the result type, so will end up being expanded too.
203705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(getTypeAction(Op.getValueType()) == PromoteInteger &&
203805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Only know how to promote this result!");
2039475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Res = GetPromotedInteger(Op);
204005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(Res.getValueType() == N->getValueType(0) &&
204105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Operand over promoted?");
204205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Split the promoted operand.  This will simplify when it is expanded.
204305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SplitInteger(Res, Lo, Hi);
204405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    unsigned ExcessBits =
204505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      Op.getValueType().getSizeInBits() - NVT.getSizeInBits();
2046adf979900c84d00e1fe0872a68d2819c654b6f29Evan Cheng    Hi = DAG.getZeroExtendInReg(Hi, dl,
2047adf979900c84d00e1fe0872a68d2819c654b6f29Evan Cheng                                EVT::getIntegerVT(*DAG.getContext(), ExcessBits));
20489e255b7df5a0a629920706e086e78ef89bf2f183Dan Gohman  }
2049cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
2050cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2051cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2052cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
205369b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands//  Integer Operand Expansion
2054cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner//===----------------------------------------------------------------------===//
2055cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
205605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// ExpandIntegerOperand - This method is called when the specified operand of
205705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// the specified node is found to need expansion.  At this point, all of the
205805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// result types of the node are known to be legal, but other operands of the
205905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands/// node may need promotion or expansion as well as the specified one.
206005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sandsbool DAGTypeLegalizer::ExpandIntegerOperand(SDNode *N, unsigned OpNo) {
2061d765353da89988e949fd4c021d8860f36ab7c392David Greene  DEBUG(dbgs() << "Expand integer operand: "; N->dump(&DAG); dbgs() << "\n");
2062475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Res = SDValue();
2063051bb7b07504be9f848f7cce802e62ed24980bc5Duncan Sands
2064f43071beddb7ed5b2fd7d2f06c4130460616a13dDuncan Sands  if (CustomLowerNode(N, N->getOperand(OpNo).getValueType(), false))
2065bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta    return false;
206611ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands
2067bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  switch (N->getOpcode()) {
2068bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  default:
206905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  #ifndef NDEBUG
2070d765353da89988e949fd4c021d8860f36ab7c392David Greene    dbgs() << "ExpandIntegerOperand Op #" << OpNo << ": ";
2071d765353da89988e949fd4c021d8860f36ab7c392David Greene    N->dump(&DAG); dbgs() << "\n";
207205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  #endif
2073c23197a26f34f559ea9797de51e187087c039c42Torok Edwin    llvm_unreachable("Do not know how to expand this operator's operand!");
2074bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta
2075bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::BIT_CONVERT:       Res = ExpandOp_BIT_CONVERT(N); break;
207692abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::BR_CC:             Res = ExpandIntOp_BR_CC(N); break;
207792abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::BUILD_VECTOR:      Res = ExpandOp_BUILD_VECTOR(N); break;
2078bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::EXTRACT_ELEMENT:   Res = ExpandOp_EXTRACT_ELEMENT(N); break;
2079bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::INSERT_VECTOR_ELT: Res = ExpandOp_INSERT_VECTOR_ELT(N); break;
2080bb326bbe88d0b243d5d9d224308eb0c028d4d4afSanjiv Gupta  case ISD::SCALAR_TO_VECTOR:  Res = ExpandOp_SCALAR_TO_VECTOR(N); break;
208192abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::SELECT_CC:         Res = ExpandIntOp_SELECT_CC(N); break;
208292abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::SETCC:             Res = ExpandIntOp_SETCC(N); break;
208392abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::SINT_TO_FP:        Res = ExpandIntOp_SINT_TO_FP(N); break;
208492abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::STORE:   Res = ExpandIntOp_STORE(cast<StoreSDNode>(N), OpNo); break;
208592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::TRUNCATE:          Res = ExpandIntOp_TRUNCATE(N); break;
208692abc62399881ba9c525be80362c134ad836e2d9Duncan Sands  case ISD::UINT_TO_FP:        Res = ExpandIntOp_UINT_TO_FP(N); break;
208755467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
208855467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SHL:
208955467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRA:
209055467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::SRL:
209155467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  case ISD::ROTL:
20921c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  case ISD::ROTR:              Res = ExpandIntOp_Shift(N); break;
20931c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  case ISD::RETURNADDR:
20941c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  case ISD::FRAMEADDR:         Res = ExpandIntOp_RETURNADDR(N); break;
209505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
209669b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
209705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If the result is null, the sub-method took care of registering results etc.
2098ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!Res.getNode()) return false;
209947d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands
210047d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // If the result is N, the sub-method updated N in place.  Tell the legalizer
210147d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  // core about this.
210247d9dcc584cdb7fd645ca1d5c2a0ce363570aeb7Duncan Sands  if (Res.getNode() == N)
210305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return true;
2104cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
210505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(Res.getValueType() == N->getValueType(0) && N->getNumValues() == 1 &&
210605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Invalid operand expansion");
210705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2108475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  ReplaceValueWith(SDValue(N, 0), Res);
210905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  return false;
2110cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
2111cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
211211ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands/// IntegerExpandSetCCOperands - Expand the operands of a comparison.  This code
211311ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands/// is shared among BR_CC, SELECT_CC, and SETCC handlers.
2114475871a144eb604ddaf37503397ba0941442e5fbDan Gohmanvoid DAGTypeLegalizer::IntegerExpandSetCCOperands(SDValue &NewLHS,
2115475871a144eb604ddaf37503397ba0941442e5fbDan Gohman                                                  SDValue &NewRHS,
2116c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen                                                  ISD::CondCode &CCCode,
2117c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen                                                  DebugLoc dl) {
2118475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue LHSLo, LHSHi, RHSLo, RHSHi;
211969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(NewLHS, LHSLo, LHSHi);
212069b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands  GetExpandedInteger(NewRHS, RHSLo, RHSHi);
212141edfb8ae119d6cf6579046619dd2820ec876065Duncan Sands
2122cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (CCCode == ISD::SETEQ || CCCode == ISD::SETNE) {
212311ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    if (RHSLo == RHSHi) {
212411ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands      if (ConstantSDNode *RHSCST = dyn_cast<ConstantSDNode>(RHSLo)) {
2125cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        if (RHSCST->isAllOnesValue()) {
2126cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner          // Equality comparison to -1.
21277fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands          NewLHS = DAG.getNode(ISD::AND, dl,
2128786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                               LHSLo.getValueType(), LHSLo, LHSHi);
2129cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner          NewRHS = RHSLo;
2130cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner          return;
2131cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        }
213211ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands      }
213311ac797f5ed142f11aafde3dd76c28a73d84282eDuncan Sands    }
213469b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2135786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewLHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSLo, RHSLo);
2136786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewRHS = DAG.getNode(ISD::XOR, dl, LHSLo.getValueType(), LHSHi, RHSHi);
2137786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewLHS = DAG.getNode(ISD::OR, dl, NewLHS.getValueType(), NewLHS, NewRHS);
2138cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
2139cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
2140cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
214169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2142cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // If this is a comparison of the sign bit, just look at the top part.
2143cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // X > -1,  x < 0
2144cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  if (ConstantSDNode *CST = dyn_cast<ConstantSDNode>(NewRHS))
2145002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman    if ((CCCode == ISD::SETLT && CST->isNullValue()) ||     // X < 0
2146cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        (CCCode == ISD::SETGT && CST->isAllOnesValue())) {  // X > -1
2147cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      NewLHS = LHSHi;
2148cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      NewRHS = RHSHi;
2149cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      return;
2150cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
215169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2152cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // FIXME: This generated code sucks.
2153cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  ISD::CondCode LowCC;
2154cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  switch (CCCode) {
2155c23197a26f34f559ea9797de51e187087c039c42Torok Edwin  default: llvm_unreachable("Unknown integer setcc!");
2156cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETLT:
2157cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETULT: LowCC = ISD::SETULT; break;
2158cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETGT:
2159cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETUGT: LowCC = ISD::SETUGT; break;
2160cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETLE:
2161cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETULE: LowCC = ISD::SETULE; break;
2162cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETGE:
2163cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  case ISD::SETUGE: LowCC = ISD::SETUGE; break;
2164cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
216569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2166cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Tmp1 = lo(op1) < lo(op2)   // Always unsigned comparison
2167cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // Tmp2 = hi(op1) < hi(op2)   // Signedness depends on operands
2168cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // dest = hi(op1) == hi(op2) ? Tmp1 : Tmp2;
216969b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2170cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // NOTE: on targets without efficient SELECT of bools, we can always use
2171cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  // this identity: (B1 ? B2 : B3) --> (B1 & B2)|(!B1&B3)
217278d12644b905dc54cf6cf984af02a49d30d29744Jakob Stoklund Olesen  TargetLowering::DAGCombinerInfo DagCombineInfo(DAG, false, true, true, NULL);
2173475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Tmp1, Tmp2;
21745480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  Tmp1 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSLo.getValueType()),
2175ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                           LHSLo, RHSLo, LowCC, false, DagCombineInfo, dl);
2176ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!Tmp1.getNode())
2177786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Tmp1 = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSLo.getValueType()),
21785480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                        LHSLo, RHSLo, LowCC);
21795480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  Tmp2 = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi.getValueType()),
2180ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                           LHSHi, RHSHi, CCCode, false, DagCombineInfo, dl);
2181ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!Tmp2.getNode())
2182786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Tmp2 = DAG.getNode(ISD::SETCC, dl,
2183786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                       TLI.getSetCCResultType(LHSHi.getValueType()),
21845480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                       LHSHi, RHSHi, DAG.getCondCode(CCCode));
218569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
2186ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  ConstantSDNode *Tmp1C = dyn_cast<ConstantSDNode>(Tmp1.getNode());
2187ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  ConstantSDNode *Tmp2C = dyn_cast<ConstantSDNode>(Tmp2.getNode());
2188002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman  if ((Tmp1C && Tmp1C->isNullValue()) ||
2189002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman      (Tmp2C && Tmp2C->isNullValue() &&
2190cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner       (CCCode == ISD::SETLE || CCCode == ISD::SETGE ||
2191cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        CCCode == ISD::SETUGE || CCCode == ISD::SETULE)) ||
2192002e5d0a170dadd5c307e0b00d8c7970835837e6Dan Gohman      (Tmp2C && Tmp2C->getAPIntValue() == 1 &&
2193cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner       (CCCode == ISD::SETLT || CCCode == ISD::SETGT ||
2194cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner        CCCode == ISD::SETUGT || CCCode == ISD::SETULT))) {
2195cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // low part is known false, returns high part.
2196cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // For LE / GE, if high part is known false, ignore the low part.
2197cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // For LT / GT, if high part is known true, ignore the low part.
2198cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    NewLHS = Tmp2;
2199475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    NewRHS = SDValue();
2200cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    return;
2201cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
220269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands
22035480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands  NewLHS = TLI.SimplifySetCC(TLI.getSetCCResultType(LHSHi.getValueType()),
2204fdc40a0a696c658d550d894ea03772e5f8af2c94Scott Michel                             LHSHi, RHSHi, ISD::SETEQ, false,
2205ff97d4fe81ef0dcee9fe490bed8ab08e40251905Dale Johannesen                             DagCombineInfo, dl);
2206ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (!NewLHS.getNode())
2207786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    NewLHS = DAG.getSetCC(dl, TLI.getSetCCResultType(LHSHi.getValueType()),
22085480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                          LHSHi, RHSHi, ISD::SETEQ);
2209786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  NewLHS = DAG.getNode(ISD::SELECT, dl, Tmp1.getValueType(),
2210cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                       NewLHS, Tmp1, Tmp2);
2211475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  NewRHS = SDValue();
2212cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
2213cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2214475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_BR_CC(SDNode *N) {
2215475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewLHS = N->getOperand(2), NewRHS = N->getOperand(3);
221605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(1))->get();
2217c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, N->getDebugLoc());
221805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
221905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If ExpandSetCCOperands returned a scalar, we need to compare the result
222005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // against zero to select between true and false values.
2221ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (NewRHS.getNode() == 0) {
222205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
222305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    CCCode = ISD::SETNE;
222405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
222505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
222605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Update N to have the operands specified.
2227475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0),
222805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                DAG.getCondCode(CCCode), NewLHS, NewRHS,
222905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                N->getOperand(4));
223005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
223105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2232475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_SELECT_CC(SDNode *N) {
2233475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
223405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(4))->get();
2235c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, N->getDebugLoc());
223605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
223705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If ExpandSetCCOperands returned a scalar, we need to compare the result
223805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // against zero to select between true and false values.
2239ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (NewRHS.getNode() == 0) {
224005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    NewRHS = DAG.getConstant(0, NewLHS.getValueType());
224105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    CCCode = ISD::SETNE;
224205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
224305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
224405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Update N to have the operands specified.
2245475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), NewLHS, NewRHS,
224605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                N->getOperand(2), N->getOperand(3),
224705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                DAG.getCondCode(CCCode));
224805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
224905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2250475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_SETCC(SDNode *N) {
2251475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue NewLHS = N->getOperand(0), NewRHS = N->getOperand(1);
225205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  ISD::CondCode CCCode = cast<CondCodeSDNode>(N->getOperand(2))->get();
2253c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  IntegerExpandSetCCOperands(NewLHS, NewRHS, CCCode, N->getDebugLoc());
225405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
225505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // If ExpandSetCCOperands returned a scalar, use it.
2256ba36cb5242eb02b12b277f82b9efe497f7da4d7fGabor Greif  if (NewRHS.getNode() == 0) {
225705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    assert(NewLHS.getValueType() == N->getValueType(0) &&
225805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands           "Unexpected setcc expansion!");
225905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    return NewLHS;
226005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
226105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
226205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Otherwise, update N to have the operands specified.
2263475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  return DAG.UpdateNodeOperands(SDValue(N, 0), NewLHS, NewRHS,
226405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands                                DAG.getCondCode(CCCode));
226505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
226605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
226755467af31620c9d027e071ebcd9746b7593cff17Sanjiv GuptaSDValue DAGTypeLegalizer::ExpandIntOp_Shift(SDNode *N) {
226855467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  // The value being shifted is legal, but the shift amount is too big.
226955467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  // It follows that either the result of the shift is undefined, or the
227055467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  // upper half of the shift amount is zero.  Just use the lower half.
227155467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  SDValue Lo, Hi;
227255467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  GetExpandedInteger(N->getOperand(1), Lo, Hi);
227355467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta  return DAG.UpdateNodeOperands(SDValue(N, 0), N->getOperand(0), Lo);
227455467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta}
227555467af31620c9d027e071ebcd9746b7593cff17Sanjiv Gupta
22761c3436a67afcfaee5f972836ff1ffff2985adce1Anton KorobeynikovSDValue DAGTypeLegalizer::ExpandIntOp_RETURNADDR(SDNode *N) {
22771c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  // The argument of RETURNADDR / FRAMEADDR builtin is 32 bit contant.  This
22781c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  // surely makes pretty nice problems on 8/16 bit targets. Just truncate this
22791c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  // constant to valid type.
22801c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  SDValue Lo, Hi;
22811c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  GetExpandedInteger(N->getOperand(0), Lo, Hi);
22821c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov  return DAG.UpdateNodeOperands(SDValue(N, 0), Lo);
22831c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov}
22841c3436a67afcfaee5f972836ff1ffff2985adce1Anton Korobeynikov
2285475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_SINT_TO_FP(SDNode *N) {
2286475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
2287e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT DstVT = N->getValueType(0);
2288b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getSINTTOFP(Op.getValueType(), DstVT);
228905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL &&
229005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Don't know how to expand this SINT_TO_FP!");
2291c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  return MakeLibCall(LC, DstVT, &Op, 1, true, N->getDebugLoc());
229205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
229305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2294475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_STORE(StoreSDNode *N, unsigned OpNo) {
2295ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands  if (ISD::isNormalStore(N))
2296ab09b7e8f34075c1759127a113f41bdf921f4034Duncan Sands    return ExpandOp_NormalStore(N, OpNo);
229778cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands
229878cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  assert(ISD::isUNINDEXEDStore(N) && "Indexed store during type legalization!");
2299cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  assert(OpNo == 1 && "Can only expand the stored value so far");
2300cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2301e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT VT = N->getOperand(1).getValueType();
230223b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson  EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), VT);
2303475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ch  = N->getChain();
2304475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Ptr = N->getBasePtr();
2305cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  int SVOffset = N->getSrcValueOffset();
2306cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  unsigned Alignment = N->getAlignment();
2307cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  bool isVolatile = N->isVolatile();
23081e559443a17d1b335f697551c6263ba60d5dd827David Greene  bool isNonTemporal = N->isNonTemporal();
2309786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  DebugLoc dl = N->getDebugLoc();
2310475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Lo, Hi;
2311cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2312a1ace76c70ae5332d6f33fce5c0c1e2fdb8cca11Duncan Sands  assert(NVT.isByteSized() && "Expanded type not byte sized!");
2313cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
231478cd649ad326f79a1f8424ca2b63cea3239a9a52Duncan Sands  if (N->getMemoryVT().bitsLE(NVT)) {
231569b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getValue(), Lo, Hi);
2316786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
23171e559443a17d1b335f697551c6263ba60d5dd827David Greene                             N->getMemoryVT(), isVolatile, isNonTemporal,
23181e559443a17d1b335f697551c6263ba60d5dd827David Greene                             Alignment);
2319cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else if (TLI.isLittleEndian()) {
2320cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Little-endian - low bits are at low addresses.
232169b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getValue(), Lo, Hi);
2322cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2323786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getStore(Ch, dl, Lo, Ptr, N->getSrcValue(), SVOffset,
23241e559443a17d1b335f697551c6263ba60d5dd827David Greene                      isVolatile, isNonTemporal, Alignment);
2325cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2326cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits =
232783ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands      N->getMemoryVT().getSizeInBits() - NVT.getSizeInBits();
232823b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson    EVT NEVT = EVT::getIntegerVT(*DAG.getContext(), ExcessBits);
2329cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2330cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
233183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
2332786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
23330bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
2334786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(),
2335cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                           SVOffset+IncrementSize, NEVT,
23361e559443a17d1b335f697551c6263ba60d5dd827David Greene                           isVolatile, isNonTemporal,
23371e559443a17d1b335f697551c6263ba60d5dd827David Greene                           MinAlign(Alignment, IncrementSize));
2338825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
2339cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  } else {
2340cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Big-endian - high bits are at low addresses.  Favor aligned stores at
2341cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // the cost of some bit-fiddling.
234269b01e92a29ce6d7e435171aeea3fbc987b81586Duncan Sands    GetExpandedInteger(N->getValue(), Lo, Hi);
2343cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2344e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson    EVT ExtVT = N->getMemoryVT();
23454e918b2c8ca81edd63f6708e08835b2c14648615Dan Gohman    unsigned EBytes = ExtVT.getStoreSize();
234683ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    unsigned IncrementSize = NVT.getSizeInBits()/8;
2347cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    unsigned ExcessBits = (EBytes - IncrementSize)*8;
2348adf979900c84d00e1fe0872a68d2819c654b6f29Evan Cheng    EVT HiVT = EVT::getIntegerVT(*DAG.getContext(),
2349adf979900c84d00e1fe0872a68d2819c654b6f29Evan Cheng                                 ExtVT.getSizeInBits() - ExcessBits);
2350cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
235183ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands    if (ExcessBits < NVT.getSizeInBits()) {
2352cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner      // Transfer high bits from the top of Lo to the bottom of Hi.
2353786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::SHL, dl, NVT, Hi,
235483ec4b6711980242ef3c55a4fa36b2d7a39c1bfbDuncan Sands                       DAG.getConstant(NVT.getSizeInBits() - ExcessBits,
235592abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                       TLI.getPointerTy()));
2356786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen      Hi = DAG.getNode(ISD::OR, dl, NVT, Hi,
2357de06470330260f5937e7ca558f5f5b3e171f2ee5Dale Johannesen                       DAG.getNode(ISD::SRL, dl, NVT, Lo,
2358cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                                   DAG.getConstant(ExcessBits,
235992abc62399881ba9c525be80362c134ad836e2d9Duncan Sands                                                   TLI.getPointerTy())));
2360cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    }
2361cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2362cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Store both the high bits and maybe some of the low bits.
2363786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Hi = DAG.getTruncStore(Ch, dl, Hi, Ptr, N->getSrcValue(),
23641e559443a17d1b335f697551c6263ba60d5dd827David Greene                           SVOffset, HiVT, isVolatile, isNonTemporal,
23651e559443a17d1b335f697551c6263ba60d5dd827David Greene                           Alignment);
2366cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner
2367cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Increment the pointer to the other half.
2368786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
23690bd4893a0726889b942405262e53d06cf3fe3be8Chris Lattner                      DAG.getIntPtrConstant(IncrementSize));
2370cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner    // Store the lowest ExcessBits bits in the second half.
2371786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    Lo = DAG.getTruncStore(Ch, dl, Lo, Ptr, N->getSrcValue(),
2372cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner                           SVOffset+IncrementSize,
237323b9b19b1a5a00faa9fce0788155c7dbfd00bfb1Owen Anderson                           EVT::getIntegerVT(*DAG.getContext(), ExcessBits),
23741e559443a17d1b335f697551c6263ba60d5dd827David Greene                           isVolatile, isNonTemporal,
23751e559443a17d1b335f697551c6263ba60d5dd827David Greene                           MinAlign(Alignment, IncrementSize));
2376825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
2377cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner  }
2378cc663a8112017f06e0cd4b6fe1546ccfcd5d05c3Chris Lattner}
237905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
2380475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_TRUNCATE(SDNode *N) {
2381475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue InL, InH;
238205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  GetExpandedInteger(N->getOperand(0), InL, InH);
238305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Just truncate the low part of the source.
2384786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen  return DAG.getNode(ISD::TRUNCATE, N->getDebugLoc(), N->getValueType(0), InL);
238505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
238605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
23878d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesenstatic const fltSemantics *EVTToAPFloatSemantics(EVT VT) {
23888d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  switch (VT.getSimpleVT().SimpleTy) {
23898d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  default: llvm_unreachable("Unknown FP format");
23908d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  case MVT::f32:     return &APFloat::IEEEsingle;
23918d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  case MVT::f64:     return &APFloat::IEEEdouble;
23928d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  case MVT::f80:     return &APFloat::x87DoubleExtended;
23938d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  case MVT::f128:    return &APFloat::IEEEquad;
23948d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  case MVT::ppcf128: return &APFloat::PPCDoubleDouble;
23958d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  }
23968d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen}
23978d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen
2398475871a144eb604ddaf37503397ba0941442e5fbDan GohmanSDValue DAGTypeLegalizer::ExpandIntOp_UINT_TO_FP(SDNode *N) {
2399475871a144eb604ddaf37503397ba0941442e5fbDan Gohman  SDValue Op = N->getOperand(0);
2400e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT SrcVT = Op.getValueType();
2401e50ed30282bb5b4a9ed952580523f2dda16215acOwen Anderson  EVT DstVT = N->getValueType(0);
2402c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  DebugLoc dl = N->getDebugLoc();
240305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
24048d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  // The following optimization is valid only if every value in SrcVT (when
24058d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  // treated as signed) is representable in DstVT.  Check that the mantissa
24068d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  // size of DstVT is >= than the number of bits in SrcVT -1.
24078d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  const fltSemantics *sem = EVTToAPFloatSemantics(DstVT);
24088d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen  if (APFloat::semanticsPrecision(*sem) >= SrcVT.getSizeInBits()-1 &&
24098d908ebd1926d00ff47d8284e52657705efb7f9bDale Johannesen      TLI.getOperationAction(ISD::SINT_TO_FP, SrcVT) == TargetLowering::Custom){
241005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Do a signed conversion then adjust the result.
2411786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue SignedConv = DAG.getNode(ISD::SINT_TO_FP, dl, DstVT, Op);
241205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    SignedConv = TLI.LowerOperation(SignedConv, DAG);
241305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
241405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // The result of the signed conversion needs adjusting if the 'sign bit' of
241505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // the incoming integer was set.  To handle this, we dynamically test to see
241605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // if it is set, and, if so, add a fudge factor.
241705c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
241805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    const uint64_t F32TwoE32  = 0x4F800000ULL;
241905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    const uint64_t F32TwoE64  = 0x5F800000ULL;
242005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    const uint64_t F32TwoE128 = 0x7F800000ULL;
242105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
242205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    APInt FF(32, 0);
2423825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    if (SrcVT == MVT::i32)
242405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      FF = APInt(32, F32TwoE32);
2425825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (SrcVT == MVT::i64)
242605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      FF = APInt(32, F32TwoE64);
2427825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson    else if (SrcVT == MVT::i128)
242805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      FF = APInt(32, F32TwoE128);
242905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    else
243005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands      assert(false && "Unsupported UINT_TO_FP!");
243105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
243205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Check whether the sign bit is set.
2433475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Lo, Hi;
243405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    GetExpandedInteger(Op, Lo, Hi);
24357fb085871857134f8cbeb17499d4ab771ba8da42Duncan Sands    SDValue SignSet = DAG.getSetCC(dl,
2436786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen                                   TLI.getSetCCResultType(Hi.getValueType()),
24375480c0469e5c0323ffb12f1ead2abd169d6cc0e7Duncan Sands                                   Hi, DAG.getConstant(0, Hi.getValueType()),
2438ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                   ISD::SETLT);
243905c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
244005c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Build a 64 bit pair (0, FF) in the constant pool, with FF in the lo bits.
2441001dbfebcbbded8c8e74b19e838b50da2b6c6fb5Owen Anderson    SDValue FudgePtr = DAG.getConstantPool(
2442eed707b1e6097aac2bb6b3d47271f6300ace7f2eOwen Anderson                               ConstantInt::get(*DAG.getContext(), FF.zext(64)),
244349c18cce976c158e86f54c681dff21bb81640fb8Duncan Sands                                           TLI.getPointerTy());
244405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
244505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Get a pointer to FF if the sign bit was set, or to 0 otherwise.
2446475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Zero = DAG.getIntPtrConstant(0);
2447475871a144eb604ddaf37503397ba0941442e5fbDan Gohman    SDValue Four = DAG.getIntPtrConstant(4);
244805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    if (TLI.isBigEndian()) std::swap(Zero, Four);
2449786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue Offset = DAG.getNode(ISD::SELECT, dl, Zero.getValueType(), SignSet,
2450ef5b199905cee0b78eb30cd44836e5b6ca5cbd09Duncan Sands                                 Zero, Four);
24511606e8e4cd937e6de6681f686c266cf61722d972Evan Cheng    unsigned Alignment = cast<ConstantPoolSDNode>(FudgePtr)->getAlignment();
2452786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    FudgePtr = DAG.getNode(ISD::ADD, dl, TLI.getPointerTy(), FudgePtr, Offset);
245387a0f10dc7eff8cf5e83a754f75adf9cb3991435Dan Gohman    Alignment = std::min(Alignment, 4u);
245405c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
245505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // Load the value out, extending it from f32 to the destination float type.
245605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands    // FIXME: Avoid the extend by constructing the right constant pool?
2457786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    SDValue Fudge = DAG.getExtLoad(ISD::EXTLOAD, dl, DstVT, DAG.getEntryNode(),
2458825b72b0571821bf2d378749f69d6c4cfb52d2f9Owen Anderson                                   FudgePtr, NULL, 0, MVT::f32,
24591e559443a17d1b335f697551c6263ba60d5dd827David Greene                                   false, false, Alignment);
2460786fd4dded6a42561c0d82bbd9d13b9a4d8d9675Dale Johannesen    return DAG.getNode(ISD::FADD, dl, DstVT, SignedConv, Fudge);
246105c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  }
246205c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands
246305c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  // Otherwise, use a libcall.
2464b2ff885aaed8f9b033b16ca78d645650efc32433Duncan Sands  RTLIB::Libcall LC = RTLIB::getUINTTOFP(SrcVT, DstVT);
246505c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands  assert(LC != RTLIB::UNKNOWN_LIBCALL &&
246605c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands         "Don't know how to expand this UINT_TO_FP!");
2467c8fc99d66a03dc603f49d653937ad1d94e833006Dale Johannesen  return MakeLibCall(LC, DstVT, &Op, 1, true, dl);
246805c397d52a145c8844790d6491c4c51d4bbfed7cDuncan Sands}
2469