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/Target/TargetData.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     EVT NVT = EVT::getVectorVT(*DAG.getContext(), NOutVT, 2);
     98 
     99     if (isTypeLegal(NVT)) {
    100       SDValue CastInOp = DAG.getNode(ISD::BITCAST, dl, NVT, InOp);
    101       Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NOutVT, CastInOp,
    102                        DAG.getIntPtrConstant(0));
    103       Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NOutVT, CastInOp,
    104                        DAG.getIntPtrConstant(1));
    105 
    106       if (TLI.isBigEndian())
    107         std::swap(Lo, Hi);
    108 
    109       return;
    110     }
    111   }
    112 
    113   // Lower the bit-convert to a store/load from the stack.
    114   assert(NOutVT.isByteSized() && "Expanded type not byte sized!");
    115 
    116   // Create the stack frame object.  Make sure it is aligned for both
    117   // the source and expanded destination types.
    118   unsigned Alignment =
    119     TLI.getTargetData()->getPrefTypeAlignment(NOutVT.
    120                                               getTypeForEVT(*DAG.getContext()));
    121   SDValue StackPtr = DAG.CreateStackTemporary(InVT, Alignment);
    122   int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
    123   MachinePointerInfo PtrInfo = MachinePointerInfo::getFixedStack(SPFI);
    124 
    125   // Emit a store to the stack slot.
    126   SDValue Store = DAG.getStore(DAG.getEntryNode(), dl, InOp, StackPtr, PtrInfo,
    127                                false, false, 0);
    128 
    129   // Load the first half from the stack slot.
    130   Lo = DAG.getLoad(NOutVT, dl, Store, StackPtr, PtrInfo,
    131                    false, false, false, 0);
    132 
    133   // Increment the pointer to the other half.
    134   unsigned IncrementSize = NOutVT.getSizeInBits() / 8;
    135   StackPtr = DAG.getNode(ISD::ADD, dl, StackPtr.getValueType(), StackPtr,
    136                          DAG.getIntPtrConstant(IncrementSize));
    137 
    138   // Load the second half from the stack slot.
    139   Hi = DAG.getLoad(NOutVT, dl, Store, StackPtr,
    140                    PtrInfo.getWithOffset(IncrementSize), false,
    141                    false, false, MinAlign(Alignment, IncrementSize));
    142 
    143   // Handle endianness of the load.
    144   if (TLI.isBigEndian())
    145     std::swap(Lo, Hi);
    146 }
    147 
    148 void DAGTypeLegalizer::ExpandRes_BUILD_PAIR(SDNode *N, SDValue &Lo,
    149                                             SDValue &Hi) {
    150   // Return the operands.
    151   Lo = N->getOperand(0);
    152   Hi = N->getOperand(1);
    153 }
    154 
    155 void DAGTypeLegalizer::ExpandRes_EXTRACT_ELEMENT(SDNode *N, SDValue &Lo,
    156                                                  SDValue &Hi) {
    157   GetExpandedOp(N->getOperand(0), Lo, Hi);
    158   SDValue Part = cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() ?
    159                    Hi : Lo;
    160 
    161   assert(Part.getValueType() == N->getValueType(0) &&
    162          "Type twice as big as expanded type not itself expanded!");
    163 
    164   GetPairElements(Part, Lo, Hi);
    165 }
    166 
    167 void DAGTypeLegalizer::ExpandRes_EXTRACT_VECTOR_ELT(SDNode *N, SDValue &Lo,
    168                                                     SDValue &Hi) {
    169   SDValue OldVec = N->getOperand(0);
    170   unsigned OldElts = OldVec.getValueType().getVectorNumElements();
    171   EVT OldEltVT = OldVec.getValueType().getVectorElementType();
    172   DebugLoc dl = N->getDebugLoc();
    173 
    174   // Convert to a vector of the expanded element type, for example
    175   // <3 x i64> -> <6 x i32>.
    176   EVT OldVT = N->getValueType(0);
    177   EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(), OldVT);
    178 
    179   if (OldVT != OldEltVT) {
    180     // The result of EXTRACT_VECTOR_ELT may be larger than the element type of
    181     // the input vector.  If so, extend the elements of the input vector to the
    182     // same bitwidth as the result before expanding.
    183     assert(OldEltVT.bitsLT(OldVT) && "Result type smaller then element type!");
    184     EVT NVecVT = EVT::getVectorVT(*DAG.getContext(), OldVT, OldElts);
    185     OldVec = DAG.getNode(ISD::ANY_EXTEND, dl, NVecVT, N->getOperand(0));
    186   }
    187 
    188   SDValue NewVec = DAG.getNode(ISD::BITCAST, dl,
    189                                EVT::getVectorVT(*DAG.getContext(),
    190                                                 NewVT, 2*OldElts),
    191                                OldVec);
    192 
    193   // Extract the elements at 2 * Idx and 2 * Idx + 1 from the new vector.
    194   SDValue Idx = N->getOperand(1);
    195 
    196   // Make sure the type of Idx is big enough to hold the new values.
    197   if (Idx.getValueType().bitsLT(TLI.getPointerTy()))
    198     Idx = DAG.getNode(ISD::ZERO_EXTEND, dl, TLI.getPointerTy(), Idx);
    199 
    200   Idx = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, Idx);
    201   Lo = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, NewVec, Idx);
    202 
    203   Idx = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx,
    204                     DAG.getConstant(1, Idx.getValueType()));
    205   Hi = DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, NewVT, NewVec, Idx);
    206 
    207   if (TLI.isBigEndian())
    208     std::swap(Lo, Hi);
    209 }
    210 
    211 void DAGTypeLegalizer::ExpandRes_NormalLoad(SDNode *N, SDValue &Lo,
    212                                             SDValue &Hi) {
    213   assert(ISD::isNormalLoad(N) && "This routine only for normal loads!");
    214   DebugLoc dl = N->getDebugLoc();
    215 
    216   LoadSDNode *LD = cast<LoadSDNode>(N);
    217   EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), LD->getValueType(0));
    218   SDValue Chain = LD->getChain();
    219   SDValue Ptr = LD->getBasePtr();
    220   unsigned Alignment = LD->getAlignment();
    221   bool isVolatile = LD->isVolatile();
    222   bool isNonTemporal = LD->isNonTemporal();
    223   bool isInvariant = LD->isInvariant();
    224 
    225   assert(NVT.isByteSized() && "Expanded type not byte sized!");
    226 
    227   Lo = DAG.getLoad(NVT, dl, Chain, Ptr, LD->getPointerInfo(),
    228                    isVolatile, isNonTemporal, isInvariant, Alignment);
    229 
    230   // Increment the pointer to the other half.
    231   unsigned IncrementSize = NVT.getSizeInBits() / 8;
    232   Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
    233                     DAG.getIntPtrConstant(IncrementSize));
    234   Hi = DAG.getLoad(NVT, dl, Chain, Ptr,
    235                    LD->getPointerInfo().getWithOffset(IncrementSize),
    236                    isVolatile, isNonTemporal, isInvariant,
    237                    MinAlign(Alignment, IncrementSize));
    238 
    239   // Build a factor node to remember that this load is independent of the
    240   // other one.
    241   Chain = DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo.getValue(1),
    242                       Hi.getValue(1));
    243 
    244   // Handle endianness of the load.
    245   if (TLI.isBigEndian())
    246     std::swap(Lo, Hi);
    247 
    248   // Modified the chain - switch anything that used the old chain to use
    249   // the new one.
    250   ReplaceValueWith(SDValue(N, 1), Chain);
    251 }
    252 
    253 void DAGTypeLegalizer::ExpandRes_VAARG(SDNode *N, SDValue &Lo, SDValue &Hi) {
    254   EVT OVT = N->getValueType(0);
    255   EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(), OVT);
    256   SDValue Chain = N->getOperand(0);
    257   SDValue Ptr = N->getOperand(1);
    258   DebugLoc dl = N->getDebugLoc();
    259   const unsigned Align = N->getConstantOperandVal(3);
    260 
    261   Lo = DAG.getVAArg(NVT, dl, Chain, Ptr, N->getOperand(2), Align);
    262   Hi = DAG.getVAArg(NVT, dl, Lo.getValue(1), Ptr, N->getOperand(2), 0);
    263 
    264   // Handle endianness of the load.
    265   if (TLI.isBigEndian())
    266     std::swap(Lo, Hi);
    267 
    268   // Modified the chain - switch anything that used the old chain to use
    269   // the new one.
    270   ReplaceValueWith(SDValue(N, 1), Hi.getValue(1));
    271 }
    272 
    273 
    274 //===--------------------------------------------------------------------===//
    275 // Generic Operand Expansion.
    276 //===--------------------------------------------------------------------===//
    277 
    278 SDValue DAGTypeLegalizer::ExpandOp_BITCAST(SDNode *N) {
    279   DebugLoc dl = N->getDebugLoc();
    280   if (N->getValueType(0).isVector()) {
    281     // An illegal expanding type is being converted to a legal vector type.
    282     // Make a two element vector out of the expanded parts and convert that
    283     // instead, but only if the new vector type is legal (otherwise there
    284     // is no point, and it might create expansion loops).  For example, on
    285     // x86 this turns v1i64 = BITCAST i64 into v1i64 = BITCAST v2i32.
    286     EVT OVT = N->getOperand(0).getValueType();
    287     EVT NVT = EVT::getVectorVT(*DAG.getContext(),
    288                                TLI.getTypeToTransformTo(*DAG.getContext(), OVT),
    289                                2);
    290 
    291     if (isTypeLegal(NVT)) {
    292       SDValue Parts[2];
    293       GetExpandedOp(N->getOperand(0), Parts[0], Parts[1]);
    294 
    295       if (TLI.isBigEndian())
    296         std::swap(Parts[0], Parts[1]);
    297 
    298       SDValue Vec = DAG.getNode(ISD::BUILD_VECTOR, dl, NVT, Parts, 2);
    299       return DAG.getNode(ISD::BITCAST, dl, N->getValueType(0), Vec);
    300     }
    301   }
    302 
    303   // Otherwise, store to a temporary and load out again as the new type.
    304   return CreateStackStoreLoad(N->getOperand(0), N->getValueType(0));
    305 }
    306 
    307 SDValue DAGTypeLegalizer::ExpandOp_BUILD_VECTOR(SDNode *N) {
    308   // The vector type is legal but the element type needs expansion.
    309   EVT VecVT = N->getValueType(0);
    310   unsigned NumElts = VecVT.getVectorNumElements();
    311   EVT OldVT = N->getOperand(0).getValueType();
    312   EVT NewVT = TLI.getTypeToTransformTo(*DAG.getContext(), OldVT);
    313   DebugLoc dl = N->getDebugLoc();
    314 
    315   assert(OldVT == VecVT.getVectorElementType() &&
    316          "BUILD_VECTOR operand type doesn't match vector element type!");
    317 
    318   // Build a vector of twice the length out of the expanded elements.
    319   // For example <3 x i64> -> <6 x i32>.
    320   std::vector<SDValue> NewElts;
    321   NewElts.reserve(NumElts*2);
    322 
    323   for (unsigned i = 0; i < NumElts; ++i) {
    324     SDValue Lo, Hi;
    325     GetExpandedOp(N->getOperand(i), Lo, Hi);
    326     if (TLI.isBigEndian())
    327       std::swap(Lo, Hi);
    328     NewElts.push_back(Lo);
    329     NewElts.push_back(Hi);
    330   }
    331 
    332   SDValue NewVec = DAG.getNode(ISD::BUILD_VECTOR, dl,
    333                                EVT::getVectorVT(*DAG.getContext(),
    334                                                 NewVT, NewElts.size()),
    335                                &NewElts[0], NewElts.size());
    336 
    337   // Convert the new vector to the old vector type.
    338   return DAG.getNode(ISD::BITCAST, dl, VecVT, NewVec);
    339 }
    340 
    341 SDValue DAGTypeLegalizer::ExpandOp_EXTRACT_ELEMENT(SDNode *N) {
    342   SDValue Lo, Hi;
    343   GetExpandedOp(N->getOperand(0), Lo, Hi);
    344   return cast<ConstantSDNode>(N->getOperand(1))->getZExtValue() ? Hi : Lo;
    345 }
    346 
    347 SDValue DAGTypeLegalizer::ExpandOp_INSERT_VECTOR_ELT(SDNode *N) {
    348   // The vector type is legal but the element type needs expansion.
    349   EVT VecVT = N->getValueType(0);
    350   unsigned NumElts = VecVT.getVectorNumElements();
    351   DebugLoc dl = N->getDebugLoc();
    352 
    353   SDValue Val = N->getOperand(1);
    354   EVT OldEVT = Val.getValueType();
    355   EVT NewEVT = TLI.getTypeToTransformTo(*DAG.getContext(), OldEVT);
    356 
    357   assert(OldEVT == VecVT.getVectorElementType() &&
    358          "Inserted element type doesn't match vector element type!");
    359 
    360   // Bitconvert to a vector of twice the length with elements of the expanded
    361   // type, insert the expanded vector elements, and then convert back.
    362   EVT NewVecVT = EVT::getVectorVT(*DAG.getContext(), NewEVT, NumElts*2);
    363   SDValue NewVec = DAG.getNode(ISD::BITCAST, dl,
    364                                NewVecVT, N->getOperand(0));
    365 
    366   SDValue Lo, Hi;
    367   GetExpandedOp(Val, Lo, Hi);
    368   if (TLI.isBigEndian())
    369     std::swap(Lo, Hi);
    370 
    371   SDValue Idx = N->getOperand(2);
    372   Idx = DAG.getNode(ISD::ADD, dl, Idx.getValueType(), Idx, Idx);
    373   NewVec = DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVecVT, NewVec, Lo, Idx);
    374   Idx = DAG.getNode(ISD::ADD, dl,
    375                     Idx.getValueType(), Idx, DAG.getIntPtrConstant(1));
    376   NewVec =  DAG.getNode(ISD::INSERT_VECTOR_ELT, dl, NewVecVT, NewVec, Hi, Idx);
    377 
    378   // Convert the new vector to the old vector type.
    379   return DAG.getNode(ISD::BITCAST, dl, VecVT, NewVec);
    380 }
    381 
    382 SDValue DAGTypeLegalizer::ExpandOp_SCALAR_TO_VECTOR(SDNode *N) {
    383   DebugLoc dl = N->getDebugLoc();
    384   EVT VT = N->getValueType(0);
    385   assert(VT.getVectorElementType() == N->getOperand(0).getValueType() &&
    386          "SCALAR_TO_VECTOR operand type doesn't match vector element type!");
    387   unsigned NumElts = VT.getVectorNumElements();
    388   SmallVector<SDValue, 16> Ops(NumElts);
    389   Ops[0] = N->getOperand(0);
    390   SDValue UndefVal = DAG.getUNDEF(Ops[0].getValueType());
    391   for (unsigned i = 1; i < NumElts; ++i)
    392     Ops[i] = UndefVal;
    393   return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, &Ops[0], NumElts);
    394 }
    395 
    396 SDValue DAGTypeLegalizer::ExpandOp_NormalStore(SDNode *N, unsigned OpNo) {
    397   assert(ISD::isNormalStore(N) && "This routine only for normal stores!");
    398   assert(OpNo == 1 && "Can only expand the stored value so far");
    399   DebugLoc dl = N->getDebugLoc();
    400 
    401   StoreSDNode *St = cast<StoreSDNode>(N);
    402   EVT NVT = TLI.getTypeToTransformTo(*DAG.getContext(),
    403                                      St->getValue().getValueType());
    404   SDValue Chain = St->getChain();
    405   SDValue Ptr = St->getBasePtr();
    406   unsigned Alignment = St->getAlignment();
    407   bool isVolatile = St->isVolatile();
    408   bool isNonTemporal = St->isNonTemporal();
    409 
    410   assert(NVT.isByteSized() && "Expanded type not byte sized!");
    411   unsigned IncrementSize = NVT.getSizeInBits() / 8;
    412 
    413   SDValue Lo, Hi;
    414   GetExpandedOp(St->getValue(), Lo, Hi);
    415 
    416   if (TLI.isBigEndian())
    417     std::swap(Lo, Hi);
    418 
    419   Lo = DAG.getStore(Chain, dl, Lo, Ptr, St->getPointerInfo(),
    420                     isVolatile, isNonTemporal, Alignment);
    421 
    422   Ptr = DAG.getNode(ISD::ADD, dl, Ptr.getValueType(), Ptr,
    423                     DAG.getIntPtrConstant(IncrementSize));
    424   assert(isTypeLegal(Ptr.getValueType()) && "Pointers must be legal!");
    425   Hi = DAG.getStore(Chain, dl, Hi, Ptr,
    426                     St->getPointerInfo().getWithOffset(IncrementSize),
    427                     isVolatile, isNonTemporal,
    428                     MinAlign(Alignment, IncrementSize));
    429 
    430   return DAG.getNode(ISD::TokenFactor, dl, MVT::Other, Lo, Hi);
    431 }
    432 
    433 
    434 //===--------------------------------------------------------------------===//
    435 // Generic Result Splitting.
    436 //===--------------------------------------------------------------------===//
    437 
    438 // Be careful to make no assumptions about which of Lo/Hi is stored first in
    439 // memory (for vectors it is always Lo first followed by Hi in the following
    440 // bytes; for integers and floats it is Lo first if and only if the machine is
    441 // little-endian).
    442 
    443 void DAGTypeLegalizer::SplitRes_MERGE_VALUES(SDNode *N, unsigned ResNo,
    444                                              SDValue &Lo, SDValue &Hi) {
    445   SDValue Op = DisintegrateMERGE_VALUES(N, ResNo);
    446   GetSplitOp(Op, Lo, Hi);
    447 }
    448 
    449 void DAGTypeLegalizer::SplitRes_SELECT(SDNode *N, SDValue &Lo,
    450                                        SDValue &Hi) {
    451   SDValue LL, LH, RL, RH, CL, CH;
    452   DebugLoc dl = N->getDebugLoc();
    453   GetSplitOp(N->getOperand(1), LL, LH);
    454   GetSplitOp(N->getOperand(2), RL, RH);
    455 
    456   SDValue Cond = N->getOperand(0);
    457   CL = CH = Cond;
    458   if (Cond.getValueType().isVector()) {
    459     assert(Cond.getValueType().getVectorElementType() == MVT::i1 &&
    460            "Condition legalized before result?");
    461     unsigned NumElements = Cond.getValueType().getVectorNumElements();
    462     EVT VCondTy = EVT::getVectorVT(*DAG.getContext(), MVT::i1, NumElements / 2);
    463     CL = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VCondTy, Cond,
    464                      DAG.getIntPtrConstant(0));
    465     CH = DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, VCondTy, Cond,
    466                      DAG.getIntPtrConstant(NumElements / 2));
    467   }
    468 
    469   Lo = DAG.getNode(N->getOpcode(), dl, LL.getValueType(), CL, LL, RL);
    470   Hi = DAG.getNode(N->getOpcode(), dl, LH.getValueType(), CH, LH, RH);
    471 }
    472 
    473 void DAGTypeLegalizer::SplitRes_SELECT_CC(SDNode *N, SDValue &Lo,
    474                                           SDValue &Hi) {
    475   SDValue LL, LH, RL, RH;
    476   DebugLoc dl = N->getDebugLoc();
    477   GetSplitOp(N->getOperand(2), LL, LH);
    478   GetSplitOp(N->getOperand(3), RL, RH);
    479 
    480   Lo = DAG.getNode(ISD::SELECT_CC, dl, LL.getValueType(), N->getOperand(0),
    481                    N->getOperand(1), LL, RL, N->getOperand(4));
    482   Hi = DAG.getNode(ISD::SELECT_CC, dl, LH.getValueType(), N->getOperand(0),
    483                    N->getOperand(1), LH, RH, N->getOperand(4));
    484 }
    485 
    486 void DAGTypeLegalizer::SplitRes_UNDEF(SDNode *N, SDValue &Lo, SDValue &Hi) {
    487   EVT LoVT, HiVT;
    488   GetSplitDestVTs(N->getValueType(0), LoVT, HiVT);
    489   Lo = DAG.getUNDEF(LoVT);
    490   Hi = DAG.getUNDEF(HiVT);
    491 }
    492