Home | History | Annotate | Download | only in SelectionDAG
      1 //===-------- LegalizeTypesGeneric.cpp - Generic type legalization --------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file implements generic type expansion and splitting for LegalizeTypes.
     11 // The routines here perform legalization when the details of the type (such as
     12 // whether it is an integer or a float) do not matter.
     13 // Expansion is the act of changing a computation in an illegal type to be a
     14 // computation in two identical registers of a smaller type.  The Lo/Hi part
     15 // is required to be stored first in memory on little/big-endian machines.
     16 // Splitting is the act of changing a computation in an illegal type to be a
     17 // computation in two not necessarily identical registers of a smaller type.
     18 // There are no requirements on how the type is represented in memory.
     19 //
     20 //===----------------------------------------------------------------------===//
     21 
     22 #include "LegalizeTypes.h"
     23 #include "llvm/IR/DataLayout.h"
     24 using namespace llvm;
     25 
     26 //===----------------------------------------------------------------------===//
     27 // Generic Result Expansion.
     28 //===----------------------------------------------------------------------===//
     29 
     30 // These routines assume that the Lo/Hi part is stored first in memory on
     31 // little/big-endian machines, followed by the Hi/Lo part.  This means that
     32 // they cannot be used as is on vectors, for which Lo is always stored first.
     33 void DAGTypeLegalizer::ExpandRes_MERGE_VALUES(SDNode *N, unsigned ResNo,
     34                                               SDValue &Lo, SDValue &Hi) {
     35   SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
     36   GetExpandedOp(Op, Lo, Hi);
     37 }
     38 
     39 void DAGTypeLegalizer::ExpandRes_BITCAST(SDNode *N, SDValue &Lo, SDValue &Hi) {
     40   EVT OutVT = N->getValueType(0);
     41   EVT NOutVT = TLI.getTypeToTransformTo(*DAG.getContext(), OutVT);
     42   SDValue InOp = N->getOperand(0);
     43   EVT InVT = InOp.getValueType();
     44   DebugLoc dl = N->getDebugLoc();
     45 
     46   // Handle some special cases efficiently.
     47   switch (getTypeAction(InVT)) {
     48     case TargetLowering::TypeLegal:
     49     case TargetLowering::TypePromoteInteger:
     50       break;
     51     case TargetLowering::TypeSoftenFloat:
     52       // Convert the integer operand instead.
     53       SplitInteger(GetSoftenedFloat(InOp), Lo, Hi);
     54       Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
     55       Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
     56       return;
     57     case TargetLowering::TypeExpandInteger:
     58     case TargetLowering::TypeExpandFloat:
     59       // Convert the expanded pieces of the input.
     60       GetExpandedOp(InOp, Lo, Hi);
     61       Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
     62       Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
     63       return;
     64     case TargetLowering::TypeSplitVector:
     65       GetSplitVector(InOp, Lo, Hi);
     66       if (TLI.isBigEndian())
     67         std::swap(Lo, Hi);
     68       Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
     69       Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
     70       return;
     71     case TargetLowering::TypeScalarizeVector:
     72       // Convert the element instead.
     73       SplitInteger(BitConvertToInteger(GetScalarizedVector(InOp)), Lo, Hi);
     74       Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
     75       Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
     76       return;
     77     case TargetLowering::TypeWidenVector: {
     78       assert(!(InVT.getVectorNumElements() & 1) && "Unsupported BITCAST");
     79       InOp = GetWidenedVector(InOp);
     80       EVT InNVT = EVT::getVectorVT(*DAG.getContext(), InVT.getVectorElementType(),
     81                                    InVT.getVectorNumElements()/2);
     82       Lo = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, InNVT, InOp,
     83                        DAG.getIntPtrConstant(0));
     84       Hi = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, InNVT, InOp,
     85                        DAG.getIntPtrConstant(InNVT.getVectorNumElements()));
     86       if (TLI.isBigEndian())
     87         std::swap(Lo, Hi);
     88       Lo = DAG.getNode(ISD::BITCAST, dl, NOutVT, Lo);
     89       Hi = DAG.getNode(ISD::BITCAST, dl, NOutVT, Hi);
     90       return;
     91     }
     92   }
     93 
     94   if (InVT.isVector() && OutVT.isInteger()) {
     95     // Handle cases like i64 = BITCAST v1i64 on x86, where the operand
     96     // is legal but the result is not.
     97     unsigned NumElems = 2;
     98     EVT ElemVT = NOutVT;
     99     EVT NVT = EVT::getVectorVT(*DAG.getContext(), ElemVT, NumElems);
    100 
    101     // If <ElemVT * N> is not a legal type, try <ElemVT/2 * (N*2)>.
    102     while (!isTypeLegal(NVT)) {
    103       unsigned NewSizeInBits = ElemVT.getSizeInBits() / 2;
    104       // If the element size is smaller than byte, bail.
    105       if (NewSizeInBits < 8)
    106         break;
    107       NumElems *= 2;
    108       ElemVT = EVT::getIntegerVT(*DAG.getContext(), NewSizeInBits);
    109       NVT = EVT::getVectorVT(*DAG.getContext(), ElemVT, NumElems);
    110     }
    111 
    112     if (isTypeLegal(NVT)) {
    113       SDValue CastInOp = DAG.getNode(ISD::BITCAST, dl, NVT, InOp);
    114 
    115       SmallVector<SDValue, 8> Vals;
    116       for (unsigned i = 0; i < NumElems; ++i)
    117         Vals.push_back(DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, ElemVT,
    118                                    CastInOp, DAG.getIntPtrConstant(i)));
    119 
    120       // Build Lo, Hi pair by pairing extracted elements if needed.
    121       unsigned Slot = 0;
    122       for (unsigned e = Vals.size(); e - Slot > 2; Slot += 2, e += 1) {
    123         // Each iteration will BUILD_PAIR two nodes and append the result until
    124         // there are only two nodes left, i.e. Lo and Hi.
    125         SDValue LHS = Vals[Slot];
    126         SDValue RHS = Vals[Slot + 1];
    127 
    128         if (TLI.isBigEndian())
    129           std::swap(LHS, RHS);
    130 
    131         Vals.push_back(DAG.getNode(ISD::BUILD_PAIR, dl,
    132                                    EVT::getIntegerVT(
    133                                      *DAG.getContext(),
    134                                      LHS.getValueType().getSizeInBits() << 1),
    135                                    LHS, RHS));
    136       }
    137       Lo = Vals[Slot++];
    138       Hi = Vals[Slot++];
    139 
    140       if (TLI.isBigEndian())
    141         std::swap(Lo, Hi);
    142 
    143       return;
    144     }
    145   }
    146 
    147   // Lower the bit-convert to a store/load from the stack.
    148   assert(NOutVT.isByteSized() && "Expanded type not byte sized!");
    149 
    150   // Create the stack frame object.  Make sure it is aligned for both
    151   // the source and expanded destination types.
    152   unsigned Alignment =
    153     TLI.getDataLayout()->getPrefTypeAlignment(NOutVT.
    154                                               getTypeForEVT(*DAG.getContext()));
    155   SDValue StackPtr = DAG.CreateStackTemporary(InVT, Alignment);
    156   int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
    157   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
    158 
    159   // Emit a store to the stack slot.
    160   SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, InOp, StackPtr, PtrInfo,
    161                                false, false, 0);
    162 
    163   // Load the first half from the stack slot.
    164   Lo = DAG.getLoad(NOutVT, dl, Store, StackPtr, PtrInfo,
    165                    false, false, false, 0);
    166 
    167   // Increment the pointer to the other half.
    168   unsigned IncrementSize = NOutVT.getSizeInBits() / 8;
    169   StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
    170                          DAG.getIntPtrConstant(IncrementSize));
    171 
    172   // Load the second half from the stack slot.
    173   Hi = DAG.getLoad(NOutVT, dl, Store, StackPtr,
    174                    PtrInfo.getWithOffset(IncrementSize), false,
    175                    false, false, MinAlign(Alignment, IncrementSize));
    176 
    177   // Handle endianness of the load.
    178   if (TLI.isBigEndian())
    179     std::swap(Lo, Hi);
    180 }
    181 
    182 void DAGTypeLegalizer::ExpandRes_BUILD_PAIR(SDNode *N, SDValue &Lo,
    183                                             SDValue &Hi) {
    184   // Return the operands.
    185   Lo = N->getOperand(0);
    186   Hi = N->getOperand(1);
    187 }
    188 
    189 void DAGTypeLegalizer::ExpandRes_EXTRACT_ELEMENT(SDNode *N, SDValue &Lo,
    190                                                  SDValue &Hi) {
    191   GetExpandedOp(N->getOperand(0), Lo, Hi);
    192   SDValue Part = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() ?
    193                    Hi : Lo;
    194 
    195   assert(Part.getValueType() == N->getValueType(0) &&
    196          "Type twice as big as expanded type not itself expanded!");
    197 
    198   GetPairElements(Part, Lo, Hi);
    199 }
    200 
    201 void DAGTypeLegalizer::ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo,
    202                                                     SDValue &Hi) {
    203   SDValue OldVec = N->getOperand(0);
    204   unsigned OldElts = OldVec.getValueType().getVectorNumElements();
    205   EVT OldEltVT = OldVec.getValueType().getVectorElementType();
    206   DebugLoc dl = N->getDebugLoc();
    207 
    208   // Convert to a vector of the expanded element type, for example
    209   // <3 x i64> -> <6 x i32>.
    210   EVT OldVT = N->getValueType(0);
    211   EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(), OldVT);
    212 
    213   if (OldVT != OldEltVT) {
    214     // The result of EXTRACT_VECTOR_ELT may be larger than the element type of
    215     // the input vector.  If so, extend the elements of the input vector to the
    216     // same bitwidth as the result before expanding.
    217     assert(OldEltVT.bitsLT(OldVT) && "Result type smaller then element type!");
    218     EVT NVecVT = EVT::getVectorVT(*DAG.getContext(), OldVT, OldElts);
    219     OldVec = DAG.getNode(ISD::ANY_EXTEND, dl, NVecVT, N->getOperand(0));
    220   }
    221 
    222   SDValue NewVec = DAG.getNode(ISD::BITCAST, dl,
    223                                EVT::getVectorVT(*DAG.getContext(),
    224                                                 NewVT, 2*OldElts),
    225                                OldVec);
    226 
    227   // Extract the elements at 2 * Idx and 2 * Idx + 1 from the new vector.
    228   SDValue Idx = N->getOperand(1);
    229 
    230   // Make sure the type of Idx is big enough to hold the new values.
    231   if (Idx.getValueType().bitsLT(TLI.getPointerTy()))
    232     Idx = DAG.getNode(ISD::ZERO_EXTEND, dl, TLI.getPointerTy(), Idx);
    233 
    234   Idx = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, Idx);
    235   Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, NewVec, Idx);
    236 
    237   Idx = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx,
    238                     DAG.getConstant(1, Idx.getValueType()));
    239   Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, NewVec, Idx);
    240 
    241   if (TLI.isBigEndian())
    242     std::swap(Lo, Hi);
    243 }
    244 
    245 void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
    246                                             SDValue &Hi) {
    247   assert(ISD::isNormalLoad(N) && "This routine only for normal loads!");
    248   DebugLoc dl = N->getDebugLoc();
    249 
    250   LoadSDNode *LD = cast<LoadSDNode>(N);
    251   EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), LD->getValueType(0));
    252   SDValue Chain = LD->getChain();
    253   SDValue Ptr = LD->getBasePtr();
    254   unsigned Alignment = LD->getAlignment();
    255   bool isVolatile = LD->isVolatile();
    256   bool isNonTemporal = LD->isNonTemporal();
    257   bool isInvariant = LD->isInvariant();
    258 
    259   assert(NVT.isByteSized() && "Expanded type not byte sized!");
    260 
    261   Lo = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getPointerInfo(),
    262                    isVolatile, isNonTemporal, isInvariant, Alignment);
    263 
    264   // Increment the pointer to the other half.
    265   unsigned IncrementSize = NVT.getSizeInBits() / 8;
    266   Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
    267                     DAG.getIntPtrConstant(IncrementSize));
    268   Hi = DAG.getLoad(NVT, dl, Chain, Ptr,
    269                    LD->getPointerInfo().getWithOffset(IncrementSize),
    270                    isVolatile, isNonTemporal, isInvariant,
    271                    MinAlign(Alignment, IncrementSize));
    272 
    273   // Build a factor node to remember that this load is independent of the
    274   // other one.
    275   Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
    276                       Hi.getValue(1));
    277 
    278   // Handle endianness of the load.
    279   if (TLI.isBigEndian())
    280     std::swap(Lo, Hi);
    281 
    282   // Modified the chain - switch anything that used the old chain to use
    283   // the new one.
    284   ReplaceValueWith(SDValue(N, 1), Chain);
    285 }
    286 
    287 void DAGTypeLegalizer::ExpandRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
    288   EVT OVT = N->getValueType(0);
    289   EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
    290   SDValue Chain = N->getOperand(0);
    291   SDValue Ptr = N->getOperand(1);
    292   DebugLoc dl = N->getDebugLoc();
    293   const unsigned Align = N->getConstantOperandVal(3);
    294 
    295   Lo = DAG.getVAArg(NVT, dl, Chain, Ptr, N->getOperand(2), Align);
    296   Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, N->getOperand(2), 0);
    297 
    298   // Handle endianness of the load.
    299   if (TLI.isBigEndian())
    300     std::swap(Lo, Hi);
    301 
    302   // Modified the chain - switch anything that used the old chain to use
    303   // the new one.
    304   ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
    305 }
    306 
    307 
    308 //===--------------------------------------------------------------------===//
    309 // Generic Operand Expansion.
    310 //===--------------------------------------------------------------------===//
    311 
    312 SDValue DAGTypeLegalizer::ExpandOp_BITCAST(SDNode *N) {
    313   DebugLoc dl = N->getDebugLoc();
    314   if (N->getValueType(0).isVector()) {
    315     // An illegal expanding type is being converted to a legal vector type.
    316     // Make a two element vector out of the expanded parts and convert that
    317     // instead, but only if the new vector type is legal (otherwise there
    318     // is no point, and it might create expansion loops).  For example, on
    319     // x86 this turns v1i64 = BITCAST i64 into v1i64 = BITCAST v2i32.
    320     EVT OVT = N->getOperand(0).getValueType();
    321     EVT NVT = EVT::getVectorVT(*DAG.getContext(),
    322                                TLI.getTypeToTransformTo(*DAG.getContext(), OVT),
    323                                2);
    324 
    325     if (isTypeLegal(NVT)) {
    326       SDValue Parts[2];
    327       GetExpandedOp(N->getOperand(0), Parts[0], Parts[1]);
    328 
    329       if (TLI.isBigEndian())
    330         std::swap(Parts[0], Parts[1]);
    331 
    332       SDValue Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, NVT, Parts, 2);
    333       return DAG.getNode(ISD::BITCAST, dl, N->getValueType(0), Vec);
    334     }
    335   }
    336 
    337   // Otherwise, store to a temporary and load out again as the new type.
    338   return CreateStackStoreLoad(N->getOperand(0), N->getValueType(0));
    339 }
    340 
    341 SDValue DAGTypeLegalizer::ExpandOp_BUILD_VECTOR(SDNode *N) {
    342   // The vector type is legal but the element type needs expansion.
    343   EVT VecVT = N->getValueType(0);
    344   unsigned NumElts = VecVT.getVectorNumElements();
    345   EVT OldVT = N->getOperand(0).getValueType();
    346   EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(), OldVT);
    347   DebugLoc dl = N->getDebugLoc();
    348 
    349   assert(OldVT == VecVT.getVectorElementType() &&
    350          "BUILD_VECTOR operand type doesn't match vector element type!");
    351 
    352   // Build a vector of twice the length out of the expanded elements.
    353   // For example <3 x i64> -> <6 x i32>.
    354   std::vector<SDValue> NewElts;
    355   NewElts.reserve(NumElts*2);
    356 
    357   for (unsigned i = 0; i < NumElts; ++i) {
    358     SDValue Lo, Hi;
    359     GetExpandedOp(N->getOperand(i), Lo, Hi);
    360     if (TLI.isBigEndian())
    361       std::swap(Lo, Hi);
    362     NewElts.push_back(Lo);
    363     NewElts.push_back(Hi);
    364   }
    365 
    366   SDValue NewVec = DAG.getNode(ISD::BUILD_VECTOR, dl,
    367                                EVT::getVectorVT(*DAG.getContext(),
    368                                                 NewVT, NewElts.size()),
    369                                &NewElts[0], NewElts.size());
    370 
    371   // Convert the new vector to the old vector type.
    372   return DAG.getNode(ISD::BITCAST, dl, VecVT, NewVec);
    373 }
    374 
    375 SDValue DAGTypeLegalizer::ExpandOp_EXTRACT_ELEMENT(SDNode *N) {
    376   SDValue Lo, Hi;
    377   GetExpandedOp(N->getOperand(0), Lo, Hi);
    378   return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() ? Hi : Lo;
    379 }
    380 
    381 SDValue DAGTypeLegalizer::ExpandOp_INSERT_VECTOR_ELT(SDNode *N) {
    382   // The vector type is legal but the element type needs expansion.
    383   EVT VecVT = N->getValueType(0);
    384   unsigned NumElts = VecVT.getVectorNumElements();
    385   DebugLoc dl = N->getDebugLoc();
    386 
    387   SDValue Val = N->getOperand(1);
    388   EVT OldEVT = Val.getValueType();
    389   EVT NewEVT = TLI.getTypeToTransformTo(*DAG.getContext(), OldEVT);
    390 
    391   assert(OldEVT == VecVT.getVectorElementType() &&
    392          "Inserted element type doesn't match vector element type!");
    393 
    394   // Bitconvert to a vector of twice the length with elements of the expanded
    395   // type, insert the expanded vector elements, and then convert back.
    396   EVT NewVecVT = EVT::getVectorVT(*DAG.getContext(), NewEVT, NumElts*2);
    397   SDValue NewVec = DAG.getNode(ISD::BITCAST, dl,
    398                                NewVecVT, N->getOperand(0));
    399 
    400   SDValue Lo, Hi;
    401   GetExpandedOp(Val, Lo, Hi);
    402   if (TLI.isBigEndian())
    403     std::swap(Lo, Hi);
    404 
    405   SDValue Idx = N->getOperand(2);
    406   Idx = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, Idx);
    407   NewVec = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVecVT, NewVec, Lo, Idx);
    408   Idx = DAG.getNode(ISD::ADD, dl,
    409                     Idx.getValueType(), Idx, DAG.getIntPtrConstant(1));
    410   NewVec =  DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVecVT, NewVec, Hi, Idx);
    411 
    412   // Convert the new vector to the old vector type.
    413   return DAG.getNode(ISD::BITCAST, dl, VecVT, NewVec);
    414 }
    415 
    416 SDValue DAGTypeLegalizer::ExpandOp_SCALAR_TO_VECTOR(SDNode *N) {
    417   DebugLoc dl = N->getDebugLoc();
    418   EVT VT = N->getValueType(0);
    419   assert(VT.getVectorElementType() == N->getOperand(0).getValueType() &&
    420          "SCALAR_TO_VECTOR operand type doesn't match vector element type!");
    421   unsigned NumElts = VT.getVectorNumElements();
    422   SmallVector<SDValue, 16> Ops(NumElts);
    423   Ops[0] = N->getOperand(0);
    424   SDValue UndefVal = DAG.getUNDEF(Ops[0].getValueType());
    425   for (unsigned i = 1; i < NumElts; ++i)
    426     Ops[i] = UndefVal;
    427   return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Ops[0], NumElts);
    428 }
    429 
    430 SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
    431   assert(ISD::isNormalStore(N) && "This routine only for normal stores!");
    432   assert(OpNo == 1 && "Can only expand the stored value so far");
    433   DebugLoc dl = N->getDebugLoc();
    434 
    435   StoreSDNode *St = cast<StoreSDNode>(N);
    436   EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
    437                                      St->getValue().getValueType());
    438   SDValue Chain = St->getChain();
    439   SDValue Ptr = St->getBasePtr();
    440   unsigned Alignment = St->getAlignment();
    441   bool isVolatile = St->isVolatile();
    442   bool isNonTemporal = St->isNonTemporal();
    443 
    444   assert(NVT.isByteSized() && "Expanded type not byte sized!");
    445   unsigned IncrementSize = NVT.getSizeInBits() / 8;
    446 
    447   SDValue Lo, Hi;
    448   GetExpandedOp(St->getValue(), Lo, Hi);
    449 
    450   if (TLI.isBigEndian())
    451     std::swap(Lo, Hi);
    452 
    453   Lo = DAG.getStore(Chain, dl, Lo, Ptr, St->getPointerInfo(),
    454                     isVolatile, isNonTemporal, Alignment);
    455 
    456   Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
    457                     DAG.getIntPtrConstant(IncrementSize));
    458   assert(isTypeLegal(Ptr.getValueType()) && "Pointers must be legal!");
    459   Hi = DAG.getStore(Chain, dl, Hi, Ptr,
    460                     St->getPointerInfo().getWithOffset(IncrementSize),
    461                     isVolatile, isNonTemporal,
    462                     MinAlign(Alignment, IncrementSize));
    463 
    464   return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
    465 }
    466 
    467 
    468 //===--------------------------------------------------------------------===//
    469 // Generic Result Splitting.
    470 //===--------------------------------------------------------------------===//
    471 
    472 // Be careful to make no assumptions about which of Lo/Hi is stored first in
    473 // memory (for vectors it is always Lo first followed by Hi in the following
    474 // bytes; for integers and floats it is Lo first if and only if the machine is
    475 // little-endian).
    476 
    477 void DAGTypeLegalizer::SplitRes_MERGE_VALUES(SDNode *N, unsigned ResNo,
    478                                              SDValue &Lo, SDValue &Hi) {
    479   SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
    480   GetSplitOp(Op, Lo, Hi);
    481 }
    482 
    483 void DAGTypeLegalizer::SplitRes_SELECT(SDNode *N, SDValue &Lo,
    484                                        SDValue &Hi) {
    485   SDValue LL, LH, RL, RH, CL, CH;
    486   DebugLoc dl = N->getDebugLoc();
    487   GetSplitOp(N->getOperand(1), LL, LH);
    488   GetSplitOp(N->getOperand(2), RL, RH);
    489 
    490   SDValue Cond = N->getOperand(0);
    491   CL = CH = Cond;
    492   if (Cond.getValueType().isVector()) {
    493     assert(Cond.getValueType().getVectorElementType() == MVT::i1 &&
    494            "Condition legalized before result?");
    495     unsigned NumElements = Cond.getValueType().getVectorNumElements();
    496     EVT VCondTy = EVT::getVectorVT(*DAG.getContext(), MVT::i1, NumElements / 2);
    497     CL = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VCondTy, Cond,
    498                      DAG.getIntPtrConstant(0));
    499     CH = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VCondTy, Cond,
    500                      DAG.getIntPtrConstant(NumElements / 2));
    501   }
    502 
    503   Lo = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), CL, LL, RL);
    504   Hi = DAG.getNode(N->getOpcode(), dl, LH.getValueType(), CH, LH, RH);
    505 }
    506 
    507 void DAGTypeLegalizer::SplitRes_SELECT_CC(SDNode *N, SDValue &Lo,
    508                                           SDValue &Hi) {
    509   SDValue LL, LH, RL, RH;
    510   DebugLoc dl = N->getDebugLoc();
    511   GetSplitOp(N->getOperand(2), LL, LH);
    512   GetSplitOp(N->getOperand(3), RL, RH);
    513 
    514   Lo = DAG.getNode(ISD::SELECT_CC, dl, LL.getValueType(), N->getOperand(0),
    515                    N->getOperand(1), LL, RL, N->getOperand(4));
    516   Hi = DAG.getNode(ISD::SELECT_CC, dl, LH.getValueType(), N->getOperand(0),
    517                    N->getOperand(1), LH, RH, N->getOperand(4));
    518 }
    519 
    520 void DAGTypeLegalizer::SplitRes_UNDEF(SDNode *N, SDValue &Lo, SDValue &Hi) {
    521   EVT LoVT, HiVT;
    522   GetSplitDestVTs(N->getValueType(0), LoVT, HiVT);
    523   Lo = DAG.getUNDEF(LoVT);
    524   Hi = DAG.getUNDEF(HiVT);
    525 }
    526