LLVM API Documentation

PPCGenDAGISel.inc

Go to the documentation of this file.
00001 //===- TableGen'erated file -------------------------------------*- C++ -*-===//
00002 //
00003 // DAG Instruction Selector for the PPC target
00004 //
00005 // Automatically generated file, do not edit!
00006 //
00007 //===----------------------------------------------------------------------===//
00008 
00009 // *** NOTE: This file is #included into the middle of the target
00010 // *** instruction selector class.  These functions are really methods.
00011 
00012 // Include standard, target-independent definitions and methods used
00013 // by the instruction selector.
00014 #include <llvm/CodeGen/DAGISelHeader.h>
00015 
00016 
00017 // Node transformations.
00018 inline SDValue Transform_HA16(SDNode *inN) {
00019   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00020 
00021   // Transformation function: shift the immediate value down into the low bits.
00022   signed int Val = N->getZExtValue();
00023   return getI32Imm((Val - (signed short)Val) >> 16);
00024 
00025 }
00026 inline SDValue Transform_HI16(SDNode *inN) {
00027   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00028 
00029   // Transformation function: shift the immediate value down into the low bits.
00030   return getI32Imm((unsigned)N->getZExtValue() >> 16);
00031 
00032 }
00033 inline SDValue Transform_HI32_48(SDNode *inN) {
00034   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00035 
00036   // Transformation function: shift the immediate value down into the low bits.
00037   return getI32Imm((unsigned short)(N->getZExtValue() >> 32));
00038 
00039 }
00040 inline SDValue Transform_HI48_64(SDNode *inN) {
00041   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00042 
00043   // Transformation function: shift the immediate value down into the low bits.
00044   return getI32Imm((unsigned short)(N->getZExtValue() >> 48));
00045 
00046 }
00047 inline SDValue Transform_LO16(SDNode *inN) {
00048   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00049 
00050   // Transformation function: get the low 16 bits.
00051   return getI32Imm((unsigned short)N->getZExtValue());
00052 
00053 }
00054 inline SDValue Transform_MB(SDNode *inN) {
00055   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00056 
00057   // Transformation function: get the start bit of a mask
00058   unsigned mb = 0, me;
00059   (void)isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
00060   return getI32Imm(mb);
00061 
00062 }
00063 inline SDValue Transform_ME(SDNode *inN) {
00064   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00065 
00066   // Transformation function: get the end bit of a mask
00067   unsigned mb, me = 0;
00068   (void)isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
00069   return getI32Imm(me);
00070 
00071 }
00072 inline SDValue Transform_SHL32(SDNode *inN) {
00073   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00074 
00075   // Transformation function: 31 - imm
00076   return getI32Imm(31 - N->getZExtValue());
00077 
00078 }
00079 inline SDValue Transform_SHL64(SDNode *inN) {
00080   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00081 
00082   // Transformation function: 63 - imm
00083   return getI32Imm(63 - N->getZExtValue());
00084 
00085 }
00086 inline SDValue Transform_SRL32(SDNode *inN) {
00087   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00088 
00089   // Transformation function: 32 - imm
00090   return N->getZExtValue() ? getI32Imm(32 - N->getZExtValue()) : getI32Imm(0);
00091 
00092 }
00093 inline SDValue Transform_SRL64(SDNode *inN) {
00094   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00095 
00096   // Transformation function: 64 - imm
00097   return N->getZExtValue() ? getI32Imm(64 - N->getZExtValue()) : getI32Imm(0);
00098 
00099 }
00100 inline SDValue Transform_VSLDOI_get_imm(SDNode *N) {
00101 
00102   return getI32Imm(PPC::isVSLDOIShuffleMask(N, false));
00103 
00104 }
00105 inline SDValue Transform_VSLDOI_unary_get_imm(SDNode *N) {
00106 
00107   return getI32Imm(PPC::isVSLDOIShuffleMask(N, true));
00108 
00109 }
00110 inline SDValue Transform_VSPLTB_get_imm(SDNode *N) {
00111 
00112   return getI32Imm(PPC::getVSPLTImmediate(N, 1));
00113 
00114 }
00115 inline SDValue Transform_VSPLTH_get_imm(SDNode *N) {
00116 
00117   return getI32Imm(PPC::getVSPLTImmediate(N, 2));
00118 
00119 }
00120 inline SDValue Transform_VSPLTISB_get_imm(SDNode *N) {
00121 
00122   return PPC::get_VSPLTI_elt(N, 1, *CurDAG);
00123 
00124 }
00125 inline SDValue Transform_VSPLTISH_get_imm(SDNode *N) {
00126 
00127   return PPC::get_VSPLTI_elt(N, 2, *CurDAG);
00128 
00129 }
00130 inline SDValue Transform_VSPLTISW_get_imm(SDNode *N) {
00131 
00132   return PPC::get_VSPLTI_elt(N, 4, *CurDAG);
00133 
00134 }
00135 inline SDValue Transform_VSPLTW_get_imm(SDNode *N) {
00136 
00137   return getI32Imm(PPC::getVSPLTImmediate(N, 4));
00138 
00139 }
00140 
00141 // Predicate functions.
00142 inline bool Predicate_VMRGHB_shuffle_mask(SDNode *N) {
00143 
00144   return PPC::isVMRGHShuffleMask(N, 1, false);
00145 
00146 }
00147 inline bool Predicate_VMRGHB_unary_shuffle_mask(SDNode *N) {
00148 
00149   return PPC::isVMRGHShuffleMask(N, 1, true);
00150 
00151 }
00152 inline bool Predicate_VMRGHH_shuffle_mask(SDNode *N) {
00153 
00154   return PPC::isVMRGHShuffleMask(N, 2, false);
00155 
00156 }
00157 inline bool Predicate_VMRGHH_unary_shuffle_mask(SDNode *N) {
00158 
00159   return PPC::isVMRGHShuffleMask(N, 2, true);
00160 
00161 }
00162 inline bool Predicate_VMRGHW_shuffle_mask(SDNode *N) {
00163 
00164   return PPC::isVMRGHShuffleMask(N, 4, false);
00165 
00166 }
00167 inline bool Predicate_VMRGHW_unary_shuffle_mask(SDNode *N) {
00168 
00169   return PPC::isVMRGHShuffleMask(N, 4, true);
00170 
00171 }
00172 inline bool Predicate_VMRGLB_shuffle_mask(SDNode *N) {
00173 
00174   return PPC::isVMRGLShuffleMask(N, 1, false);
00175 
00176 }
00177 inline bool Predicate_VMRGLB_unary_shuffle_mask(SDNode *N) {
00178 
00179   return PPC::isVMRGLShuffleMask(N, 1, true);
00180 
00181 }
00182 inline bool Predicate_VMRGLH_shuffle_mask(SDNode *N) {
00183 
00184   return PPC::isVMRGLShuffleMask(N, 2, false);
00185 
00186 }
00187 inline bool Predicate_VMRGLH_unary_shuffle_mask(SDNode *N) {
00188 
00189   return PPC::isVMRGLShuffleMask(N, 2, true);
00190 
00191 }
00192 inline bool Predicate_VMRGLW_shuffle_mask(SDNode *N) {
00193 
00194   return PPC::isVMRGLShuffleMask(N, 4, false);
00195 
00196 }
00197 inline bool Predicate_VMRGLW_unary_shuffle_mask(SDNode *N) {
00198 
00199   return PPC::isVMRGLShuffleMask(N, 4, true);
00200 
00201 }
00202 inline bool Predicate_VPKUHUM_shuffle_mask(SDNode *N) {
00203 
00204   return PPC::isVPKUHUMShuffleMask(N, false);
00205 
00206 }
00207 inline bool Predicate_VPKUHUM_unary_shuffle_mask(SDNode *N) {
00208 
00209   return PPC::isVPKUHUMShuffleMask(N, true);
00210 
00211 }
00212 inline bool Predicate_VPKUWUM_shuffle_mask(SDNode *N) {
00213 
00214   return PPC::isVPKUWUMShuffleMask(N, false);
00215 
00216 }
00217 inline bool Predicate_VPKUWUM_unary_shuffle_mask(SDNode *N) {
00218 
00219   return PPC::isVPKUWUMShuffleMask(N, true);
00220 
00221 }
00222 inline bool Predicate_VSLDOI_shuffle_mask(SDNode *N) {
00223 
00224   return PPC::isVSLDOIShuffleMask(N, false) != -1;
00225 
00226 }
00227 inline bool Predicate_VSLDOI_unary_shuffle_mask(SDNode *N) {
00228 
00229   return PPC::isVSLDOIShuffleMask(N, true) != -1;
00230 
00231 }
00232 inline bool Predicate_VSPLTB_shuffle_mask(SDNode *N) {
00233 
00234   return PPC::isSplatShuffleMask(N, 1);
00235 
00236 }
00237 inline bool Predicate_VSPLTH_shuffle_mask(SDNode *N) {
00238 
00239   return PPC::isSplatShuffleMask(N, 2);
00240 
00241 }
00242 inline bool Predicate_VSPLTW_shuffle_mask(SDNode *N) {
00243 
00244   return PPC::isSplatShuffleMask(N, 4);
00245 
00246 }
00247 inline bool Predicate_V_immneg0(SDNode *N) {
00248 
00249   return PPC::isAllNegativeZeroVector(N);
00250 
00251 }
00252 inline bool Predicate_atomic_cmp_swap_16(SDNode *N) {
00253 
00254   return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00255 
00256 }
00257 inline bool Predicate_atomic_cmp_swap_32(SDNode *N) {
00258 
00259   return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00260 
00261 }
00262 inline bool Predicate_atomic_cmp_swap_64(SDNode *N) {
00263 
00264   return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00265 
00266 }
00267 inline bool Predicate_atomic_cmp_swap_8(SDNode *N) {
00268 
00269   return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00270 
00271 }
00272 inline bool Predicate_atomic_load_add_16(SDNode *N) {
00273 
00274     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00275   
00276 }
00277 inline bool Predicate_atomic_load_add_32(SDNode *N) {
00278 
00279     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00280   
00281 }
00282 inline bool Predicate_atomic_load_add_64(SDNode *N) {
00283 
00284     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00285   
00286 }
00287 inline bool Predicate_atomic_load_add_8(SDNode *N) {
00288 
00289     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00290   
00291 }
00292 inline bool Predicate_atomic_load_and_16(SDNode *N) {
00293 
00294     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00295   
00296 }
00297 inline bool Predicate_atomic_load_and_32(SDNode *N) {
00298 
00299     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00300   
00301 }
00302 inline bool Predicate_atomic_load_and_64(SDNode *N) {
00303 
00304     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00305   
00306 }
00307 inline bool Predicate_atomic_load_and_8(SDNode *N) {
00308 
00309     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00310   
00311 }
00312 inline bool Predicate_atomic_load_max_16(SDNode *N) {
00313 
00314     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00315   
00316 }
00317 inline bool Predicate_atomic_load_max_32(SDNode *N) {
00318 
00319     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00320   
00321 }
00322 inline bool Predicate_atomic_load_max_64(SDNode *N) {
00323 
00324     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00325   
00326 }
00327 inline bool Predicate_atomic_load_max_8(SDNode *N) {
00328 
00329     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00330   
00331 }
00332 inline bool Predicate_atomic_load_min_16(SDNode *N) {
00333 
00334     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00335   
00336 }
00337 inline bool Predicate_atomic_load_min_32(SDNode *N) {
00338 
00339     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00340   
00341 }
00342 inline bool Predicate_atomic_load_min_64(SDNode *N) {
00343 
00344     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00345   
00346 }
00347 inline bool Predicate_atomic_load_min_8(SDNode *N) {
00348 
00349     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00350   
00351 }
00352 inline bool Predicate_atomic_load_nand_16(SDNode *N) {
00353 
00354     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00355   
00356 }
00357 inline bool Predicate_atomic_load_nand_32(SDNode *N) {
00358 
00359     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00360   
00361 }
00362 inline bool Predicate_atomic_load_nand_64(SDNode *N) {
00363 
00364     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00365   
00366 }
00367 inline bool Predicate_atomic_load_nand_8(SDNode *N) {
00368 
00369     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00370   
00371 }
00372 inline bool Predicate_atomic_load_or_16(SDNode *N) {
00373 
00374     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00375   
00376 }
00377 inline bool Predicate_atomic_load_or_32(SDNode *N) {
00378 
00379     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00380   
00381 }
00382 inline bool Predicate_atomic_load_or_64(SDNode *N) {
00383 
00384     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00385   
00386 }
00387 inline bool Predicate_atomic_load_or_8(SDNode *N) {
00388 
00389     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00390   
00391 }
00392 inline bool Predicate_atomic_load_sub_16(SDNode *N) {
00393 
00394     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00395   
00396 }
00397 inline bool Predicate_atomic_load_sub_32(SDNode *N) {
00398 
00399     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00400   
00401 }
00402 inline bool Predicate_atomic_load_sub_64(SDNode *N) {
00403 
00404     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00405   
00406 }
00407 inline bool Predicate_atomic_load_sub_8(SDNode *N) {
00408 
00409     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00410   
00411 }
00412 inline bool Predicate_atomic_load_umax_16(SDNode *N) {
00413 
00414     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00415   
00416 }
00417 inline bool Predicate_atomic_load_umax_32(SDNode *N) {
00418 
00419     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00420   
00421 }
00422 inline bool Predicate_atomic_load_umax_64(SDNode *N) {
00423 
00424     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00425   
00426 }
00427 inline bool Predicate_atomic_load_umax_8(SDNode *N) {
00428 
00429     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00430   
00431 }
00432 inline bool Predicate_atomic_load_umin_16(SDNode *N) {
00433 
00434     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00435   
00436 }
00437 inline bool Predicate_atomic_load_umin_32(SDNode *N) {
00438 
00439     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00440   
00441 }
00442 inline bool Predicate_atomic_load_umin_64(SDNode *N) {
00443 
00444     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00445   
00446 }
00447 inline bool Predicate_atomic_load_umin_8(SDNode *N) {
00448 
00449     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00450   
00451 }
00452 inline bool Predicate_atomic_load_xor_16(SDNode *N) {
00453 
00454     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00455   
00456 }
00457 inline bool Predicate_atomic_load_xor_32(SDNode *N) {
00458 
00459     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00460   
00461 }
00462 inline bool Predicate_atomic_load_xor_64(SDNode *N) {
00463 
00464     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00465   
00466 }
00467 inline bool Predicate_atomic_load_xor_8(SDNode *N) {
00468 
00469     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00470   
00471 }
00472 inline bool Predicate_atomic_swap_16(SDNode *N) {
00473 
00474     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16;
00475   
00476 }
00477 inline bool Predicate_atomic_swap_32(SDNode *N) {
00478 
00479     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32;
00480   
00481 }
00482 inline bool Predicate_atomic_swap_64(SDNode *N) {
00483 
00484     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64;
00485   
00486 }
00487 inline bool Predicate_atomic_swap_8(SDNode *N) {
00488 
00489     return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8;
00490   
00491 }
00492 inline bool Predicate_cvtff(SDNode *N) {
00493 
00494        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FF;
00495     
00496 }
00497 inline bool Predicate_cvtfs(SDNode *N) {
00498 
00499        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FS;
00500     
00501 }
00502 inline bool Predicate_cvtfu(SDNode *N) {
00503 
00504        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FU;
00505     
00506 }
00507 inline bool Predicate_cvtsf(SDNode *N) {
00508 
00509        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SF;
00510     
00511 }
00512 inline bool Predicate_cvtss(SDNode *N) {
00513 
00514        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SS;
00515     
00516 }
00517 inline bool Predicate_cvtsu(SDNode *N) {
00518 
00519        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SU;
00520     
00521 }
00522 inline bool Predicate_cvtuf(SDNode *N) {
00523 
00524        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_UF;
00525     
00526 }
00527 inline bool Predicate_cvtus(SDNode *N) {
00528 
00529        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_US;
00530     
00531 }
00532 inline bool Predicate_cvtuu(SDNode *N) {
00533 
00534        return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_UU;
00535     
00536 }
00537 inline bool Predicate_extload(SDNode *N) {
00538 
00539   return cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD;
00540 
00541 }
00542 inline bool Predicate_extloadf32(SDNode *N) {
00543 
00544   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::f32;
00545 
00546 }
00547 inline bool Predicate_extloadf64(SDNode *N) {
00548 
00549   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::f64;
00550 
00551 }
00552 inline bool Predicate_extloadi1(SDNode *N) {
00553 
00554   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i1;
00555 
00556 }
00557 inline bool Predicate_extloadi16(SDNode *N) {
00558 
00559   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
00560 
00561 }
00562 inline bool Predicate_extloadi32(SDNode *N) {
00563 
00564   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32;
00565 
00566 }
00567 inline bool Predicate_extloadi8(SDNode *N) {
00568 
00569   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
00570 
00571 }
00572 inline bool Predicate_imm16ShiftedSExt(SDNode *inN) {
00573   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00574 
00575   // imm16ShiftedSExt predicate - True if only bits in the top 16-bits of the
00576   // immediate are set.  Used by instructions like 'addis'.  Identical to 
00577   // imm16ShiftedZExt in 32-bit mode.
00578   if (N->getZExtValue() & 0xFFFF) return false;
00579   if (N->getValueType(0) == MVT::i32)
00580     return true;
00581   // For 64-bit, make sure it is sext right.
00582   return N->getZExtValue() == (uint64_t)(int)N->getZExtValue();
00583 
00584 }
00585 inline bool Predicate_imm16ShiftedZExt(SDNode *inN) {
00586   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00587 
00588   // imm16ShiftedZExt predicate - True if only bits in the top 16-bits of the
00589   // immediate are set.  Used by instructions like 'xoris'.
00590   return (N->getZExtValue() & ~uint64_t(0xFFFF0000)) == 0;
00591 
00592 }
00593 inline bool Predicate_immAllOnes(SDNode *inN) {
00594   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00595  return N->isAllOnesValue(); 
00596 }
00597 inline bool Predicate_immAllOnesV(SDNode *N) {
00598 
00599   return ISD::isBuildVectorAllOnes(N);
00600 
00601 }
00602 inline bool Predicate_immAllOnesV_bc(SDNode *N) {
00603 
00604   return ISD::isBuildVectorAllOnes(N);
00605 
00606 }
00607 inline bool Predicate_immAllZerosV(SDNode *N) {
00608 
00609   return ISD::isBuildVectorAllZeros(N);
00610 
00611 }
00612 inline bool Predicate_immAllZerosV_bc(SDNode *N) {
00613 
00614   return ISD::isBuildVectorAllZeros(N);
00615 
00616 }
00617 inline bool Predicate_immSExt16(SDNode *inN) {
00618   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00619 
00620   // immSExt16 predicate - True if the immediate fits in a 16-bit sign extended
00621   // field.  Used by instructions like 'addi'.
00622   if (N->getValueType(0) == MVT::i32)
00623     return (int32_t)N->getZExtValue() == (short)N->getZExtValue();
00624   else
00625     return (int64_t)N->getZExtValue() == (short)N->getZExtValue();
00626 
00627 }
00628 inline bool Predicate_immZExt16(SDNode *inN) {
00629   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00630 
00631   // immZExt16 predicate - True if the immediate fits in a 16-bit zero extended
00632   // field.  Used by instructions like 'ori'.
00633   return (uint64_t)N->getZExtValue() == (unsigned short)N->getZExtValue();
00634 
00635 }
00636 inline bool Predicate_istore(SDNode *N) {
00637 
00638   return !cast<StoreSDNode>(N)->isTruncatingStore();
00639 
00640 }
00641 inline bool Predicate_itruncstore(SDNode *N) {
00642 
00643   return cast<StoreSDNode>(N)->isTruncatingStore();
00644 
00645 }
00646 inline bool Predicate_load(SDNode *N) {
00647 
00648   return cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD;
00649 
00650 }
00651 inline bool Predicate_maskimm32(SDNode *inN) {
00652   ConstantSDNode *N = cast<ConstantSDNode>(inN);
00653 
00654   // maskImm predicate - True if immediate is a run of ones.
00655   unsigned mb, me;
00656   if (N->getValueType(0) == MVT::i32)
00657     return isRunOfOnes((unsigned)N->getZExtValue(), mb, me);
00658   else
00659     return false;
00660 
00661 }
00662 inline bool Predicate_post_store(SDNode *N) {
00663 
00664   ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode();
00665   return AM == ISD::POST_INC || AM == ISD::POST_DEC;
00666 
00667 }
00668 inline bool Predicate_post_truncst(SDNode *N) {
00669 
00670   ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode();
00671   return AM == ISD::POST_INC || AM == ISD::POST_DEC;
00672 
00673 }
00674 inline bool Predicate_post_truncstf32(SDNode *N) {
00675 
00676   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f32;
00677 
00678 }
00679 inline bool Predicate_post_truncsti1(SDNode *N) {
00680 
00681   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i1;
00682 
00683 }
00684 inline bool Predicate_post_truncsti16(SDNode *N) {
00685 
00686   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i16;
00687 
00688 }
00689 inline bool Predicate_post_truncsti32(SDNode *N) {
00690 
00691   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i32;
00692 
00693 }
00694 inline bool Predicate_post_truncsti8(SDNode *N) {
00695 
00696   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i8;
00697 
00698 }
00699 inline bool Predicate_pre_store(SDNode *N) {
00700 
00701   ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode();
00702   return AM == ISD::PRE_INC || AM == ISD::PRE_DEC;
00703 
00704 }
00705 inline bool Predicate_pre_truncst(SDNode *N) {
00706 
00707   ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode();
00708   return AM == ISD::PRE_INC || AM == ISD::PRE_DEC;
00709 
00710 }
00711 inline bool Predicate_pre_truncstf32(SDNode *N) {
00712 
00713   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f32;
00714 
00715 }
00716 inline bool Predicate_pre_truncsti1(SDNode *N) {
00717 
00718   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i1;
00719 
00720 }
00721 inline bool Predicate_pre_truncsti16(SDNode *N) {
00722 
00723   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i16;
00724 
00725 }
00726 inline bool Predicate_pre_truncsti32(SDNode *N) {
00727 
00728   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i32;
00729 
00730 }
00731 inline bool Predicate_pre_truncsti8(SDNode *N) {
00732 
00733   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i8;
00734 
00735 }
00736 inline bool Predicate_sextload(SDNode *N) {
00737 
00738   return cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD;
00739 
00740 }
00741 inline bool Predicate_sextloadi1(SDNode *N) {
00742 
00743   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i1;
00744 
00745 }
00746 inline bool Predicate_sextloadi16(SDNode *N) {
00747 
00748   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
00749 
00750 }
00751 inline bool Predicate_sextloadi32(SDNode *N) {
00752 
00753   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32;
00754 
00755 }
00756 inline bool Predicate_sextloadi8(SDNode *N) {
00757 
00758   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
00759 
00760 }
00761 inline bool Predicate_store(SDNode *N) {
00762 
00763   return !cast<StoreSDNode>(N)->isTruncatingStore();
00764 
00765 }
00766 inline bool Predicate_truncstore(SDNode *N) {
00767 
00768   return cast<StoreSDNode>(N)->isTruncatingStore();
00769 
00770 }
00771 inline bool Predicate_truncstoref32(SDNode *N) {
00772 
00773   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f32;
00774 
00775 }
00776 inline bool Predicate_truncstoref64(SDNode *N) {
00777 
00778   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f64;
00779 
00780 }
00781 inline bool Predicate_truncstorei16(SDNode *N) {
00782 
00783   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i16;
00784 
00785 }
00786 inline bool Predicate_truncstorei32(SDNode *N) {
00787 
00788   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i32;
00789 
00790 }
00791 inline bool Predicate_truncstorei8(SDNode *N) {
00792 
00793   return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i8;
00794 
00795 }
00796 inline bool Predicate_unindexedload(SDNode *N) {
00797 
00798   return cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
00799 
00800 }
00801 inline bool Predicate_unindexedstore(SDNode *N) {
00802 
00803   return cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED;
00804 
00805 }
00806 inline bool Predicate_vecspltisb(SDNode *N) {
00807 
00808   return PPC::get_VSPLTI_elt(N, 1, *CurDAG).getNode() != 0;
00809 
00810 }
00811 inline bool Predicate_vecspltish(SDNode *N) {
00812 
00813   return PPC::get_VSPLTI_elt(N, 2, *CurDAG).getNode() != 0;
00814 
00815 }
00816 inline bool Predicate_vecspltisw(SDNode *N) {
00817 
00818   return PPC::get_VSPLTI_elt(N, 4, *CurDAG).getNode() != 0;
00819 
00820 }
00821 inline bool Predicate_vtFP(SDNode *inN) {
00822   VTSDNode *N = cast<VTSDNode>(inN);
00823  return N->getVT().isFloatingPoint(); 
00824 }
00825 inline bool Predicate_vtInt(SDNode *inN) {
00826   VTSDNode *N = cast<VTSDNode>(inN);
00827  return N->getVT().isInteger(); 
00828 }
00829 inline bool Predicate_zextload(SDNode *N) {
00830 
00831   return cast<LoadSDNode>(N)->getExtensionType() == ISD::ZEXTLOAD;
00832 
00833 }
00834 inline bool Predicate_zextloadi1(SDNode *N) {
00835 
00836   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i1;
00837 
00838 }
00839 inline bool Predicate_zextloadi16(SDNode *N) {
00840 
00841   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16;
00842 
00843 }
00844 inline bool Predicate_zextloadi32(SDNode *N) {
00845 
00846   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32;
00847 
00848 }
00849 inline bool Predicate_zextloadi8(SDNode *N) {
00850 
00851   return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8;
00852 
00853 }
00854 
00855 
00856 SDNode *Emit_0(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
00857   SDValue N0 = N.getOperand(0);
00858   SDValue N1 = N.getOperand(1);
00859   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
00860   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp1);
00861 }
00862 SDNode *Emit_1(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
00863   SDValue N0 = N.getOperand(0);
00864   SDValue N1 = N.getOperand(1);
00865   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
00866   SDValue Tmp2 = Transform_HI16(Tmp1.getNode());
00867   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp2);
00868 }
00869 SDNode *Emit_2(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
00870   SDValue N0 = N.getOperand(0);
00871   SDValue N1 = N.getOperand(1);
00872   SDValue N10 = N1.getOperand(0);
00873   SDValue N11 = N1.getOperand(1);
00874   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N10);
00875 }
00876 SDNode *Emit_3(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
00877   SDValue N0 = N.getOperand(0);
00878   SDValue N1 = N.getOperand(1);
00879   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N1);
00880 }
00881 SDNode *Emit_4(const SDValue &N, unsigned Opc0, unsigned Opc1, MVT VT0, MVT VT1) DISABLE_INLINE {
00882   SDValue N0 = N.getOperand(0);
00883   SDValue N1 = N.getOperand(1);
00884   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
00885   SDValue Tmp2 = Transform_LO16(Tmp1.getNode());
00886   SDValue Tmp3(CurDAG->getTargetNode(Opc0, N.getDebugLoc(), VT0, N0, Tmp2), 0);
00887   SDValue Tmp4 = Transform_HA16(Tmp1.getNode());
00888   return CurDAG->SelectNodeTo(N.getNode(), Opc1, VT1, Tmp3, Tmp4);
00889 }
00890 SDNode *Emit_5(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
00891   SDValue N0 = N.getOperand(0);
00892   SDValue N00 = N0.getOperand(0);
00893   SDValue N01 = N0.getOperand(1);
00894   SDValue N1 = N.getOperand(1);
00895   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1, N00);
00896 }
00897 SDNode *Select_ISD_ADD_i32(const SDValue &N) {
00898   {
00899     SDValue N0 = N.getOperand(0);
00900     {
00901       SDValue N1 = N.getOperand(1);
00902 
00903       // Pattern: (add:i32 GPRC:i32:$rA, (PPClo:i32 (tglobaladdr:i32):$sym, 0:i32))
00904       // Emits: (LA:i32 GPRC:i32:$rA, (tglobaladdr:i32):$sym)
00905       // Pattern complexity = 14  cost = 1  size = 0
00906       if (N1.getOpcode() == PPCISD::Lo) {
00907         SDValue N10 = N1.getOperand(0);
00908         if (N10.getOpcode() == ISD::TargetGlobalAddress) {
00909           SDValue N11 = N1.getOperand(1);
00910           ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11);
00911           if (Tmp0) {
00912             int64_t CN1 = Tmp0->getSExtValue();
00913             if (CN1 == INT64_C(0)) {
00914               SDNode *Result = Emit_2(N, PPC::LA, MVT::i32);
00915               return Result;
00916             }
00917           }
00918         }
00919       }
00920       if (N1.getOpcode() == PPCISD::Hi) {
00921         SDValue N10 = N1.getOperand(0);
00922 
00923         // Pattern: (add:i32 GPRC:i32:$in, (PPChi:i32 (tglobaladdr:i32):$g, 0:i32))
00924         // Emits: (ADDIS:i32 GPRC:i32:$in, (tglobaladdr:i32):$g)
00925         // Pattern complexity = 14  cost = 1  size = 0
00926         if (N10.getOpcode() == ISD::TargetGlobalAddress) {
00927           SDValue N11 = N1.getOperand(1);
00928           ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11);
00929           if (Tmp0) {
00930             int64_t CN1 = Tmp0->getSExtValue();
00931             if (CN1 == INT64_C(0)) {
00932               SDNode *Result = Emit_2(N, PPC::ADDIS, MVT::i32);
00933               return Result;
00934             }
00935           }
00936         }
00937 
00938         // Pattern: (add:i32 GPRC:i32:$in, (PPChi:i32 (tconstpool:i32):$g, 0:i32))
00939         // Emits: (ADDIS:i32 GPRC:i32:$in, (tconstpool:i32):$g)
00940         // Pattern complexity = 14  cost = 1  size = 0
00941         if (N10.getOpcode() == ISD::TargetConstantPool) {
00942           SDValue N11 = N1.getOperand(1);
00943           ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11);
00944           if (Tmp0) {
00945             int64_t CN1 = Tmp0->getSExtValue();
00946             if (CN1 == INT64_C(0)) {
00947               SDNode *Result = Emit_2(N, PPC::ADDIS, MVT::i32);
00948               return Result;
00949             }
00950           }
00951         }
00952 
00953         // Pattern: (add:i32 GPRC:i32:$in, (PPChi:i32 (tjumptable:i32):$g, 0:i32))
00954         // Emits: (ADDIS:i32 GPRC:i32:$in, (tjumptable:i32):$g)
00955         // Pattern complexity = 14  cost = 1  size = 0
00956         if (N10.getOpcode() == ISD::TargetJumpTable) {
00957           SDValue N11 = N1.getOperand(1);
00958           ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11);
00959           if (Tmp0) {
00960             int64_t CN1 = Tmp0->getSExtValue();
00961             if (CN1 == INT64_C(0)) {
00962               SDNode *Result = Emit_2(N, PPC::ADDIS, MVT::i32);
00963               return Result;
00964             }
00965           }
00966         }
00967       }
00968     }
00969 
00970     // Pattern: (add:i32 (PPClo:i32 (tglobaladdr:i32):$sym, 0:i32), GPRC:i32:$rA)
00971     // Emits: (LA:i32 GPRC:i32:$rA, (tglobaladdr:i32):$sym)
00972     // Pattern complexity = 14  cost = 1  size = 0
00973     if (N0.getOpcode() == PPCISD::Lo) {
00974       SDValue N00 = N0.getOperand(0);
00975       if (N00.getOpcode() == ISD::TargetGlobalAddress) {
00976         SDValue N01 = N0.getOperand(1);
00977         ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01);
00978         if (Tmp0) {
00979           int64_t CN1 = Tmp0->getSExtValue();
00980           if (CN1 == INT64_C(0)) {
00981             SDNode *Result = Emit_5(N, PPC::LA, MVT::i32);
00982             return Result;
00983           }
00984         }
00985       }
00986     }
00987     if (N0.getOpcode() == PPCISD::Hi) {
00988       SDValue N00 = N0.getOperand(0);
00989 
00990       // Pattern: (add:i32 (PPChi:i32 (tglobaladdr:i32):$g, 0:i32), GPRC:i32:$in)
00991       // Emits: (ADDIS:i32 GPRC:i32:$in, (tglobaladdr:i32):$g)
00992       // Pattern complexity = 14  cost = 1  size = 0
00993       if (N00.getOpcode() == ISD::TargetGlobalAddress) {
00994         SDValue N01 = N0.getOperand(1);
00995         ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01);
00996         if (Tmp0) {
00997           int64_t CN1 = Tmp0->getSExtValue();
00998           if (CN1 == INT64_C(0)) {
00999             SDNode *Result = Emit_5(N, PPC::ADDIS, MVT::i32);
01000             return Result;
01001           }
01002         }
01003       }
01004 
01005       // Pattern: (add:i32 (PPChi:i32 (tconstpool:i32):$g, 0:i32), GPRC:i32:$in)
01006       // Emits: (ADDIS:i32 GPRC:i32:$in, (tconstpool:i32):$g)
01007       // Pattern complexity = 14  cost = 1  size = 0
01008       if (N00.getOpcode() == ISD::TargetConstantPool) {
01009         SDValue N01 = N0.getOperand(1);
01010         ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01);
01011         if (Tmp0) {
01012           int64_t CN1 = Tmp0->getSExtValue();
01013           if (CN1 == INT64_C(0)) {
01014             SDNode *Result = Emit_5(N, PPC::ADDIS, MVT::i32);
01015             return Result;
01016           }
01017         }
01018       }
01019 
01020       // Pattern: (add:i32 (PPChi:i32 (tjumptable:i32):$g, 0:i32), GPRC:i32:$in)
01021       // Emits: (ADDIS:i32 GPRC:i32:$in, (tjumptable:i32):$g)
01022       // Pattern complexity = 14  cost = 1  size = 0
01023       if (N00.getOpcode() == ISD::TargetJumpTable) {
01024         SDValue N01 = N0.getOperand(1);
01025         ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01);
01026         if (Tmp0) {
01027           int64_t CN1 = Tmp0->getSExtValue();
01028           if (CN1 == INT64_C(0)) {
01029             SDNode *Result = Emit_5(N, PPC::ADDIS, MVT::i32);
01030             return Result;
01031           }
01032         }
01033       }
01034     }
01035     SDValue N1 = N.getOperand(1);
01036     if (N1.getOpcode() == ISD::Constant) {
01037 
01038       // Pattern: (add:i32 GPRC:i32:$rA, (imm:i32)<<P:Predicate_immSExt16>>:$imm)
01039       // Emits: (ADDI:i32 GPRC:i32:$rA, (imm:i32):$imm)
01040       // Pattern complexity = 7  cost = 1  size = 0
01041       if (Predicate_immSExt16(N1.getNode())) {
01042         SDNode *Result = Emit_0(N, PPC::ADDI, MVT::i32);
01043         return Result;
01044       }
01045 
01046       // Pattern: (add:i32 GPRC:i32:$rA, (imm:i32)<<P:Predicate_imm16ShiftedSExt>><<X:HI16>>:$imm)
01047       // Emits: (ADDIS:i32 GPRC:i32:$rA, (HI16:i32 (imm:i32):$imm))
01048       // Pattern complexity = 7  cost = 1  size = 0
01049       if (Predicate_imm16ShiftedSExt(N1.getNode())) {
01050         SDNode *Result = Emit_1(N, PPC::ADDIS, MVT::i32);
01051         return Result;
01052       }
01053 
01054       // Pattern: (add:i32 GPRC:i32:$in, (imm:i32):$imm)
01055       // Emits: (ADDIS:i32 (ADDI:i32 GPRC:i32:$in, (LO16:i32 (imm:i32):$imm)), (HA16:i32 (imm:i32):$imm))
01056       // Pattern complexity = 6  cost = 2  size = 0
01057       SDNode *Result = Emit_4(N, PPC::ADDI, PPC::ADDIS, MVT::i32, MVT::i32);
01058       return Result;
01059     }
01060   }
01061 
01062   // Pattern: (add:i32 GPRC:i32:$rA, GPRC:i32:$rB)
01063   // Emits: (ADD4:i32 GPRC:i32:$rA, GPRC:i32:$rB)
01064   // Pattern complexity = 3  cost = 1  size = 0
01065   SDNode *Result = Emit_3(N, PPC::ADD4, MVT::i32);
01066   return Result;
01067 }
01068 
01069 SDNode *Emit_6(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01070   SDValue N0 = N.getOperand(0);
01071   SDValue N1 = N.getOperand(1);
01072   SDValue Tmp1 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i64);
01073   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp1);
01074 }
01075 SDNode *Emit_7(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01076   SDValue N0 = N.getOperand(0);
01077   SDValue N1 = N.getOperand(1);
01078   SDValue Tmp1 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i64);
01079   SDValue Tmp2 = Transform_HI16(Tmp1.getNode());
01080   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp2);
01081 }
01082 SDNode *Select_ISD_ADD_i64(const SDValue &N) {
01083   {
01084     SDValue N0 = N.getOperand(0);
01085     {
01086       SDValue N1 = N.getOperand(1);
01087       if (N1.getOpcode() == PPCISD::Hi) {
01088         SDValue N10 = N1.getOperand(0);
01089 
01090         // Pattern: (add:i64 G8RC:i64:$in, (PPChi:i64 (tglobaladdr:i64):$g, 0:i64))
01091         // Emits: (ADDIS8:i64 G8RC:i64:$in, (tglobaladdr:i64):$g)
01092         // Pattern complexity = 14  cost = 1  size = 0
01093         if (N10.getOpcode() == ISD::TargetGlobalAddress) {
01094           SDValue N11 = N1.getOperand(1);
01095           ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11);
01096           if (Tmp0) {
01097             int64_t CN1 = Tmp0->getSExtValue();
01098             if (CN1 == INT64_C(0)) {
01099               SDNode *Result = Emit_2(N, PPC::ADDIS8, MVT::i64);
01100               return Result;
01101             }
01102           }
01103         }
01104 
01105         // Pattern: (add:i64 G8RC:i64:$in, (PPChi:i64 (tconstpool:i64):$g, 0:i64))
01106         // Emits: (ADDIS8:i64 G8RC:i64:$in, (tconstpool:i64):$g)
01107         // Pattern complexity = 14  cost = 1  size = 0
01108         if (N10.getOpcode() == ISD::TargetConstantPool) {
01109           SDValue N11 = N1.getOperand(1);
01110           ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11);
01111           if (Tmp0) {
01112             int64_t CN1 = Tmp0->getSExtValue();
01113             if (CN1 == INT64_C(0)) {
01114               SDNode *Result = Emit_2(N, PPC::ADDIS8, MVT::i64);
01115               return Result;
01116             }
01117           }
01118         }
01119 
01120         // Pattern: (add:i64 G8RC:i64:$in, (PPChi:i64 (tjumptable:i64):$g, 0:i64))
01121         // Emits: (ADDIS8:i64 G8RC:i64:$in, (tjumptable:i64):$g)
01122         // Pattern complexity = 14  cost = 1  size = 0
01123         if (N10.getOpcode() == ISD::TargetJumpTable) {
01124           SDValue N11 = N1.getOperand(1);
01125           ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11);
01126           if (Tmp0) {
01127             int64_t CN1 = Tmp0->getSExtValue();
01128             if (CN1 == INT64_C(0)) {
01129               SDNode *Result = Emit_2(N, PPC::ADDIS8, MVT::i64);
01130               return Result;
01131             }
01132           }
01133         }
01134       }
01135     }
01136     if (N0.getOpcode() == PPCISD::Hi) {
01137       SDValue N00 = N0.getOperand(0);
01138 
01139       // Pattern: (add:i64 (PPChi:i64 (tglobaladdr:i64):$g, 0:i64), G8RC:i64:$in)
01140       // Emits: (ADDIS8:i64 G8RC:i64:$in, (tglobaladdr:i64):$g)
01141       // Pattern complexity = 14  cost = 1  size = 0
01142       if (N00.getOpcode() == ISD::TargetGlobalAddress) {
01143         SDValue N01 = N0.getOperand(1);
01144         ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01);
01145         if (Tmp0) {
01146           int64_t CN1 = Tmp0->getSExtValue();
01147           if (CN1 == INT64_C(0)) {
01148             SDNode *Result = Emit_5(N, PPC::ADDIS8, MVT::i64);
01149             return Result;
01150           }
01151         }
01152       }
01153 
01154       // Pattern: (add:i64 (PPChi:i64 (tconstpool:i64):$g, 0:i64), G8RC:i64:$in)
01155       // Emits: (ADDIS8:i64 G8RC:i64:$in, (tconstpool:i64):$g)
01156       // Pattern complexity = 14  cost = 1  size = 0
01157       if (N00.getOpcode() == ISD::TargetConstantPool) {
01158         SDValue N01 = N0.getOperand(1);
01159         ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01);
01160         if (Tmp0) {
01161           int64_t CN1 = Tmp0->getSExtValue();
01162           if (CN1 == INT64_C(0)) {
01163             SDNode *Result = Emit_5(N, PPC::ADDIS8, MVT::i64);
01164             return Result;
01165           }
01166         }
01167       }
01168 
01169       // Pattern: (add:i64 (PPChi:i64 (tjumptable:i64):$g, 0:i64), G8RC:i64:$in)
01170       // Emits: (ADDIS8:i64 G8RC:i64:$in, (tjumptable:i64):$g)
01171       // Pattern complexity = 14  cost = 1  size = 0
01172       if (N00.getOpcode() == ISD::TargetJumpTable) {
01173         SDValue N01 = N0.getOperand(1);
01174         ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01);
01175         if (Tmp0) {
01176           int64_t CN1 = Tmp0->getSExtValue();
01177           if (CN1 == INT64_C(0)) {
01178             SDNode *Result = Emit_5(N, PPC::ADDIS8, MVT::i64);
01179             return Result;
01180           }
01181         }
01182       }
01183     }
01184     SDValue N1 = N.getOperand(1);
01185     if (N1.getOpcode() == ISD::Constant) {
01186 
01187       // Pattern: (add:i64 G8RC:i64:$rA, (imm:i64)<<P:Predicate_immSExt16>>:$imm)
01188       // Emits: (ADDI8:i64 G8RC:i64:$rA, (imm:i64):$imm)
01189       // Pattern complexity = 7  cost = 1  size = 0
01190       if (Predicate_immSExt16(N1.getNode())) {
01191         SDNode *Result = Emit_6(N, PPC::ADDI8, MVT::i64);
01192         return Result;
01193       }
01194 
01195       // Pattern: (add:i64 G8RC:i64:$rA, (imm:i64)<<P:Predicate_imm16ShiftedSExt>><<X:HI16>>:$imm)
01196       // Emits: (ADDIS8:i64 G8RC:i64:$rA, (HI16:i64 (imm:i64):$imm))
01197       // Pattern complexity = 7  cost = 1  size = 0
01198       if (Predicate_imm16ShiftedSExt(N1.getNode())) {
01199         SDNode *Result = Emit_7(N, PPC::ADDIS8, MVT::i64);
01200         return Result;
01201       }
01202     }
01203   }
01204 
01205   // Pattern: (add:i64 G8RC:i64:$rA, G8RC:i64:$rB)
01206   // Emits: (ADD8:i64 G8RC:i64:$rA, G8RC:i64:$rB)
01207   // Pattern complexity = 3  cost = 1  size = 0
01208   SDNode *Result = Emit_3(N, PPC::ADD8, MVT::i64);
01209   return Result;
01210 }
01211 
01212 SDNode *Select_ISD_ADD_v16i8(const SDValue &N) {
01213   SDNode *Result = Emit_3(N, PPC::VADDUBM, MVT::v16i8);
01214   return Result;
01215 }
01216 
01217 SDNode *Select_ISD_ADD_v8i16(const SDValue &N) {
01218   SDNode *Result = Emit_3(N, PPC::VADDUHM, MVT::v8i16);
01219   return Result;
01220 }
01221 
01222 SDNode *Select_ISD_ADD_v4i32(const SDValue &N) {
01223   SDNode *Result = Emit_3(N, PPC::VADDUWM, MVT::v4i32);
01224   return Result;
01225 }
01226 
01227 SDNode *Emit_8(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01228   SDValue N0 = N.getOperand(0);
01229   SDValue N1 = N.getOperand(1);
01230   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
01231   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N0, Tmp1);
01232   SDValue InFlag(ResNode, 1);
01233   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
01234   return ResNode;
01235 }
01236 SDNode *Emit_9(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01237   SDValue N0 = N.getOperand(0);
01238   SDValue N1 = N.getOperand(1);
01239   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N0, N1);
01240   SDValue InFlag(ResNode, 1);
01241   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
01242   return ResNode;
01243 }
01244 SDNode *Select_ISD_ADDC_i32(const SDValue &N) {
01245 
01246   // Pattern: (addc:i32 GPRC:i32:$rA, (imm:i32)<<P:Predicate_immSExt16>>:$imm)
01247   // Emits: (ADDIC:i32 GPRC:i32:$rA, (imm:i32):$imm)
01248   // Pattern complexity = 7  cost = 1  size = 0
01249   {
01250     SDValue N0 = N.getOperand(0);
01251     SDValue N1 = N.getOperand(1);
01252     if (N1.getOpcode() == ISD::Constant &&
01253         Predicate_immSExt16(N1.getNode())) {
01254       SDNode *Result = Emit_8(N, PPC::ADDIC, MVT::i32);
01255       return Result;
01256     }
01257   }
01258 
01259   // Pattern: (addc:i32 GPRC:i32:$rA, GPRC:i32:$rB)
01260   // Emits: (ADDC:i32 GPRC:i32:$rA, GPRC:i32:$rB)
01261   // Pattern complexity = 3  cost = 1  size = 0
01262   SDNode *Result = Emit_9(N, PPC::ADDC, MVT::i32);
01263   return Result;
01264 }
01265 
01266 SDNode *Select_ISD_ADDC_i64(const SDValue &N) {
01267   SDNode *Result = Emit_9(N, PPC::ADDC8, MVT::i64);
01268   return Result;
01269 }
01270 
01271 SDNode *Emit_10(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01272   SDValue N0 = N.getOperand(0);
01273   SDValue N1 = N.getOperand(1);
01274   SDValue InFlag = N.getOperand(2);
01275   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N0, N1, InFlag);
01276   InFlag = SDValue(ResNode, 1);
01277   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
01278   return ResNode;
01279 }
01280 SDNode *Emit_11(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01281   SDValue N0 = N.getOperand(0);
01282   SDValue N1 = N.getOperand(1);
01283   SDValue InFlag = N.getOperand(2);
01284   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N0, InFlag);
01285   InFlag = SDValue(ResNode, 1);
01286   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
01287   return ResNode;
01288 }
01289 SDNode *Select_ISD_ADDE_i32(const SDValue &N) {
01290   {
01291     SDValue N0 = N.getOperand(0);
01292     SDValue N1 = N.getOperand(1);
01293 
01294     // Pattern: (adde:i32 GPRC:i32:$rA, 0:i32)
01295     // Emits: (ADDZE:i32 GPRC:i32:$rA)
01296     // Pattern complexity = 8  cost = 1  size = 0
01297     {
01298       ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
01299       if (Tmp0) {
01300         int64_t CN1 = Tmp0->getSExtValue();
01301         if (CN1 == INT64_C(0)) {
01302           SDNode *Result = Emit_11(N, PPC::ADDZE, MVT::i32);
01303           return Result;
01304         }
01305       }
01306     }
01307 
01308     // Pattern: (adde:i32 GPRC:i32:$rA, (imm:i32)<<P:Predicate_immAllOnes>>)
01309     // Emits: (ADDME:i32 GPRC:i32:$rA)
01310     // Pattern complexity = 7  cost = 1  size = 0
01311     if (N1.getOpcode() == ISD::Constant &&
01312         Predicate_immAllOnes(N1.getNode())) {
01313       SDNode *Result = Emit_11(N, PPC::ADDME, MVT::i32);
01314       return Result;
01315     }
01316   }
01317 
01318   // Pattern: (adde:i32 GPRC:i32:$rA, GPRC:i32:$rB)
01319   // Emits: (ADDE:i32 GPRC:i32:$rA, GPRC:i32:$rB)
01320   // Pattern complexity = 3  cost = 1  size = 0
01321   SDNode *Result = Emit_10(N, PPC::ADDE, MVT::i32);
01322   return Result;
01323 }
01324 
01325 SDNode *Select_ISD_ADDE_i64(const SDValue &N) {
01326   {
01327     SDValue N0 = N.getOperand(0);
01328     SDValue N1 = N.getOperand(1);
01329 
01330     // Pattern: (adde:i64 G8RC:i64:$rA, 0:i64)
01331     // Emits: (ADDZE8:i64 G8RC:i64:$rA)
01332     // Pattern complexity = 8  cost = 1  size = 0
01333     {
01334       ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
01335       if (Tmp0) {
01336         int64_t CN1 = Tmp0->getSExtValue();
01337         if (CN1 == INT64_C(0)) {
01338           SDNode *Result = Emit_11(N, PPC::ADDZE8, MVT::i64);
01339           return Result;
01340         }
01341       }
01342     }
01343 
01344     // Pattern: (adde:i64 G8RC:i64:$rA, (imm:i64)<<P:Predicate_immAllOnes>>)
01345     // Emits: (ADDME8:i64 G8RC:i64:$rA)
01346     // Pattern complexity = 7  cost = 1  size = 0
01347     if (N1.getOpcode() == ISD::Constant &&
01348         Predicate_immAllOnes(N1.getNode())) {
01349       SDNode *Result = Emit_11(N, PPC::ADDME8, MVT::i64);
01350       return Result;
01351     }
01352   }
01353 
01354   // Pattern: (adde:i64 G8RC:i64:$rA, G8RC:i64:$rB)
01355   // Emits: (ADDE8:i64 G8RC:i64:$rA, G8RC:i64:$rB)
01356   // Pattern complexity = 3  cost = 1  size = 0
01357   SDNode *Result = Emit_10(N, PPC::ADDE8, MVT::i64);
01358   return Result;
01359 }
01360 
01361 SDNode *Emit_12(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01362   SDValue N0 = N.getOperand(0);
01363   SDValue N1 = N.getOperand(1);
01364   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
01365   SDValue Tmp2 = Transform_LO16(Tmp1.getNode());
01366   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp2);
01367 }
01368 SDNode *Emit_13(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01369   SDValue N0 = N.getOperand(0);
01370   SDValue N00 = N0.getOperand(0);
01371   SDValue N01 = N0.getOperand(1);
01372   SDValue N1 = N.getOperand(1);
01373   SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
01374   SDValue Tmp3 = Transform_MB(Tmp2.getNode());
01375   SDValue Tmp4 = Transform_ME(Tmp2.getNode());
01376   SDValue Ops0[] = { N00, N01, Tmp3, Tmp4 };
01377   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Ops0, 4);
01378 }
01379 SDNode *Select_ISD_AND_i32(const SDValue &N) {
01380   {
01381     SDValue N0 = N.getOperand(0);
01382 
01383     // Pattern: (and:i32 GPRC:i32:$rS, (xor:i32 GPRC:i32:$rB, (imm:i32)<<P:Predicate_immAllOnes>>))
01384     // Emits: (ANDC:i32 GPRC:i32:$rS, GPRC:i32:$rB)
01385     // Pattern complexity = 10  cost = 1  size = 0
01386     {
01387       SDValue N1 = N.getOperand(1);
01388       if (N1.getOpcode() == ISD::XOR) {
01389         SDValue N10 = N1.getOperand(0);
01390         SDValue N11 = N1.getOperand(1);
01391         if (N11.getOpcode() == ISD::Constant &&
01392             Predicate_immAllOnes(N11.getNode())) {
01393           SDNode *Result = Emit_2(N, PPC::ANDC, MVT::i32);
01394           return Result;
01395         }
01396       }
01397     }
01398 
01399     // Pattern: (and:i32 (rotl:i32 GPRC:i32:$in, GPRC:i32:$sh), (imm:i32)<<P:Predicate_maskimm32>>:$imm)
01400     // Emits: (RLWNM:i32 GPRC:i32:$in, GPRC:i32:$sh, (MB:i32 (imm:i32)<<P:Predicate_maskimm32>>:$imm), (ME:i32 (imm:i32)<<P:Predicate_maskimm32>>:$imm))
01401     // Pattern complexity = 10  cost = 1  size = 0
01402     if (N0.getOpcode() == ISD::ROTL) {
01403       SDValue N00 = N0.getOperand(0);
01404       SDValue N01 = N0.getOperand(1);
01405       SDValue N1 = N.getOperand(1);
01406       if (N1.getOpcode() == ISD::Constant &&
01407           Predicate_maskimm32(N1.getNode()) &&
01408           N01.getNode()->getValueType(0) == MVT::i32) {
01409         SDNode *Result = Emit_13(N, PPC::RLWNM, MVT::i32);
01410         return Result;
01411       }
01412     }
01413 
01414     // Pattern: (and:i32 (xor:i32 GPRC:i32:$rB, (imm:i32)<<P:Predicate_immAllOnes>>), GPRC:i32:$rS)
01415     // Emits: (ANDC:i32 GPRC:i32:$rS, GPRC:i32:$rB)
01416     // Pattern complexity = 10  cost = 1  size = 0
01417     if (N0.getOpcode() == ISD::XOR) {
01418       SDValue N00 = N0.getOperand(0);
01419       SDValue N01 = N0.getOperand(1);
01420       if (N01.getOpcode() == ISD::Constant &&
01421           Predicate_immAllOnes(N01.getNode())) {
01422         SDNode *Result = Emit_5(N, PPC::ANDC, MVT::i32);
01423         return Result;
01424       }
01425     }
01426     SDValue N1 = N.getOperand(1);
01427     if (N1.getOpcode() == ISD::Constant) {
01428 
01429       // Pattern: (and:i32 GPRC:i32:$src1, (imm:i32)<<P:Predicate_immZExt16>><<X:LO16>>:$src2)
01430       // Emits: (ANDIo:i32 GPRC:i32:$src1, (LO16:i32 (imm:i32):$src2))
01431       // Pattern complexity = 7  cost = 1  size = 0
01432       if (Predicate_immZExt16(N1.getNode())) {
01433         SDNode *Result = Emit_12(N, PPC::ANDIo, MVT::i32);
01434         return Result;
01435       }
01436 
01437       // Pattern: (and:i32 GPRC:i32:$src1, (imm:i32)<<P:Predicate_imm16ShiftedZExt>><<X:HI16>>:$src2)
01438       // Emits: (ANDISo:i32 GPRC:i32:$src1, (HI16:i32 (imm:i32):$src2))
01439       // Pattern complexity = 7  cost = 1  size = 0
01440       if (Predicate_imm16ShiftedZExt(N1.getNode())) {
01441         SDNode *Result = Emit_1(N, PPC::ANDISo, MVT::i32);
01442         return Result;
01443       }
01444     }
01445   }
01446 
01447   // Pattern: (and:i32 GPRC:i32:$rS, GPRC:i32:$rB)
01448   // Emits: (AND:i32 GPRC:i32:$rS, GPRC:i32:$rB)
01449   // Pattern complexity = 3  cost = 1  size = 0
01450   SDNode *Result = Emit_3(N, PPC::AND, MVT::i32);
01451   return Result;
01452 }
01453 
01454 SDNode *Emit_14(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01455   SDValue N0 = N.getOperand(0);
01456   SDValue N1 = N.getOperand(1);
01457   SDValue Tmp1 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i64);
01458   SDValue Tmp2 = Transform_LO16(Tmp1.getNode());
01459   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp2);
01460 }
01461 SDNode *Select_ISD_AND_i64(const SDValue &N) {
01462   {
01463     SDValue N0 = N.getOperand(0);
01464 
01465     // Pattern: (and:i64 G8RC:i64:$rS, (xor:i64 G8RC:i64:$rB, (imm:i64)<<P:Predicate_immAllOnes>>))
01466     // Emits: (ANDC8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
01467     // Pattern complexity = 10  cost = 1  size = 0
01468     {
01469       SDValue N1 = N.getOperand(1);
01470       if (N1.getOpcode() == ISD::XOR) {
01471         SDValue N10 = N1.getOperand(0);
01472         SDValue N11 = N1.getOperand(1);
01473         if (N11.getOpcode() == ISD::Constant &&
01474             Predicate_immAllOnes(N11.getNode())) {
01475           SDNode *Result = Emit_2(N, PPC::ANDC8, MVT::i64);
01476           return Result;
01477         }
01478       }
01479     }
01480 
01481     // Pattern: (and:i64 (xor:i64 G8RC:i64:$rB, (imm:i64)<<P:Predicate_immAllOnes>>), G8RC:i64:$rS)
01482     // Emits: (ANDC8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
01483     // Pattern complexity = 10  cost = 1  size = 0
01484     if (N0.getOpcode() == ISD::XOR) {
01485       SDValue N00 = N0.getOperand(0);
01486       SDValue N01 = N0.getOperand(1);
01487       if (N01.getOpcode() == ISD::Constant &&
01488           Predicate_immAllOnes(N01.getNode())) {
01489         SDNode *Result = Emit_5(N, PPC::ANDC8, MVT::i64);
01490         return Result;
01491       }
01492     }
01493     SDValue N1 = N.getOperand(1);
01494     if (N1.getOpcode() == ISD::Constant) {
01495 
01496       // Pattern: (and:i64 G8RC:i64:$src1, (imm:i64)<<P:Predicate_immZExt16>><<X:LO16>>:$src2)
01497       // Emits: (ANDIo8:i64 G8RC:i64:$src1, (LO16:i32 (imm:i64):$src2))
01498       // Pattern complexity = 7  cost = 1  size = 0
01499       if (Predicate_immZExt16(N1.getNode())) {
01500         SDNode *Result = Emit_14(N, PPC::ANDIo8, MVT::i64);
01501         return Result;
01502       }
01503 
01504       // Pattern: (and:i64 G8RC:i64:$src1, (imm:i64)<<P:Predicate_imm16ShiftedZExt>><<X:HI16>>:$src2)
01505       // Emits: (ANDISo8:i64 G8RC:i64:$src1, (HI16:i32 (imm:i64):$src2))
01506       // Pattern complexity = 7  cost = 1  size = 0
01507       if (Predicate_imm16ShiftedZExt(N1.getNode())) {
01508         SDNode *Result = Emit_7(N, PPC::ANDISo8, MVT::i64);
01509         return Result;
01510       }
01511     }
01512   }
01513 
01514   // Pattern: (and:i64 G8RC:i64:$rS, G8RC:i64:$rB)
01515   // Emits: (AND8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
01516   // Pattern complexity = 3  cost = 1  size = 0
01517   SDNode *Result = Emit_3(N, PPC::AND8, MVT::i64);
01518   return Result;
01519 }
01520 
01521 SDNode *Emit_15(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01522   SDValue N0 = N.getOperand(0);
01523   SDValue N1 = N.getOperand(1);
01524   SDValue N10 = N1.getOperand(0);
01525   SDValue N11 = N1.getOperand(1);
01526   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N11);
01527 }
01528 SDNode *Emit_16(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01529   SDValue N0 = N.getOperand(0);
01530   SDValue N00 = N0.getOperand(0);
01531   SDValue N01 = N0.getOperand(1);
01532   SDValue N1 = N.getOperand(1);
01533   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1, N01);
01534 }
01535 SDNode *Select_ISD_AND_v4i32(const SDValue &N) {
01536   {
01537     SDValue N0 = N.getOperand(0);
01538     {
01539       SDValue N1 = N.getOperand(1);
01540       if (N1.getOpcode() == ISD::XOR) {
01541         SDValue N10 = N1.getOperand(0);
01542         {
01543           SDValue N11 = N1.getOperand(1);
01544 
01545           // Pattern: (and:v4i32 VRRC:v4i32:$vA, (xor:v4i32 VRRC:v4i32:$vB, (build_vector:v4i32)<<P:Predicate_immAllOnesV>>))
01546           // Emits: (VANDC:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
01547           // Pattern complexity = 10  cost = 1  size = 0
01548           if (N11.getOpcode() == ISD::BUILD_VECTOR &&
01549               Predicate_immAllOnesV(N11.getNode())) {
01550             SDNode *Result = Emit_2(N, PPC::VANDC, MVT::v4i32);
01551             return Result;
01552           }
01553 
01554           // Pattern: (and:v4i32 VRRC:v4i32:$A, (xor:v4i32 VRRC:v4i32:$B, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>))
01555           // Emits: (VANDC:v4i32 VRRC:v16i8:$A, VRRC:v16i8:$B)
01556           // Pattern complexity = 10  cost = 1  size = 0
01557           if (N11.getOpcode() == ISD::BIT_CONVERT &&
01558               Predicate_immAllOnesV_bc(N11.getNode())) {
01559             SDNode *Result = Emit_2(N, PPC::VANDC, MVT::v4i32);
01560             return Result;
01561           }
01562         }
01563 
01564         // Pattern: (and:v4i32 VRRC:v4i32:$vA, (xor:v4i32 (build_vector:v4i32)<<P:Predicate_immAllOnesV>>, VRRC:v4i32:$vB))
01565         // Emits: (VANDC:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
01566         // Pattern complexity = 10  cost = 1  size = 0
01567         if (N10.getOpcode() == ISD::BUILD_VECTOR &&
01568             Predicate_immAllOnesV(N10.getNode())) {
01569           SDNode *Result = Emit_15(N, PPC::VANDC, MVT::v4i32);
01570           return Result;
01571         }
01572       }
01573     }
01574     if (N0.getOpcode() == ISD::XOR) {
01575       SDValue N00 = N0.getOperand(0);
01576 
01577       // Pattern: (and:v4i32 (xor:v4i32 VRRC:v4i32:$vB, (build_vector:v4i32)<<P:Predicate_immAllOnesV>>), VRRC:v4i32:$vA)
01578       // Emits: (VANDC:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
01579       // Pattern complexity = 10  cost = 1  size = 0
01580       {
01581         SDValue N01 = N0.getOperand(1);
01582         if (N01.getOpcode() == ISD::BUILD_VECTOR &&
01583             Predicate_immAllOnesV(N01.getNode())) {
01584           SDNode *Result = Emit_5(N, PPC::VANDC, MVT::v4i32);
01585           return Result;
01586         }
01587       }
01588 
01589       // Pattern: (and:v4i32 (xor:v4i32 (build_vector:v4i32)<<P:Predicate_immAllOnesV>>, VRRC:v4i32:$vB), VRRC:v4i32:$vA)
01590       // Emits: (VANDC:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
01591       // Pattern complexity = 10  cost = 1  size = 0
01592       if (N00.getOpcode() == ISD::BUILD_VECTOR &&
01593           Predicate_immAllOnesV(N00.getNode())) {
01594         SDNode *Result = Emit_16(N, PPC::VANDC, MVT::v4i32);
01595         return Result;
01596       }
01597     }
01598 
01599     // Pattern: (and:v4i32 VRRC:v4i32:$A, (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, VRRC:v4i32:$B))
01600     // Emits: (VANDC:v4i32 VRRC:v16i8:$A, VRRC:v16i8:$B)
01601     // Pattern complexity = 10  cost = 1  size = 0
01602     {
01603       SDValue N1 = N.getOperand(1);
01604       if (N1.getOpcode() == ISD::XOR) {
01605         SDValue N10 = N1.getOperand(0);
01606         if (N10.getOpcode() == ISD::BIT_CONVERT &&
01607             Predicate_immAllOnesV_bc(N10.getNode())) {
01608           SDNode *Result = Emit_15(N, PPC::VANDC, MVT::v4i32);
01609           return Result;
01610         }
01611       }
01612     }
01613     if (N0.getOpcode() == ISD::XOR) {
01614       SDValue N00 = N0.getOperand(0);
01615 
01616       // Pattern: (and:v4i32 (xor:v4i32 VRRC:v4i32:$B, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>), VRRC:v4i32:$A)
01617       // Emits: (VANDC:v4i32 VRRC:v16i8:$A, VRRC:v16i8:$B)
01618       // Pattern complexity = 10  cost = 1  size = 0
01619       {
01620         SDValue N01 = N0.getOperand(1);
01621         if (N01.getOpcode() == ISD::BIT_CONVERT &&
01622             Predicate_immAllOnesV_bc(N01.getNode())) {
01623           SDNode *Result = Emit_5(N, PPC::VANDC, MVT::v4i32);
01624           return Result;
01625         }
01626       }
01627 
01628       // Pattern: (and:v4i32 (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, VRRC:v4i32:$B), VRRC:v4i32:$A)
01629       // Emits: (VANDC:v4i32 VRRC:v16i8:$A, VRRC:v16i8:$B)
01630       // Pattern complexity = 10  cost = 1  size = 0
01631       if (N00.getOpcode() == ISD::BIT_CONVERT &&
01632           Predicate_immAllOnesV_bc(N00.getNode())) {
01633         SDNode *Result = Emit_16(N, PPC::VANDC, MVT::v4i32);
01634         return Result;
01635       }
01636     }
01637   }
01638 
01639   // Pattern: (and:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
01640   // Emits: (VAND:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
01641   // Pattern complexity = 3  cost = 1  size = 0
01642   SDNode *Result = Emit_3(N, PPC::VAND, MVT::v4i32);
01643   return Result;
01644 }
01645 
01646 SDNode *Emit_17(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
01647   SDValue N0 = N.getOperand(0);
01648   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N0);
01649 }
01650 SDNode *Select_ISD_ANY_EXTEND_i64(const SDValue &N) {
01651   SDValue N0 = N.getOperand(0);
01652   if (N0.getNode()->getValueType(0) == MVT::i32) {
01653     SDNode *Result = Emit_17(N, PPC::OR4To8, MVT::i64);
01654     return Result;
01655   }
01656 
01657   CannotYetSelect(N);
01658   return NULL;
01659 }
01660 
01661 SDNode *Emit_18(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) DISABLE_INLINE {
01662   SDValue Chain = N.getOperand(0);
01663   SDValue N1 = N.getOperand(1);
01664   SDValue N2 = N.getOperand(2);
01665   SDValue N3 = N.getOperand(3);
01666   SDValue LSI_N = CurDAG->getMemOperand(cast<MemSDNode>(N)->getMemOperand());
01667   SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, N2, N3, LSI_N, Chain };
01668   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, Ops0, 6);
01669 }
01670 SDNode *Select_ISD_ATOMIC_CMP_SWAP_i32(const SDValue &N) {
01671   SDValue Chain = N.getOperand(0);
01672 
01673   // Pattern: (atomic_cmp_swap:i32 xoaddr:iPTR:$ptr, GPRC:i32:$old, GPRC:i32:$new)<<P:Predicate_atomic_cmp_swap_8>>
01674   // Emits: (ATOMIC_CMP_SWAP_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$old, GPRC:i32:$new)
01675   // Pattern complexity = 13  cost = 11  size = 0
01676   if (Predicate_atomic_cmp_swap_8(N.getNode())) {
01677     SDValue N1 = N.getOperand(1);
01678     SDValue CPTmpN1_0;
01679     SDValue CPTmpN1_1;
01680     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01681       SDNode *Result = Emit_18(N, PPC::ATOMIC_CMP_SWAP_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01682       return Result;
01683     }
01684   }
01685 
01686   // Pattern: (atomic_cmp_swap:i32 xoaddr:iPTR:$ptr, GPRC:i32:$old, GPRC:i32:$new)<<P:Predicate_atomic_cmp_swap_16>>
01687   // Emits: (ATOMIC_CMP_SWAP_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$old, GPRC:i32:$new)
01688   // Pattern complexity = 13  cost = 11  size = 0
01689   if (Predicate_atomic_cmp_swap_16(N.getNode())) {
01690     SDValue N1 = N.getOperand(1);
01691     SDValue CPTmpN1_0;
01692     SDValue CPTmpN1_1;
01693     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01694       SDNode *Result = Emit_18(N, PPC::ATOMIC_CMP_SWAP_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01695       return Result;
01696     }
01697   }
01698 
01699   // Pattern: (atomic_cmp_swap:i32 xoaddr:iPTR:$ptr, GPRC:i32:$old, GPRC:i32:$new)<<P:Predicate_atomic_cmp_swap_32>>
01700   // Emits: (ATOMIC_CMP_SWAP_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$old, GPRC:i32:$new)
01701   // Pattern complexity = 13  cost = 11  size = 0
01702   if (Predicate_atomic_cmp_swap_32(N.getNode())) {
01703     SDValue N1 = N.getOperand(1);
01704     SDValue CPTmpN1_0;
01705     SDValue CPTmpN1_1;
01706     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01707       SDNode *Result = Emit_18(N, PPC::ATOMIC_CMP_SWAP_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01708       return Result;
01709     }
01710   }
01711 
01712   CannotYetSelect(N);
01713   return NULL;
01714 }
01715 
01716 SDNode *Select_ISD_ATOMIC_CMP_SWAP_i64(const SDValue &N) {
01717   SDValue Chain = N.getOperand(0);
01718   if (Predicate_atomic_cmp_swap_64(N.getNode())) {
01719     SDValue N1 = N.getOperand(1);
01720     SDValue CPTmpN1_0;
01721     SDValue CPTmpN1_1;
01722     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01723       SDNode *Result = Emit_18(N, PPC::ATOMIC_CMP_SWAP_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
01724       return Result;
01725     }
01726   }
01727 
01728   CannotYetSelect(N);
01729   return NULL;
01730 }
01731 
01732 SDNode *Emit_19(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) DISABLE_INLINE {
01733   SDValue Chain = N.getOperand(0);
01734   SDValue N1 = N.getOperand(1);
01735   SDValue N2 = N.getOperand(2);
01736   SDValue LSI_N = CurDAG->getMemOperand(cast<MemSDNode>(N)->getMemOperand());
01737   SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, N2, LSI_N, Chain };
01738   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, Ops0, 5);
01739 }
01740 SDNode *Select_ISD_ATOMIC_LOAD_ADD_i32(const SDValue &N) {
01741   SDValue Chain = N.getOperand(0);
01742 
01743   // Pattern: (atomic_load_add:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_add_8>>
01744   // Emits: (ATOMIC_LOAD_ADD_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01745   // Pattern complexity = 13  cost = 11  size = 0
01746   if (Predicate_atomic_load_add_8(N.getNode())) {
01747     SDValue N1 = N.getOperand(1);
01748     SDValue CPTmpN1_0;
01749     SDValue CPTmpN1_1;
01750     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01751       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_ADD_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01752       return Result;
01753     }
01754   }
01755 
01756   // Pattern: (atomic_load_add:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_add_16>>
01757   // Emits: (ATOMIC_LOAD_ADD_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01758   // Pattern complexity = 13  cost = 11  size = 0
01759   if (Predicate_atomic_load_add_16(N.getNode())) {
01760     SDValue N1 = N.getOperand(1);
01761     SDValue CPTmpN1_0;
01762     SDValue CPTmpN1_1;
01763     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01764       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_ADD_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01765       return Result;
01766     }
01767   }
01768 
01769   // Pattern: (atomic_load_add:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_add_32>>
01770   // Emits: (ATOMIC_LOAD_ADD_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01771   // Pattern complexity = 13  cost = 11  size = 0
01772   if (Predicate_atomic_load_add_32(N.getNode())) {
01773     SDValue N1 = N.getOperand(1);
01774     SDValue CPTmpN1_0;
01775     SDValue CPTmpN1_1;
01776     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01777       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_ADD_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01778       return Result;
01779     }
01780   }
01781 
01782   CannotYetSelect(N);
01783   return NULL;
01784 }
01785 
01786 SDNode *Select_ISD_ATOMIC_LOAD_ADD_i64(const SDValue &N) {
01787   SDValue Chain = N.getOperand(0);
01788   if (Predicate_atomic_load_add_64(N.getNode())) {
01789     SDValue N1 = N.getOperand(1);
01790     SDValue CPTmpN1_0;
01791     SDValue CPTmpN1_1;
01792     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01793       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_ADD_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
01794       return Result;
01795     }
01796   }
01797 
01798   CannotYetSelect(N);
01799   return NULL;
01800 }
01801 
01802 SDNode *Select_ISD_ATOMIC_LOAD_AND_i32(const SDValue &N) {
01803   SDValue Chain = N.getOperand(0);
01804 
01805   // Pattern: (atomic_load_and:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_and_8>>
01806   // Emits: (ATOMIC_LOAD_AND_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01807   // Pattern complexity = 13  cost = 11  size = 0
01808   if (Predicate_atomic_load_and_8(N.getNode())) {
01809     SDValue N1 = N.getOperand(1);
01810     SDValue CPTmpN1_0;
01811     SDValue CPTmpN1_1;
01812     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01813       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_AND_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01814       return Result;
01815     }
01816   }
01817 
01818   // Pattern: (atomic_load_and:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_and_16>>
01819   // Emits: (ATOMIC_LOAD_AND_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01820   // Pattern complexity = 13  cost = 11  size = 0
01821   if (Predicate_atomic_load_and_16(N.getNode())) {
01822     SDValue N1 = N.getOperand(1);
01823     SDValue CPTmpN1_0;
01824     SDValue CPTmpN1_1;
01825     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01826       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_AND_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01827       return Result;
01828     }
01829   }
01830 
01831   // Pattern: (atomic_load_and:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_and_32>>
01832   // Emits: (ATOMIC_LOAD_AND_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01833   // Pattern complexity = 13  cost = 11  size = 0
01834   if (Predicate_atomic_load_and_32(N.getNode())) {
01835     SDValue N1 = N.getOperand(1);
01836     SDValue CPTmpN1_0;
01837     SDValue CPTmpN1_1;
01838     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01839       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_AND_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01840       return Result;
01841     }
01842   }
01843 
01844   CannotYetSelect(N);
01845   return NULL;
01846 }
01847 
01848 SDNode *Select_ISD_ATOMIC_LOAD_AND_i64(const SDValue &N) {
01849   SDValue Chain = N.getOperand(0);
01850   if (Predicate_atomic_load_and_64(N.getNode())) {
01851     SDValue N1 = N.getOperand(1);
01852     SDValue CPTmpN1_0;
01853     SDValue CPTmpN1_1;
01854     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01855       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_AND_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
01856       return Result;
01857     }
01858   }
01859 
01860   CannotYetSelect(N);
01861   return NULL;
01862 }
01863 
01864 SDNode *Select_ISD_ATOMIC_LOAD_NAND_i32(const SDValue &N) {
01865   SDValue Chain = N.getOperand(0);
01866 
01867   // Pattern: (atomic_load_nand:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_nand_8>>
01868   // Emits: (ATOMIC_LOAD_NAND_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01869   // Pattern complexity = 13  cost = 11  size = 0
01870   if (Predicate_atomic_load_nand_8(N.getNode())) {
01871     SDValue N1 = N.getOperand(1);
01872     SDValue CPTmpN1_0;
01873     SDValue CPTmpN1_1;
01874     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01875       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_NAND_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01876       return Result;
01877     }
01878   }
01879 
01880   // Pattern: (atomic_load_nand:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_nand_16>>
01881   // Emits: (ATOMIC_LOAD_NAND_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01882   // Pattern complexity = 13  cost = 11  size = 0
01883   if (Predicate_atomic_load_nand_16(N.getNode())) {
01884     SDValue N1 = N.getOperand(1);
01885     SDValue CPTmpN1_0;
01886     SDValue CPTmpN1_1;
01887     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01888       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_NAND_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01889       return Result;
01890     }
01891   }
01892 
01893   // Pattern: (atomic_load_nand:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_nand_32>>
01894   // Emits: (ATOMIC_LOAD_NAND_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01895   // Pattern complexity = 13  cost = 11  size = 0
01896   if (Predicate_atomic_load_nand_32(N.getNode())) {
01897     SDValue N1 = N.getOperand(1);
01898     SDValue CPTmpN1_0;
01899     SDValue CPTmpN1_1;
01900     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01901       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_NAND_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01902       return Result;
01903     }
01904   }
01905 
01906   CannotYetSelect(N);
01907   return NULL;
01908 }
01909 
01910 SDNode *Select_ISD_ATOMIC_LOAD_NAND_i64(const SDValue &N) {
01911   SDValue Chain = N.getOperand(0);
01912   if (Predicate_atomic_load_nand_64(N.getNode())) {
01913     SDValue N1 = N.getOperand(1);
01914     SDValue CPTmpN1_0;
01915     SDValue CPTmpN1_1;
01916     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01917       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_NAND_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
01918       return Result;
01919     }
01920   }
01921 
01922   CannotYetSelect(N);
01923   return NULL;
01924 }
01925 
01926 SDNode *Select_ISD_ATOMIC_LOAD_OR_i32(const SDValue &N) {
01927   SDValue Chain = N.getOperand(0);
01928 
01929   // Pattern: (atomic_load_or:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_or_8>>
01930   // Emits: (ATOMIC_LOAD_OR_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01931   // Pattern complexity = 13  cost = 11  size = 0
01932   if (Predicate_atomic_load_or_8(N.getNode())) {
01933     SDValue N1 = N.getOperand(1);
01934     SDValue CPTmpN1_0;
01935     SDValue CPTmpN1_1;
01936     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01937       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_OR_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01938       return Result;
01939     }
01940   }
01941 
01942   // Pattern: (atomic_load_or:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_or_16>>
01943   // Emits: (ATOMIC_LOAD_OR_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01944   // Pattern complexity = 13  cost = 11  size = 0
01945   if (Predicate_atomic_load_or_16(N.getNode())) {
01946     SDValue N1 = N.getOperand(1);
01947     SDValue CPTmpN1_0;
01948     SDValue CPTmpN1_1;
01949     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01950       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_OR_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01951       return Result;
01952     }
01953   }
01954 
01955   // Pattern: (atomic_load_or:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_or_32>>
01956   // Emits: (ATOMIC_LOAD_OR_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01957   // Pattern complexity = 13  cost = 11  size = 0
01958   if (Predicate_atomic_load_or_32(N.getNode())) {
01959     SDValue N1 = N.getOperand(1);
01960     SDValue CPTmpN1_0;
01961     SDValue CPTmpN1_1;
01962     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01963       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_OR_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
01964       return Result;
01965     }
01966   }
01967 
01968   CannotYetSelect(N);
01969   return NULL;
01970 }
01971 
01972 SDNode *Select_ISD_ATOMIC_LOAD_OR_i64(const SDValue &N) {
01973   SDValue Chain = N.getOperand(0);
01974   if (Predicate_atomic_load_or_64(N.getNode())) {
01975     SDValue N1 = N.getOperand(1);
01976     SDValue CPTmpN1_0;
01977     SDValue CPTmpN1_1;
01978     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01979       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_OR_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
01980       return Result;
01981     }
01982   }
01983 
01984   CannotYetSelect(N);
01985   return NULL;
01986 }
01987 
01988 SDNode *Select_ISD_ATOMIC_LOAD_SUB_i32(const SDValue &N) {
01989   SDValue Chain = N.getOperand(0);
01990 
01991   // Pattern: (atomic_load_sub:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_sub_8>>
01992   // Emits: (ATOMIC_LOAD_SUB_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
01993   // Pattern complexity = 13  cost = 11  size = 0
01994   if (Predicate_atomic_load_sub_8(N.getNode())) {
01995     SDValue N1 = N.getOperand(1);
01996     SDValue CPTmpN1_0;
01997     SDValue CPTmpN1_1;
01998     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
01999       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_SUB_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02000       return Result;
02001     }
02002   }
02003 
02004   // Pattern: (atomic_load_sub:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_sub_16>>
02005   // Emits: (ATOMIC_LOAD_SUB_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
02006   // Pattern complexity = 13  cost = 11  size = 0
02007   if (Predicate_atomic_load_sub_16(N.getNode())) {
02008     SDValue N1 = N.getOperand(1);
02009     SDValue CPTmpN1_0;
02010     SDValue CPTmpN1_1;
02011     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02012       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_SUB_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02013       return Result;
02014     }
02015   }
02016 
02017   // Pattern: (atomic_load_sub:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_sub_32>>
02018   // Emits: (ATOMIC_LOAD_SUB_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
02019   // Pattern complexity = 13  cost = 11  size = 0
02020   if (Predicate_atomic_load_sub_32(N.getNode())) {
02021     SDValue N1 = N.getOperand(1);
02022     SDValue CPTmpN1_0;
02023     SDValue CPTmpN1_1;
02024     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02025       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_SUB_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02026       return Result;
02027     }
02028   }
02029 
02030   CannotYetSelect(N);
02031   return NULL;
02032 }
02033 
02034 SDNode *Select_ISD_ATOMIC_LOAD_SUB_i64(const SDValue &N) {
02035   SDValue Chain = N.getOperand(0);
02036   if (Predicate_atomic_load_sub_64(N.getNode())) {
02037     SDValue N1 = N.getOperand(1);
02038     SDValue CPTmpN1_0;
02039     SDValue CPTmpN1_1;
02040     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02041       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_SUB_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
02042       return Result;
02043     }
02044   }
02045 
02046   CannotYetSelect(N);
02047   return NULL;
02048 }
02049 
02050 SDNode *Select_ISD_ATOMIC_LOAD_XOR_i32(const SDValue &N) {
02051   SDValue Chain = N.getOperand(0);
02052 
02053   // Pattern: (atomic_load_xor:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_xor_8>>
02054   // Emits: (ATOMIC_LOAD_XOR_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
02055   // Pattern complexity = 13  cost = 11  size = 0
02056   if (Predicate_atomic_load_xor_8(N.getNode())) {
02057     SDValue N1 = N.getOperand(1);
02058     SDValue CPTmpN1_0;
02059     SDValue CPTmpN1_1;
02060     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02061       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_XOR_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02062       return Result;
02063     }
02064   }
02065 
02066   // Pattern: (atomic_load_xor:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_xor_16>>
02067   // Emits: (ATOMIC_LOAD_XOR_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
02068   // Pattern complexity = 13  cost = 11  size = 0
02069   if (Predicate_atomic_load_xor_16(N.getNode())) {
02070     SDValue N1 = N.getOperand(1);
02071     SDValue CPTmpN1_0;
02072     SDValue CPTmpN1_1;
02073     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02074       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_XOR_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02075       return Result;
02076     }
02077   }
02078 
02079   // Pattern: (atomic_load_xor:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)<<P:Predicate_atomic_load_xor_32>>
02080   // Emits: (ATOMIC_LOAD_XOR_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$incr)
02081   // Pattern complexity = 13  cost = 11  size = 0
02082   if (Predicate_atomic_load_xor_32(N.getNode())) {
02083     SDValue N1 = N.getOperand(1);
02084     SDValue CPTmpN1_0;
02085     SDValue CPTmpN1_1;
02086     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02087       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_XOR_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02088       return Result;
02089     }
02090   }
02091 
02092   CannotYetSelect(N);
02093   return NULL;
02094 }
02095 
02096 SDNode *Select_ISD_ATOMIC_LOAD_XOR_i64(const SDValue &N) {
02097   SDValue Chain = N.getOperand(0);
02098   if (Predicate_atomic_load_xor_64(N.getNode())) {
02099     SDValue N1 = N.getOperand(1);
02100     SDValue CPTmpN1_0;
02101     SDValue CPTmpN1_1;
02102     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02103       SDNode *Result = Emit_19(N, PPC::ATOMIC_LOAD_XOR_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
02104       return Result;
02105     }
02106   }
02107 
02108   CannotYetSelect(N);
02109   return NULL;
02110 }
02111 
02112 SDNode *Select_ISD_ATOMIC_SWAP_i32(const SDValue &N) {
02113   SDValue Chain = N.getOperand(0);
02114 
02115   // Pattern: (atomic_swap:i32 xoaddr:iPTR:$ptr, GPRC:i32:$new)<<P:Predicate_atomic_swap_8>>
02116   // Emits: (ATOMIC_SWAP_I8:i32 xoaddr:iPTR:$ptr, GPRC:i32:$new)
02117   // Pattern complexity = 13  cost = 11  size = 0
02118   if (Predicate_atomic_swap_8(N.getNode())) {
02119     SDValue N1 = N.getOperand(1);
02120     SDValue CPTmpN1_0;
02121     SDValue CPTmpN1_1;
02122     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02123       SDNode *Result = Emit_19(N, PPC::ATOMIC_SWAP_I8, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02124       return Result;
02125     }
02126   }
02127 
02128   // Pattern: (atomic_swap:i32 xoaddr:iPTR:$ptr, GPRC:i32:$new)<<P:Predicate_atomic_swap_16>>
02129   // Emits: (ATOMIC_SWAP_I16:i32 xoaddr:iPTR:$ptr, GPRC:i32:$new)
02130   // Pattern complexity = 13  cost = 11  size = 0
02131   if (Predicate_atomic_swap_16(N.getNode())) {
02132     SDValue N1 = N.getOperand(1);
02133     SDValue CPTmpN1_0;
02134     SDValue CPTmpN1_1;
02135     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02136       SDNode *Result = Emit_19(N, PPC::ATOMIC_SWAP_I16, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02137       return Result;
02138     }
02139   }
02140 
02141   // Pattern: (atomic_swap:i32 xoaddr:iPTR:$ptr, GPRC:i32:$new)<<P:Predicate_atomic_swap_32>>
02142   // Emits: (ATOMIC_SWAP_I32:i32 xoaddr:iPTR:$ptr, GPRC:i32:$new)
02143   // Pattern complexity = 13  cost = 11  size = 0
02144   if (Predicate_atomic_swap_32(N.getNode())) {
02145     SDValue N1 = N.getOperand(1);
02146     SDValue CPTmpN1_0;
02147     SDValue CPTmpN1_1;
02148     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02149       SDNode *Result = Emit_19(N, PPC::ATOMIC_SWAP_I32, MVT::i32, CPTmpN1_0, CPTmpN1_1);
02150       return Result;
02151     }
02152   }
02153 
02154   CannotYetSelect(N);
02155   return NULL;
02156 }
02157 
02158 SDNode *Select_ISD_ATOMIC_SWAP_i64(const SDValue &N) {
02159   SDValue Chain = N.getOperand(0);
02160   if (Predicate_atomic_swap_64(N.getNode())) {
02161     SDValue N1 = N.getOperand(1);
02162     SDValue CPTmpN1_0;
02163     SDValue CPTmpN1_1;
02164     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
02165       SDNode *Result = Emit_19(N, PPC::ATOMIC_SWAP_I64, MVT::i64, CPTmpN1_0, CPTmpN1_1);
02166       return Result;
02167     }
02168   }
02169 
02170   CannotYetSelect(N);
02171   return NULL;
02172 }
02173 
02174 SDNode *Emit_20(const SDValue &N) DISABLE_INLINE {
02175   SDValue N0 = N.getOperand(0);
02176   ReplaceUses(N, N0);
02177   return NULL;
02178 }
02179 SDNode *Select_ISD_BIT_CONVERT_v16i8(const SDValue &N) {
02180   SDValue N0 = N.getOperand(0);
02181 
02182   // Pattern: (bitconvert:v16i8 VRRC:v8i16:$src)
02183   // Emits: VRRC:v16i8:$src
02184   // Pattern complexity = 3  cost = 0  size = 0
02185   if (N0.getNode()->getValueType(0) == MVT::v8i16) {
02186     SDNode *Result = Emit_20(N);
02187     return Result;
02188   }
02189 
02190   // Pattern: (bitconvert:v16i8 VRRC:v4i32:$src)
02191   // Emits: VRRC:v16i8:$src
02192   // Pattern complexity = 3  cost = 0  size = 0
02193   if (N0.getNode()->getValueType(0) == MVT::v4i32) {
02194     SDNode *Result = Emit_20(N);
02195     return Result;
02196   }
02197 
02198   // Pattern: (bitconvert:v16i8 VRRC:v4f32:$src)
02199   // Emits: VRRC:v16i8:$src
02200   // Pattern complexity = 3  cost = 0  size = 0
02201   if (N0.getNode()->getValueType(0) == MVT::v4f32) {
02202     SDNode *Result = Emit_20(N);
02203     return Result;
02204   }
02205 
02206   CannotYetSelect(N);
02207   return NULL;
02208 }
02209 
02210 SDNode *Select_ISD_BIT_CONVERT_v8i16(const SDValue &N) {
02211   SDValue N0 = N.getOperand(0);
02212 
02213   // Pattern: (bitconvert:v8i16 VRRC:v16i8:$src)
02214   // Emits: VRRC:v8i16:$src
02215   // Pattern complexity = 3  cost = 0  size = 0
02216   if (N0.getNode()->getValueType(0) == MVT::v16i8) {
02217     SDNode *Result = Emit_20(N);
02218     return Result;
02219   }
02220 
02221   // Pattern: (bitconvert:v8i16 VRRC:v4i32:$src)
02222   // Emits: VRRC:v8i16:$src
02223   // Pattern complexity = 3  cost = 0  size = 0
02224   if (N0.getNode()->getValueType(0) == MVT::v4i32) {
02225     SDNode *Result = Emit_20(N);
02226     return Result;
02227   }
02228 
02229   // Pattern: (bitconvert:v8i16 VRRC:v4f32:$src)
02230   // Emits: VRRC:v8i16:$src
02231   // Pattern complexity = 3  cost = 0  size = 0
02232   if (N0.getNode()->getValueType(0) == MVT::v4f32) {
02233     SDNode *Result = Emit_20(N);
02234     return Result;
02235   }
02236 
02237   CannotYetSelect(N);
02238   return NULL;
02239 }
02240 
02241 SDNode *Select_ISD_BIT_CONVERT_v4i32(const SDValue &N) {
02242   SDValue N0 = N.getOperand(0);
02243 
02244   // Pattern: (bitconvert:v4i32 VRRC:v16i8:$src)
02245   // Emits: VRRC:v4i32:$src
02246   // Pattern complexity = 3  cost = 0  size = 0
02247   if (N0.getNode()->getValueType(0) == MVT::v16i8) {
02248     SDNode *Result = Emit_20(N);
02249     return Result;
02250   }
02251 
02252   // Pattern: (bitconvert:v4i32 VRRC:v8i16:$src)
02253   // Emits: VRRC:v4i32:$src
02254   // Pattern complexity = 3  cost = 0  size = 0
02255   if (N0.getNode()->getValueType(0) == MVT::v8i16) {
02256     SDNode *Result = Emit_20(N);
02257     return Result;
02258   }
02259 
02260   // Pattern: (bitconvert:v4i32 VRRC:v4f32:$src)
02261   // Emits: VRRC:v4i32:$src
02262   // Pattern complexity = 3  cost = 0  size = 0
02263   if (N0.getNode()->getValueType(0) == MVT::v4f32) {
02264     SDNode *Result = Emit_20(N);
02265     return Result;
02266   }
02267 
02268   CannotYetSelect(N);
02269   return NULL;
02270 }
02271 
02272 SDNode *Select_ISD_BIT_CONVERT_v4f32(const SDValue &N) {
02273   SDValue N0 = N.getOperand(0);
02274 
02275   // Pattern: (bitconvert:v4f32 VRRC:v16i8:$src)
02276   // Emits: VRRC:v4f32:$src
02277   // Pattern complexity = 3  cost = 0  size = 0
02278   if (N0.getNode()->getValueType(0) == MVT::v16i8) {
02279     SDNode *Result = Emit_20(N);
02280     return Result;
02281   }
02282 
02283   // Pattern: (bitconvert:v4f32 VRRC:v8i16:$src)
02284   // Emits: VRRC:v4f32:$src
02285   // Pattern complexity = 3  cost = 0  size = 0
02286   if (N0.getNode()->getValueType(0) == MVT::v8i16) {
02287     SDNode *Result = Emit_20(N);
02288     return Result;
02289   }
02290 
02291   // Pattern: (bitconvert:v4f32 VRRC:v4i32:$src)
02292   // Emits: VRRC:v4f32:$src
02293   // Pattern complexity = 3  cost = 0  size = 0
02294   if (N0.getNode()->getValueType(0) == MVT::v4i32) {
02295     SDNode *Result = Emit_20(N);
02296     return Result;
02297   }
02298 
02299   CannotYetSelect(N);
02300   return NULL;
02301 }
02302 
02303 SDNode *Emit_21(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
02304   SDValue Chain = N.getOperand(0);
02305   SDValue N1 = N.getOperand(1);
02306   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, N1, Chain);
02307 }
02308 SDNode *Select_ISD_BR(const SDValue &N) {
02309   SDValue Chain = N.getOperand(0);
02310   SDValue N1 = N.getOperand(1);
02311   if (N1.getOpcode() == ISD::BasicBlock) {
02312     SDNode *Result = Emit_21(N, PPC::B);
02313     return Result;
02314   }
02315 
02316   CannotYetSelect(N);
02317   return NULL;
02318 }
02319 
02320 SDNode *Emit_22(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02321   SDValue Tmp1 = Transform_VSPLTISB_get_imm(N.getNode());
02322   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1);
02323 }
02324 SDNode *Select_ISD_BUILD_VECTOR_v16i8(const SDValue &N) {
02325   if (Predicate_vecspltisb(N.getNode())) {
02326     SDNode *Result = Emit_22(N, PPC::VSPLTISB, MVT::v16i8);
02327     return Result;
02328   }
02329 
02330   CannotYetSelect(N);
02331   return NULL;
02332 }
02333 
02334 SDNode *Emit_23(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02335   SDValue Tmp1 = Transform_VSPLTISH_get_imm(N.getNode());
02336   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1);
02337 }
02338 SDNode *Select_ISD_BUILD_VECTOR_v8i16(const SDValue &N) {
02339   if (Predicate_vecspltish(N.getNode())) {
02340     SDNode *Result = Emit_23(N, PPC::VSPLTISH, MVT::v8i16);
02341     return Result;
02342   }
02343 
02344   CannotYetSelect(N);
02345   return NULL;
02346 }
02347 
02348 SDNode *Emit_24(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02349   SDValue Tmp1 = Transform_VSPLTISW_get_imm(N.getNode());
02350   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1);
02351 }
02352 SDNode *Emit_25(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02353   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0);
02354 }
02355 SDNode *Select_ISD_BUILD_VECTOR_v4i32(const SDValue &N) {
02356 
02357   // Pattern: (build_vector:v4i32)<<P:Predicate_vecspltisw>><<X:VSPLTISW_get_imm>>:$SIMM
02358   // Emits: (VSPLTISW:v4i32 (VSPLTISW_get_imm:i32 (build_vector:v4i32):$SIMM))
02359   // Pattern complexity = 4  cost = 1  size = 0
02360   if (Predicate_vecspltisw(N.getNode())) {
02361     SDNode *Result = Emit_24(N, PPC::VSPLTISW, MVT::v4i32);
02362     return Result;
02363   }
02364 
02365   // Pattern: (build_vector:v4i32)<<P:Predicate_immAllZerosV>>
02366   // Emits: (V_SET0:v4i32)
02367   // Pattern complexity = 4  cost = 1  size = 0
02368   if (Predicate_immAllZerosV(N.getNode())) {
02369     SDNode *Result = Emit_25(N, PPC::V_SET0, MVT::v4i32);
02370     return Result;
02371   }
02372 
02373   CannotYetSelect(N);
02374   return NULL;
02375 }
02376 
02377 SDNode *Emit_26(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
02378   SDValue Chain = N.getOperand(0);
02379   SDValue N1 = N.getOperand(1);
02380   SDValue N2 = N.getOperand(2);
02381   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
02382   SDValue InFlag(0, 0);
02383   if (HasInFlag) {
02384     InFlag = N.getOperand(N.getNumOperands()-1);
02385   }
02386   SDValue Ops0[] = { N1, N2, Chain, InFlag };
02387   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, MVT::Flag, Ops0, HasInFlag ? 4 : 3);
02388   Chain = SDValue(ResNode, 0);
02389   InFlag = SDValue(ResNode, 1);
02390   const SDValue Froms[] = {
02391     SDValue(N.getNode(), 1),
02392     SDValue(N.getNode(), 0)
02393   };
02394   const SDValue Tos[] = {
02395     InFlag,
02396     SDValue(Chain.getNode(), Chain.getResNo())
02397   };
02398   ReplaceUses(Froms, Tos, 2);
02399   return ResNode;
02400 }
02401 SDNode *Select_ISD_CALLSEQ_END(const SDValue &N) {
02402   SDValue Chain = N.getOperand(0);
02403   SDValue N1 = N.getOperand(1);
02404   if (N1.getOpcode() == ISD::TargetConstant) {
02405     SDValue N2 = N.getOperand(2);
02406     if (N2.getOpcode() == ISD::TargetConstant) {
02407       SDNode *Result = Emit_26(N, PPC::ADJCALLSTACKUP);
02408       return Result;
02409     }
02410   }
02411 
02412   CannotYetSelect(N);
02413   return NULL;
02414 }
02415 
02416 SDNode *Emit_27(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
02417   SDValue Chain = N.getOperand(0);
02418   SDValue N1 = N.getOperand(1);
02419   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, MVT::Flag, N1, Chain);
02420   Chain = SDValue(ResNode, 0);
02421   SDValue InFlag(ResNode, 1);
02422   const SDValue Froms[] = {
02423     SDValue(N.getNode(), 1),
02424     SDValue(N.getNode(), 0)
02425   };
02426   const SDValue Tos[] = {
02427     InFlag,
02428     SDValue(Chain.getNode(), Chain.getResNo())
02429   };
02430   ReplaceUses(Froms, Tos, 2);
02431   return ResNode;
02432 }
02433 SDNode *Select_ISD_CALLSEQ_START(const SDValue &N) {
02434   SDValue Chain = N.getOperand(0);
02435   SDValue N1 = N.getOperand(1);
02436   if (N1.getOpcode() == ISD::TargetConstant) {
02437     SDNode *Result = Emit_27(N, PPC::ADJCALLSTACKDOWN);
02438     return Result;
02439   }
02440 
02441   CannotYetSelect(N);
02442   return NULL;
02443 }
02444 
02445 SDNode *Emit_28(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02446   SDValue N0 = N.getOperand(0);
02447   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0);
02448 }
02449 SDNode *Select_ISD_CTLZ_i32(const SDValue &N) {
02450   SDNode *Result = Emit_28(N, PPC::CNTLZW, MVT::i32);
02451   return Result;
02452 }
02453 
02454 SDNode *Select_ISD_CTLZ_i64(const SDValue &N) {
02455   SDNode *Result = Emit_28(N, PPC::CNTLZD, MVT::i64);
02456   return Result;
02457 }
02458 
02459 SDNode *Emit_29(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02460   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32);
02461   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp0);
02462 }
02463 SDNode *Emit_30(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02464   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32);
02465   SDValue Tmp1 = Transform_HI16(Tmp0.getNode());
02466   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1);
02467 }
02468 SDNode *Emit_31(const SDValue &N, unsigned Opc0, unsigned Opc1, MVT VT0, MVT VT1) DISABLE_INLINE {
02469   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32);
02470   SDValue Tmp1 = Transform_HI16(Tmp0.getNode());
02471   SDValue Tmp2(CurDAG->getTargetNode(Opc0, N.getDebugLoc(), VT0, Tmp1), 0);
02472   SDValue Tmp3 = Transform_LO16(Tmp0.getNode());
02473   return CurDAG->SelectNodeTo(N.getNode(), Opc1, VT1, Tmp2, Tmp3);
02474 }
02475 SDNode *Select_ISD_Constant_i32(const SDValue &N) {
02476 
02477   // Pattern: (imm:i32)<<P:Predicate_immSExt16>>:$imm
02478   // Emits: (LI:i32 (imm:i32):$imm)
02479   // Pattern complexity = 4  cost = 1  size = 0
02480   if (Predicate_immSExt16(N.getNode())) {
02481     SDNode *Result = Emit_29(N, PPC::LI, MVT::i32);
02482     return Result;
02483   }
02484 
02485   // Pattern: (imm:i32)<<P:Predicate_imm16ShiftedSExt>><<X:HI16>>:$imm
02486   // Emits: (LIS:i32 (HI16:i32 (imm:i32):$imm))
02487   // Pattern complexity = 4  cost = 1  size = 0
02488   if (Predicate_imm16ShiftedSExt(N.getNode())) {
02489     SDNode *Result = Emit_30(N, PPC::LIS, MVT::i32);
02490     return Result;
02491   }
02492 
02493   // Pattern: (imm:i32):$imm
02494   // Emits: (ORI:i32 (LIS:i32 (HI16:i32 (imm:i32):$imm)), (LO16:i32 (imm:i32):$imm))
02495   // Pattern complexity = 3  cost = 2  size = 0
02496   SDNode *Result = Emit_31(N, PPC::LIS, PPC::ORI, MVT::i32, MVT::i32);
02497   return Result;
02498 }
02499 
02500 SDNode *Emit_32(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02501   SDValue Tmp0 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i64);
02502   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp0);
02503 }
02504 SDNode *Emit_33(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02505   SDValue Tmp0 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i64);
02506   SDValue Tmp1 = Transform_HI16(Tmp0.getNode());
02507   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1);
02508 }
02509 SDNode *Select_ISD_Constant_i64(const SDValue &N) {
02510 
02511   // Pattern: (imm:i64)<<P:Predicate_immSExt16>>:$imm
02512   // Emits: (LI8:i64 (imm:i64):$imm)
02513   // Pattern complexity = 4  cost = 1  size = 0
02514   if (Predicate_immSExt16(N.getNode())) {
02515     SDNode *Result = Emit_32(N, PPC::LI8, MVT::i64);
02516     return Result;
02517   }
02518 
02519   // Pattern: (imm:i64)<<P:Predicate_imm16ShiftedSExt>><<X:HI16>>:$imm
02520   // Emits: (LIS8:i64 (HI16:i64 (imm:i64):$imm))
02521   // Pattern complexity = 4  cost = 1  size = 0
02522   if (Predicate_imm16ShiftedSExt(N.getNode())) {
02523     SDNode *Result = Emit_33(N, PPC::LIS8, MVT::i64);
02524     return Result;
02525   }
02526 
02527   CannotYetSelect(N);
02528   return NULL;
02529 }
02530 
02531 SDNode *Emit_34(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
02532   SDValue Chain = N.getOperand(0);
02533   SDValue N1 = N.getOperand(1);
02534   SDValue N2 = N.getOperand(2);
02535   SDValue N3 = N.getOperand(3);
02536   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
02537   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32);
02538   SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N3)->getZExtValue()), MVT::i32);
02539   SDValue Ops0[] = { Tmp0, Tmp1, Tmp2, Chain };
02540   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 4);
02541 }
02542 SDNode *Select_ISD_DEBUG_LOC(const SDValue &N) {
02543   SDValue Chain = N.getOperand(0);
02544   SDValue N1 = N.getOperand(1);
02545   if (N1.getOpcode() == ISD::Constant) {
02546     SDValue N2 = N.getOperand(2);
02547     if (N2.getOpcode() == ISD::Constant) {
02548       SDValue N3 = N.getOperand(3);
02549       if (N3.getOpcode() == ISD::Constant &&
02550           N1.getNode()->getValueType(0) == MVT::i32 &&
02551           N2.getNode()->getValueType(0) == MVT::i32 &&
02552           N3.getNode()->getValueType(0) == MVT::i32) {
02553         SDNode *Result = Emit_34(N, PPC::DWARF_LOC);
02554         return Result;
02555       }
02556     }
02557   }
02558 
02559   CannotYetSelect(N);
02560   return NULL;
02561 }
02562 
02563 SDNode *Select_ISD_FABS_f32(const SDValue &N) {
02564   SDNode *Result = Emit_28(N, PPC::FABSS, MVT::f32);
02565   return Result;
02566 }
02567 
02568 SDNode *Select_ISD_FABS_f64(const SDValue &N) {
02569   SDNode *Result = Emit_28(N, PPC::FABSD, MVT::f64);
02570   return Result;
02571 }
02572 
02573 SDNode *Emit_35(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02574   SDValue N0 = N.getOperand(0);
02575   SDValue N00 = N0.getOperand(0);
02576   SDValue N01 = N0.getOperand(1);
02577   SDValue N1 = N.getOperand(1);
02578   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N00, N01, N1);
02579 }
02580 SDNode *Emit_36(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02581   SDValue N0 = N.getOperand(0);
02582   SDValue N1 = N.getOperand(1);
02583   SDValue N10 = N1.getOperand(0);
02584   SDValue N11 = N1.getOperand(1);
02585   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N10, N11, N0);
02586 }
02587 SDNode *Select_ISD_FADD_f32(const SDValue &N) {
02588   if ((!NoExcessFPPrecision)) {
02589     SDValue N0 = N.getOperand(0);
02590 
02591     // Pattern: (fadd:f32 (fmul:f32 F4RC:f32:$FRA, F4RC:f32:$FRC), F4RC:f32:$FRB)
02592     // Emits: (FMADDS:f32 F4RC:f32:$FRA, F4RC:f32:$FRC, F4RC:f32:$FRB)
02593     // Pattern complexity = 6  cost = 1  size = 0
02594     if (N0.getOpcode() == ISD::FMUL) {
02595       SDNode *Result = Emit_35(N, PPC::FMADDS, MVT::f32);
02596       return Result;
02597     }
02598 
02599     // Pattern: (fadd:f32 F4RC:f32:$FRB, (fmul:f32 F4RC:f32:$FRA, F4RC:f32:$FRC))
02600     // Emits: (FMADDS:f32 F4RC:f32:$FRA, F4RC:f32:$FRC, F4RC:f32:$FRB)
02601     // Pattern complexity = 6  cost = 1  size = 0
02602     SDValue N1 = N.getOperand(1);
02603     if (N1.getOpcode() == ISD::FMUL) {
02604       SDNode *Result = Emit_36(N, PPC::FMADDS, MVT::f32);
02605       return Result;
02606     }
02607   }
02608 
02609   // Pattern: (fadd:f32 F4RC:f32:$FRA, F4RC:f32:$FRB)
02610   // Emits: (FADDS:f32 F4RC:f32:$FRA, F4RC:f32:$FRB)
02611   // Pattern complexity = 3  cost = 1  size = 0
02612   SDNode *Result = Emit_3(N, PPC::FADDS, MVT::f32);
02613   return Result;
02614 }
02615 
02616 SDNode *Select_ISD_FADD_f64(const SDValue &N) {
02617   if ((!NoExcessFPPrecision)) {
02618     SDValue N0 = N.getOperand(0);
02619 
02620     // Pattern: (fadd:f64 (fmul:f64 F8RC:f64:$FRA, F8RC:f64:$FRC), F8RC:f64:$FRB)
02621     // Emits: (FMADD:f64 F8RC:f64:$FRA, F8RC:f64:$FRC, F8RC:f64:$FRB)
02622     // Pattern complexity = 6  cost = 1  size = 0
02623     if (N0.getOpcode() == ISD::FMUL) {
02624       SDNode *Result = Emit_35(N, PPC::FMADD, MVT::f64);
02625       return Result;
02626     }
02627 
02628     // Pattern: (fadd:f64 F8RC:f64:$FRB, (fmul:f64 F8RC:f64:$FRA, F8RC:f64:$FRC))
02629     // Emits: (FMADD:f64 F8RC:f64:$FRA, F8RC:f64:$FRC, F8RC:f64:$FRB)
02630     // Pattern complexity = 6  cost = 1  size = 0
02631     SDValue N1 = N.getOperand(1);
02632     if (N1.getOpcode() == ISD::FMUL) {
02633       SDNode *Result = Emit_36(N, PPC::FMADD, MVT::f64);
02634       return Result;
02635     }
02636   }
02637 
02638   // Pattern: (fadd:f64 F8RC:f64:$FRA, F8RC:f64:$FRB)
02639   // Emits: (FADD:f64 F8RC:f64:$FRA, F8RC:f64:$FRB)
02640   // Pattern complexity = 3  cost = 1  size = 0
02641   SDNode *Result = Emit_3(N, PPC::FADD, MVT::f64);
02642   return Result;
02643 }
02644 
02645 SDNode *Select_ISD_FADD_v4f32(const SDValue &N) {
02646   if ((!NoExcessFPPrecision)) {
02647     SDValue N0 = N.getOperand(0);
02648 
02649     // Pattern: (fadd:v4f32 (fmul:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vC), VRRC:v4f32:$vB)
02650     // Emits: (VMADDFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vC, VRRC:v4f32:$vB)
02651     // Pattern complexity = 6  cost = 1  size = 0
02652     if (N0.getOpcode() == ISD::FMUL) {
02653       SDNode *Result = Emit_35(N, PPC::VMADDFP, MVT::v4f32);
02654       return Result;
02655     }
02656 
02657     // Pattern: (fadd:v4f32 VRRC:v4f32:$vB, (fmul:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vC))
02658     // Emits: (VMADDFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vC, VRRC:v4f32:$vB)
02659     // Pattern complexity = 6  cost = 1  size = 0
02660     SDValue N1 = N.getOperand(1);
02661     if (N1.getOpcode() == ISD::FMUL) {
02662       SDNode *Result = Emit_36(N, PPC::VMADDFP, MVT::v4f32);
02663       return Result;
02664     }
02665   }
02666 
02667   // Pattern: (fadd:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
02668   // Emits: (VADDFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
02669   // Pattern complexity = 3  cost = 1  size = 0
02670   SDNode *Result = Emit_3(N, PPC::VADDFP, MVT::v4f32);
02671   return Result;
02672 }
02673 
02674 SDNode *Select_ISD_FDIV_f32(const SDValue &N) {
02675   SDNode *Result = Emit_3(N, PPC::FDIVS, MVT::f32);
02676   return Result;
02677 }
02678 
02679 SDNode *Select_ISD_FDIV_f64(const SDValue &N) {
02680   SDNode *Result = Emit_3(N, PPC::FDIV, MVT::f64);
02681   return Result;
02682 }
02683 
02684 SDNode *Select_ISD_FMUL_f32(const SDValue &N) {
02685   SDNode *Result = Emit_3(N, PPC::FMULS, MVT::f32);
02686   return Result;
02687 }
02688 
02689 SDNode *Select_ISD_FMUL_f64(const SDValue &N) {
02690   SDNode *Result = Emit_3(N, PPC::FMUL, MVT::f64);
02691   return Result;
02692 }
02693 
02694 SDNode *Emit_37(const SDValue &N, unsigned Opc0, unsigned Opc1, MVT VT0, MVT VT1) DISABLE_INLINE {
02695   SDValue N0 = N.getOperand(0);
02696   SDValue N1 = N.getOperand(1);
02697   SDValue Tmp2(CurDAG->getTargetNode(Opc0, N.getDebugLoc(), VT0), 0);
02698   return CurDAG->SelectNodeTo(N.getNode(), Opc1, VT1, N0, N1, Tmp2);
02699 }
02700 SDNode *Select_ISD_FMUL_v4f32(const SDValue &N) {
02701   SDNode *Result = Emit_37(N, PPC::V_SET0, PPC::VMADDFP, MVT::v4i32, MVT::v4f32);
02702   return Result;
02703 }
02704 
02705 SDNode *Emit_38(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02706   SDValue N0 = N.getOperand(0);
02707   SDValue N00 = N0.getOperand(0);
02708   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N00);
02709 }
02710 SDNode *Emit_39(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02711   SDValue N0 = N.getOperand(0);
02712   SDValue N00 = N0.getOperand(0);
02713   SDValue N000 = N00.getOperand(0);
02714   SDValue N001 = N00.getOperand(1);
02715   SDValue N01 = N0.getOperand(1);
02716   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N000, N001, N01);
02717 }
02718 SDNode *Emit_40(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02719   SDValue N0 = N.getOperand(0);
02720   SDValue N00 = N0.getOperand(0);
02721   SDValue N01 = N0.getOperand(1);
02722   SDValue N010 = N01.getOperand(0);
02723   SDValue N011 = N01.getOperand(1);
02724   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N010, N011, N00);
02725 }
02726 SDNode *Select_ISD_FNEG_f32(const SDValue &N) {
02727   if ((!NoExcessFPPrecision)) {
02728     SDValue N0 = N.getOperand(0);
02729 
02730     // Pattern: (fneg:f32 (fadd:f32 (fmul:f32 F4RC:f32:$FRA, F4RC:f32:$FRC), F4RC:f32:$FRB))
02731     // Emits: (FNMADDS:f32 F4RC:f32:$FRA, F4RC:f32:$FRC, F4RC:f32:$FRB)
02732     // Pattern complexity = 9  cost = 1  size = 0
02733     if (N0.getOpcode() == ISD::FADD) {
02734       SDValue N00 = N0.getOperand(0);
02735       if (N00.getOpcode() == ISD::FMUL) {
02736         SDNode *Result = Emit_39(N, PPC::FNMADDS, MVT::f32);
02737         return Result;
02738       }
02739     }
02740 
02741     // Pattern: (fneg:f32 (fsub:f32 (fmul:f32 F4RC:f32:$FRA, F4RC:f32:$FRC), F4RC:f32:$FRB))
02742     // Emits: (FNMSUBS:f32 F4RC:f32:$FRA, F4RC:f32:$FRC, F4RC:f32:$FRB)
02743     // Pattern complexity = 9  cost = 1  size = 0
02744     if (N0.getOpcode() == ISD::FSUB) {
02745       SDValue N00 = N0.getOperand(0);
02746       if (N00.getOpcode() == ISD::FMUL) {
02747         SDNode *Result = Emit_39(N, PPC::FNMSUBS, MVT::f32);
02748         return Result;
02749       }
02750     }
02751 
02752     // Pattern: (fneg:f32 (fadd:f32 F4RC:f32:$FRB, (fmul:f32 F4RC:f32:$FRA, F4RC:f32:$FRC)))
02753     // Emits: (FNMADDS:f32 F4RC:f32:$FRA, F4RC:f32:$FRC, F4RC:f32:$FRB)
02754     // Pattern complexity = 9  cost = 1  size = 0
02755     if (N0.getOpcode() == ISD::FADD) {
02756       SDValue N00 = N0.getOperand(0);
02757       SDValue N01 = N0.getOperand(1);
02758       if (N01.getOpcode() == ISD::FMUL) {
02759         SDNode *Result = Emit_40(N, PPC::FNMADDS, MVT::f32);
02760         return Result;
02761       }
02762     }
02763   }
02764 
02765   // Pattern: (fneg:f32 (fabs:f32 F4RC:f32:$frB))
02766   // Emits: (FNABSS:f32 F4RC:f32:$frB)
02767   // Pattern complexity = 6  cost = 1  size = 0
02768   {
02769     SDValue N0 = N.getOperand(0);
02770     if (N0.getOpcode() == ISD::FABS) {
02771       SDNode *Result = Emit_38(N, PPC::FNABSS, MVT::f32);
02772       return Result;
02773     }
02774   }
02775 
02776   // Pattern: (fneg:f32 F4RC:f32:$frB)
02777   // Emits: (FNEGS:f32 F4RC:f32:$frB)
02778   // Pattern complexity = 3  cost = 1  size = 0
02779   SDNode *Result = Emit_28(N, PPC::FNEGS, MVT::f32);
02780   return Result;
02781 }
02782 
02783 SDNode *Select_ISD_FNEG_f64(const SDValue &N) {
02784   if ((!NoExcessFPPrecision)) {
02785     SDValue N0 = N.getOperand(0);
02786 
02787     // Pattern: (fneg:f64 (fadd:f64 (fmul:f64 F8RC:f64:$FRA, F8RC:f64:$FRC), F8RC:f64:$FRB))
02788     // Emits: (FNMADD:f64 F8RC:f64:$FRA, F8RC:f64:$FRC, F8RC:f64:$FRB)
02789     // Pattern complexity = 9  cost = 1  size = 0
02790     if (N0.getOpcode() == ISD::FADD) {
02791       SDValue N00 = N0.getOperand(0);
02792       if (N00.getOpcode() == ISD::FMUL) {
02793         SDNode *Result = Emit_39(N, PPC::FNMADD, MVT::f64);
02794         return Result;
02795       }
02796     }
02797 
02798     // Pattern: (fneg:f64 (fsub:f64 (fmul:f64 F8RC:f64:$FRA, F8RC:f64:$FRC), F8RC:f64:$FRB))
02799     // Emits: (FNMSUB:f64 F8RC:f64:$FRA, F8RC:f64:$FRC, F8RC:f64:$FRB)
02800     // Pattern complexity = 9  cost = 1  size = 0
02801     if (N0.getOpcode() == ISD::FSUB) {
02802       SDValue N00 = N0.getOperand(0);
02803       if (N00.getOpcode() == ISD::FMUL) {
02804         SDNode *Result = Emit_39(N, PPC::FNMSUB, MVT::f64);
02805         return Result;
02806       }
02807     }
02808 
02809     // Pattern: (fneg:f64 (fadd:f64 F8RC:f64:$FRB, (fmul:f64 F8RC:f64:$FRA, F8RC:f64:$FRC)))
02810     // Emits: (FNMADD:f64 F8RC:f64:$FRA, F8RC:f64:$FRC, F8RC:f64:$FRB)
02811     // Pattern complexity = 9  cost = 1  size = 0
02812     if (N0.getOpcode() == ISD::FADD) {
02813       SDValue N00 = N0.getOperand(0);
02814       SDValue N01 = N0.getOperand(1);
02815       if (N01.getOpcode() == ISD::FMUL) {
02816         SDNode *Result = Emit_40(N, PPC::FNMADD, MVT::f64);
02817         return Result;
02818       }
02819     }
02820   }
02821 
02822   // Pattern: (fneg:f64 (fabs:f64 F8RC:f64:$frB))
02823   // Emits: (FNABSD:f64 F8RC:f64:$frB)
02824   // Pattern complexity = 6  cost = 1  size = 0
02825   {
02826     SDValue N0 = N.getOperand(0);
02827     if (N0.getOpcode() == ISD::FABS) {
02828       SDNode *Result = Emit_38(N, PPC::FNABSD, MVT::f64);
02829       return Result;
02830     }
02831   }
02832 
02833   // Pattern: (fneg:f64 F8RC:f64:$frB)
02834   // Emits: (FNEGD:f64 F8RC:f64:$frB)
02835   // Pattern complexity = 3  cost = 1  size = 0
02836   SDNode *Result = Emit_28(N, PPC::FNEGD, MVT::f64);
02837   return Result;
02838 }
02839 
02840 SDNode *Select_ISD_FP_EXTEND_f64(const SDValue &N) {
02841   SDValue N0 = N.getOperand(0);
02842   if (N0.getNode()->getValueType(0) == MVT::f32) {
02843     SDNode *Result = Emit_28(N, PPC::FMRSD, MVT::f64);
02844     return Result;
02845   }
02846 
02847   CannotYetSelect(N);
02848   return NULL;
02849 }
02850 
02851 SDNode *Select_ISD_FP_ROUND_f32(const SDValue &N) {
02852   SDValue N0 = N.getOperand(0);
02853   if (N0.getNode()->getValueType(0) == MVT::f64) {
02854     SDNode *Result = Emit_28(N, PPC::FRSP, MVT::f32);
02855     return Result;
02856   }
02857 
02858   CannotYetSelect(N);
02859   return NULL;
02860 }
02861 
02862 SDNode *Select_ISD_FSQRT_f32(const SDValue &N) {
02863   SDNode *Result = Emit_28(N, PPC::FSQRTS, MVT::f32);
02864   return Result;
02865 }
02866 
02867 SDNode *Select_ISD_FSQRT_f64(const SDValue &N) {
02868   SDNode *Result = Emit_28(N, PPC::FSQRT, MVT::f64);
02869   return Result;
02870 }
02871 
02872 SDNode *Select_ISD_FSUB_f32(const SDValue &N) {
02873   if ((!NoExcessFPPrecision)) {
02874     SDValue N0 = N.getOperand(0);
02875 
02876     // Pattern: (fsub:f32 (fmul:f32 F4RC:f32:$FRA, F4RC:f32:$FRC), F4RC:f32:$FRB)
02877     // Emits: (FMSUBS:f32 F4RC:f32:$FRA, F4RC:f32:$FRC, F4RC:f32:$FRB)
02878     // Pattern complexity = 6  cost = 1  size = 0
02879     if (N0.getOpcode() == ISD::FMUL) {
02880       SDNode *Result = Emit_35(N, PPC::FMSUBS, MVT::f32);
02881       return Result;
02882     }
02883 
02884     // Pattern: (fsub:f32 F4RC:f32:$B, (fmul:f32 F4RC:f32:$A, F4RC:f32:$C))
02885     // Emits: (FNMSUBS:f32 F4RC:f32:$A, F4RC:f32:$C, F4RC:f32:$B)
02886     // Pattern complexity = 6  cost = 1  size = 0
02887     SDValue N1 = N.getOperand(1);
02888     if (N1.getOpcode() == ISD::FMUL) {
02889       SDNode *Result = Emit_36(N, PPC::FNMSUBS, MVT::f32);
02890       return Result;
02891     }
02892   }
02893 
02894   // Pattern: (fsub:f32 F4RC:f32:$FRA, F4RC:f32:$FRB)
02895   // Emits: (FSUBS:f32 F4RC:f32:$FRA, F4RC:f32:$FRB)
02896   // Pattern complexity = 3  cost = 1  size = 0
02897   SDNode *Result = Emit_3(N, PPC::FSUBS, MVT::f32);
02898   return Result;
02899 }
02900 
02901 SDNode *Select_ISD_FSUB_f64(const SDValue &N) {
02902   if ((!NoExcessFPPrecision)) {
02903     SDValue N0 = N.getOperand(0);
02904 
02905     // Pattern: (fsub:f64 (fmul:f64 F8RC:f64:$FRA, F8RC:f64:$FRC), F8RC:f64:$FRB)
02906     // Emits: (FMSUB:f64 F8RC:f64:$FRA, F8RC:f64:$FRC, F8RC:f64:$FRB)
02907     // Pattern complexity = 6  cost = 1  size = 0
02908     if (N0.getOpcode() == ISD::FMUL) {
02909       SDNode *Result = Emit_35(N, PPC::FMSUB, MVT::f64);
02910       return Result;
02911     }
02912 
02913     // Pattern: (fsub:f64 F8RC:f64:$B, (fmul:f64 F8RC:f64:$A, F8RC:f64:$C))
02914     // Emits: (FNMSUB:f64 F8RC:f64:$A, F8RC:f64:$C, F8RC:f64:$B)
02915     // Pattern complexity = 6  cost = 1  size = 0
02916     SDValue N1 = N.getOperand(1);
02917     if (N1.getOpcode() == ISD::FMUL) {
02918       SDNode *Result = Emit_36(N, PPC::FNMSUB, MVT::f64);
02919       return Result;
02920     }
02921   }
02922 
02923   // Pattern: (fsub:f64 F8RC:f64:$FRA, F8RC:f64:$FRB)
02924   // Emits: (FSUB:f64 F8RC:f64:$FRA, F8RC:f64:$FRB)
02925   // Pattern complexity = 3  cost = 1  size = 0
02926   SDNode *Result = Emit_3(N, PPC::FSUB, MVT::f64);
02927   return Result;
02928 }
02929 
02930 SDNode *Emit_41(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
02931   SDValue N0 = N.getOperand(0);
02932   SDValue N1 = N.getOperand(1);
02933   SDValue N10 = N1.getOperand(0);
02934   SDValue N100 = N10.getOperand(0);
02935   SDValue N101 = N10.getOperand(1);
02936   SDValue N11 = N1.getOperand(1);
02937   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N100, N101, N11);
02938 }
02939 SDNode *Select_ISD_FSUB_v4f32(const SDValue &N) {
02940 
02941   // Pattern: (fsub:v4f32 (build_vector:v4f32)<<P:Predicate_V_immneg0>>, (fsub:v4f32 (fmul:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vC), VRRC:v4f32:$vB))
02942   // Emits: (VNMSUBFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vC, VRRC:v4f32:$vB)
02943   // Pattern complexity = 13  cost = 1  size = 0
02944   if ((!NoExcessFPPrecision)) {
02945     SDValue N0 = N.getOperand(0);
02946     if (N0.getOpcode() == ISD::BUILD_VECTOR &&
02947         Predicate_V_immneg0(N0.getNode())) {
02948       SDValue N1 = N.getOperand(1);
02949       if (N1.getOpcode() == ISD::FSUB) {
02950         SDValue N10 = N1.getOperand(0);
02951         if (N10.getOpcode() == ISD::FMUL) {
02952           SDNode *Result = Emit_41(N, PPC::VNMSUBFP, MVT::v4f32);
02953           return Result;
02954         }
02955       }
02956     }
02957   }
02958 
02959   // Pattern: (fsub:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
02960   // Emits: (VSUBFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
02961   // Pattern complexity = 3  cost = 1  size = 0
02962   SDNode *Result = Emit_3(N, PPC::VSUBFP, MVT::v4f32);
02963   return Result;
02964 }
02965 
02966 SDNode *Emit_42(const SDValue &N, unsigned Opc0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1) DISABLE_INLINE {
02967   SDValue Chain = N.getOperand(0);
02968   SDValue N1 = N.getOperand(1);
02969   SDValue N2 = N.getOperand(2);
02970   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, CPTmpN2_0, CPTmpN2_1, Chain);
02971 }
02972 SDNode *Emit_43(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
02973   SDValue Chain = N.getOperand(0);
02974   SDValue N1 = N.getOperand(1);
02975   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Chain);
02976 }
02977 SDNode *Emit_44(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
02978   SDValue Chain = N.getOperand(0);
02979   SDValue N1 = N.getOperand(1);
02980   SDValue N2 = N.getOperand(2);
02981   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, N2, Chain);
02982 }
02983 SDNode *Emit_45(const SDValue &N, unsigned Opc0, SDValue &CPTmpN3_0, SDValue &CPTmpN3_1) DISABLE_INLINE {
02984   SDValue Chain = N.getOperand(0);
02985   SDValue N1 = N.getOperand(1);
02986   SDValue N2 = N.getOperand(2);
02987   SDValue N3 = N.getOperand(3);
02988   SDValue Ops0[] = { N2, CPTmpN3_0, CPTmpN3_1, Chain };
02989   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 4);
02990 }
02991 SDNode *Emit_46(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
02992   SDValue Chain = N.getOperand(0);
02993   SDValue N1 = N.getOperand(1);
02994   SDValue Tmp2 = CurDAG->getTargetConstant(0x1ULL, MVT::i32);
02995   SDValue Tmp3 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
02996   SDValue Tmp4 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
02997   SDValue Tmp5 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
02998   SDValue Ops0[] = { Tmp2, Tmp3, Tmp4, Tmp5, Chain };
02999   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 5);
03000 }
03001 SDNode *Emit_47(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
03002   SDValue Chain = N.getOperand(0);
03003   SDValue N1 = N.getOperand(1);
03004   SDValue N2 = N.getOperand(2);
03005   SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
03006   SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32);
03007   SDValue Tmp4 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
03008   SDValue Tmp5 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
03009   SDValue Ops0[] = { Tmp2, Tmp3, Tmp4, Tmp5, Chain };
03010   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 5);
03011 }
03012 SDNode *Emit_48(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
03013   SDValue Chain = N.getOperand(0);
03014   SDValue N1 = N.getOperand(1);
03015   SDValue N2 = N.getOperand(2);
03016   SDValue N3 = N.getOperand(3);
03017   SDValue N4 = N.getOperand(4);
03018   SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
03019   SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N4)->getZExtValue()), MVT::i32);
03020   SDValue Ops0[] = { Tmp2, Tmp3, N2, N3, Chain };
03021   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 5);
03022 }
03023 SDNode *Emit_49(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
03024   SDValue Chain = N.getOperand(0);
03025   SDValue N1 = N.getOperand(1);
03026   SDValue N2 = N.getOperand(2);
03027   SDValue N3 = N.getOperand(3);
03028   SDValue N4 = N.getOperand(4);
03029   SDValue Tmp2 = CurDAG->getTargetConstant(0x1ULL, MVT::i32);
03030   SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N4)->getZExtValue()), MVT::i32);
03031   SDValue Ops0[] = { Tmp2, Tmp3, N2, N3, Chain };
03032   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 5);
03033 }
03034 SDNode *Select_ISD_INTRINSIC_VOID(const SDValue &N) {
03035   SDValue Chain = N.getOperand(0);
03036   SDValue N1 = N.getOperand(1);
03037   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
03038   if (Tmp0) {
03039     int64_t CN1 = Tmp0->getSExtValue();
03040 
03041     // Pattern: (intrinsic_void:isVoid 212:iPTR, xoaddr:iPTR:$dst)
03042     // Emits: (DCBA:isVoid xoaddr:iPTR:$dst)
03043     // Pattern complexity = 17  cost = 1  size = 0
03044     if (CN1 == INT64_C(212)) {
03045       SDValue N2 = N.getOperand(2);
03046       SDValue CPTmpN2_0;
03047       SDValue CPTmpN2_1;
03048       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03049         SDNode *Result = Emit_42(N, PPC::DCBA, CPTmpN2_0, CPTmpN2_1);
03050         return Result;
03051       }
03052     }
03053 
03054     // Pattern: (intrinsic_void:isVoid 213:iPTR, xoaddr:iPTR:$dst)
03055     // Emits: (DCBF:isVoid xoaddr:iPTR:$dst)
03056     // Pattern complexity = 17  cost = 1  size = 0
03057     if (CN1 == INT64_C(213)) {
03058       SDValue N2 = N.getOperand(2);
03059       SDValue CPTmpN2_0;
03060       SDValue CPTmpN2_1;
03061       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03062         SDNode *Result = Emit_42(N, PPC::DCBF, CPTmpN2_0, CPTmpN2_1);
03063         return Result;
03064       }
03065     }
03066 
03067     // Pattern: (intrinsic_void:isVoid 214:iPTR, xoaddr:iPTR:$dst)
03068     // Emits: (DCBI:isVoid xoaddr:iPTR:$dst)
03069     // Pattern complexity = 17  cost = 1  size = 0
03070     if (CN1 == INT64_C(214)) {
03071       SDValue N2 = N.getOperand(2);
03072       SDValue CPTmpN2_0;
03073       SDValue CPTmpN2_1;
03074       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03075         SDNode *Result = Emit_42(N, PPC::DCBI, CPTmpN2_0, CPTmpN2_1);
03076         return Result;
03077       }
03078     }
03079 
03080     // Pattern: (intrinsic_void:isVoid 215:iPTR, xoaddr:iPTR:$dst)
03081     // Emits: (DCBST:isVoid xoaddr:iPTR:$dst)
03082     // Pattern complexity = 17  cost = 1  size = 0
03083     if (CN1 == INT64_C(215)) {
03084       SDValue N2 = N.getOperand(2);
03085       SDValue CPTmpN2_0;
03086       SDValue CPTmpN2_1;
03087       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03088         SDNode *Result = Emit_42(N, PPC::DCBST, CPTmpN2_0, CPTmpN2_1);
03089         return Result;
03090       }
03091     }
03092 
03093     // Pattern: (intrinsic_void:isVoid 216:iPTR, xoaddr:iPTR:$dst)
03094     // Emits: (DCBT:isVoid xoaddr:iPTR:$dst)
03095     // Pattern complexity = 17  cost = 1  size = 0
03096     if (CN1 == INT64_C(216)) {
03097       SDValue N2 = N.getOperand(2);
03098       SDValue CPTmpN2_0;
03099       SDValue CPTmpN2_1;
03100       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03101         SDNode *Result = Emit_42(N, PPC::DCBT, CPTmpN2_0, CPTmpN2_1);
03102         return Result;
03103       }
03104     }
03105 
03106     // Pattern: (intrinsic_void:isVoid 217:iPTR, xoaddr:iPTR:$dst)
03107     // Emits: (DCBTST:isVoid xoaddr:iPTR:$dst)
03108     // Pattern complexity = 17  cost = 1  size = 0
03109     if (CN1 == INT64_C(217)) {
03110       SDValue N2 = N.getOperand(2);
03111       SDValue CPTmpN2_0;
03112       SDValue CPTmpN2_1;
03113       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03114         SDNode *Result = Emit_42(N, PPC::DCBTST, CPTmpN2_0, CPTmpN2_1);
03115         return Result;
03116       }
03117     }
03118 
03119     // Pattern: (intrinsic_void:isVoid 218:iPTR, xoaddr:iPTR:$dst)
03120     // Emits: (DCBZ:isVoid xoaddr:iPTR:$dst)
03121     // Pattern complexity = 17  cost = 1  size = 0
03122     if (CN1 == INT64_C(218)) {
03123       SDValue N2 = N.getOperand(2);
03124       SDValue CPTmpN2_0;
03125       SDValue CPTmpN2_1;
03126       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03127         SDNode *Result = Emit_42(N, PPC::DCBZ, CPTmpN2_0, CPTmpN2_1);
03128         return Result;
03129       }
03130     }
03131 
03132     // Pattern: (intrinsic_void:isVoid 219:iPTR, xoaddr:iPTR:$dst)
03133     // Emits: (DCBZL:isVoid xoaddr:iPTR:$dst)
03134     // Pattern complexity = 17  cost = 1  size = 0
03135     if (CN1 == INT64_C(219)) {
03136       SDValue N2 = N.getOperand(2);
03137       SDValue CPTmpN2_0;
03138       SDValue CPTmpN2_1;
03139       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
03140         SDNode *Result = Emit_42(N, PPC::DCBZL, CPTmpN2_0, CPTmpN2_1);
03141         return Result;
03142       }
03143     }
03144 
03145     // Pattern: (intrinsic_void:isVoid 80:iPTR, VRRC:v16i8:$rS, xoaddr:iPTR:$dst)
03146     // Emits: (STVEBX:isVoid VRRC:v16i8:$rS, xoaddr:iPTR:$dst)
03147     // Pattern complexity = 17  cost = 1  size = 0
03148     if (CN1 == INT64_C(80)) {
03149       SDValue N2 = N.getOperand(2);
03150       SDValue N3 = N.getOperand(3);
03151       SDValue CPTmpN3_0;
03152       SDValue CPTmpN3_1;
03153       if (SelectAddrIdxOnly(N, N3, CPTmpN3_0, CPTmpN3_1)) {
03154         SDNode *Result = Emit_45(N, PPC::STVEBX, CPTmpN3_0, CPTmpN3_1);
03155         return Result;
03156       }
03157     }
03158 
03159     // Pattern: (intrinsic_void:isVoid 81:iPTR, VRRC:v8i16:$rS, xoaddr:iPTR:$dst)
03160     // Emits: (STVEHX:isVoid VRRC:v8i16:$rS, xoaddr:iPTR:$dst)
03161     // Pattern complexity = 17  cost = 1  size = 0
03162     if (CN1 == INT64_C(81)) {
03163       SDValue N2 = N.getOperand(2);
03164       SDValue N3 = N.getOperand(3);
03165       SDValue CPTmpN3_0;
03166       SDValue CPTmpN3_1;
03167       if (SelectAddrIdxOnly(N, N3, CPTmpN3_0, CPTmpN3_1)) {
03168         SDNode *Result = Emit_45(N, PPC::STVEHX, CPTmpN3_0, CPTmpN3_1);
03169         return Result;
03170       }
03171     }
03172 
03173     // Pattern: (intrinsic_void:isVoid 82:iPTR, VRRC:v4i32:$rS, xoaddr:iPTR:$dst)
03174     // Emits: (STVEWX:isVoid VRRC:v4i32:$rS, xoaddr:iPTR:$dst)
03175     // Pattern complexity = 17  cost = 1  size = 0
03176     if (CN1 == INT64_C(82)) {
03177       SDValue N2 = N.getOperand(2);
03178       SDValue N3 = N.getOperand(3);
03179       SDValue CPTmpN3_0;
03180       SDValue CPTmpN3_1;
03181       if (SelectAddrIdxOnly(N, N3, CPTmpN3_0, CPTmpN3_1)) {
03182         SDNode *Result = Emit_45(N, PPC::STVEWX, CPTmpN3_0, CPTmpN3_1);
03183         return Result;
03184       }
03185     }
03186 
03187     // Pattern: (intrinsic_void:isVoid 83:iPTR, VRRC:v4i32:$rS, xoaddr:iPTR:$dst)
03188     // Emits: (STVX:isVoid VRRC:v4i32:$rS, xoaddr:iPTR:$dst)
03189     // Pattern complexity = 17  cost = 1  size = 0
03190     if (CN1 == INT64_C(83)) {
03191       SDValue N2 = N.getOperand(2);
03192       SDValue N3 = N.getOperand(3);
03193       SDValue CPTmpN3_0;
03194       SDValue CPTmpN3_1;
03195       if (SelectAddrIdxOnly(N, N3, CPTmpN3_0, CPTmpN3_1)) {
03196         SDNode *Result = Emit_45(N, PPC::STVX, CPTmpN3_0, CPTmpN3_1);
03197         return Result;
03198       }
03199     }
03200 
03201     // Pattern: (intrinsic_void:isVoid 84:iPTR, VRRC:v4i32:$rS, xoaddr:iPTR:$dst)
03202     // Emits: (STVXL:isVoid VRRC:v4i32:$rS, xoaddr:iPTR:$dst)
03203     // Pattern complexity = 17  cost = 1  size = 0
03204     if (CN1 == INT64_C(84)) {
03205       SDValue N2 = N.getOperand(2);
03206       SDValue N3 = N.getOperand(3);
03207       SDValue CPTmpN3_0;
03208       SDValue CPTmpN3_1;
03209       if (SelectAddrIdxOnly(N, N3, CPTmpN3_0, CPTmpN3_1)) {
03210         SDNode *Result = Emit_45(N, PPC::STVXL, CPTmpN3_0, CPTmpN3_1);
03211         return Result;
03212       }
03213     }
03214 
03215     // Pattern: (intrinsic_void:isVoid 65:iPTR, (imm:i32):$STRM)
03216     // Emits: (DSS:isVoid 0:i32, (imm:i32):$STRM, 0:i32, 0:i32)
03217     // Pattern complexity = 11  cost = 1  size = 0
03218     if (CN1 == INT64_C(65)) {
03219       SDValue N2 = N.getOperand(2);
03220       if (N2.getOpcode() == ISD::Constant) {
03221         SDNode *Result = Emit_47(N, PPC::DSS);
03222         return Result;
03223       }
03224     }
03225 
03226     // Pattern: (intrinsic_void:isVoid 67:iPTR, GPRC:i32:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03227     // Emits: (DST:isVoid 0:i32, (imm:i32):$STRM, GPRC:i32:$rA, GPRC:i32:$rB)
03228     // Pattern complexity = 11  cost = 1  size = 0
03229     if (CN1 == INT64_C(67)) {
03230       SDValue N2 = N.getOperand(2);
03231       SDValue N3 = N.getOperand(3);
03232       SDValue N4 = N.getOperand(4);
03233       if (N4.getOpcode() == ISD::Constant &&
03234           N2.getNode()->getValueType(0) == MVT::i32) {
03235         SDNode *Result = Emit_48(N, PPC::DST);
03236         return Result;
03237       }
03238     }
03239 
03240     // Pattern: (intrinsic_void:isVoid 70:iPTR, GPRC:i32:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03241     // Emits: (DSTT:isVoid 1:i32, (imm:i32):$STRM, GPRC:i32:$rA, GPRC:i32:$rB)
03242     // Pattern complexity = 11  cost = 1  size = 0
03243     if (CN1 == INT64_C(70)) {
03244       SDValue N2 = N.getOperand(2);
03245       SDValue N3 = N.getOperand(3);
03246       SDValue N4 = N.getOperand(4);
03247       if (N4.getOpcode() == ISD::Constant &&
03248           N2.getNode()->getValueType(0) == MVT::i32) {
03249         SDNode *Result = Emit_49(N, PPC::DSTT);
03250         return Result;
03251       }
03252     }
03253 
03254     // Pattern: (intrinsic_void:isVoid 68:iPTR, GPRC:i32:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03255     // Emits: (DSTST:isVoid 0:i32, (imm:i32):$STRM, GPRC:i32:$rA, GPRC:i32:$rB)
03256     // Pattern complexity = 11  cost = 1  size = 0
03257     if (CN1 == INT64_C(68)) {
03258       SDValue N2 = N.getOperand(2);
03259       SDValue N3 = N.getOperand(3);
03260       SDValue N4 = N.getOperand(4);
03261       if (N4.getOpcode() == ISD::Constant &&
03262           N2.getNode()->getValueType(0) == MVT::i32) {
03263         SDNode *Result = Emit_48(N, PPC::DSTST);
03264         return Result;
03265       }
03266     }
03267 
03268     // Pattern: (intrinsic_void:isVoid 69:iPTR, GPRC:i32:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03269     // Emits: (DSTSTT:isVoid 1:i32, (imm:i32):$STRM, GPRC:i32:$rA, GPRC:i32:$rB)
03270     // Pattern complexity = 11  cost = 1  size = 0
03271     if (CN1 == INT64_C(69)) {
03272       SDValue N2 = N.getOperand(2);
03273       SDValue N3 = N.getOperand(3);
03274       SDValue N4 = N.getOperand(4);
03275       if (N4.getOpcode() == ISD::Constant &&
03276           N2.getNode()->getValueType(0) == MVT::i32) {
03277         SDNode *Result = Emit_49(N, PPC::DSTSTT);
03278         return Result;
03279       }
03280     }
03281 
03282     // Pattern: (intrinsic_void:isVoid 67:iPTR, G8RC:i64:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03283     // Emits: (DST64:isVoid 0:i32, (imm:i32):$STRM, G8RC:i64:$rA, GPRC:i32:$rB)
03284     // Pattern complexity = 11  cost = 1  size = 0
03285     if (CN1 == INT64_C(67)) {
03286       SDValue N2 = N.getOperand(2);
03287       SDValue N3 = N.getOperand(3);
03288       SDValue N4 = N.getOperand(4);
03289       if (N4.getOpcode() == ISD::Constant &&
03290           N2.getNode()->getValueType(0) == MVT::i64) {
03291         SDNode *Result = Emit_48(N, PPC::DST64);
03292         return Result;
03293       }
03294     }
03295 
03296     // Pattern: (intrinsic_void:isVoid 70:iPTR, G8RC:i64:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03297     // Emits: (DSTT64:isVoid 1:i32, (imm:i32):$STRM, G8RC:i64:$rA, GPRC:i32:$rB)
03298     // Pattern complexity = 11  cost = 1  size = 0
03299     if (CN1 == INT64_C(70)) {
03300       SDValue N2 = N.getOperand(2);
03301       SDValue N3 = N.getOperand(3);
03302       SDValue N4 = N.getOperand(4);
03303       if (N4.getOpcode() == ISD::Constant &&
03304           N2.getNode()->getValueType(0) == MVT::i64) {
03305         SDNode *Result = Emit_49(N, PPC::DSTT64);
03306         return Result;
03307       }
03308     }
03309 
03310     // Pattern: (intrinsic_void:isVoid 68:iPTR, G8RC:i64:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03311     // Emits: (DSTST64:isVoid 0:i32, (imm:i32):$STRM, G8RC:i64:$rA, GPRC:i32:$rB)
03312     // Pattern complexity = 11  cost = 1  size = 0
03313     if (CN1 == INT64_C(68)) {
03314       SDValue N2 = N.getOperand(2);
03315       SDValue N3 = N.getOperand(3);
03316       SDValue N4 = N.getOperand(4);
03317       if (N4.getOpcode() == ISD::Constant &&
03318           N2.getNode()->getValueType(0) == MVT::i64) {
03319         SDNode *Result = Emit_48(N, PPC::DSTST64);
03320         return Result;
03321       }
03322     }
03323 
03324     // Pattern: (intrinsic_void:isVoid 69:iPTR, G8RC:i64:$rA, GPRC:i32:$rB, (imm:i32):$STRM)
03325     // Emits: (DSTSTT64:isVoid 1:i32, (imm:i32):$STRM, G8RC:i64:$rA, GPRC:i32:$rB)
03326     // Pattern complexity = 11  cost = 1  size = 0
03327     if (CN1 == INT64_C(69)) {
03328       SDValue N2 = N.getOperand(2);
03329       SDValue N3 = N.getOperand(3);
03330       SDValue N4 = N.getOperand(4);
03331       if (N4.getOpcode() == ISD::Constant &&
03332           N2.getNode()->getValueType(0) == MVT::i64) {
03333         SDNode *Result = Emit_49(N, PPC::DSTSTT64);
03334         return Result;
03335       }
03336     }
03337 
03338     // Pattern: (intrinsic_void:isVoid 220:iPTR)
03339     // Emits: (SYNC:isVoid)
03340     // Pattern complexity = 8  cost = 1  size = 0
03341     if (CN1 == INT64_C(220)) {
03342       SDNode *Result = Emit_43(N, PPC::SYNC);
03343       return Result;
03344     }
03345 
03346     // Pattern: (intrinsic_void:isVoid 79:iPTR, VRRC:v4i32:$vB)
03347     // Emits: (MTVSCR:isVoid VRRC:v4i32:$vB)
03348     // Pattern complexity = 8  cost = 1  size = 0
03349     if (CN1 == INT64_C(79)) {
03350       SDNode *Result = Emit_44(N, PPC::MTVSCR);
03351       return Result;
03352     }
03353 
03354     // Pattern: (intrinsic_void:isVoid 66:iPTR)
03355     // Emits: (DSSALL:isVoid 1:i32, 0:i32, 0:i32, 0:i32)
03356     // Pattern complexity = 8  cost = 1  size = 0
03357     if (CN1 == INT64_C(66)) {
03358       SDNode *Result = Emit_46(N, PPC::DSSALL);
03359       return Result;
03360     }
03361   }
03362 
03363   CannotYetSelectIntrinsic(N);
03364   return NULL;
03365 }
03366 
03367 SDNode *Emit_50(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) DISABLE_INLINE {
03368   SDValue N0 = N.getOperand(0);
03369   SDValue N1 = N.getOperand(1);
03370   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, CPTmpN1_0, CPTmpN1_1);
03371 }
03372 SDNode *Emit_51(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
03373   SDValue N0 = N.getOperand(0);
03374   SDValue N1 = N.getOperand(1);
03375   SDValue N2 = N.getOperand(2);
03376   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1, N2);
03377 }
03378 SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v16i8(const SDValue &N) {
03379   SDValue N0 = N.getOperand(0);
03380   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
03381   if (Tmp0) {
03382     int64_t CN1 = Tmp0->getSExtValue();
03383 
03384     // Pattern: (intrinsic_wo_chain:v16i8 74:iPTR, xoaddr:iPTR:$src)
03385     // Emits: (LVSL:v16i8 xoaddr:iPTR:$src)
03386     // Pattern complexity = 17  cost = 1  size = 0
03387     if (CN1 == INT64_C(74)) {
03388       SDValue N1 = N.getOperand(1);
03389       SDValue CPTmpN1_0;
03390       SDValue CPTmpN1_1;
03391       if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
03392         SDNode *Result = Emit_50(N, PPC::LVSL, MVT::v16i8, CPTmpN1_0, CPTmpN1_1);
03393         return Result;
03394       }
03395     }
03396 
03397     // Pattern: (intrinsic_wo_chain:v16i8 75:iPTR, xoaddr:iPTR:$src)
03398     // Emits: (LVSR:v16i8 xoaddr:iPTR:$src)
03399     // Pattern complexity = 17  cost = 1  size = 0
03400     if (CN1 == INT64_C(75)) {
03401       SDValue N1 = N.getOperand(1);
03402       SDValue CPTmpN1_0;
03403       SDValue CPTmpN1_1;
03404       if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
03405         SDNode *Result = Emit_50(N, PPC::LVSR, MVT::v16i8, CPTmpN1_0, CPTmpN1_1);
03406         return Result;
03407       }
03408     }
03409 
03410     // Pattern: (intrinsic_wo_chain:v16i8 86:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03411     // Emits: (VADDSBS:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03412     // Pattern complexity = 8  cost = 1  size = 0
03413     if (CN1 == INT64_C(86)) {
03414       SDNode *Result = Emit_51(N, PPC::VADDSBS, MVT::v16i8);
03415       return Result;
03416     }
03417 
03418     // Pattern: (intrinsic_wo_chain:v16i8 89:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03419     // Emits: (VADDUBS:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03420     // Pattern complexity = 8  cost = 1  size = 0
03421     if (CN1 == INT64_C(89)) {
03422       SDNode *Result = Emit_51(N, PPC::VADDUBS, MVT::v16i8);
03423       return Result;
03424     }
03425 
03426     // Pattern: (intrinsic_wo_chain:v16i8 92:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03427     // Emits: (VAVGSB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03428     // Pattern complexity = 8  cost = 1  size = 0
03429     if (CN1 == INT64_C(92)) {
03430       SDNode *Result = Emit_51(N, PPC::VAVGSB, MVT::v16i8);
03431       return Result;
03432     }
03433 
03434     // Pattern: (intrinsic_wo_chain:v16i8 95:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03435     // Emits: (VAVGUB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03436     // Pattern complexity = 8  cost = 1  size = 0
03437     if (CN1 == INT64_C(95)) {
03438       SDNode *Result = Emit_51(N, PPC::VAVGUB, MVT::v16i8);
03439       return Result;
03440     }
03441 
03442     // Pattern: (intrinsic_wo_chain:v16i8 132:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03443     // Emits: (VMAXSB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03444     // Pattern complexity = 8  cost = 1  size = 0
03445     if (CN1 == INT64_C(132)) {
03446       SDNode *Result = Emit_51(N, PPC::VMAXSB, MVT::v16i8);
03447       return Result;
03448     }
03449 
03450     // Pattern: (intrinsic_wo_chain:v16i8 135:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03451     // Emits: (VMAXUB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03452     // Pattern complexity = 8  cost = 1  size = 0
03453     if (CN1 == INT64_C(135)) {
03454       SDNode *Result = Emit_51(N, PPC::VMAXUB, MVT::v16i8);
03455       return Result;
03456     }
03457 
03458     // Pattern: (intrinsic_wo_chain:v16i8 141:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03459     // Emits: (VMINSB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03460     // Pattern complexity = 8  cost = 1  size = 0
03461     if (CN1 == INT64_C(141)) {
03462       SDNode *Result = Emit_51(N, PPC::VMINSB, MVT::v16i8);
03463       return Result;
03464     }
03465 
03466     // Pattern: (intrinsic_wo_chain:v16i8 144:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03467     // Emits: (VMINUB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03468     // Pattern complexity = 8  cost = 1  size = 0
03469     if (CN1 == INT64_C(144)) {
03470       SDNode *Result = Emit_51(N, PPC::VMINUB, MVT::v16i8);
03471       return Result;
03472     }
03473 
03474     // Pattern: (intrinsic_wo_chain:v16i8 195:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03475     // Emits: (VSUBSBS:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03476     // Pattern complexity = 8  cost = 1  size = 0
03477     if (CN1 == INT64_C(195)) {
03478       SDNode *Result = Emit_51(N, PPC::VSUBSBS, MVT::v16i8);
03479       return Result;
03480     }
03481 
03482     // Pattern: (intrinsic_wo_chain:v16i8 198:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03483     // Emits: (VSUBUBS:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03484     // Pattern complexity = 8  cost = 1  size = 0
03485     if (CN1 == INT64_C(198)) {
03486       SDNode *Result = Emit_51(N, PPC::VSUBUBS, MVT::v16i8);
03487       return Result;
03488     }
03489 
03490     // Pattern: (intrinsic_wo_chain:v16i8 176:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03491     // Emits: (VRLB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03492     // Pattern complexity = 8  cost = 1  size = 0
03493     if (CN1 == INT64_C(176)) {
03494       SDNode *Result = Emit_51(N, PPC::VRLB, MVT::v16i8);
03495       return Result;
03496     }
03497 
03498     // Pattern: (intrinsic_wo_chain:v16i8 182:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03499     // Emits: (VSLB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03500     // Pattern complexity = 8  cost = 1  size = 0
03501     if (CN1 == INT64_C(182)) {
03502       SDNode *Result = Emit_51(N, PPC::VSLB, MVT::v16i8);
03503       return Result;
03504     }
03505 
03506     // Pattern: (intrinsic_wo_chain:v16i8 187:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03507     // Emits: (VSRAB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03508     // Pattern complexity = 8  cost = 1  size = 0
03509     if (CN1 == INT64_C(187)) {
03510       SDNode *Result = Emit_51(N, PPC::VSRAB, MVT::v16i8);
03511       return Result;
03512     }
03513 
03514     // Pattern: (intrinsic_wo_chain:v16i8 190:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03515     // Emits: (VSRB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03516     // Pattern complexity = 8  cost = 1  size = 0
03517     if (CN1 == INT64_C(190)) {
03518       SDNode *Result = Emit_51(N, PPC::VSRB, MVT::v16i8);
03519       return Result;
03520     }
03521 
03522     // Pattern: (intrinsic_wo_chain:v16i8 165:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03523     // Emits: (VPKSHSS:v16i8 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03524     // Pattern complexity = 8  cost = 1  size = 0
03525     if (CN1 == INT64_C(165)) {
03526       SDNode *Result = Emit_51(N, PPC::VPKSHSS, MVT::v16i8);
03527       return Result;
03528     }
03529 
03530     // Pattern: (intrinsic_wo_chain:v16i8 166:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03531     // Emits: (VPKSHUS:v16i8 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03532     // Pattern complexity = 8  cost = 1  size = 0
03533     if (CN1 == INT64_C(166)) {
03534       SDNode *Result = Emit_51(N, PPC::VPKSHUS, MVT::v16i8);
03535       return Result;
03536     }
03537 
03538     // Pattern: (intrinsic_wo_chain:v16i8 167:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03539     // Emits: (VPKSWSS:v16i8 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03540     // Pattern complexity = 8  cost = 1  size = 0
03541     if (CN1 == INT64_C(167)) {
03542       SDNode *Result = Emit_51(N, PPC::VPKSWSS, MVT::v16i8);
03543       return Result;
03544     }
03545 
03546     // Pattern: (intrinsic_wo_chain:v16i8 169:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03547     // Emits: (VPKUHUS:v16i8 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03548     // Pattern complexity = 8  cost = 1  size = 0
03549     if (CN1 == INT64_C(169)) {
03550       SDNode *Result = Emit_51(N, PPC::VPKUHUS, MVT::v16i8);
03551       return Result;
03552     }
03553   }
03554 
03555   CannotYetSelectIntrinsic(N);
03556   return NULL;
03557 }
03558 
03559 SDNode *Emit_52(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
03560   SDValue N0 = N.getOperand(0);
03561   SDValue N1 = N.getOperand(1);
03562   SDValue N2 = N.getOperand(2);
03563   SDValue N3 = N.getOperand(3);
03564   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1, N2, N3);
03565 }
03566 SDNode *Emit_53(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
03567   SDValue N0 = N.getOperand(0);
03568   SDValue N1 = N.getOperand(1);
03569   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1);
03570 }
03571 SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v8i16(const SDValue &N) {
03572   SDValue N0 = N.getOperand(0);
03573   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
03574   if (Tmp0) {
03575     int64_t CN1 = Tmp0->getSExtValue();
03576 
03577     // Pattern: (intrinsic_wo_chain:v8i16 138:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v8i16:$vC)
03578     // Emits: (VMHADDSHS:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v8i16:$vC)
03579     // Pattern complexity = 8  cost = 1  size = 0
03580     if (CN1 == INT64_C(138)) {
03581       SDNode *Result = Emit_52(N, PPC::VMHADDSHS, MVT::v8i16);
03582       return Result;
03583     }
03584 
03585     // Pattern: (intrinsic_wo_chain:v8i16 139:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v8i16:$vC)
03586     // Emits: (VMHRADDSHS:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v8i16:$vC)
03587     // Pattern complexity = 8  cost = 1  size = 0
03588     if (CN1 == INT64_C(139)) {
03589       SDNode *Result = Emit_52(N, PPC::VMHRADDSHS, MVT::v8i16);
03590       return Result;
03591     }
03592 
03593     // Pattern: (intrinsic_wo_chain:v8i16 147:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v8i16:$vC)
03594     // Emits: (VMLADDUHM:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v8i16:$vC)
03595     // Pattern complexity = 8  cost = 1  size = 0
03596     if (CN1 == INT64_C(147)) {
03597       SDNode *Result = Emit_52(N, PPC::VMLADDUHM, MVT::v8i16);
03598       return Result;
03599     }
03600 
03601     // Pattern: (intrinsic_wo_chain:v8i16 87:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03602     // Emits: (VADDSHS:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03603     // Pattern complexity = 8  cost = 1  size = 0
03604     if (CN1 == INT64_C(87)) {
03605       SDNode *Result = Emit_51(N, PPC::VADDSHS, MVT::v8i16);
03606       return Result;
03607     }
03608 
03609     // Pattern: (intrinsic_wo_chain:v8i16 90:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03610     // Emits: (VADDUHS:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03611     // Pattern complexity = 8  cost = 1  size = 0
03612     if (CN1 == INT64_C(90)) {
03613       SDNode *Result = Emit_51(N, PPC::VADDUHS, MVT::v8i16);
03614       return Result;
03615     }
03616 
03617     // Pattern: (intrinsic_wo_chain:v8i16 93:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03618     // Emits: (VAVGSH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03619     // Pattern complexity = 8  cost = 1  size = 0
03620     if (CN1 == INT64_C(93)) {
03621       SDNode *Result = Emit_51(N, PPC::VAVGSH, MVT::v8i16);
03622       return Result;
03623     }
03624 
03625     // Pattern: (intrinsic_wo_chain:v8i16 96:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03626     // Emits: (VAVGUH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03627     // Pattern complexity = 8  cost = 1  size = 0
03628     if (CN1 == INT64_C(96)) {
03629       SDNode *Result = Emit_51(N, PPC::VAVGUH, MVT::v8i16);
03630       return Result;
03631     }
03632 
03633     // Pattern: (intrinsic_wo_chain:v8i16 133:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03634     // Emits: (VMAXSH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03635     // Pattern complexity = 8  cost = 1  size = 0
03636     if (CN1 == INT64_C(133)) {
03637       SDNode *Result = Emit_51(N, PPC::VMAXSH, MVT::v8i16);
03638       return Result;
03639     }
03640 
03641     // Pattern: (intrinsic_wo_chain:v8i16 136:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03642     // Emits: (VMAXUH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03643     // Pattern complexity = 8  cost = 1  size = 0
03644     if (CN1 == INT64_C(136)) {
03645       SDNode *Result = Emit_51(N, PPC::VMAXUH, MVT::v8i16);
03646       return Result;
03647     }
03648 
03649     // Pattern: (intrinsic_wo_chain:v8i16 142:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03650     // Emits: (VMINSH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03651     // Pattern complexity = 8  cost = 1  size = 0
03652     if (CN1 == INT64_C(142)) {
03653       SDNode *Result = Emit_51(N, PPC::VMINSH, MVT::v8i16);
03654       return Result;
03655     }
03656 
03657     // Pattern: (intrinsic_wo_chain:v8i16 145:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03658     // Emits: (VMINUH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03659     // Pattern complexity = 8  cost = 1  size = 0
03660     if (CN1 == INT64_C(145)) {
03661       SDNode *Result = Emit_51(N, PPC::VMINUH, MVT::v8i16);
03662       return Result;
03663     }
03664 
03665     // Pattern: (intrinsic_wo_chain:v8i16 154:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03666     // Emits: (VMULESB:v8i16 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03667     // Pattern complexity = 8  cost = 1  size = 0
03668     if (CN1 == INT64_C(154)) {
03669       SDNode *Result = Emit_51(N, PPC::VMULESB, MVT::v8i16);
03670       return Result;
03671     }
03672 
03673     // Pattern: (intrinsic_wo_chain:v8i16 156:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03674     // Emits: (VMULEUB:v8i16 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03675     // Pattern complexity = 8  cost = 1  size = 0
03676     if (CN1 == INT64_C(156)) {
03677       SDNode *Result = Emit_51(N, PPC::VMULEUB, MVT::v8i16);
03678       return Result;
03679     }
03680 
03681     // Pattern: (intrinsic_wo_chain:v8i16 158:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03682     // Emits: (VMULOSB:v8i16 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03683     // Pattern complexity = 8  cost = 1  size = 0
03684     if (CN1 == INT64_C(158)) {
03685       SDNode *Result = Emit_51(N, PPC::VMULOSB, MVT::v8i16);
03686       return Result;
03687     }
03688 
03689     // Pattern: (intrinsic_wo_chain:v8i16 160:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03690     // Emits: (VMULOUB:v8i16 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
03691     // Pattern complexity = 8  cost = 1  size = 0
03692     if (CN1 == INT64_C(160)) {
03693       SDNode *Result = Emit_51(N, PPC::VMULOUB, MVT::v8i16);
03694       return Result;
03695     }
03696 
03697     // Pattern: (intrinsic_wo_chain:v8i16 196:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03698     // Emits: (VSUBSHS:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03699     // Pattern complexity = 8  cost = 1  size = 0
03700     if (CN1 == INT64_C(196)) {
03701       SDNode *Result = Emit_51(N, PPC::VSUBSHS, MVT::v8i16);
03702       return Result;
03703     }
03704 
03705     // Pattern: (intrinsic_wo_chain:v8i16 199:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03706     // Emits: (VSUBUHS:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03707     // Pattern complexity = 8  cost = 1  size = 0
03708     if (CN1 == INT64_C(199)) {
03709       SDNode *Result = Emit_51(N, PPC::VSUBUHS, MVT::v8i16);
03710       return Result;
03711     }
03712 
03713     // Pattern: (intrinsic_wo_chain:v8i16 177:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03714     // Emits: (VRLH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03715     // Pattern complexity = 8  cost = 1  size = 0
03716     if (CN1 == INT64_C(177)) {
03717       SDNode *Result = Emit_51(N, PPC::VRLH, MVT::v8i16);
03718       return Result;
03719     }
03720 
03721     // Pattern: (intrinsic_wo_chain:v8i16 183:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03722     // Emits: (VSLH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03723     // Pattern complexity = 8  cost = 1  size = 0
03724     if (CN1 == INT64_C(183)) {
03725       SDNode *Result = Emit_51(N, PPC::VSLH, MVT::v8i16);
03726       return Result;
03727     }
03728 
03729     // Pattern: (intrinsic_wo_chain:v8i16 188:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03730     // Emits: (VSRAH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03731     // Pattern complexity = 8  cost = 1  size = 0
03732     if (CN1 == INT64_C(188)) {
03733       SDNode *Result = Emit_51(N, PPC::VSRAH, MVT::v8i16);
03734       return Result;
03735     }
03736 
03737     // Pattern: (intrinsic_wo_chain:v8i16 191:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03738     // Emits: (VSRH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03739     // Pattern complexity = 8  cost = 1  size = 0
03740     if (CN1 == INT64_C(191)) {
03741       SDNode *Result = Emit_51(N, PPC::VSRH, MVT::v8i16);
03742       return Result;
03743     }
03744 
03745     // Pattern: (intrinsic_wo_chain:v8i16 164:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03746     // Emits: (VPKPX:v8i16 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03747     // Pattern complexity = 8  cost = 1  size = 0
03748     if (CN1 == INT64_C(164)) {
03749       SDNode *Result = Emit_51(N, PPC::VPKPX, MVT::v8i16);
03750       return Result;
03751     }
03752 
03753     // Pattern: (intrinsic_wo_chain:v8i16 168:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03754     // Emits: (VPKSWUS:v8i16 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03755     // Pattern complexity = 8  cost = 1  size = 0
03756     if (CN1 == INT64_C(168)) {
03757       SDNode *Result = Emit_51(N, PPC::VPKSWUS, MVT::v8i16);
03758       return Result;
03759     }
03760 
03761     // Pattern: (intrinsic_wo_chain:v8i16 170:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03762     // Emits: (VPKUWUS:v8i16 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03763     // Pattern complexity = 8  cost = 1  size = 0
03764     if (CN1 == INT64_C(170)) {
03765       SDNode *Result = Emit_51(N, PPC::VPKUWUS, MVT::v8i16);
03766       return Result;
03767     }
03768 
03769     // Pattern: (intrinsic_wo_chain:v8i16 207:iPTR, VRRC:v16i8:$vB)
03770     // Emits: (VUPKHSB:v8i16 VRRC:v16i8:$vB)
03771     // Pattern complexity = 8  cost = 1  size = 0
03772     if (CN1 == INT64_C(207)) {
03773       SDNode *Result = Emit_53(N, PPC::VUPKHSB, MVT::v8i16);
03774       return Result;
03775     }
03776 
03777     // Pattern: (intrinsic_wo_chain:v8i16 210:iPTR, VRRC:v16i8:$vB)
03778     // Emits: (VUPKLSB:v8i16 VRRC:v16i8:$vB)
03779     // Pattern complexity = 8  cost = 1  size = 0
03780     if (CN1 == INT64_C(210)) {
03781       SDNode *Result = Emit_53(N, PPC::VUPKLSB, MVT::v8i16);
03782       return Result;
03783     }
03784   }
03785 
03786   CannotYetSelectIntrinsic(N);
03787   return NULL;
03788 }
03789 
03790 SDNode *Emit_54(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
03791   SDValue N0 = N.getOperand(0);
03792   SDValue N1 = N.getOperand(1);
03793   SDValue N2 = N.getOperand(2);
03794   SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32);
03795   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp2, N1);
03796 }
03797 SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v4i32(const SDValue &N) {
03798   SDValue N0 = N.getOperand(0);
03799   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
03800   if (Tmp0) {
03801     int64_t CN1 = Tmp0->getSExtValue();
03802 
03803     // Pattern: (intrinsic_wo_chain:v4i32 126:iPTR, VRRC:v4f32:$vB, (imm:i32):$UIMM)
03804     // Emits: (VCTSXS:v4i32 (imm:i32):$UIMM, VRRC:v4f32:$vB)
03805     // Pattern complexity = 11  cost = 1  size = 0
03806     if (CN1 == INT64_C(126)) {
03807       SDValue N1 = N.getOperand(1);
03808       SDValue N2 = N.getOperand(2);
03809       if (N2.getOpcode() == ISD::Constant) {
03810         SDNode *Result = Emit_54(N, PPC::VCTSXS, MVT::v4i32);
03811         return Result;
03812       }
03813     }
03814 
03815     // Pattern: (intrinsic_wo_chain:v4i32 127:iPTR, VRRC:v4f32:$vB, (imm:i32):$UIMM)
03816     // Emits: (VCTUXS:v4i32 (imm:i32):$UIMM, VRRC:v4f32:$vB)
03817     // Pattern complexity = 11  cost = 1  size = 0
03818     if (CN1 == INT64_C(127)) {
03819       SDValue N1 = N.getOperand(1);
03820       SDValue N2 = N.getOperand(2);
03821       if (N2.getOpcode() == ISD::Constant) {
03822         SDNode *Result = Emit_54(N, PPC::VCTUXS, MVT::v4i32);
03823         return Result;
03824       }
03825     }
03826 
03827     // Pattern: (intrinsic_wo_chain:v4i32 163:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB, VRRC:v16i8:$vC)
03828     // Emits: (VPERM:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, VRRC:v16i8:$vC)
03829     // Pattern complexity = 8  cost = 1  size = 0
03830     if (CN1 == INT64_C(163)) {
03831       SDNode *Result = Emit_52(N, PPC::VPERM, MVT::v4i32);
03832       return Result;
03833     }
03834 
03835     // Pattern: (intrinsic_wo_chain:v4i32 180:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB, VRRC:v4i32:$vC)
03836     // Emits: (VSEL:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, VRRC:v4i32:$vC)
03837     // Pattern complexity = 8  cost = 1  size = 0
03838     if (CN1 == INT64_C(180)) {
03839       SDNode *Result = Emit_52(N, PPC::VSEL, MVT::v4i32);
03840       return Result;
03841     }
03842 
03843     // Pattern: (intrinsic_wo_chain:v4i32 85:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03844     // Emits: (VADDCUW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03845     // Pattern complexity = 8  cost = 1  size = 0
03846     if (CN1 == INT64_C(85)) {
03847       SDNode *Result = Emit_51(N, PPC::VADDCUW, MVT::v4i32);
03848       return Result;
03849     }
03850 
03851     // Pattern: (intrinsic_wo_chain:v4i32 88:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03852     // Emits: (VADDSWS:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03853     // Pattern complexity = 8  cost = 1  size = 0
03854     if (CN1 == INT64_C(88)) {
03855       SDNode *Result = Emit_51(N, PPC::VADDSWS, MVT::v4i32);
03856       return Result;
03857     }
03858 
03859     // Pattern: (intrinsic_wo_chain:v4i32 91:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03860     // Emits: (VADDUWS:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03861     // Pattern complexity = 8  cost = 1  size = 0
03862     if (CN1 == INT64_C(91)) {
03863       SDNode *Result = Emit_51(N, PPC::VADDUWS, MVT::v4i32);
03864       return Result;
03865     }
03866 
03867     // Pattern: (intrinsic_wo_chain:v4i32 94:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03868     // Emits: (VAVGSW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03869     // Pattern complexity = 8  cost = 1  size = 0
03870     if (CN1 == INT64_C(94)) {
03871       SDNode *Result = Emit_51(N, PPC::VAVGSW, MVT::v4i32);
03872       return Result;
03873     }
03874 
03875     // Pattern: (intrinsic_wo_chain:v4i32 97:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03876     // Emits: (VAVGUW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03877     // Pattern complexity = 8  cost = 1  size = 0
03878     if (CN1 == INT64_C(97)) {
03879       SDNode *Result = Emit_51(N, PPC::VAVGUW, MVT::v4i32);
03880       return Result;
03881     }
03882 
03883     // Pattern: (intrinsic_wo_chain:v4i32 134:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03884     // Emits: (VMAXSW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03885     // Pattern complexity = 8  cost = 1  size = 0
03886     if (CN1 == INT64_C(134)) {
03887       SDNode *Result = Emit_51(N, PPC::VMAXSW, MVT::v4i32);
03888       return Result;
03889     }
03890 
03891     // Pattern: (intrinsic_wo_chain:v4i32 137:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03892     // Emits: (VMAXUW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03893     // Pattern complexity = 8  cost = 1  size = 0
03894     if (CN1 == INT64_C(137)) {
03895       SDNode *Result = Emit_51(N, PPC::VMAXUW, MVT::v4i32);
03896       return Result;
03897     }
03898 
03899     // Pattern: (intrinsic_wo_chain:v4i32 143:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03900     // Emits: (VMINSW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03901     // Pattern complexity = 8  cost = 1  size = 0
03902     if (CN1 == INT64_C(143)) {
03903       SDNode *Result = Emit_51(N, PPC::VMINSW, MVT::v4i32);
03904       return Result;
03905     }
03906 
03907     // Pattern: (intrinsic_wo_chain:v4i32 146:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03908     // Emits: (VMINUW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03909     // Pattern complexity = 8  cost = 1  size = 0
03910     if (CN1 == INT64_C(146)) {
03911       SDNode *Result = Emit_51(N, PPC::VMINUW, MVT::v4i32);
03912       return Result;
03913     }
03914 
03915     // Pattern: (intrinsic_wo_chain:v4i32 148:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB, VRRC:v4i32:$vC)
03916     // Emits: (VMSUMMBM:v4i32 VRRC:v16i8:$vA, VRRC:v16i8:$vB, VRRC:v4i32:$vC)
03917     // Pattern complexity = 8  cost = 1  size = 0
03918     if (CN1 == INT64_C(148)) {
03919       SDNode *Result = Emit_52(N, PPC::VMSUMMBM, MVT::v4i32);
03920       return Result;
03921     }
03922 
03923     // Pattern: (intrinsic_wo_chain:v4i32 149:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03924     // Emits: (VMSUMSHM:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03925     // Pattern complexity = 8  cost = 1  size = 0
03926     if (CN1 == INT64_C(149)) {
03927       SDNode *Result = Emit_52(N, PPC::VMSUMSHM, MVT::v4i32);
03928       return Result;
03929     }
03930 
03931     // Pattern: (intrinsic_wo_chain:v4i32 150:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03932     // Emits: (VMSUMSHS:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03933     // Pattern complexity = 8  cost = 1  size = 0
03934     if (CN1 == INT64_C(150)) {
03935       SDNode *Result = Emit_52(N, PPC::VMSUMSHS, MVT::v4i32);
03936       return Result;
03937     }
03938 
03939     // Pattern: (intrinsic_wo_chain:v4i32 151:iPTR, VRRC:v16i8:$vA, VRRC:v16i8:$vB, VRRC:v4i32:$vC)
03940     // Emits: (VMSUMUBM:v4i32 VRRC:v16i8:$vA, VRRC:v16i8:$vB, VRRC:v4i32:$vC)
03941     // Pattern complexity = 8  cost = 1  size = 0
03942     if (CN1 == INT64_C(151)) {
03943       SDNode *Result = Emit_52(N, PPC::VMSUMUBM, MVT::v4i32);
03944       return Result;
03945     }
03946 
03947     // Pattern: (intrinsic_wo_chain:v4i32 152:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03948     // Emits: (VMSUMUHM:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03949     // Pattern complexity = 8  cost = 1  size = 0
03950     if (CN1 == INT64_C(152)) {
03951       SDNode *Result = Emit_52(N, PPC::VMSUMUHM, MVT::v4i32);
03952       return Result;
03953     }
03954 
03955     // Pattern: (intrinsic_wo_chain:v4i32 153:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03956     // Emits: (VMSUMUHS:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB, VRRC:v4i32:$vC)
03957     // Pattern complexity = 8  cost = 1  size = 0
03958     if (CN1 == INT64_C(153)) {
03959       SDNode *Result = Emit_52(N, PPC::VMSUMUHS, MVT::v4i32);
03960       return Result;
03961     }
03962 
03963     // Pattern: (intrinsic_wo_chain:v4i32 155:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03964     // Emits: (VMULESH:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03965     // Pattern complexity = 8  cost = 1  size = 0
03966     if (CN1 == INT64_C(155)) {
03967       SDNode *Result = Emit_51(N, PPC::VMULESH, MVT::v4i32);
03968       return Result;
03969     }
03970 
03971     // Pattern: (intrinsic_wo_chain:v4i32 157:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03972     // Emits: (VMULEUH:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03973     // Pattern complexity = 8  cost = 1  size = 0
03974     if (CN1 == INT64_C(157)) {
03975       SDNode *Result = Emit_51(N, PPC::VMULEUH, MVT::v4i32);
03976       return Result;
03977     }
03978 
03979     // Pattern: (intrinsic_wo_chain:v4i32 159:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03980     // Emits: (VMULOSH:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03981     // Pattern complexity = 8  cost = 1  size = 0
03982     if (CN1 == INT64_C(159)) {
03983       SDNode *Result = Emit_51(N, PPC::VMULOSH, MVT::v4i32);
03984       return Result;
03985     }
03986 
03987     // Pattern: (intrinsic_wo_chain:v4i32 161:iPTR, VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03988     // Emits: (VMULOUH:v4i32 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
03989     // Pattern complexity = 8  cost = 1  size = 0
03990     if (CN1 == INT64_C(161)) {
03991       SDNode *Result = Emit_51(N, PPC::VMULOUH, MVT::v4i32);
03992       return Result;
03993     }
03994 
03995     // Pattern: (intrinsic_wo_chain:v4i32 194:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03996     // Emits: (VSUBCUW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
03997     // Pattern complexity = 8  cost = 1  size = 0
03998     if (CN1 == INT64_C(194)) {
03999       SDNode *Result = Emit_51(N, PPC::VSUBCUW, MVT::v4i32);
04000       return Result;
04001     }
04002 
04003     // Pattern: (intrinsic_wo_chain:v4i32 197:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04004     // Emits: (VSUBSWS:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04005     // Pattern complexity = 8  cost = 1  size = 0
04006     if (CN1 == INT64_C(197)) {
04007       SDNode *Result = Emit_51(N, PPC::VSUBSWS, MVT::v4i32);
04008       return Result;
04009     }
04010 
04011     // Pattern: (intrinsic_wo_chain:v4i32 200:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04012     // Emits: (VSUBUWS:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04013     // Pattern complexity = 8  cost = 1  size = 0
04014     if (CN1 == INT64_C(200)) {
04015       SDNode *Result = Emit_51(N, PPC::VSUBUWS, MVT::v4i32);
04016       return Result;
04017     }
04018 
04019     // Pattern: (intrinsic_wo_chain:v4i32 205:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04020     // Emits: (VSUMSWS:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04021     // Pattern complexity = 8  cost = 1  size = 0
04022     if (CN1 == INT64_C(205)) {
04023       SDNode *Result = Emit_51(N, PPC::VSUMSWS, MVT::v4i32);
04024       return Result;
04025     }
04026 
04027     // Pattern: (intrinsic_wo_chain:v4i32 201:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04028     // Emits: (VSUM2SWS:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04029     // Pattern complexity = 8  cost = 1  size = 0
04030     if (CN1 == INT64_C(201)) {
04031       SDNode *Result = Emit_51(N, PPC::VSUM2SWS, MVT::v4i32);
04032       return Result;
04033     }
04034 
04035     // Pattern: (intrinsic_wo_chain:v4i32 202:iPTR, VRRC:v16i8:$vA, VRRC:v4i32:$vB)
04036     // Emits: (VSUM4SBS:v4i32 VRRC:v16i8:$vA, VRRC:v4i32:$vB)
04037     // Pattern complexity = 8  cost = 1  size = 0
04038     if (CN1 == INT64_C(202)) {
04039       SDNode *Result = Emit_51(N, PPC::VSUM4SBS, MVT::v4i32);
04040       return Result;
04041     }
04042 
04043     // Pattern: (intrinsic_wo_chain:v4i32 203:iPTR, VRRC:v8i16:$vA, VRRC:v4i32:$vB)
04044     // Emits: (VSUM4SHS:v4i32 VRRC:v8i16:$vA, VRRC:v4i32:$vB)
04045     // Pattern complexity = 8  cost = 1  size = 0
04046     if (CN1 == INT64_C(203)) {
04047       SDNode *Result = Emit_51(N, PPC::VSUM4SHS, MVT::v4i32);
04048       return Result;
04049     }
04050 
04051     // Pattern: (intrinsic_wo_chain:v4i32 204:iPTR, VRRC:v16i8:$vA, VRRC:v4i32:$vB)
04052     // Emits: (VSUM4UBS:v4i32 VRRC:v16i8:$vA, VRRC:v4i32:$vB)
04053     // Pattern complexity = 8  cost = 1  size = 0
04054     if (CN1 == INT64_C(204)) {
04055       SDNode *Result = Emit_51(N, PPC::VSUM4UBS, MVT::v4i32);
04056       return Result;
04057     }
04058 
04059     // Pattern: (intrinsic_wo_chain:v4i32 178:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04060     // Emits: (VRLW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04061     // Pattern complexity = 8  cost = 1  size = 0
04062     if (CN1 == INT64_C(178)) {
04063       SDNode *Result = Emit_51(N, PPC::VRLW, MVT::v4i32);
04064       return Result;
04065     }
04066 
04067     // Pattern: (intrinsic_wo_chain:v4i32 181:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04068     // Emits: (VSL:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04069     // Pattern complexity = 8  cost = 1  size = 0
04070     if (CN1 == INT64_C(181)) {
04071       SDNode *Result = Emit_51(N, PPC::VSL, MVT::v4i32);
04072       return Result;
04073     }
04074 
04075     // Pattern: (intrinsic_wo_chain:v4i32 184:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04076     // Emits: (VSLO:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04077     // Pattern complexity = 8  cost = 1  size = 0
04078     if (CN1 == INT64_C(184)) {
04079       SDNode *Result = Emit_51(N, PPC::VSLO, MVT::v4i32);
04080       return Result;
04081     }
04082 
04083     // Pattern: (intrinsic_wo_chain:v4i32 185:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04084     // Emits: (VSLW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04085     // Pattern complexity = 8  cost = 1  size = 0
04086     if (CN1 == INT64_C(185)) {
04087       SDNode *Result = Emit_51(N, PPC::VSLW, MVT::v4i32);
04088       return Result;
04089     }
04090 
04091     // Pattern: (intrinsic_wo_chain:v4i32 186:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04092     // Emits: (VSR:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04093     // Pattern complexity = 8  cost = 1  size = 0
04094     if (CN1 == INT64_C(186)) {
04095       SDNode *Result = Emit_51(N, PPC::VSR, MVT::v4i32);
04096       return Result;
04097     }
04098 
04099     // Pattern: (intrinsic_wo_chain:v4i32 192:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04100     // Emits: (VSRO:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04101     // Pattern complexity = 8  cost = 1  size = 0
04102     if (CN1 == INT64_C(192)) {
04103       SDNode *Result = Emit_51(N, PPC::VSRO, MVT::v4i32);
04104       return Result;
04105     }
04106 
04107     // Pattern: (intrinsic_wo_chain:v4i32 189:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04108     // Emits: (VSRAW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04109     // Pattern complexity = 8  cost = 1  size = 0
04110     if (CN1 == INT64_C(189)) {
04111       SDNode *Result = Emit_51(N, PPC::VSRAW, MVT::v4i32);
04112       return Result;
04113     }
04114 
04115     // Pattern: (intrinsic_wo_chain:v4i32 193:iPTR, VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04116     // Emits: (VSRW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
04117     // Pattern complexity = 8  cost = 1  size = 0
04118     if (CN1 == INT64_C(193)) {
04119       SDNode *Result = Emit_51(N, PPC::VSRW, MVT::v4i32);
04120       return Result;
04121     }
04122 
04123     // Pattern: (intrinsic_wo_chain:v4i32 206:iPTR, VRRC:v8i16:$vB)
04124     // Emits: (VUPKHPX:v4i32 VRRC:v8i16:$vB)
04125     // Pattern complexity = 8  cost = 1  size = 0
04126     if (CN1 == INT64_C(206)) {
04127       SDNode *Result = Emit_53(N, PPC::VUPKHPX, MVT::v4i32);
04128       return Result;
04129     }
04130 
04131     // Pattern: (intrinsic_wo_chain:v4i32 208:iPTR, VRRC:v8i16:$vB)
04132     // Emits: (VUPKHSH:v4i32 VRRC:v8i16:$vB)
04133     // Pattern complexity = 8  cost = 1  size = 0
04134     if (CN1 == INT64_C(208)) {
04135       SDNode *Result = Emit_53(N, PPC::VUPKHSH, MVT::v4i32);
04136       return Result;
04137     }
04138 
04139     // Pattern: (intrinsic_wo_chain:v4i32 209:iPTR, VRRC:v8i16:$vB)
04140     // Emits: (VUPKLPX:v4i32 VRRC:v8i16:$vB)
04141     // Pattern complexity = 8  cost = 1  size = 0
04142     if (CN1 == INT64_C(209)) {
04143       SDNode *Result = Emit_53(N, PPC::VUPKLPX, MVT::v4i32);
04144       return Result;
04145     }
04146 
04147     // Pattern: (intrinsic_wo_chain:v4i32 211:iPTR, VRRC:v8i16:$vB)
04148     // Emits: (VUPKLSH:v4i32 VRRC:v8i16:$vB)
04149     // Pattern complexity = 8  cost = 1  size = 0
04150     if (CN1 == INT64_C(211)) {
04151       SDNode *Result = Emit_53(N, PPC::VUPKLSH, MVT::v4i32);
04152       return Result;
04153     }
04154   }
04155 
04156   CannotYetSelectIntrinsic(N);
04157   return NULL;
04158 }
04159 
04160 SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v4f32(const SDValue &N) {
04161   SDValue N0 = N.getOperand(0);
04162   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
04163   if (Tmp0) {
04164     int64_t CN1 = Tmp0->getSExtValue();
04165 
04166     // Pattern: (intrinsic_wo_chain:v4f32 98:iPTR, VRRC:v4i32:$vB, (imm:i32):$UIMM)
04167     // Emits: (VCFSX:v4f32 (imm:i32):$UIMM, VRRC:v4i32:$vB)
04168     // Pattern complexity = 11  cost = 1  size = 0
04169     if (CN1 == INT64_C(98)) {
04170       SDValue N1 = N.getOperand(1);
04171       SDValue N2 = N.getOperand(2);
04172       if (N2.getOpcode() == ISD::Constant) {
04173         SDNode *Result = Emit_54(N, PPC::VCFSX, MVT::v4f32);
04174         return Result;
04175       }
04176     }
04177 
04178     // Pattern: (intrinsic_wo_chain:v4f32 99:iPTR, VRRC:v4i32:$vB, (imm:i32):$UIMM)
04179     // Emits: (VCFUX:v4f32 (imm:i32):$UIMM, VRRC:v4i32:$vB)
04180     // Pattern complexity = 11  cost = 1  size = 0
04181     if (CN1 == INT64_C(99)) {
04182       SDValue N1 = N.getOperand(1);
04183       SDValue N2 = N.getOperand(2);
04184       if (N2.getOpcode() == ISD::Constant) {
04185         SDNode *Result = Emit_54(N, PPC::VCFUX, MVT::v4f32);
04186         return Result;
04187       }
04188     }
04189 
04190     // Pattern: (intrinsic_wo_chain:v4f32 128:iPTR, VRRC:v4f32:$vB)
04191     // Emits: (VEXPTEFP:v4f32 VRRC:v4f32:$vB)
04192     // Pattern complexity = 8  cost = 1  size = 0
04193     if (CN1 == INT64_C(128)) {
04194       SDNode *Result = Emit_53(N, PPC::VEXPTEFP, MVT::v4f32);
04195       return Result;
04196     }
04197 
04198     // Pattern: (intrinsic_wo_chain:v4f32 129:iPTR, VRRC:v4f32:$vB)
04199     // Emits: (VLOGEFP:v4f32 VRRC:v4f32:$vB)
04200     // Pattern complexity = 8  cost = 1  size = 0
04201     if (CN1 == INT64_C(129)) {
04202       SDNode *Result = Emit_53(N, PPC::VLOGEFP, MVT::v4f32);
04203       return Result;
04204     }
04205 
04206     // Pattern: (intrinsic_wo_chain:v4f32 131:iPTR, VRRC:v4f32:$vA, VRRC:v4f32:$vB)
04207     // Emits: (VMAXFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
04208     // Pattern complexity = 8  cost = 1  size = 0
04209     if (CN1 == INT64_C(131)) {
04210       SDNode *Result = Emit_51(N, PPC::VMAXFP, MVT::v4f32);
04211       return Result;
04212     }
04213 
04214     // Pattern: (intrinsic_wo_chain:v4f32 140:iPTR, VRRC:v4f32:$vA, VRRC:v4f32:$vB)
04215     // Emits: (VMINFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
04216     // Pattern complexity = 8  cost = 1  size = 0
04217     if (CN1 == INT64_C(140)) {
04218       SDNode *Result = Emit_51(N, PPC::VMINFP, MVT::v4f32);
04219       return Result;
04220     }
04221 
04222     // Pattern: (intrinsic_wo_chain:v4f32 171:iPTR, VRRC:v4f32:$vB)
04223     // Emits: (VREFP:v4f32 VRRC:v4f32:$vB)
04224     // Pattern complexity = 8  cost = 1  size = 0
04225     if (CN1 == INT64_C(171)) {
04226       SDNode *Result = Emit_53(N, PPC::VREFP, MVT::v4f32);
04227       return Result;
04228     }
04229 
04230     // Pattern: (intrinsic_wo_chain:v4f32 172:iPTR, VRRC:v4f32:$vB)
04231     // Emits: (VRFIM:v4f32 VRRC:v4f32:$vB)
04232     // Pattern complexity = 8  cost = 1  size = 0
04233     if (CN1 == INT64_C(172)) {
04234       SDNode *Result = Emit_53(N, PPC::VRFIM, MVT::v4f32);
04235       return Result;
04236     }
04237 
04238     // Pattern: (intrinsic_wo_chain:v4f32 173:iPTR, VRRC:v4f32:$vB)
04239     // Emits: (VRFIN:v4f32 VRRC:v4f32:$vB)
04240     // Pattern complexity = 8  cost = 1  size = 0
04241     if (CN1 == INT64_C(173)) {
04242       SDNode *Result = Emit_53(N, PPC::VRFIN, MVT::v4f32);
04243       return Result;
04244     }
04245 
04246     // Pattern: (intrinsic_wo_chain:v4f32 174:iPTR, VRRC:v4f32:$vB)
04247     // Emits: (VRFIP:v4f32 VRRC:v4f32:$vB)
04248     // Pattern complexity = 8  cost = 1  size = 0
04249     if (CN1 == INT64_C(174)) {
04250       SDNode *Result = Emit_53(N, PPC::VRFIP, MVT::v4f32);
04251       return Result;
04252     }
04253 
04254     // Pattern: (intrinsic_wo_chain:v4f32 175:iPTR, VRRC:v4f32:$vB)
04255     // Emits: (VRFIZ:v4f32 VRRC:v4f32:$vB)
04256     // Pattern complexity = 8  cost = 1  size = 0
04257     if (CN1 == INT64_C(175)) {
04258       SDNode *Result = Emit_53(N, PPC::VRFIZ, MVT::v4f32);
04259       return Result;
04260     }
04261 
04262     // Pattern: (intrinsic_wo_chain:v4f32 179:iPTR, VRRC:v4f32:$vB)
04263     // Emits: (VRSQRTEFP:v4f32 VRRC:v4f32:$vB)
04264     // Pattern complexity = 8  cost = 1  size = 0
04265     if (CN1 == INT64_C(179)) {
04266       SDNode *Result = Emit_53(N, PPC::VRSQRTEFP, MVT::v4f32);
04267       return Result;
04268     }
04269 
04270     // Pattern: (intrinsic_wo_chain:v4f32 130:iPTR, VRRC:v4f32:$A, VRRC:v4f32:$B, VRRC:v4f32:$C)
04271     // Emits: (VMADDFP:v4f32 VRRC:v16i8:$A, VRRC:v16i8:$B, VRRC:v16i8:$C)
04272     // Pattern complexity = 8  cost = 1  size = 0
04273     if (CN1 == INT64_C(130)) {
04274       SDNode *Result = Emit_52(N, PPC::VMADDFP, MVT::v4f32);
04275       return Result;
04276     }
04277 
04278     // Pattern: (intrinsic_wo_chain:v4f32 162:iPTR, VRRC:v4f32:$A, VRRC:v4f32:$B, VRRC:v4f32:$C)
04279     // Emits: (VNMSUBFP:v4f32 VRRC:v16i8:$A, VRRC:v16i8:$B, VRRC:v16i8:$C)
04280     // Pattern complexity = 8  cost = 1  size = 0
04281     if (CN1 == INT64_C(162)) {
04282       SDNode *Result = Emit_52(N, PPC::VNMSUBFP, MVT::v4f32);
04283       return Result;
04284     }
04285   }
04286 
04287   CannotYetSelectIntrinsic(N);
04288   return NULL;
04289 }
04290 
04291 SDNode *Emit_55(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1) DISABLE_INLINE {
04292   SDValue Chain = N.getOperand(0);
04293   SDValue N1 = N.getOperand(1);
04294   SDValue N2 = N.getOperand(2);
04295   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, CPTmpN2_0, CPTmpN2_1, Chain);
04296 }
04297 SDNode *Select_ISD_INTRINSIC_W_CHAIN_v16i8(const SDValue &N) {
04298   SDValue Chain = N.getOperand(0);
04299   SDValue N1 = N.getOperand(1);
04300   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
04301   if (Tmp0) {
04302     int64_t CN1 = Tmp0->getSExtValue();
04303     if (CN1 == INT64_C(71)) {
04304       SDValue N2 = N.getOperand(2);
04305       SDValue CPTmpN2_0;
04306       SDValue CPTmpN2_1;
04307       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
04308         SDNode *Result = Emit_55(N, PPC::LVEBX, MVT::v16i8, CPTmpN2_0, CPTmpN2_1);
04309         return Result;
04310       }
04311     }
04312   }
04313 
04314   CannotYetSelectIntrinsic(N);
04315   return NULL;
04316 }
04317 
04318 SDNode *Emit_56(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
04319   SDValue Chain = N.getOperand(0);
04320   SDValue N1 = N.getOperand(1);
04321   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, Chain);
04322 }
04323 SDNode *Select_ISD_INTRINSIC_W_CHAIN_v8i16(const SDValue &N) {
04324   SDValue Chain = N.getOperand(0);
04325   SDValue N1 = N.getOperand(1);
04326   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
04327   if (Tmp0) {
04328     int64_t CN1 = Tmp0->getSExtValue();
04329 
04330     // Pattern: (intrinsic_w_chain:v8i16 72:iPTR, xoaddr:iPTR:$src)
04331     // Emits: (LVEHX:v8i16 xoaddr:iPTR:$src)
04332     // Pattern complexity = 17  cost = 1  size = 0
04333     if (CN1 == INT64_C(72)) {
04334       SDValue N2 = N.getOperand(2);
04335       SDValue CPTmpN2_0;
04336       SDValue CPTmpN2_1;
04337       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
04338         SDNode *Result = Emit_55(N, PPC::LVEHX, MVT::v8i16, CPTmpN2_0, CPTmpN2_1);
04339         return Result;
04340       }
04341     }
04342 
04343     // Pattern: (intrinsic_w_chain:v8i16 78:iPTR)
04344     // Emits: (MFVSCR:v8i16)
04345     // Pattern complexity = 8  cost = 1  size = 0
04346     if (CN1 == INT64_C(78)) {
04347       SDNode *Result = Emit_56(N, PPC::MFVSCR, MVT::v8i16);
04348       return Result;
04349     }
04350   }
04351 
04352   CannotYetSelectIntrinsic(N);
04353   return NULL;
04354 }
04355 
04356 SDNode *Select_ISD_INTRINSIC_W_CHAIN_v4i32(const SDValue &N) {
04357   SDValue Chain = N.getOperand(0);
04358   SDValue N1 = N.getOperand(1);
04359   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
04360   if (Tmp0) {
04361     int64_t CN1 = Tmp0->getSExtValue();
04362 
04363     // Pattern: (intrinsic_w_chain:v4i32 73:iPTR, xoaddr:iPTR:$src)
04364     // Emits: (LVEWX:v4i32 xoaddr:iPTR:$src)
04365     // Pattern complexity = 17  cost = 1  size = 0
04366     if (CN1 == INT64_C(73)) {
04367       SDValue N2 = N.getOperand(2);
04368       SDValue CPTmpN2_0;
04369       SDValue CPTmpN2_1;
04370       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
04371         SDNode *Result = Emit_55(N, PPC::LVEWX, MVT::v4i32, CPTmpN2_0, CPTmpN2_1);
04372         return Result;
04373       }
04374     }
04375 
04376     // Pattern: (intrinsic_w_chain:v4i32 76:iPTR, xoaddr:iPTR:$src)
04377     // Emits: (LVX:v4i32 xoaddr:iPTR:$src)
04378     // Pattern complexity = 17  cost = 1  size = 0
04379     if (CN1 == INT64_C(76)) {
04380       SDValue N2 = N.getOperand(2);
04381       SDValue CPTmpN2_0;
04382       SDValue CPTmpN2_1;
04383       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
04384         SDNode *Result = Emit_55(N, PPC::LVX, MVT::v4i32, CPTmpN2_0, CPTmpN2_1);
04385         return Result;
04386       }
04387     }
04388 
04389     // Pattern: (intrinsic_w_chain:v4i32 77:iPTR, xoaddr:iPTR:$src)
04390     // Emits: (LVXL:v4i32 xoaddr:iPTR:$src)
04391     // Pattern complexity = 17  cost = 1  size = 0
04392     if (CN1 == INT64_C(77)) {
04393       SDValue N2 = N.getOperand(2);
04394       SDValue CPTmpN2_0;
04395       SDValue CPTmpN2_1;
04396       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
04397         SDNode *Result = Emit_55(N, PPC::LVXL, MVT::v4i32, CPTmpN2_0, CPTmpN2_1);
04398         return Result;
04399       }
04400     }
04401   }
04402 
04403   CannotYetSelectIntrinsic(N);
04404   return NULL;
04405 }
04406 
04407 SDNode *Emit_57(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) DISABLE_INLINE {
04408   SDValue Chain = N.getOperand(0);
04409   SDValue N1 = N.getOperand(1);
04410   SDValue LSI_N = CurDAG->getMemOperand(cast<MemSDNode>(N)->getMemOperand());
04411   SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, LSI_N, Chain };
04412   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, Ops0, 4);
04413 }
04414 SDNode *Select_ISD_LOAD_i32(const SDValue &N) {
04415   SDValue Chain = N.getOperand(0);
04416   if (Predicate_unindexedload(N.getNode())) {
04417 
04418     // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>>
04419     // Emits: (LBZ:i32 iaddr:iPTR:$src)
04420     // Pattern complexity = 13  cost = 1  size = 0
04421     if (Predicate_zextload(N.getNode()) &&
04422         Predicate_zextloadi8(N.getNode())) {
04423       SDValue N1 = N.getOperand(1);
04424       SDValue CPTmpN1_0;
04425       SDValue CPTmpN1_1;
04426       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04427         SDNode *Result = Emit_57(N, PPC::LBZ, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04428         return Result;
04429       }
04430     }
04431 
04432     // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>>
04433     // Emits: (LHA:i32 iaddr:iPTR:$src)
04434     // Pattern complexity = 13  cost = 1  size = 0
04435     if (Predicate_sextload(N.getNode()) &&
04436         Predicate_sextloadi16(N.getNode())) {
04437       SDValue N1 = N.getOperand(1);
04438       SDValue CPTmpN1_0;
04439       SDValue CPTmpN1_1;
04440       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04441         SDNode *Result = Emit_57(N, PPC::LHA, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04442         return Result;
04443       }
04444     }
04445 
04446     // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>>
04447     // Emits: (LHZ:i32 iaddr:iPTR:$src)
04448     // Pattern complexity = 13  cost = 1  size = 0
04449     if (Predicate_zextload(N.getNode()) &&
04450         Predicate_zextloadi16(N.getNode())) {
04451       SDValue N1 = N.getOperand(1);
04452       SDValue CPTmpN1_0;
04453       SDValue CPTmpN1_1;
04454       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04455         SDNode *Result = Emit_57(N, PPC::LHZ, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04456         return Result;
04457       }
04458     }
04459 
04460     // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04461     // Emits: (LWZ:i32 iaddr:iPTR:$src)
04462     // Pattern complexity = 13  cost = 1  size = 0
04463     if (Predicate_load(N.getNode())) {
04464       SDValue N1 = N.getOperand(1);
04465       SDValue CPTmpN1_0;
04466       SDValue CPTmpN1_1;
04467       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04468         SDNode *Result = Emit_57(N, PPC::LWZ, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04469         return Result;
04470       }
04471     }
04472 
04473     // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>>
04474     // Emits: (LBZX:i32 xaddr:iPTR:$src)
04475     // Pattern complexity = 13  cost = 1  size = 0
04476     if (Predicate_zextload(N.getNode()) &&
04477         Predicate_zextloadi8(N.getNode())) {
04478       SDValue N1 = N.getOperand(1);
04479       SDValue CPTmpN1_0;
04480       SDValue CPTmpN1_1;
04481       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04482         SDNode *Result = Emit_57(N, PPC::LBZX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04483         return Result;
04484       }
04485     }
04486 
04487     // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>>
04488     // Emits: (LHAX:i32 xaddr:iPTR:$src)
04489     // Pattern complexity = 13  cost = 1  size = 0
04490     if (Predicate_sextload(N.getNode()) &&
04491         Predicate_sextloadi16(N.getNode())) {
04492       SDValue N1 = N.getOperand(1);
04493       SDValue CPTmpN1_0;
04494       SDValue CPTmpN1_1;
04495       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04496         SDNode *Result = Emit_57(N, PPC::LHAX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04497         return Result;
04498       }
04499     }
04500 
04501     // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>>
04502     // Emits: (LHZX:i32 xaddr:iPTR:$src)
04503     // Pattern complexity = 13  cost = 1  size = 0
04504     if (Predicate_zextload(N.getNode()) &&
04505         Predicate_zextloadi16(N.getNode())) {
04506       SDValue N1 = N.getOperand(1);
04507       SDValue CPTmpN1_0;
04508       SDValue CPTmpN1_1;
04509       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04510         SDNode *Result = Emit_57(N, PPC::LHZX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04511         return Result;
04512       }
04513     }
04514 
04515     // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04516     // Emits: (LWZX:i32 xaddr:iPTR:$src)
04517     // Pattern complexity = 13  cost = 1  size = 0
04518     if (Predicate_load(N.getNode())) {
04519       SDValue N1 = N.getOperand(1);
04520       SDValue CPTmpN1_0;
04521       SDValue CPTmpN1_1;
04522       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04523         SDNode *Result = Emit_57(N, PPC::LWZX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04524         return Result;
04525       }
04526     }
04527     if (Predicate_zextload(N.getNode()) &&
04528         Predicate_zextloadi1(N.getNode())) {
04529       SDValue N1 = N.getOperand(1);
04530       SDValue CPTmpN1_0;
04531       SDValue CPTmpN1_1;
04532 
04533       // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>>
04534       // Emits: (LBZ:i32 iaddr:iPTR:$src)
04535       // Pattern complexity = 13  cost = 1  size = 0
04536       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04537         SDNode *Result = Emit_57(N, PPC::LBZ, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04538         return Result;
04539       }
04540 
04541       // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>>
04542       // Emits: (LBZX:i32 xaddr:iPTR:$src)
04543       // Pattern complexity = 13  cost = 1  size = 0
04544       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04545         SDNode *Result = Emit_57(N, PPC::LBZX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04546         return Result;
04547       }
04548     }
04549     if (Predicate_extload(N.getNode())) {
04550       if (Predicate_extloadi1(N.getNode())) {
04551         SDValue N1 = N.getOperand(1);
04552         SDValue CPTmpN1_0;
04553         SDValue CPTmpN1_1;
04554 
04555         // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>>
04556         // Emits: (LBZ:i32 iaddr:iPTR:$src)
04557         // Pattern complexity = 13  cost = 1  size = 0
04558         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04559           SDNode *Result = Emit_57(N, PPC::LBZ, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04560           return Result;
04561         }
04562 
04563         // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>>
04564         // Emits: (LBZX:i32 xaddr:iPTR:$src)
04565         // Pattern complexity = 13  cost = 1  size = 0
04566         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04567           SDNode *Result = Emit_57(N, PPC::LBZX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04568           return Result;
04569         }
04570       }
04571       if (Predicate_extloadi8(N.getNode())) {
04572         SDValue N1 = N.getOperand(1);
04573         SDValue CPTmpN1_0;
04574         SDValue CPTmpN1_1;
04575 
04576         // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>>
04577         // Emits: (LBZ:i32 iaddr:iPTR:$src)
04578         // Pattern complexity = 13  cost = 1  size = 0
04579         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04580           SDNode *Result = Emit_57(N, PPC::LBZ, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04581           return Result;
04582         }
04583 
04584         // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>>
04585         // Emits: (LBZX:i32 xaddr:iPTR:$src)
04586         // Pattern complexity = 13  cost = 1  size = 0
04587         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04588           SDNode *Result = Emit_57(N, PPC::LBZX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04589           return Result;
04590         }
04591       }
04592       if (Predicate_extloadi16(N.getNode())) {
04593         SDValue N1 = N.getOperand(1);
04594         SDValue CPTmpN1_0;
04595         SDValue CPTmpN1_1;
04596 
04597         // Pattern: (ld:i32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>>
04598         // Emits: (LHZ:i32 iaddr:iPTR:$src)
04599         // Pattern complexity = 13  cost = 1  size = 0
04600         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04601           SDNode *Result = Emit_57(N, PPC::LHZ, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04602           return Result;
04603         }
04604 
04605         // Pattern: (ld:i32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>>
04606         // Emits: (LHZX:i32 xaddr:iPTR:$src)
04607         // Pattern complexity = 13  cost = 1  size = 0
04608         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04609           SDNode *Result = Emit_57(N, PPC::LHZX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
04610           return Result;
04611         }
04612       }
04613     }
04614   }
04615 
04616   CannotYetSelect(N);
04617   return NULL;
04618 }
04619 
04620 SDNode *Select_ISD_LOAD_i64(const SDValue &N) {
04621   SDValue Chain = N.getOperand(0);
04622   if (Predicate_unindexedload(N.getNode())) {
04623     if (Predicate_sextload(N.getNode())) {
04624 
04625       // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>>
04626       // Emits: (LHA8:i64 iaddr:iPTR:$src)
04627       // Pattern complexity = 13  cost = 1  size = 0
04628       if (Predicate_sextloadi16(N.getNode())) {
04629         SDValue N1 = N.getOperand(1);
04630         SDValue CPTmpN1_0;
04631         SDValue CPTmpN1_1;
04632         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04633           SDNode *Result = Emit_57(N, PPC::LHA8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04634           return Result;
04635         }
04636       }
04637 
04638       // Pattern: (ld:i64 ixaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi32>>
04639       // Emits: (LWA:i64 ixaddr:iPTR:$src)
04640       // Pattern complexity = 13  cost = 1  size = 0
04641       if (Predicate_sextloadi32(N.getNode())) {
04642         SDValue N1 = N.getOperand(1);
04643         SDValue CPTmpN1_0;
04644         SDValue CPTmpN1_1;
04645         if (SelectAddrImmShift(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04646           SDNode *Result = Emit_57(N, PPC::LWA, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04647           return Result;
04648         }
04649       }
04650 
04651       // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>>
04652       // Emits: (LHAX8:i64 xaddr:iPTR:$src)
04653       // Pattern complexity = 13  cost = 1  size = 0
04654       if (Predicate_sextloadi16(N.getNode())) {
04655         SDValue N1 = N.getOperand(1);
04656         SDValue CPTmpN1_0;
04657         SDValue CPTmpN1_1;
04658         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04659           SDNode *Result = Emit_57(N, PPC::LHAX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04660           return Result;
04661         }
04662       }
04663 
04664       // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi32>>
04665       // Emits: (LWAX:i64 xaddr:iPTR:$src)
04666       // Pattern complexity = 13  cost = 1  size = 0
04667       if (Predicate_sextloadi32(N.getNode())) {
04668         SDValue N1 = N.getOperand(1);
04669         SDValue CPTmpN1_0;
04670         SDValue CPTmpN1_1;
04671         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04672           SDNode *Result = Emit_57(N, PPC::LWAX, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04673           return Result;
04674         }
04675       }
04676     }
04677     if (Predicate_zextload(N.getNode())) {
04678 
04679       // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>>
04680       // Emits: (LBZ8:i64 iaddr:iPTR:$src)
04681       // Pattern complexity = 13  cost = 1  size = 0
04682       if (Predicate_zextloadi8(N.getNode())) {
04683         SDValue N1 = N.getOperand(1);
04684         SDValue CPTmpN1_0;
04685         SDValue CPTmpN1_1;
04686         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04687           SDNode *Result = Emit_57(N, PPC::LBZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04688           return Result;
04689         }
04690       }
04691 
04692       // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>>
04693       // Emits: (LHZ8:i64 iaddr:iPTR:$src)
04694       // Pattern complexity = 13  cost = 1  size = 0
04695       if (Predicate_zextloadi16(N.getNode())) {
04696         SDValue N1 = N.getOperand(1);
04697         SDValue CPTmpN1_0;
04698         SDValue CPTmpN1_1;
04699         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04700           SDNode *Result = Emit_57(N, PPC::LHZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04701           return Result;
04702         }
04703       }
04704 
04705       // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi32>>
04706       // Emits: (LWZ8:i64 iaddr:iPTR:$src)
04707       // Pattern complexity = 13  cost = 1  size = 0
04708       if (Predicate_zextloadi32(N.getNode())) {
04709         SDValue N1 = N.getOperand(1);
04710         SDValue CPTmpN1_0;
04711         SDValue CPTmpN1_1;
04712         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04713           SDNode *Result = Emit_57(N, PPC::LWZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04714           return Result;
04715         }
04716       }
04717 
04718       // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>>
04719       // Emits: (LBZX8:i64 xaddr:iPTR:$src)
04720       // Pattern complexity = 13  cost = 1  size = 0
04721       if (Predicate_zextloadi8(N.getNode())) {
04722         SDValue N1 = N.getOperand(1);
04723         SDValue CPTmpN1_0;
04724         SDValue CPTmpN1_1;
04725         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04726           SDNode *Result = Emit_57(N, PPC::LBZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04727           return Result;
04728         }
04729       }
04730 
04731       // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>>
04732       // Emits: (LHZX8:i64 xaddr:iPTR:$src)
04733       // Pattern complexity = 13  cost = 1  size = 0
04734       if (Predicate_zextloadi16(N.getNode())) {
04735         SDValue N1 = N.getOperand(1);
04736         SDValue CPTmpN1_0;
04737         SDValue CPTmpN1_1;
04738         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04739           SDNode *Result = Emit_57(N, PPC::LHZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04740           return Result;
04741         }
04742       }
04743 
04744       // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi32>>
04745       // Emits: (LWZX8:i64 xaddr:iPTR:$src)
04746       // Pattern complexity = 13  cost = 1  size = 0
04747       if (Predicate_zextloadi32(N.getNode())) {
04748         SDValue N1 = N.getOperand(1);
04749         SDValue CPTmpN1_0;
04750         SDValue CPTmpN1_1;
04751         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04752           SDNode *Result = Emit_57(N, PPC::LWZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04753           return Result;
04754         }
04755       }
04756     }
04757     if (Predicate_load(N.getNode())) {
04758       SDValue N1 = N.getOperand(1);
04759       SDValue CPTmpN1_0;
04760       SDValue CPTmpN1_1;
04761 
04762       // Pattern: (ld:i64 ixaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04763       // Emits: (LD:i64 ixaddr:iPTR:$src)
04764       // Pattern complexity = 13  cost = 1  size = 0
04765       if (SelectAddrImmShift(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04766         SDNode *Result = Emit_57(N, PPC::LD, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04767         return Result;
04768       }
04769 
04770       // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04771       // Emits: (LDX:i64 xaddr:iPTR:$src)
04772       // Pattern complexity = 13  cost = 1  size = 0
04773       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04774         SDNode *Result = Emit_57(N, PPC::LDX, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04775         return Result;
04776       }
04777     }
04778 
04779     // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>>
04780     // Emits: (LBZX8:i64 xaddr:iPTR:$src)
04781     // Pattern complexity = 13  cost = 1  size = 0
04782     if (Predicate_zextload(N.getNode()) &&
04783         Predicate_zextloadi1(N.getNode())) {
04784       SDValue N1 = N.getOperand(1);
04785       SDValue CPTmpN1_0;
04786       SDValue CPTmpN1_1;
04787       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04788         SDNode *Result = Emit_57(N, PPC::LBZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04789         return Result;
04790       }
04791     }
04792     if (Predicate_extload(N.getNode())) {
04793       if (Predicate_extloadi1(N.getNode())) {
04794         SDValue N1 = N.getOperand(1);
04795         SDValue CPTmpN1_0;
04796         SDValue CPTmpN1_1;
04797 
04798         // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>>
04799         // Emits: (LBZ8:i64 iaddr:iPTR:$src)
04800         // Pattern complexity = 13  cost = 1  size = 0
04801         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04802           SDNode *Result = Emit_57(N, PPC::LBZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04803           return Result;
04804         }
04805 
04806         // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>>
04807         // Emits: (LBZX8:i64 xaddr:iPTR:$src)
04808         // Pattern complexity = 13  cost = 1  size = 0
04809         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04810           SDNode *Result = Emit_57(N, PPC::LBZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04811           return Result;
04812         }
04813       }
04814       if (Predicate_extloadi8(N.getNode())) {
04815         SDValue N1 = N.getOperand(1);
04816         SDValue CPTmpN1_0;
04817         SDValue CPTmpN1_1;
04818 
04819         // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>>
04820         // Emits: (LBZ8:i64 iaddr:iPTR:$src)
04821         // Pattern complexity = 13  cost = 1  size = 0
04822         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04823           SDNode *Result = Emit_57(N, PPC::LBZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04824           return Result;
04825         }
04826 
04827         // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>>
04828         // Emits: (LBZX8:i64 xaddr:iPTR:$src)
04829         // Pattern complexity = 13  cost = 1  size = 0
04830         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04831           SDNode *Result = Emit_57(N, PPC::LBZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04832           return Result;
04833         }
04834       }
04835       if (Predicate_extloadi16(N.getNode())) {
04836         SDValue N1 = N.getOperand(1);
04837         SDValue CPTmpN1_0;
04838         SDValue CPTmpN1_1;
04839 
04840         // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>>
04841         // Emits: (LHZ8:i64 iaddr:iPTR:$src)
04842         // Pattern complexity = 13  cost = 1  size = 0
04843         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04844           SDNode *Result = Emit_57(N, PPC::LHZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04845           return Result;
04846         }
04847 
04848         // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>>
04849         // Emits: (LHZX8:i64 xaddr:iPTR:$src)
04850         // Pattern complexity = 13  cost = 1  size = 0
04851         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04852           SDNode *Result = Emit_57(N, PPC::LHZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04853           return Result;
04854         }
04855       }
04856       if (Predicate_extloadi32(N.getNode())) {
04857         SDValue N1 = N.getOperand(1);
04858         SDValue CPTmpN1_0;
04859         SDValue CPTmpN1_1;
04860 
04861         // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi32>>
04862         // Emits: (LWZ8:i64 iaddr:iPTR:$src)
04863         // Pattern complexity = 13  cost = 1  size = 0
04864         if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04865           SDNode *Result = Emit_57(N, PPC::LWZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04866           return Result;
04867         }
04868 
04869         // Pattern: (ld:i64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi32>>
04870         // Emits: (LWZX8:i64 xaddr:iPTR:$src)
04871         // Pattern complexity = 13  cost = 1  size = 0
04872         if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04873           SDNode *Result = Emit_57(N, PPC::LWZX8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04874           return Result;
04875         }
04876       }
04877     }
04878 
04879     // Pattern: (ld:i64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>>
04880     // Emits: (LBZ8:i64 iaddr:iPTR:$src)
04881     // Pattern complexity = 13  cost = 1  size = 0
04882     if (Predicate_zextload(N.getNode()) &&
04883         Predicate_zextloadi1(N.getNode())) {
04884       SDValue N1 = N.getOperand(1);
04885       SDValue CPTmpN1_0;
04886       SDValue CPTmpN1_1;
04887       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04888         SDNode *Result = Emit_57(N, PPC::LBZ8, MVT::i64, CPTmpN1_0, CPTmpN1_1);
04889         return Result;
04890       }
04891     }
04892   }
04893 
04894   CannotYetSelect(N);
04895   return NULL;
04896 }
04897 
04898 SDNode *Select_ISD_LOAD_f32(const SDValue &N) {
04899   SDValue Chain = N.getOperand(0);
04900   if (Predicate_unindexedload(N.getNode()) &&
04901       Predicate_load(N.getNode())) {
04902     SDValue N1 = N.getOperand(1);
04903     SDValue CPTmpN1_0;
04904     SDValue CPTmpN1_1;
04905 
04906     // Pattern: (ld:f32 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04907     // Emits: (LFS:f32 iaddr:iPTR:$src)
04908     // Pattern complexity = 13  cost = 1  size = 0
04909     if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04910       SDNode *Result = Emit_57(N, PPC::LFS, MVT::f32, CPTmpN1_0, CPTmpN1_1);
04911       return Result;
04912     }
04913 
04914     // Pattern: (ld:f32 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04915     // Emits: (LFSX:f32 xaddr:iPTR:$src)
04916     // Pattern complexity = 13  cost = 1  size = 0
04917     if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04918       SDNode *Result = Emit_57(N, PPC::LFSX, MVT::f32, CPTmpN1_0, CPTmpN1_1);
04919       return Result;
04920     }
04921   }
04922 
04923   CannotYetSelect(N);
04924   return NULL;
04925 }
04926 
04927 SDNode *Emit_58(const SDValue &N, unsigned Opc0, unsigned Opc1, MVT VT0, MVT VT1, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) DISABLE_INLINE {
04928   SDValue Chain = N.getOperand(0);
04929   SDValue N1 = N.getOperand(1);
04930   SDValue LSI_N = CurDAG->getMemOperand(cast<MemSDNode>(N)->getMemOperand());
04931   SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, LSI_N, Chain };
04932   SDValue Tmp1(CurDAG->getTargetNode(Opc0, N.getDebugLoc(), VT0, MVT::Other, Ops0, 4), 0);
04933   Chain = SDValue(Tmp1.getNode(), 1);
04934   SDNode *ResNode = CurDAG->getTargetNode(Opc1, N.getDebugLoc(), VT1, Tmp1);
04935   ReplaceUses(SDValue(N.getNode(), 1), Chain);
04936   return ResNode;
04937 }
04938 SDNode *Select_ISD_LOAD_f64(const SDValue &N) {
04939   SDValue Chain = N.getOperand(0);
04940   if (Predicate_unindexedload(N.getNode())) {
04941     if (Predicate_load(N.getNode())) {
04942       SDValue N1 = N.getOperand(1);
04943       SDValue CPTmpN1_0;
04944       SDValue CPTmpN1_1;
04945 
04946       // Pattern: (ld:f64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04947       // Emits: (LFD:f64 iaddr:iPTR:$src)
04948       // Pattern complexity = 13  cost = 1  size = 0
04949       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04950         SDNode *Result = Emit_57(N, PPC::LFD, MVT::f64, CPTmpN1_0, CPTmpN1_1);
04951         return Result;
04952       }
04953 
04954       // Pattern: (ld:f64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_load>>
04955       // Emits: (LFDX:f64 xaddr:iPTR:$src)
04956       // Pattern complexity = 13  cost = 1  size = 0
04957       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04958         SDNode *Result = Emit_57(N, PPC::LFDX, MVT::f64, CPTmpN1_0, CPTmpN1_1);
04959         return Result;
04960       }
04961     }
04962     if (Predicate_extload(N.getNode()) &&
04963         Predicate_extloadf32(N.getNode())) {
04964       SDValue N1 = N.getOperand(1);
04965       SDValue CPTmpN1_0;
04966       SDValue CPTmpN1_1;
04967 
04968       // Pattern: (ld:f64 iaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadf32>>
04969       // Emits: (FMRSD:f64 (LFS:f32 iaddr:iPTR:$src))
04970       // Pattern complexity = 13  cost = 2  size = 0
04971       if (SelectAddrImm(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04972         SDNode *Result = Emit_58(N, PPC::LFS, PPC::FMRSD, MVT::f32, MVT::f64, CPTmpN1_0, CPTmpN1_1);
04973         return Result;
04974       }
04975 
04976       // Pattern: (ld:f64 xaddr:iPTR:$src)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadf32>>
04977       // Emits: (FMRSD:f64 (LFSX:f32 xaddr:iPTR:$src))
04978       // Pattern complexity = 13  cost = 2  size = 0
04979       if (SelectAddrIdx(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04980         SDNode *Result = Emit_58(N, PPC::LFSX, PPC::FMRSD, MVT::f32, MVT::f64, CPTmpN1_0, CPTmpN1_1);
04981         return Result;
04982       }
04983     }
04984   }
04985 
04986   CannotYetSelect(N);
04987   return NULL;
04988 }
04989 
04990 SDNode *Select_ISD_LOAD_v4i32(const SDValue &N) {
04991   SDValue Chain = N.getOperand(0);
04992   if (Predicate_unindexedload(N.getNode()) &&
04993       Predicate_load(N.getNode())) {
04994     SDValue N1 = N.getOperand(1);
04995     SDValue CPTmpN1_0;
04996     SDValue CPTmpN1_1;
04997     if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
04998       SDNode *Result = Emit_57(N, PPC::LVX, MVT::v4i32, CPTmpN1_0, CPTmpN1_1);
04999       return Result;
05000     }
05001   }
05002 
05003   CannotYetSelect(N);
05004   return NULL;
05005 }
05006 
05007 SDNode *Emit_59(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
05008   SDValue Chain = N.getOperand(0);
05009   SDValue N1 = N.getOperand(1);
05010   SDValue N2 = N.getOperand(2);
05011   SDValue N3 = N.getOperand(3);
05012   SDValue N4 = N.getOperand(4);
05013   SDValue N5 = N.getOperand(5);
05014   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Chain);
05015 }
05016 SDNode *Select_ISD_MEMBARRIER(const SDValue &N) {
05017   SDValue Chain = N.getOperand(0);
05018   SDValue N1 = N.getOperand(1);
05019   if (N1.getOpcode() == ISD::Constant) {
05020     SDValue N2 = N.getOperand(2);
05021     if (N2.getOpcode() == ISD::Constant) {
05022       SDValue N3 = N.getOperand(3);
05023       if (N3.getOpcode() == ISD::Constant) {
05024         SDValue N4 = N.getOperand(4);
05025         if (N4.getOpcode() == ISD::Constant) {
05026           SDValue N5 = N.getOperand(5);
05027           if (N5.getOpcode() == ISD::Constant &&
05028               N1.getNode()->getValueType(0) == MVT::i32) {
05029             SDNode *Result = Emit_59(N, PPC::SYNC);
05030             return Result;
05031           }
05032         }
05033       }
05034     }
05035   }
05036 
05037   CannotYetSelect(N);
05038   return NULL;
05039 }
05040 
05041 SDNode *Select_ISD_MUL_i32(const SDValue &N) {
05042 
05043   // Pattern: (mul:i32 GPRC:i32:$rA, (imm:i32)<<P:Predicate_immSExt16>>:$imm)
05044   // Emits: (MULLI:i32 GPRC:i32:$rA, (imm:i32):$imm)
05045   // Pattern complexity = 7  cost = 1  size = 0
05046   {
05047     SDValue N0 = N.getOperand(0);
05048     SDValue N1 = N.getOperand(1);
05049     if (N1.getOpcode() == ISD::Constant &&
05050         Predicate_immSExt16(N1.getNode())) {
05051       SDNode *Result = Emit_0(N, PPC::MULLI, MVT::i32);
05052       return Result;
05053     }
05054   }
05055 
05056   // Pattern: (mul:i32 GPRC:i32:$rA, GPRC:i32:$rB)
05057   // Emits: (MULLW:i32 GPRC:i32:$rA, GPRC:i32:$rB)
05058   // Pattern complexity = 3  cost = 1  size = 0
05059   SDNode *Result = Emit_3(N, PPC::MULLW, MVT::i32);
05060   return Result;
05061 }
05062 
05063 SDNode *Select_ISD_MUL_i64(const SDValue &N) {
05064   SDNode *Result = Emit_3(N, PPC::MULLD, MVT::i64);
05065   return Result;
05066 }
05067 
05068 SDNode *Select_ISD_MULHS_i32(const SDValue &N) {
05069   SDNode *Result = Emit_3(N, PPC::MULHW, MVT::i32);
05070   return Result;
05071 }
05072 
05073 SDNode *Select_ISD_MULHS_i64(const SDValue &N) {
05074   SDNode *Result = Emit_3(N, PPC::MULHD, MVT::i64);
05075   return Result;
05076 }
05077 
05078 SDNode *Select_ISD_MULHU_i32(const SDValue &N) {
05079   SDNode *Result = Emit_3(N, PPC::MULHWU, MVT::i32);
05080   return Result;
05081 }
05082 
05083 SDNode *Select_ISD_MULHU_i64(const SDValue &N) {
05084   SDNode *Result = Emit_3(N, PPC::MULHDU, MVT::i64);
05085   return Result;
05086 }
05087 
05088 SDNode *Emit_60(const SDValue &N, unsigned Opc0, unsigned Opc1, MVT VT0, MVT VT1) DISABLE_INLINE {
05089   SDValue N0 = N.getOperand(0);
05090   SDValue N1 = N.getOperand(1);
05091   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
05092   SDValue Tmp2 = Transform_LO16(Tmp1.getNode());
05093   SDValue Tmp3(CurDAG->getTargetNode(Opc0, N.getDebugLoc(), VT0, N0, Tmp2), 0);
05094   SDValue Tmp4 = Transform_HI16(Tmp1.getNode());
05095   return CurDAG->SelectNodeTo(N.getNode(), Opc1, VT1, Tmp3, Tmp4);
05096 }
05097 SDNode *Select_ISD_OR_i32(const SDValue &N) {
05098   {
05099     SDValue N0 = N.getOperand(0);
05100 
05101     // Pattern: (or:i32 GPRC:i32:$rS, (xor:i32 GPRC:i32:$rB, (imm:i32)<<P:Predicate_immAllOnes>>))
05102     // Emits: (ORC:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05103     // Pattern complexity = 10  cost = 1  size = 0
05104     {
05105       SDValue N1 = N.getOperand(1);
05106       if (N1.getOpcode() == ISD::XOR) {
05107         SDValue N10 = N1.getOperand(0);
05108         SDValue N11 = N1.getOperand(1);
05109         if (N11.getOpcode() == ISD::Constant &&
05110             Predicate_immAllOnes(N11.getNode())) {
05111           SDNode *Result = Emit_2(N, PPC::ORC, MVT::i32);
05112           return Result;
05113         }
05114       }
05115     }
05116 
05117     // Pattern: (or:i32 (xor:i32 GPRC:i32:$rB, (imm:i32)<<P:Predicate_immAllOnes>>), GPRC:i32:$rS)
05118     // Emits: (ORC:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05119     // Pattern complexity = 10  cost = 1  size = 0
05120     if (N0.getOpcode() == ISD::XOR) {
05121       SDValue N00 = N0.getOperand(0);
05122       SDValue N01 = N0.getOperand(1);
05123       if (N01.getOpcode() == ISD::Constant &&
05124           Predicate_immAllOnes(N01.getNode())) {
05125         SDNode *Result = Emit_5(N, PPC::ORC, MVT::i32);
05126         return Result;
05127       }
05128     }
05129     SDValue N1 = N.getOperand(1);
05130     if (N1.getOpcode() == ISD::Constant) {
05131 
05132       // Pattern: (or:i32 GPRC:i32:$src1, (imm:i32)<<P:Predicate_immZExt16>><<X:LO16>>:$src2)
05133       // Emits: (ORI:i32 GPRC:i32:$src1, (LO16:i32 (imm:i32):$src2))
05134       // Pattern complexity = 7  cost = 1  size = 0
05135       if (Predicate_immZExt16(N1.getNode())) {
05136         SDNode *Result = Emit_12(N, PPC::ORI, MVT::i32);
05137         return Result;
05138       }
05139 
05140       // Pattern: (or:i32 GPRC:i32:$src1, (imm:i32)<<P:Predicate_imm16ShiftedZExt>><<X:HI16>>:$src2)
05141       // Emits: (ORIS:i32 GPRC:i32:$src1, (HI16:i32 (imm:i32):$src2))
05142       // Pattern complexity = 7  cost = 1  size = 0
05143       if (Predicate_imm16ShiftedZExt(N1.getNode())) {
05144         SDNode *Result = Emit_1(N, PPC::ORIS, MVT::i32);
05145         return Result;
05146       }
05147 
05148       // Pattern: (or:i32 GPRC:i32:$in, (imm:i32):$imm)
05149       // Emits: (ORIS:i32 (ORI:i32 GPRC:i32:$in, (LO16:i32 (imm:i32):$imm)), (HI16:i32 (imm:i32):$imm))
05150       // Pattern complexity = 6  cost = 2  size = 0
05151       SDNode *Result = Emit_60(N, PPC::ORI, PPC::ORIS, MVT::i32, MVT::i32);
05152       return Result;
05153     }
05154   }
05155 
05156   // Pattern: (or:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05157   // Emits: (OR:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05158   // Pattern complexity = 3  cost = 1  size = 0
05159   SDNode *Result = Emit_3(N, PPC::OR, MVT::i32);
05160   return Result;
05161 }
05162 
05163 SDNode *Select_ISD_OR_i64(const SDValue &N) {
05164   {
05165     SDValue N0 = N.getOperand(0);
05166 
05167     // Pattern: (or:i64 G8RC:i64:$rS, (xor:i64 G8RC:i64:$rB, (imm:i64)<<P:Predicate_immAllOnes>>))
05168     // Emits: (ORC8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
05169     // Pattern complexity = 10  cost = 1  size = 0
05170     {
05171       SDValue N1 = N.getOperand(1);
05172       if (N1.getOpcode() == ISD::XOR) {
05173         SDValue N10 = N1.getOperand(0);
05174         SDValue N11 = N1.getOperand(1);
05175         if (N11.getOpcode() == ISD::Constant &&
05176             Predicate_immAllOnes(N11.getNode())) {
05177           SDNode *Result = Emit_2(N, PPC::ORC8, MVT::i64);
05178           return Result;
05179         }
05180       }
05181     }
05182 
05183     // Pattern: (or:i64 (xor:i64 G8RC:i64:$rB, (imm:i64)<<P:Predicate_immAllOnes>>), G8RC:i64:$rS)
05184     // Emits: (ORC8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
05185     // Pattern complexity = 10  cost = 1  size = 0
05186     if (N0.getOpcode() == ISD::XOR) {
05187       SDValue N00 = N0.getOperand(0);
05188       SDValue N01 = N0.getOperand(1);
05189       if (N01.getOpcode() == ISD::Constant &&
05190           Predicate_immAllOnes(N01.getNode())) {
05191         SDNode *Result = Emit_5(N, PPC::ORC8, MVT::i64);
05192         return Result;
05193       }
05194     }
05195     SDValue N1 = N.getOperand(1);
05196     if (N1.getOpcode() == ISD::Constant) {
05197 
05198       // Pattern: (or:i64 G8RC:i64:$src1, (imm:i64)<<P:Predicate_immZExt16>><<X:LO16>>:$src2)
05199       // Emits: (ORI8:i64 G8RC:i64:$src1, (LO16:i32 (imm:i64):$src2))
05200       // Pattern complexity = 7  cost = 1  size = 0
05201       if (Predicate_immZExt16(N1.getNode())) {
05202         SDNode *Result = Emit_14(N, PPC::ORI8, MVT::i64);
05203         return Result;
05204       }
05205 
05206       // Pattern: (or:i64 G8RC:i64:$src1, (imm:i64)<<P:Predicate_imm16ShiftedZExt>><<X:HI16>>:$src2)
05207       // Emits: (ORIS8:i64 G8RC:i64:$src1, (HI16:i32 (imm:i64):$src2))
05208       // Pattern complexity = 7  cost = 1  size = 0
05209       if (Predicate_imm16ShiftedZExt(N1.getNode())) {
05210         SDNode *Result = Emit_7(N, PPC::ORIS8, MVT::i64);
05211         return Result;
05212       }
05213     }
05214   }
05215 
05216   // Pattern: (or:i64 G8RC:i64:$rS, G8RC:i64:$rB)
05217   // Emits: (OR8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
05218   // Pattern complexity = 3  cost = 1  size = 0
05219   SDNode *Result = Emit_3(N, PPC::OR8, MVT::i64);
05220   return Result;
05221 }
05222 
05223 SDNode *Select_ISD_OR_v4i32(const SDValue &N) {
05224   SDNode *Result = Emit_3(N, PPC::VOR, MVT::v4i32);
05225   return Result;
05226 }
05227 
05228 SDNode *Emit_61(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05229   SDValue N0 = N.getOperand(0);
05230   SDValue N1 = N.getOperand(1);
05231   SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
05232   SDValue Tmp3 = CurDAG->getTargetConstant(0x1FULL, MVT::i32);
05233   SDValue Ops0[] = { N0, N1, Tmp2, Tmp3 };
05234   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Ops0, 4);
05235 }
05236 SDNode *Emit_62(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05237   SDValue N0 = N.getOperand(0);
05238   SDValue N1 = N.getOperand(1);
05239   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
05240   SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
05241   SDValue Tmp3 = CurDAG->getTargetConstant(0x1FULL, MVT::i32);
05242   SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3 };
05243   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Ops0, 4);
05244 }
05245 SDNode *Select_ISD_ROTL_i32(const SDValue &N) {
05246   SDValue N0 = N.getOperand(0);
05247   SDValue N1 = N.getOperand(1);
05248 
05249   // Pattern: (rotl:i32 GPRC:i32:$in, (imm:i32):$imm)
05250   // Emits: (RLWINM:i32 GPRC:i32:$in, (imm:i32):$imm, 0:i32, 31:i32)
05251   // Pattern complexity = 6  cost = 1  size = 0
05252   if (N1.getOpcode() == ISD::Constant &&
05253       N1.getNode()->getValueType(0) == MVT::i32) {
05254     SDNode *Result = Emit_62(N, PPC::RLWINM, MVT::i32);
05255     return Result;
05256   }
05257 
05258   // Pattern: (rotl:i32 GPRC:i32:$in, GPRC:i32:$sh)
05259   // Emits: (RLWNM:i32 GPRC:i32:$in, GPRC:i32:$sh, 0:i32, 31:i32)
05260   // Pattern complexity = 3  cost = 1  size = 0
05261   if (N1.getNode()->getValueType(0) == MVT::i32) {
05262     SDNode *Result = Emit_61(N, PPC::RLWNM, MVT::i32);
05263     return Result;
05264   }
05265 
05266   CannotYetSelect(N);
05267   return NULL;
05268 }
05269 
05270 SDNode *Emit_63(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05271   SDValue N0 = N.getOperand(0);
05272   SDValue N1 = N.getOperand(1);
05273   SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
05274   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N1, Tmp2);
05275 }
05276 SDNode *Emit_64(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05277   SDValue N0 = N.getOperand(0);
05278   SDValue N1 = N.getOperand(1);
05279   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
05280   SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
05281   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp1, Tmp2);
05282 }
05283 SDNode *Select_ISD_ROTL_i64(const SDValue &N) {
05284   SDValue N0 = N.getOperand(0);
05285   SDValue N1 = N.getOperand(1);
05286 
05287   // Pattern: (rotl:i64 G8RC:i64:$in, (imm:i32):$imm)
05288   // Emits: (RLDICL:i64 G8RC:i64:$in, (imm:i32):$imm, 0:i32)
05289   // Pattern complexity = 6  cost = 1  size = 0
05290   if (N1.getOpcode() == ISD::Constant &&
05291       N1.getNode()->getValueType(0) == MVT::i32) {
05292     SDNode *Result = Emit_64(N, PPC::RLDICL, MVT::i64);
05293     return Result;
05294   }
05295 
05296   // Pattern: (rotl:i64 G8RC:i64:$in, GPRC:i32:$sh)
05297   // Emits: (RLDCL:i64 G8RC:i64:$in, GPRC:i32:$sh, 0:i32)
05298   // Pattern complexity = 3  cost = 1  size = 0
05299   if (N1.getNode()->getValueType(0) == MVT::i32) {
05300     SDNode *Result = Emit_63(N, PPC::RLDCL, MVT::i64);
05301     return Result;
05302   }
05303 
05304   CannotYetSelect(N);
05305   return NULL;
05306 }
05307 
05308 SDNode *Select_ISD_SDIV_i32(const SDValue &N) {
05309   SDNode *Result = Emit_3(N, PPC::DIVW, MVT::i32);
05310   return Result;
05311 }
05312 
05313 SDNode *Select_ISD_SDIV_i64(const SDValue &N) {
05314   SDNode *Result = Emit_3(N, PPC::DIVD, MVT::i64);
05315   return Result;
05316 }
05317 
05318 SDNode *Emit_65(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05319   SDValue N0 = N.getOperand(0);
05320   SDValue N1 = N.getOperand(1);
05321   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
05322   SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
05323   SDValue Tmp3 = Transform_SHL32(Tmp1.getNode());
05324   SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3 };
05325   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Ops0, 4);
05326 }
05327 SDNode *Select_ISD_SHL_i32(const SDValue &N) {
05328   SDValue N0 = N.getOperand(0);
05329   SDValue N1 = N.getOperand(1);
05330 
05331   // Pattern: (shl:i32 GPRC:i32:$in, (imm:i32):$imm)
05332   // Emits: (RLWINM:i32 GPRC:i32:$in, (imm:i32):$imm, 0:i32, (SHL32:i32 (imm:i32):$imm))
05333   // Pattern complexity = 6  cost = 1  size = 0
05334   if (N1.getOpcode() == ISD::Constant &&
05335       N1.getNode()->getValueType(0) == MVT::i32) {
05336     SDNode *Result = Emit_65(N, PPC::RLWINM, MVT::i32);
05337     return Result;
05338   }
05339 
05340   // Pattern: (shl:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05341   // Emits: (SLW:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05342   // Pattern complexity = 3  cost = 1  size = 0
05343   if (N1.getNode()->getValueType(0) == MVT::i32) {
05344     SDNode *Result = Emit_3(N, PPC::SLW, MVT::i32);
05345     return Result;
05346   }
05347 
05348   CannotYetSelect(N);
05349   return NULL;
05350 }
05351 
05352 SDNode *Emit_66(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05353   SDValue N0 = N.getOperand(0);
05354   SDValue N1 = N.getOperand(1);
05355   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
05356   SDValue Tmp2 = Transform_SHL64(Tmp1.getNode());
05357   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp1, Tmp2);
05358 }
05359 SDNode *Select_ISD_SHL_i64(const SDValue &N) {
05360   SDValue N0 = N.getOperand(0);
05361   SDValue N1 = N.getOperand(1);
05362 
05363   // Pattern: (shl:i64 G8RC:i64:$in, (imm:i32):$imm)
05364   // Emits: (RLDICR:i64 G8RC:i64:$in, (imm:i32):$imm, (SHL64:i32 (imm:i32):$imm))
05365   // Pattern complexity = 6  cost = 1  size = 0
05366   if (N1.getOpcode() == ISD::Constant &&
05367       N1.getNode()->getValueType(0) == MVT::i32) {
05368     SDNode *Result = Emit_66(N, PPC::RLDICR, MVT::i64);
05369     return Result;
05370   }
05371 
05372   // Pattern: (shl:i64 G8RC:i64:$rS, GPRC:i32:$rB)
05373   // Emits: (SLD:i64 G8RC:i64:$rS, GPRC:i32:$rB)
05374   // Pattern complexity = 3  cost = 1  size = 0
05375   if (N1.getNode()->getValueType(0) == MVT::i32) {
05376     SDNode *Result = Emit_3(N, PPC::SLD, MVT::i64);
05377     return Result;
05378   }
05379 
05380   CannotYetSelect(N);
05381   return NULL;
05382 }
05383 
05384 SDNode *Select_ISD_SIGN_EXTEND_i64(const SDValue &N) {
05385   SDValue N0 = N.getOperand(0);
05386   if (N0.getNode()->getValueType(0) == MVT::i32) {
05387     SDNode *Result = Emit_28(N, PPC::EXTSW_32_64, MVT::i64);
05388     return Result;
05389   }
05390 
05391   CannotYetSelect(N);
05392   return NULL;
05393 }
05394 
05395 SDNode *Emit_67(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05396   SDValue N0 = N.getOperand(0);
05397   SDValue N1 = N.getOperand(1);
05398   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0);
05399 }
05400 SDNode *Select_ISD_SIGN_EXTEND_INREG_i32(const SDValue &N) {
05401   SDValue N0 = N.getOperand(0);
05402   SDValue N1 = N.getOperand(1);
05403 
05404   // Pattern: (sext_inreg:i32 GPRC:i32:$rS, i8:Other)
05405   // Emits: (EXTSB:i32 GPRC:i32:$rS)
05406   // Pattern complexity = 3  cost = 1  size = 0
05407   if (cast<VTSDNode>(N1)->getVT() == MVT::i8) {
05408     SDNode *Result = Emit_67(N, PPC::EXTSB, MVT::i32);
05409     return Result;
05410   }
05411 
05412   // Pattern: (sext_inreg:i32 GPRC:i32:$rS, i16:Other)
05413   // Emits: (EXTSH:i32 GPRC:i32:$rS)
05414   // Pattern complexity = 3  cost = 1  size = 0
05415   if (cast<VTSDNode>(N1)->getVT() == MVT::i16) {
05416     SDNode *Result = Emit_67(N, PPC::EXTSH, MVT::i32);
05417     return Result;
05418   }
05419 
05420   CannotYetSelect(N);
05421   return NULL;
05422 }
05423 
05424 SDNode *Select_ISD_SIGN_EXTEND_INREG_i64(const SDValue &N) {
05425   SDValue N0 = N.getOperand(0);
05426   SDValue N1 = N.getOperand(1);
05427 
05428   // Pattern: (sext_inreg:i64 G8RC:i64:$rS, i8:Other)
05429   // Emits: (EXTSB8:i64 G8RC:i64:$rS)
05430   // Pattern complexity = 3  cost = 1  size = 0
05431   if (cast<VTSDNode>(N1)->getVT() == MVT::i8) {
05432     SDNode *Result = Emit_67(N, PPC::EXTSB8, MVT::i64);
05433     return Result;
05434   }
05435 
05436   // Pattern: (sext_inreg:i64 G8RC:i64:$rS, i16:Other)
05437   // Emits: (EXTSH8:i64 G8RC:i64:$rS)
05438   // Pattern complexity = 3  cost = 1  size = 0
05439   if (cast<VTSDNode>(N1)->getVT() == MVT::i16) {
05440     SDNode *Result = Emit_67(N, PPC::EXTSH8, MVT::i64);
05441     return Result;
05442   }
05443 
05444   // Pattern: (sext_inreg:i64 G8RC:i64:$rS, i32:Other)
05445   // Emits: (EXTSW:i64 G8RC:i64:$rS)
05446   // Pattern complexity = 3  cost = 1  size = 0
05447   if (cast<VTSDNode>(N1)->getVT() == MVT::i32) {
05448     SDNode *Result = Emit_67(N, PPC::EXTSW, MVT::i64);
05449     return Result;
05450   }
05451 
05452   CannotYetSelect(N);
05453   return NULL;
05454 }
05455 
05456 SDNode *Select_ISD_SRA_i32(const SDValue &N) {
05457   SDValue N0 = N.getOperand(0);
05458   SDValue N1 = N.getOperand(1);
05459 
05460   // Pattern: (sra:i32 GPRC:i32:$rS, (imm:i32):$SH)
05461   // Emits: (SRAWI:i32 GPRC:i32:$rS, (imm:i32):$SH)
05462   // Pattern complexity = 6  cost = 1  size = 0
05463   if (N1.getOpcode() == ISD::Constant &&
05464       N1.getNode()->getValueType(0) == MVT::i32) {
05465     SDNode *Result = Emit_0(N, PPC::SRAWI, MVT::i32);
05466     return Result;
05467   }
05468 
05469   // Pattern: (sra:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05470   // Emits: (SRAW:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05471   // Pattern complexity = 3  cost = 1  size = 0
05472   if (N1.getNode()->getValueType(0) == MVT::i32) {
05473     SDNode *Result = Emit_3(N, PPC::SRAW, MVT::i32);
05474     return Result;
05475   }
05476 
05477   CannotYetSelect(N);
05478   return NULL;
05479 }
05480 
05481 SDNode *Select_ISD_SRA_i64(const SDValue &N) {
05482   SDValue N0 = N.getOperand(0);
05483   SDValue N1 = N.getOperand(1);
05484 
05485   // Pattern: (sra:i64 G8RC:i64:$rS, (imm:i32):$SH)
05486   // Emits: (SRADI:i64 G8RC:i64:$rS, (imm:i32):$SH)
05487   // Pattern complexity = 6  cost = 1  size = 0
05488   if (N1.getOpcode() == ISD::Constant &&
05489       N1.getNode()->getValueType(0) == MVT::i32) {
05490     SDNode *Result = Emit_0(N, PPC::SRADI, MVT::i64);
05491     return Result;
05492   }
05493 
05494   // Pattern: (sra:i64 G8RC:i64:$rS, GPRC:i32:$rB)
05495   // Emits: (SRAD:i64 G8RC:i64:$rS, GPRC:i32:$rB)
05496   // Pattern complexity = 3  cost = 1  size = 0
05497   if (N1.getNode()->getValueType(0) == MVT::i32) {
05498     SDNode *Result = Emit_3(N, PPC::SRAD, MVT::i64);
05499     return Result;
05500   }
05501 
05502   CannotYetSelect(N);
05503   return NULL;
05504 }
05505 
05506 SDNode *Emit_68(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05507   SDValue N0 = N.getOperand(0);
05508   SDValue N1 = N.getOperand(1);
05509   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
05510   SDValue Tmp2 = Transform_SRL32(Tmp1.getNode());
05511   SDValue Tmp3 = CurDAG->getTargetConstant(0x1FULL, MVT::i32);
05512   SDValue Ops0[] = { N0, Tmp2, Tmp1, Tmp3 };
05513   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Ops0, 4);
05514 }
05515 SDNode *Select_ISD_SRL_i32(const SDValue &N) {
05516   SDValue N0 = N.getOperand(0);
05517   SDValue N1 = N.getOperand(1);
05518 
05519   // Pattern: (srl:i32 GPRC:i32:$in, (imm:i32):$imm)
05520   // Emits: (RLWINM:i32 GPRC:i32:$in, (SRL32:i32 (imm:i32):$imm), (imm:i32):$imm, 31:i32)
05521   // Pattern complexity = 6  cost = 1  size = 0
05522   if (N1.getOpcode() == ISD::Constant &&
05523       N1.getNode()->getValueType(0) == MVT::i32) {
05524     SDNode *Result = Emit_68(N, PPC::RLWINM, MVT::i32);
05525     return Result;
05526   }
05527 
05528   // Pattern: (srl:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05529   // Emits: (SRW:i32 GPRC:i32:$rS, GPRC:i32:$rB)
05530   // Pattern complexity = 3  cost = 1  size = 0
05531   if (N1.getNode()->getValueType(0) == MVT::i32) {
05532     SDNode *Result = Emit_3(N, PPC::SRW, MVT::i32);
05533     return Result;
05534   }
05535 
05536   CannotYetSelect(N);
05537   return NULL;
05538 }
05539 
05540 SDNode *Emit_69(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05541   SDValue N0 = N.getOperand(0);
05542   SDValue N1 = N.getOperand(1);
05543   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
05544   SDValue Tmp2 = Transform_SRL64(Tmp1.getNode());
05545   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, Tmp2, Tmp1);
05546 }
05547 SDNode *Select_ISD_SRL_i64(const SDValue &N) {
05548   SDValue N0 = N.getOperand(0);
05549   SDValue N1 = N.getOperand(1);
05550 
05551   // Pattern: (srl:i64 G8RC:i64:$in, (imm:i32):$imm)
05552   // Emits: (RLDICL:i64 G8RC:i64:$in, (SRL64:i32 (imm:i32):$imm), (imm:i32):$imm)
05553   // Pattern complexity = 6  cost = 1  size = 0
05554   if (N1.getOpcode() == ISD::Constant &&
05555       N1.getNode()->getValueType(0) == MVT::i32) {
05556     SDNode *Result = Emit_69(N, PPC::RLDICL, MVT::i64);
05557     return Result;
05558   }
05559 
05560   // Pattern: (srl:i64 G8RC:i64:$rS, GPRC:i32:$rB)
05561   // Emits: (SRD:i64 G8RC:i64:$rS, GPRC:i32:$rB)
05562   // Pattern complexity = 3  cost = 1  size = 0
05563   if (N1.getNode()->getValueType(0) == MVT::i32) {
05564     SDNode *Result = Emit_3(N, PPC::SRD, MVT::i64);
05565     return Result;
05566   }
05567 
05568   CannotYetSelect(N);
05569   return NULL;
05570 }
05571 
05572 SDNode *Emit_70(const SDValue &N, unsigned Opc0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1) DISABLE_INLINE {
05573   SDValue Chain = N.getOperand(0);
05574   SDValue N1 = N.getOperand(1);
05575   SDValue N2 = N.getOperand(2);
05576   SDValue LSI_N = CurDAG->getMemOperand(cast<MemSDNode>(N)->getMemOperand());
05577   SDValue Ops0[] = { N1, CPTmpN2_0, CPTmpN2_1, LSI_N, Chain };
05578   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 5);
05579 }
05580 SDNode *Select_ISD_STORE(const SDValue &N) {
05581   SDValue Chain = N.getOperand(0);
05582   if (Predicate_unindexedstore(N.getNode())) {
05583     if (Predicate_truncstore(N.getNode())) {
05584 
05585       // Pattern: (st:isVoid GPRC:i32:$rS, iaddr:iPTR:$src)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>>
05586       // Emits: (STB:isVoid GPRC:i32:$rS, iaddr:iPTR:$src)
05587       // Pattern complexity = 13  cost = 1  size = 0
05588       if (Predicate_truncstorei8(N.getNode())) {
05589         SDValue N1 = N.getOperand(1);
05590         SDValue N2 = N.getOperand(2);
05591         SDValue CPTmpN2_0;
05592         SDValue CPTmpN2_1;
05593         if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05594             N1.getNode()->getValueType(0) == MVT::i32) {
05595           SDNode *Result = Emit_70(N, PPC::STB, CPTmpN2_0, CPTmpN2_1);
05596           return Result;
05597         }
05598       }
05599 
05600       // Pattern: (st:isVoid GPRC:i32:$rS, iaddr:iPTR:$src)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>>
05601       // Emits: (STH:isVoid GPRC:i32:$rS, iaddr:iPTR:$src)
05602       // Pattern complexity = 13  cost = 1  size = 0
05603       if (Predicate_truncstorei16(N.getNode())) {
05604         SDValue N1 = N.getOperand(1);
05605         SDValue N2 = N.getOperand(2);
05606         SDValue CPTmpN2_0;
05607         SDValue CPTmpN2_1;
05608         if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05609             N1.getNode()->getValueType(0) == MVT::i32) {
05610           SDNode *Result = Emit_70(N, PPC::STH, CPTmpN2_0, CPTmpN2_1);
05611           return Result;
05612         }
05613       }
05614     }
05615     if (Predicate_store(N.getNode())) {
05616       SDValue N1 = N.getOperand(1);
05617       SDValue N2 = N.getOperand(2);
05618       SDValue CPTmpN2_0;
05619       SDValue CPTmpN2_1;
05620       if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1)) {
05621 
05622         // Pattern: (st:isVoid GPRC:i32:$rS, iaddr:iPTR:$src)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05623         // Emits: (STW:isVoid GPRC:i32:$rS, iaddr:iPTR:$src)
05624         // Pattern complexity = 13  cost = 1  size = 0
05625         if (N1.getNode()->getValueType(0) == MVT::i32) {
05626           SDNode *Result = Emit_70(N, PPC::STW, CPTmpN2_0, CPTmpN2_1);
05627           return Result;
05628         }
05629 
05630         // Pattern: (st:isVoid F4RC:f32:$rS, iaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05631         // Emits: (STFS:isVoid F4RC:f32:$rS, iaddr:iPTR:$dst)
05632         // Pattern complexity = 13  cost = 1  size = 0
05633         if (N1.getNode()->getValueType(0) == MVT::f32) {
05634           SDNode *Result = Emit_70(N, PPC::STFS, CPTmpN2_0, CPTmpN2_1);
05635           return Result;
05636         }
05637 
05638         // Pattern: (st:isVoid F8RC:f64:$rS, iaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05639         // Emits: (STFD:isVoid F8RC:f64:$rS, iaddr:iPTR:$dst)
05640         // Pattern complexity = 13  cost = 1  size = 0
05641         if (N1.getNode()->getValueType(0) == MVT::f64) {
05642           SDNode *Result = Emit_70(N, PPC::STFD, CPTmpN2_0, CPTmpN2_1);
05643           return Result;
05644         }
05645       }
05646     }
05647     if (Predicate_truncstore(N.getNode())) {
05648 
05649       // Pattern: (st:isVoid GPRC:i32:$rS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>>
05650       // Emits: (STBX:isVoid GPRC:i32:$rS, xaddr:iPTR:$dst)
05651       // Pattern complexity = 13  cost = 1  size = 0
05652       if (Predicate_truncstorei8(N.getNode())) {
05653         SDValue N1 = N.getOperand(1);
05654         SDValue N2 = N.getOperand(2);
05655         SDValue CPTmpN2_0;
05656         SDValue CPTmpN2_1;
05657         if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05658             N1.getNode()->getValueType(0) == MVT::i32) {
05659           SDNode *Result = Emit_70(N, PPC::STBX, CPTmpN2_0, CPTmpN2_1);
05660           return Result;
05661         }
05662       }
05663 
05664       // Pattern: (st:isVoid GPRC:i32:$rS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>>
05665       // Emits: (STHX:isVoid GPRC:i32:$rS, xaddr:iPTR:$dst)
05666       // Pattern complexity = 13  cost = 1  size = 0
05667       if (Predicate_truncstorei16(N.getNode())) {
05668         SDValue N1 = N.getOperand(1);
05669         SDValue N2 = N.getOperand(2);
05670         SDValue CPTmpN2_0;
05671         SDValue CPTmpN2_1;
05672         if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05673             N1.getNode()->getValueType(0) == MVT::i32) {
05674           SDNode *Result = Emit_70(N, PPC::STHX, CPTmpN2_0, CPTmpN2_1);
05675           return Result;
05676         }
05677       }
05678     }
05679     if (Predicate_store(N.getNode())) {
05680       SDValue N1 = N.getOperand(1);
05681       SDValue N2 = N.getOperand(2);
05682       SDValue CPTmpN2_0;
05683       SDValue CPTmpN2_1;
05684       if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1)) {
05685 
05686         // Pattern: (st:isVoid GPRC:i32:$rS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05687         // Emits: (STWX:isVoid GPRC:i32:$rS, xaddr:iPTR:$dst)
05688         // Pattern complexity = 13  cost = 1  size = 0
05689         if (N1.getNode()->getValueType(0) == MVT::i32) {
05690           SDNode *Result = Emit_70(N, PPC::STWX, CPTmpN2_0, CPTmpN2_1);
05691           return Result;
05692         }
05693 
05694         // Pattern: (st:isVoid F4RC:f32:$frS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05695         // Emits: (STFSX:isVoid F4RC:f32:$frS, xaddr:iPTR:$dst)
05696         // Pattern complexity = 13  cost = 1  size = 0
05697         if (N1.getNode()->getValueType(0) == MVT::f32) {
05698           SDNode *Result = Emit_70(N, PPC::STFSX, CPTmpN2_0, CPTmpN2_1);
05699           return Result;
05700         }
05701 
05702         // Pattern: (st:isVoid F8RC:f64:$frS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05703         // Emits: (STFDX:isVoid F8RC:f64:$frS, xaddr:iPTR:$dst)
05704         // Pattern complexity = 13  cost = 1  size = 0
05705         if (N1.getNode()->getValueType(0) == MVT::f64) {
05706           SDNode *Result = Emit_70(N, PPC::STFDX, CPTmpN2_0, CPTmpN2_1);
05707           return Result;
05708         }
05709       }
05710     }
05711     if (Predicate_truncstore(N.getNode())) {
05712 
05713       // Pattern: (st:isVoid G8RC:i64:$rS, iaddr:iPTR:$src)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>>
05714       // Emits: (STB8:isVoid G8RC:i64:$rS, iaddr:iPTR:$src)
05715       // Pattern complexity = 13  cost = 1  size = 0
05716       if (Predicate_truncstorei8(N.getNode())) {
05717         SDValue N1 = N.getOperand(1);
05718         SDValue N2 = N.getOperand(2);
05719         SDValue CPTmpN2_0;
05720         SDValue CPTmpN2_1;
05721         if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05722             N1.getNode()->getValueType(0) == MVT::i64) {
05723           SDNode *Result = Emit_70(N, PPC::STB8, CPTmpN2_0, CPTmpN2_1);
05724           return Result;
05725         }
05726       }
05727 
05728       // Pattern: (st:isVoid G8RC:i64:$rS, iaddr:iPTR:$src)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>>
05729       // Emits: (STH8:isVoid G8RC:i64:$rS, iaddr:iPTR:$src)
05730       // Pattern complexity = 13  cost = 1  size = 0
05731       if (Predicate_truncstorei16(N.getNode())) {
05732         SDValue N1 = N.getOperand(1);
05733         SDValue N2 = N.getOperand(2);
05734         SDValue CPTmpN2_0;
05735         SDValue CPTmpN2_1;
05736         if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05737             N1.getNode()->getValueType(0) == MVT::i64) {
05738           SDNode *Result = Emit_70(N, PPC::STH8, CPTmpN2_0, CPTmpN2_1);
05739           return Result;
05740         }
05741       }
05742 
05743       // Pattern: (st:isVoid G8RC:i64:$rS, iaddr:iPTR:$src)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei32>>
05744       // Emits: (STW8:isVoid G8RC:i64:$rS, iaddr:iPTR:$src)
05745       // Pattern complexity = 13  cost = 1  size = 0
05746       if (Predicate_truncstorei32(N.getNode())) {
05747         SDValue N1 = N.getOperand(1);
05748         SDValue N2 = N.getOperand(2);
05749         SDValue CPTmpN2_0;
05750         SDValue CPTmpN2_1;
05751         if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05752             N1.getNode()->getValueType(0) == MVT::i64) {
05753           SDNode *Result = Emit_70(N, PPC::STW8, CPTmpN2_0, CPTmpN2_1);
05754           return Result;
05755         }
05756       }
05757 
05758       // Pattern: (st:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>>
05759       // Emits: (STBX8:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)
05760       // Pattern complexity = 13  cost = 1  size = 0
05761       if (Predicate_truncstorei8(N.getNode())) {
05762         SDValue N1 = N.getOperand(1);
05763         SDValue N2 = N.getOperand(2);
05764         SDValue CPTmpN2_0;
05765         SDValue CPTmpN2_1;
05766         if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05767             N1.getNode()->getValueType(0) == MVT::i64) {
05768           SDNode *Result = Emit_70(N, PPC::STBX8, CPTmpN2_0, CPTmpN2_1);
05769           return Result;
05770         }
05771       }
05772 
05773       // Pattern: (st:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>>
05774       // Emits: (STHX8:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)
05775       // Pattern complexity = 13  cost = 1  size = 0
05776       if (Predicate_truncstorei16(N.getNode())) {
05777         SDValue N1 = N.getOperand(1);
05778         SDValue N2 = N.getOperand(2);
05779         SDValue CPTmpN2_0;
05780         SDValue CPTmpN2_1;
05781         if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05782             N1.getNode()->getValueType(0) == MVT::i64) {
05783           SDNode *Result = Emit_70(N, PPC::STHX8, CPTmpN2_0, CPTmpN2_1);
05784           return Result;
05785         }
05786       }
05787 
05788       // Pattern: (st:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei32>>
05789       // Emits: (STWX8:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)
05790       // Pattern complexity = 13  cost = 1  size = 0
05791       if (Predicate_truncstorei32(N.getNode())) {
05792         SDValue N1 = N.getOperand(1);
05793         SDValue N2 = N.getOperand(2);
05794         SDValue CPTmpN2_0;
05795         SDValue CPTmpN2_1;
05796         if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05797             N1.getNode()->getValueType(0) == MVT::i64) {
05798           SDNode *Result = Emit_70(N, PPC::STWX8, CPTmpN2_0, CPTmpN2_1);
05799           return Result;
05800         }
05801       }
05802     }
05803     if (Predicate_store(N.getNode())) {
05804       SDValue N1 = N.getOperand(1);
05805       SDValue N2 = N.getOperand(2);
05806       SDValue CPTmpN2_0;
05807       SDValue CPTmpN2_1;
05808 
05809       // Pattern: (st:isVoid G8RC:i64:$rS, ixaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05810       // Emits: (STD:isVoid G8RC:i64:$rS, ixaddr:iPTR:$dst)
05811       // Pattern complexity = 13  cost = 1  size = 0
05812       if (SelectAddrImmShift(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05813           N1.getNode()->getValueType(0) == MVT::i64) {
05814         SDNode *Result = Emit_70(N, PPC::STD, CPTmpN2_0, CPTmpN2_1);
05815         return Result;
05816       }
05817 
05818       // Pattern: (st:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05819       // Emits: (STDX:isVoid G8RC:i64:$rS, xaddr:iPTR:$dst)
05820       // Pattern complexity = 13  cost = 1  size = 0
05821       if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05822           N1.getNode()->getValueType(0) == MVT::i64) {
05823         SDNode *Result = Emit_70(N, PPC::STDX, CPTmpN2_0, CPTmpN2_1);
05824         return Result;
05825       }
05826 
05827       // Pattern: (st:isVoid VRRC:v4i32:$rS, xoaddr:iPTR:$dst)<<P:Predicate_unindexedstore>><<P:Predicate_store>>
05828       // Emits: (STVX:isVoid VRRC:v4i32:$rS, xoaddr:iPTR:$dst)
05829       // Pattern complexity = 13  cost = 1  size = 0
05830       if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1) &&
05831           N1.getNode()->getValueType(0) == MVT::v4i32) {
05832         SDNode *Result = Emit_70(N, PPC::STVX, CPTmpN2_0, CPTmpN2_1);
05833         return Result;
05834       }
05835     }
05836   }
05837 
05838   CannotYetSelect(N);
05839   return NULL;
05840 }
05841 
05842 SDNode *Emit_71(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN3_0) DISABLE_INLINE {
05843   SDValue Chain = N.getOperand(0);
05844   SDValue N1 = N.getOperand(1);
05845   SDValue N2 = N.getOperand(2);
05846   SDValue N3 = N.getOperand(3);
05847   SDValue LSI_N = CurDAG->getMemOperand(cast<MemSDNode>(N)->getMemOperand());
05848   SDValue Ops0[] = { N1, CPTmpN3_0, N2, LSI_N, Chain };
05849   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, Ops0, 5);
05850 }
05851 SDNode *Select_ISD_STORE_iPTR(const SDValue &N) {
05852   SDValue Chain = N.getOperand(0);
05853   if (Predicate_itruncstore(N.getNode()) &&
05854       Predicate_pre_truncst(N.getNode())) {
05855 
05856     // Pattern: (ist:iPTR GPRC:i32:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti8>>
05857     // Emits: (STBU:iPTR GPRC:i32:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05858     // Pattern complexity = 10  cost = 1  size = 0
05859     if (Predicate_pre_truncsti8(N.getNode())) {
05860       SDValue N1 = N.getOperand(1);
05861       SDValue N2 = N.getOperand(2);
05862       SDValue N3 = N.getOperand(3);
05863       SDValue CPTmpN3_0;
05864       if (SelectAddrImmOffs(N, N3, CPTmpN3_0) &&
05865           N1.getNode()->getValueType(0) == MVT::i32) {
05866         SDNode *Result = Emit_71(N, PPC::STBU, MVT::iPTR, CPTmpN3_0);
05867         return Result;
05868       }
05869     }
05870 
05871     // Pattern: (ist:iPTR GPRC:i32:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti16>>
05872     // Emits: (STHU:iPTR GPRC:i32:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05873     // Pattern complexity = 10  cost = 1  size = 0
05874     if (Predicate_pre_truncsti16(N.getNode())) {
05875       SDValue N1 = N.getOperand(1);
05876       SDValue N2 = N.getOperand(2);
05877       SDValue N3 = N.getOperand(3);
05878       SDValue CPTmpN3_0;
05879       if (SelectAddrImmOffs(N, N3, CPTmpN3_0) &&
05880           N1.getNode()->getValueType(0) == MVT::i32) {
05881         SDNode *Result = Emit_71(N, PPC::STHU, MVT::iPTR, CPTmpN3_0);
05882         return Result;
05883       }
05884     }
05885   }
05886   if (Predicate_istore(N.getNode()) &&
05887       Predicate_pre_store(N.getNode())) {
05888     SDValue N1 = N.getOperand(1);
05889     SDValue N2 = N.getOperand(2);
05890     SDValue N3 = N.getOperand(3);
05891     SDValue CPTmpN3_0;
05892     if (SelectAddrImmOffs(N, N3, CPTmpN3_0)) {
05893 
05894       // Pattern: (ist:iPTR GPRC:i32:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_istore>><<P:Predicate_pre_store>>
05895       // Emits: (STWU:iPTR GPRC:i32:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05896       // Pattern complexity = 10  cost = 1  size = 0
05897       if (N1.getNode()->getValueType(0) == MVT::i32) {
05898         SDNode *Result = Emit_71(N, PPC::STWU, MVT::iPTR, CPTmpN3_0);
05899         return Result;
05900       }
05901 
05902       // Pattern: (ist:iPTR F4RC:f32:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_istore>><<P:Predicate_pre_store>>
05903       // Emits: (STFSU:iPTR F4RC:f32:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05904       // Pattern complexity = 10  cost = 1  size = 0
05905       if (N1.getNode()->getValueType(0) == MVT::f32) {
05906         SDNode *Result = Emit_71(N, PPC::STFSU, MVT::iPTR, CPTmpN3_0);
05907         return Result;
05908       }
05909 
05910       // Pattern: (ist:iPTR F8RC:f64:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_istore>><<P:Predicate_pre_store>>
05911       // Emits: (STFDU:iPTR F8RC:f64:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05912       // Pattern complexity = 10  cost = 1  size = 0
05913       if (N1.getNode()->getValueType(0) == MVT::f64) {
05914         SDNode *Result = Emit_71(N, PPC::STFDU, MVT::iPTR, CPTmpN3_0);
05915         return Result;
05916       }
05917     }
05918   }
05919   if (Predicate_itruncstore(N.getNode()) &&
05920       Predicate_pre_truncst(N.getNode())) {
05921 
05922     // Pattern: (ist:iPTR G8RC:i64:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti8>>
05923     // Emits: (STBU8:iPTR G8RC:i64:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05924     // Pattern complexity = 10  cost = 1  size = 0
05925     if (Predicate_pre_truncsti8(N.getNode())) {
05926       SDValue N1 = N.getOperand(1);
05927       SDValue N2 = N.getOperand(2);
05928       SDValue N3 = N.getOperand(3);
05929       SDValue CPTmpN3_0;
05930       if (SelectAddrImmOffs(N, N3, CPTmpN3_0) &&
05931           N1.getNode()->getValueType(0) == MVT::i64) {
05932         SDNode *Result = Emit_71(N, PPC::STBU8, MVT::iPTR, CPTmpN3_0);
05933         return Result;
05934       }
05935     }
05936 
05937     // Pattern: (ist:iPTR G8RC:i64:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti16>>
05938     // Emits: (STHU8:iPTR G8RC:i64:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05939     // Pattern complexity = 10  cost = 1  size = 0
05940     if (Predicate_pre_truncsti16(N.getNode())) {
05941       SDValue N1 = N.getOperand(1);
05942       SDValue N2 = N.getOperand(2);
05943       SDValue N3 = N.getOperand(3);
05944       SDValue CPTmpN3_0;
05945       if (SelectAddrImmOffs(N, N3, CPTmpN3_0) &&
05946           N1.getNode()->getValueType(0) == MVT::i64) {
05947         SDNode *Result = Emit_71(N, PPC::STHU8, MVT::iPTR, CPTmpN3_0);
05948         return Result;
05949       }
05950     }
05951   }
05952   if (Predicate_istore(N.getNode()) &&
05953       Predicate_pre_store(N.getNode())) {
05954     SDValue N1 = N.getOperand(1);
05955     SDValue N2 = N.getOperand(2);
05956     SDValue N3 = N.getOperand(3);
05957     SDValue CPTmpN3_0;
05958     if (SelectAddrImmOffs(N, N3, CPTmpN3_0) &&
05959         N1.getNode()->getValueType(0) == MVT::i64) {
05960 
05961       // Pattern: (ist:iPTR G8RC:i64:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_istore>><<P:Predicate_pre_store>>
05962       // Emits: (STWU8:iPTR G8RC:i64:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05963       // Pattern complexity = 10  cost = 1  size = 0
05964       {
05965         SDNode *Result = Emit_71(N, PPC::STWU8, MVT::iPTR, CPTmpN3_0);
05966         return Result;
05967       }
05968 
05969       // Pattern: (ist:iPTR G8RC:i64:$rS, ptr_rc:iPTR:$ptrreg, iaddroff:iPTR:$ptroff)<<P:Predicate_istore>><<P:Predicate_pre_store>>
05970       // Emits: (STDU:iPTR G8RC:i64:$rS, iaddroff:i32:$ptroff, ptr_rc:iPTR:$ptrreg)
05971       // Pattern complexity = 10  cost = 1  size = 0
05972       SDNode *Result = Emit_71(N, PPC::STDU, MVT::iPTR, CPTmpN3_0);
05973       return Result;
05974     }
05975   }
05976 
05977   CannotYetSelect(N);
05978   return NULL;
05979 }
05980 
05981 SDNode *Emit_72(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05982   SDValue N0 = N.getOperand(0);
05983   SDValue N1 = N.getOperand(1);
05984   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1, N0);
05985 }
05986 SDNode *Emit_73(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
05987   SDValue N0 = N.getOperand(0);
05988   SDValue N1 = N.getOperand(1);
05989   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32);
05990   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1, Tmp1);
05991 }
05992 SDNode *Select_ISD_SUB_i32(const SDValue &N) {
05993   {
05994     SDValue N0 = N.getOperand(0);
05995 
05996     // Pattern: (sub:i32 0:i32, GPRC:i32:$rA)
05997     // Emits: (NEG:i32 GPRC:i32:$rA)
05998     // Pattern complexity = 8  cost = 1  size = 0
05999     {
06000       ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
06001       if (Tmp0) {
06002         int64_t CN1 = Tmp0->getSExtValue();
06003         if (CN1 == INT64_C(0)) {
06004           SDNode *Result = Emit_53(N, PPC::NEG, MVT::i32);
06005           return Result;
06006         }
06007       }
06008     }
06009 
06010     // Pattern: (sub:i32 (imm:i32)<<P:Predicate_immSExt16>>:$imm, GPRC:i32:$in)
06011     // Emits: (SUBFIC:i32 GPRC:i32:$in, (imm:i32):$imm)
06012     // Pattern complexity = 7  cost = 1  size = 0
06013     if (N0.getOpcode() == ISD::Constant &&
06014         Predicate_immSExt16(N0.getNode())) {
06015       SDNode *Result = Emit_73(N, PPC::SUBFIC, MVT::i32);
06016       return Result;
06017     }
06018   }
06019 
06020   // Pattern: (sub:i32 GPRC:i32:$rB, GPRC:i32:$rA)
06021   // Emits: (SUBF:i32 GPRC:i32:$rA, GPRC:i32:$rB)
06022   // Pattern complexity = 3  cost = 1  size = 0
06023   SDNode *Result = Emit_72(N, PPC::SUBF, MVT::i32);
06024   return Result;
06025 }
06026 
06027 SDNode *Select_ISD_SUB_i64(const SDValue &N) {
06028 
06029   // Pattern: (sub:i64 0:i64, G8RC:i64:$rA)
06030   // Emits: (NEG8:i64 G8RC:i64:$rA)
06031   // Pattern complexity = 8  cost = 1  size = 0
06032   {
06033     SDValue N0 = N.getOperand(0);
06034     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
06035     if (Tmp0) {
06036       int64_t CN1 = Tmp0->getSExtValue();
06037       if (CN1 == INT64_C(0)) {
06038         SDNode *Result = Emit_53(N, PPC::NEG8, MVT::i64);
06039         return Result;
06040       }
06041     }
06042   }
06043 
06044   // Pattern: (sub:i64 G8RC:i64:$rB, G8RC:i64:$rA)
06045   // Emits: (SUBF8:i64 G8RC:i64:$rA, G8RC:i64:$rB)
06046   // Pattern complexity = 3  cost = 1  size = 0
06047   SDNode *Result = Emit_72(N, PPC::SUBF8, MVT::i64);
06048   return Result;
06049 }
06050 
06051 SDNode *Select_ISD_SUB_v16i8(const SDValue &N) {
06052   SDNode *Result = Emit_3(N, PPC::VSUBUBM, MVT::v16i8);
06053   return Result;
06054 }
06055 
06056 SDNode *Select_ISD_SUB_v8i16(const SDValue &N) {
06057   SDNode *Result = Emit_3(N, PPC::VSUBUHM, MVT::v8i16);
06058   return Result;
06059 }
06060 
06061 SDNode *Select_ISD_SUB_v4i32(const SDValue &N) {
06062   SDNode *Result = Emit_3(N, PPC::VSUBUWM, MVT::v4i32);
06063   return Result;
06064 }
06065 
06066 SDNode *Emit_74(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06067   SDValue N0 = N.getOperand(0);
06068   SDValue N1 = N.getOperand(1);
06069   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32);
06070   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N1, Tmp1);
06071   SDValue InFlag(ResNode, 1);
06072   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
06073   return ResNode;
06074 }
06075 SDNode *Emit_75(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06076   SDValue N0 = N.getOperand(0);
06077   SDValue N1 = N.getOperand(1);
06078   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N1, N0);
06079   SDValue InFlag(ResNode, 1);
06080   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
06081   return ResNode;
06082 }
06083 SDNode *Select_ISD_SUBC_i32(const SDValue &N) {
06084 
06085   // Pattern: (subc:i32 (imm:i32)<<P:Predicate_immSExt16>>:$imm, GPRC:i32:$rA)
06086   // Emits: (SUBFIC:i32 GPRC:i32:$rA, (imm:i32):$imm)
06087   // Pattern complexity = 7  cost = 1  size = 0
06088   {
06089     SDValue N0 = N.getOperand(0);
06090     if (N0.getOpcode() == ISD::Constant &&
06091         Predicate_immSExt16(N0.getNode())) {
06092       SDNode *Result = Emit_74(N, PPC::SUBFIC, MVT::i32);
06093       return Result;
06094     }
06095   }
06096 
06097   // Pattern: (subc:i32 GPRC:i32:$rB, GPRC:i32:$rA)
06098   // Emits: (SUBFC:i32 GPRC:i32:$rA, GPRC:i32:$rB)
06099   // Pattern complexity = 3  cost = 1  size = 0
06100   SDNode *Result = Emit_75(N, PPC::SUBFC, MVT::i32);
06101   return Result;
06102 }
06103 
06104 SDNode *Emit_76(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06105   SDValue N0 = N.getOperand(0);
06106   SDValue N1 = N.getOperand(1);
06107   SDValue Tmp1 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i64);
06108   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N1, Tmp1);
06109   SDValue InFlag(ResNode, 1);
06110   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
06111   return ResNode;
06112 }
06113 SDNode *Select_ISD_SUBC_i64(const SDValue &N) {
06114 
06115   // Pattern: (subc:i64 (imm:i64)<<P:Predicate_immSExt16>>:$imm, G8RC:i64:$rA)
06116   // Emits: (SUBFIC8:i64 G8RC:i64:$rA, (imm:i64):$imm)
06117   // Pattern complexity = 7  cost = 1  size = 0
06118   {
06119     SDValue N0 = N.getOperand(0);
06120     if (N0.getOpcode() == ISD::Constant &&
06121         Predicate_immSExt16(N0.getNode())) {
06122       SDNode *Result = Emit_76(N, PPC::SUBFIC8, MVT::i64);
06123       return Result;
06124     }
06125   }
06126 
06127   // Pattern: (subc:i64 G8RC:i64:$rB, G8RC:i64:$rA)
06128   // Emits: (SUBFC8:i64 G8RC:i64:$rA, G8RC:i64:$rB)
06129   // Pattern complexity = 3  cost = 1  size = 0
06130   SDNode *Result = Emit_75(N, PPC::SUBFC8, MVT::i64);
06131   return Result;
06132 }
06133 
06134 SDNode *Emit_77(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06135   SDValue N0 = N.getOperand(0);
06136   SDValue N1 = N.getOperand(1);
06137   SDValue InFlag = N.getOperand(2);
06138   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N1, N0, InFlag);
06139   InFlag = SDValue(ResNode, 1);
06140   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
06141   return ResNode;
06142 }
06143 SDNode *Emit_78(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06144   SDValue N0 = N.getOperand(0);
06145   SDValue N1 = N.getOperand(1);
06146   SDValue InFlag = N.getOperand(2);
06147   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N1, InFlag);
06148   InFlag = SDValue(ResNode, 1);
06149   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
06150   return ResNode;
06151 }
06152 SDNode *Select_ISD_SUBE_i32(const SDValue &N) {
06153   {
06154     SDValue N0 = N.getOperand(0);
06155 
06156     // Pattern: (sube:i32 0:i32, GPRC:i32:$rA)
06157     // Emits: (SUBFZE:i32 GPRC:i32:$rA)
06158     // Pattern complexity = 8  cost = 1  size = 0
06159     {
06160       ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
06161       if (Tmp0) {
06162         int64_t CN1 = Tmp0->getSExtValue();
06163         if (CN1 == INT64_C(0)) {
06164           SDNode *Result = Emit_78(N, PPC::SUBFZE, MVT::i32);
06165           return Result;
06166         }
06167       }
06168     }
06169 
06170     // Pattern: (sube:i32 (imm:i32)<<P:Predicate_immAllOnes>>, GPRC:i32:$rA)
06171     // Emits: (SUBFME:i32 GPRC:i32:$rA)
06172     // Pattern complexity = 7  cost = 1  size = 0
06173     if (N0.getOpcode() == ISD::Constant &&
06174         Predicate_immAllOnes(N0.getNode())) {
06175       SDNode *Result = Emit_78(N, PPC::SUBFME, MVT::i32);
06176       return Result;
06177     }
06178   }
06179 
06180   // Pattern: (sube:i32 GPRC:i32:$rB, GPRC:i32:$rA)
06181   // Emits: (SUBFE:i32 GPRC:i32:$rA, GPRC:i32:$rB)
06182   // Pattern complexity = 3  cost = 1  size = 0
06183   SDNode *Result = Emit_77(N, PPC::SUBFE, MVT::i32);
06184   return Result;
06185 }
06186 
06187 SDNode *Select_ISD_SUBE_i64(const SDValue &N) {
06188   {
06189     SDValue N0 = N.getOperand(0);
06190 
06191     // Pattern: (sube:i64 0:i64, G8RC:i64:$rA)
06192     // Emits: (SUBFZE8:i64 G8RC:i64:$rA)
06193     // Pattern complexity = 8  cost = 1  size = 0
06194     {
06195       ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0);
06196       if (Tmp0) {
06197         int64_t CN1 = Tmp0->getSExtValue();
06198         if (CN1 == INT64_C(0)) {
06199           SDNode *Result = Emit_78(N, PPC::SUBFZE8, MVT::i64);
06200           return Result;
06201         }
06202       }
06203     }
06204 
06205     // Pattern: (sube:i64 (imm:i64)<<P:Predicate_immAllOnes>>, G8RC:i64:$rA)
06206     // Emits: (SUBFME8:i64 G8RC:i64:$rA)
06207     // Pattern complexity = 7  cost = 1  size = 0
06208     if (N0.getOpcode() == ISD::Constant &&
06209         Predicate_immAllOnes(N0.getNode())) {
06210       SDNode *Result = Emit_78(N, PPC::SUBFME8, MVT::i64);
06211       return Result;
06212     }
06213   }
06214 
06215   // Pattern: (sube:i64 G8RC:i64:$rB, G8RC:i64:$rA)
06216   // Emits: (SUBFE8:i64 G8RC:i64:$rA, G8RC:i64:$rB)
06217   // Pattern complexity = 3  cost = 1  size = 0
06218   SDNode *Result = Emit_77(N, PPC::SUBFE8, MVT::i64);
06219   return Result;
06220 }
06221 
06222 SDNode *Emit_79(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
06223   SDValue Chain = N.getOperand(0);
06224   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Chain);
06225 }
06226 SDNode *Select_ISD_TRAP(const SDValue &N) {
06227   SDNode *Result = Emit_79(N, PPC::TRAP);
06228   return Result;
06229 }
06230 
06231 SDNode *Select_ISD_TRUNCATE_i32(const SDValue &N) {
06232   SDValue N0 = N.getOperand(0);
06233   if (N0.getNode()->getValueType(0) == MVT::i64) {
06234     SDNode *Result = Emit_17(N, PPC::OR8To4, MVT::i32);
06235     return Result;
06236   }
06237 
06238   CannotYetSelect(N);
06239   return NULL;
06240 }
06241 
06242 SDNode *Select_ISD_UDIV_i32(const SDValue &N) {
06243   SDNode *Result = Emit_3(N, PPC::DIVWU, MVT::i32);
06244   return Result;
06245 }
06246 
06247 SDNode *Select_ISD_UDIV_i64(const SDValue &N) {
06248   SDNode *Result = Emit_3(N, PPC::DIVDU, MVT::i64);
06249   return Result;
06250 }
06251 
06252 SDNode *Emit_80(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06253   SDValue N0 = N.getOperand(0);
06254   SDValue N1 = N.getOperand(1);
06255   SDValue N2 = N.getOperand(2);
06256   SDValue Tmp3 = Transform_VSLDOI_get_imm(N2.getNode());
06257   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N1, Tmp3);
06258 }
06259 SDNode *Emit_81(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06260   SDValue N0 = N.getOperand(0);
06261   SDValue N1 = N.getOperand(1);
06262   SDValue N2 = N.getOperand(2);
06263   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N1);
06264 }
06265 SDNode *Emit_82(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06266   SDValue N0 = N.getOperand(0);
06267   SDValue N1 = N.getOperand(1);
06268   SDValue N2 = N.getOperand(2);
06269   SDValue Tmp1 = Transform_VSPLTB_get_imm(N2.getNode());
06270   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1, N0);
06271 }
06272 SDNode *Emit_83(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06273   SDValue N0 = N.getOperand(0);
06274   SDValue N1 = N.getOperand(1);
06275   SDValue N2 = N.getOperand(2);
06276   SDValue Tmp1 = Transform_VSPLTH_get_imm(N2.getNode());
06277   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1, N0);
06278 }
06279 SDNode *Emit_84(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06280   SDValue N0 = N.getOperand(0);
06281   SDValue N1 = N.getOperand(1);
06282   SDValue N2 = N.getOperand(2);
06283   SDValue Tmp1 = Transform_VSPLTW_get_imm(N2.getNode());
06284   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Tmp1, N0);
06285 }
06286 SDNode *Emit_85(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06287   SDValue N0 = N.getOperand(0);
06288   SDValue N1 = N.getOperand(1);
06289   SDValue N2 = N.getOperand(2);
06290   SDValue Tmp3 = Transform_VSLDOI_unary_get_imm(N2.getNode());
06291   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N0, Tmp3);
06292 }
06293 SDNode *Emit_86(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06294   SDValue N0 = N.getOperand(0);
06295   SDValue N1 = N.getOperand(1);
06296   SDValue N2 = N.getOperand(2);
06297   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N0);
06298 }
06299 SDNode *Select_ISD_VECTOR_SHUFFLE_v16i8(const SDValue &N) {
06300   SDValue N0 = N.getOperand(0);
06301   SDValue N1 = N.getOperand(1);
06302   if (N1.getOpcode() == ISD::UNDEF) {
06303     SDValue N2 = N.getOperand(2);
06304     if (N2.getOpcode() == ISD::BUILD_VECTOR) {
06305 
06306       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vB, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VSPLTB_shuffle_mask>><<X:VSPLTB_get_imm>>:$UIMM)
06307       // Emits: (VSPLTB:v16i8 (VSPLTB_get_imm:i32 (build_vector:v16i8):$UIMM), VRRC:v16i8:$vB)
06308       // Pattern complexity = 10  cost = 1  size = 0
06309       if (Predicate_VSPLTB_shuffle_mask(N2.getNode())) {
06310         SDNode *Result = Emit_82(N, PPC::VSPLTB, MVT::v16i8);
06311         return Result;
06312       }
06313 
06314       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vB, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VSPLTH_shuffle_mask>><<X:VSPLTH_get_imm>>:$UIMM)
06315       // Emits: (VSPLTH:v16i8 (VSPLTH_get_imm:i32 (build_vector:v16i8):$UIMM), VRRC:v16i8:$vB)
06316       // Pattern complexity = 10  cost = 1  size = 0
06317       if (Predicate_VSPLTH_shuffle_mask(N2.getNode())) {
06318         SDNode *Result = Emit_83(N, PPC::VSPLTH, MVT::v16i8);
06319         return Result;
06320       }
06321 
06322       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vB, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VSPLTW_shuffle_mask>><<X:VSPLTW_get_imm>>:$UIMM)
06323       // Emits: (VSPLTW:v16i8 (VSPLTW_get_imm:i32 (build_vector:v16i8):$UIMM), VRRC:v16i8:$vB)
06324       // Pattern complexity = 10  cost = 1  size = 0
06325       if (Predicate_VSPLTW_shuffle_mask(N2.getNode())) {
06326         SDNode *Result = Emit_84(N, PPC::VSPLTW, MVT::v16i8);
06327         return Result;
06328       }
06329 
06330       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VSLDOI_unary_shuffle_mask>><<X:VSLDOI_unary_get_imm>>:$in)
06331       // Emits: (VSLDOI:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA, (VSLDOI_unary_get_imm:i32 (build_vector:i32)<<P:Predicate_VSLDOI_unary_shuffle_mask>>:$in))
06332       // Pattern complexity = 10  cost = 1  size = 0
06333       if (Predicate_VSLDOI_unary_shuffle_mask(N2.getNode())) {
06334         SDNode *Result = Emit_85(N, PPC::VSLDOI, MVT::v16i8);
06335         return Result;
06336       }
06337 
06338       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VPKUWUM_unary_shuffle_mask>>:$in)
06339       // Emits: (VPKUWUM:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06340       // Pattern complexity = 10  cost = 1  size = 0
06341       if (Predicate_VPKUWUM_unary_shuffle_mask(N2.getNode())) {
06342         SDNode *Result = Emit_86(N, PPC::VPKUWUM, MVT::v16i8);
06343         return Result;
06344       }
06345 
06346       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VPKUHUM_unary_shuffle_mask>>:$in)
06347       // Emits: (VPKUHUM:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06348       // Pattern complexity = 10  cost = 1  size = 0
06349       if (Predicate_VPKUHUM_unary_shuffle_mask(N2.getNode())) {
06350         SDNode *Result = Emit_86(N, PPC::VPKUHUM, MVT::v16i8);
06351         return Result;
06352       }
06353 
06354       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VMRGLB_unary_shuffle_mask>>:$in)
06355       // Emits: (VMRGLB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06356       // Pattern complexity = 10  cost = 1  size = 0
06357       if (Predicate_VMRGLB_unary_shuffle_mask(N2.getNode())) {
06358         SDNode *Result = Emit_86(N, PPC::VMRGLB, MVT::v16i8);
06359         return Result;
06360       }
06361 
06362       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VMRGLH_unary_shuffle_mask>>:$in)
06363       // Emits: (VMRGLH:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06364       // Pattern complexity = 10  cost = 1  size = 0
06365       if (Predicate_VMRGLH_unary_shuffle_mask(N2.getNode())) {
06366         SDNode *Result = Emit_86(N, PPC::VMRGLH, MVT::v16i8);
06367         return Result;
06368       }
06369 
06370       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VMRGLW_unary_shuffle_mask>>:$in)
06371       // Emits: (VMRGLW:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06372       // Pattern complexity = 10  cost = 1  size = 0
06373       if (Predicate_VMRGLW_unary_shuffle_mask(N2.getNode())) {
06374         SDNode *Result = Emit_86(N, PPC::VMRGLW, MVT::v16i8);
06375         return Result;
06376       }
06377 
06378       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VMRGHB_unary_shuffle_mask>>:$in)
06379       // Emits: (VMRGHB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06380       // Pattern complexity = 10  cost = 1  size = 0
06381       if (Predicate_VMRGHB_unary_shuffle_mask(N2.getNode())) {
06382         SDNode *Result = Emit_86(N, PPC::VMRGHB, MVT::v16i8);
06383         return Result;
06384       }
06385 
06386       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VMRGHH_unary_shuffle_mask>>:$in)
06387       // Emits: (VMRGHH:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06388       // Pattern complexity = 10  cost = 1  size = 0
06389       if (Predicate_VMRGHH_unary_shuffle_mask(N2.getNode())) {
06390         SDNode *Result = Emit_86(N, PPC::VMRGHH, MVT::v16i8);
06391         return Result;
06392       }
06393 
06394       // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, (undef:v16i8), (build_vector:v16i8)<<P:Predicate_VMRGHW_unary_shuffle_mask>>:$in)
06395       // Emits: (VMRGHW:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06396       // Pattern complexity = 10  cost = 1  size = 0
06397       if (Predicate_VMRGHW_unary_shuffle_mask(N2.getNode())) {
06398         SDNode *Result = Emit_86(N, PPC::VMRGHW, MVT::v16i8);
06399         return Result;
06400       }
06401     }
06402   }
06403   SDValue N2 = N.getOperand(2);
06404   if (N2.getOpcode() == ISD::BUILD_VECTOR) {
06405 
06406     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VSLDOI_shuffle_mask>><<X:VSLDOI_get_imm>>:$SH)
06407     // Emits: (VSLDOI:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (VSLDOI_get_imm:i32 (build_vector:v16i8):$SH))
06408     // Pattern complexity = 7  cost = 1  size = 0
06409     if (Predicate_VSLDOI_shuffle_mask(N2.getNode())) {
06410       SDNode *Result = Emit_80(N, PPC::VSLDOI, MVT::v16i8);
06411       return Result;
06412     }
06413 
06414     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VMRGHB_shuffle_mask>>)
06415     // Emits: (VMRGHB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06416     // Pattern complexity = 7  cost = 1  size = 0
06417     if (Predicate_VMRGHB_shuffle_mask(N2.getNode())) {
06418       SDNode *Result = Emit_81(N, PPC::VMRGHB, MVT::v16i8);
06419       return Result;
06420     }
06421 
06422     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VMRGHH_shuffle_mask>>)
06423     // Emits: (VMRGHH:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06424     // Pattern complexity = 7  cost = 1  size = 0
06425     if (Predicate_VMRGHH_shuffle_mask(N2.getNode())) {
06426       SDNode *Result = Emit_81(N, PPC::VMRGHH, MVT::v16i8);
06427       return Result;
06428     }
06429 
06430     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VMRGHW_shuffle_mask>>)
06431     // Emits: (VMRGHW:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06432     // Pattern complexity = 7  cost = 1  size = 0
06433     if (Predicate_VMRGHW_shuffle_mask(N2.getNode())) {
06434       SDNode *Result = Emit_81(N, PPC::VMRGHW, MVT::v16i8);
06435       return Result;
06436     }
06437 
06438     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VMRGLB_shuffle_mask>>)
06439     // Emits: (VMRGLB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06440     // Pattern complexity = 7  cost = 1  size = 0
06441     if (Predicate_VMRGLB_shuffle_mask(N2.getNode())) {
06442       SDNode *Result = Emit_81(N, PPC::VMRGLB, MVT::v16i8);
06443       return Result;
06444     }
06445 
06446     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VMRGLH_shuffle_mask>>)
06447     // Emits: (VMRGLH:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06448     // Pattern complexity = 7  cost = 1  size = 0
06449     if (Predicate_VMRGLH_shuffle_mask(N2.getNode())) {
06450       SDNode *Result = Emit_81(N, PPC::VMRGLH, MVT::v16i8);
06451       return Result;
06452     }
06453 
06454     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VMRGLW_shuffle_mask>>)
06455     // Emits: (VMRGLW:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06456     // Pattern complexity = 7  cost = 1  size = 0
06457     if (Predicate_VMRGLW_shuffle_mask(N2.getNode())) {
06458       SDNode *Result = Emit_81(N, PPC::VMRGLW, MVT::v16i8);
06459       return Result;
06460     }
06461 
06462     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VPKUHUM_shuffle_mask>>)
06463     // Emits: (VPKUHUM:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06464     // Pattern complexity = 7  cost = 1  size = 0
06465     if (Predicate_VPKUHUM_shuffle_mask(N2.getNode())) {
06466       SDNode *Result = Emit_81(N, PPC::VPKUHUM, MVT::v16i8);
06467       return Result;
06468     }
06469 
06470     // Pattern: (vector_shuffle:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, (build_vector:v16i8)<<P:Predicate_VPKUWUM_shuffle_mask>>)
06471     // Emits: (VPKUWUM:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
06472     // Pattern complexity = 7  cost = 1  size = 0
06473     if (Predicate_VPKUWUM_shuffle_mask(N2.getNode())) {
06474       SDNode *Result = Emit_81(N, PPC::VPKUWUM, MVT::v16i8);
06475       return Result;
06476     }
06477   }
06478 
06479   CannotYetSelect(N);
06480   return NULL;
06481 }
06482 
06483 SDNode *Emit_87(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06484   SDValue N0 = N.getOperand(0);
06485   SDValue N00 = N0.getOperand(0);
06486   SDValue N01 = N0.getOperand(1);
06487   SDValue N1 = N.getOperand(1);
06488   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N00, N01);
06489 }
06490 SDNode *Emit_88(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06491   SDValue N0 = N.getOperand(0);
06492   SDValue N1 = N.getOperand(1);
06493   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N0);
06494 }
06495 SDNode *Emit_89(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06496   SDValue N0 = N.getOperand(0);
06497   SDValue N00 = N0.getOperand(0);
06498   SDValue N01 = N0.getOperand(1);
06499   SDValue N1 = N.getOperand(1);
06500   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N00, N1);
06501 }
06502 SDNode *Emit_90(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06503   SDValue N0 = N.getOperand(0);
06504   SDValue N1 = N.getOperand(1);
06505   SDValue N10 = N1.getOperand(0);
06506   SDValue N11 = N1.getOperand(1);
06507   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N10, N0);
06508 }
06509 SDNode *Select_ISD_XOR_i32(const SDValue &N) {
06510   {
06511     SDValue N0 = N.getOperand(0);
06512 
06513     // Pattern: (xor:i32 (and:i32 GPRC:i32:$rS, GPRC:i32:$rB), (imm:i32)<<P:Predicate_immAllOnes>>)
06514     // Emits: (NAND:i32 GPRC:i32:$rS, GPRC:i32:$rB)
06515     // Pattern complexity = 10  cost = 1  size = 0
06516     if (N0.getOpcode() == ISD::AND) {
06517       SDValue N00 = N0.getOperand(0);
06518       SDValue N01 = N0.getOperand(1);
06519       SDValue N1 = N.getOperand(1);
06520       if (N1.getOpcode() == ISD::Constant &&
06521           Predicate_immAllOnes(N1.getNode())) {
06522         SDNode *Result = Emit_87(N, PPC::NAND, MVT::i32);
06523         return Result;
06524       }
06525     }
06526 
06527     // Pattern: (xor:i32 (or:i32 GPRC:i32:$rS, GPRC:i32:$rB), (imm:i32)<<P:Predicate_immAllOnes>>)
06528     // Emits: (NOR:i32 GPRC:i32:$rS, GPRC:i32:$rB)
06529     // Pattern complexity = 10  cost = 1  size = 0
06530     if (N0.getOpcode() == ISD::OR) {
06531       SDValue N00 = N0.getOperand(0);
06532       SDValue N01 = N0.getOperand(1);
06533       SDValue N1 = N.getOperand(1);
06534       if (N1.getOpcode() == ISD::Constant &&
06535           Predicate_immAllOnes(N1.getNode())) {
06536         SDNode *Result = Emit_87(N, PPC::NOR, MVT::i32);
06537         return Result;
06538       }
06539     }
06540     if (N0.getOpcode() == ISD::XOR) {
06541       SDValue N00 = N0.getOperand(0);
06542       SDValue N01 = N0.getOperand(1);
06543 
06544       // Pattern: (xor:i32 (xor:i32 GPRC:i32:$rS, GPRC:i32:$rB), (imm:i32)<<P:Predicate_immAllOnes>>)
06545       // Emits: (EQV:i32 GPRC:i32:$rS, GPRC:i32:$rB)
06546       // Pattern complexity = 10  cost = 1  size = 0
06547       {
06548         SDValue N1 = N.getOperand(1);
06549         if (N1.getOpcode() == ISD::Constant &&
06550             Predicate_immAllOnes(N1.getNode())) {
06551           SDNode *Result = Emit_87(N, PPC::EQV, MVT::i32);
06552           return Result;
06553         }
06554       }
06555 
06556       // Pattern: (xor:i32 (xor:i32 GPRC:i32:$rS, (imm:i32)<<P:Predicate_immAllOnes>>), GPRC:i32:$rB)
06557       // Emits: (EQV:i32 GPRC:i32:$rS, GPRC:i32:$rB)
06558       // Pattern complexity = 10  cost = 1  size = 0
06559       if (N01.getOpcode() == ISD::Constant &&
06560           Predicate_immAllOnes(N01.getNode())) {
06561         SDNode *Result = Emit_89(N, PPC::EQV, MVT::i32);
06562         return Result;
06563       }
06564     }
06565     SDValue N1 = N.getOperand(1);
06566 
06567     // Pattern: (xor:i32 GPRC:i32:$rB, (xor:i32 GPRC:i32:$rS, (imm:i32)<<P:Predicate_immAllOnes>>))
06568     // Emits: (EQV:i32 GPRC:i32:$rS, GPRC:i32:$rB)
06569     // Pattern complexity = 10  cost = 1  size = 0
06570     if (N1.getOpcode() == ISD::XOR) {
06571       SDValue N10 = N1.getOperand(0);
06572       SDValue N11 = N1.getOperand(1);
06573       if (N11.getOpcode() == ISD::Constant &&
06574           Predicate_immAllOnes(N11.getNode())) {
06575         SDNode *Result = Emit_90(N, PPC::EQV, MVT::i32);
06576         return Result;
06577       }
06578     }
06579     if (N1.getOpcode() == ISD::Constant) {
06580 
06581       // Pattern: (xor:i32 GPRC:i32:$src1, (imm:i32)<<P:Predicate_immZExt16>><<X:LO16>>:$src2)
06582       // Emits: (XORI:i32 GPRC:i32:$src1, (LO16:i32 (imm:i32):$src2))
06583       // Pattern complexity = 7  cost = 1  size = 0
06584       if (Predicate_immZExt16(N1.getNode())) {
06585         SDNode *Result = Emit_12(N, PPC::XORI, MVT::i32);
06586         return Result;
06587       }
06588 
06589       // Pattern: (xor:i32 GPRC:i32:$src1, (imm:i32)<<P:Predicate_imm16ShiftedZExt>><<X:HI16>>:$src2)
06590       // Emits: (XORIS:i32 GPRC:i32:$src1, (HI16:i32 (imm:i32):$src2))
06591       // Pattern complexity = 7  cost = 1  size = 0
06592       if (Predicate_imm16ShiftedZExt(N1.getNode())) {
06593         SDNode *Result = Emit_1(N, PPC::XORIS, MVT::i32);
06594         return Result;
06595       }
06596 
06597       // Pattern: (xor:i32 GPRC:i32:$in, (imm:i32)<<P:Predicate_immAllOnes>>)
06598       // Emits: (NOR:i32 GPRC:i32:$in, GPRC:i32:$in)
06599       // Pattern complexity = 7  cost = 1  size = 0
06600       if (Predicate_immAllOnes(N1.getNode())) {
06601         SDNode *Result = Emit_88(N, PPC::NOR, MVT::i32);
06602         return Result;
06603       }
06604 
06605       // Pattern: (xor:i32 GPRC:i32:$in, (imm:i32):$imm)
06606       // Emits: (XORIS:i32 (XORI:i32 GPRC:i32:$in, (LO16:i32 (imm:i32):$imm)), (HI16:i32 (imm:i32):$imm))
06607       // Pattern complexity = 6  cost = 2  size = 0
06608       SDNode *Result = Emit_60(N, PPC::XORI, PPC::XORIS, MVT::i32, MVT::i32);
06609       return Result;
06610     }
06611   }
06612 
06613   // Pattern: (xor:i32 GPRC:i32:$rS, GPRC:i32:$rB)
06614   // Emits: (XOR:i32 GPRC:i32:$rS, GPRC:i32:$rB)
06615   // Pattern complexity = 3  cost = 1  size = 0
06616   SDNode *Result = Emit_3(N, PPC::XOR, MVT::i32);
06617   return Result;
06618 }
06619 
06620 SDNode *Select_ISD_XOR_i64(const SDValue &N) {
06621   {
06622     SDValue N0 = N.getOperand(0);
06623 
06624     // Pattern: (xor:i64 (and:i64 G8RC:i64:$rS, G8RC:i64:$rB), (imm:i64)<<P:Predicate_immAllOnes>>)
06625     // Emits: (NAND8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
06626     // Pattern complexity = 10  cost = 1  size = 0
06627     if (N0.getOpcode() == ISD::AND) {
06628       SDValue N00 = N0.getOperand(0);
06629       SDValue N01 = N0.getOperand(1);
06630       SDValue N1 = N.getOperand(1);
06631       if (N1.getOpcode() == ISD::Constant &&
06632           Predicate_immAllOnes(N1.getNode())) {
06633         SDNode *Result = Emit_87(N, PPC::NAND8, MVT::i64);
06634         return Result;
06635       }
06636     }
06637 
06638     // Pattern: (xor:i64 (or:i64 G8RC:i64:$rS, G8RC:i64:$rB), (imm:i64)<<P:Predicate_immAllOnes>>)
06639     // Emits: (NOR8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
06640     // Pattern complexity = 10  cost = 1  size = 0
06641     if (N0.getOpcode() == ISD::OR) {
06642       SDValue N00 = N0.getOperand(0);
06643       SDValue N01 = N0.getOperand(1);
06644       SDValue N1 = N.getOperand(1);
06645       if (N1.getOpcode() == ISD::Constant &&
06646           Predicate_immAllOnes(N1.getNode())) {
06647         SDNode *Result = Emit_87(N, PPC::NOR8, MVT::i64);
06648         return Result;
06649       }
06650     }
06651     if (N0.getOpcode() == ISD::XOR) {
06652       SDValue N00 = N0.getOperand(0);
06653       SDValue N01 = N0.getOperand(1);
06654 
06655       // Pattern: (xor:i64 (xor:i64 G8RC:i64:$rS, G8RC:i64:$rB), (imm:i64)<<P:Predicate_immAllOnes>>)
06656       // Emits: (EQV8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
06657       // Pattern complexity = 10  cost = 1  size = 0
06658       {
06659         SDValue N1 = N.getOperand(1);
06660         if (N1.getOpcode() == ISD::Constant &&
06661             Predicate_immAllOnes(N1.getNode())) {
06662           SDNode *Result = Emit_87(N, PPC::EQV8, MVT::i64);
06663           return Result;
06664         }
06665       }
06666 
06667       // Pattern: (xor:i64 (xor:i64 G8RC:i64:$rS, (imm:i64)<<P:Predicate_immAllOnes>>), G8RC:i64:$rB)
06668       // Emits: (EQV8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
06669       // Pattern complexity = 10  cost = 1  size = 0
06670       if (N01.getOpcode() == ISD::Constant &&
06671           Predicate_immAllOnes(N01.getNode())) {
06672         SDNode *Result = Emit_89(N, PPC::EQV8, MVT::i64);
06673         return Result;
06674       }
06675     }
06676     SDValue N1 = N.getOperand(1);
06677 
06678     // Pattern: (xor:i64 G8RC:i64:$rB, (xor:i64 G8RC:i64:$rS, (imm:i64)<<P:Predicate_immAllOnes>>))
06679     // Emits: (EQV8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
06680     // Pattern complexity = 10  cost = 1  size = 0
06681     if (N1.getOpcode() == ISD::XOR) {
06682       SDValue N10 = N1.getOperand(0);
06683       SDValue N11 = N1.getOperand(1);
06684       if (N11.getOpcode() == ISD::Constant &&
06685           Predicate_immAllOnes(N11.getNode())) {
06686         SDNode *Result = Emit_90(N, PPC::EQV8, MVT::i64);
06687         return Result;
06688       }
06689     }
06690     if (N1.getOpcode() == ISD::Constant) {
06691 
06692       // Pattern: (xor:i64 G8RC:i64:$src1, (imm:i64)<<P:Predicate_immZExt16>><<X:LO16>>:$src2)
06693       // Emits: (XORI8:i64 G8RC:i64:$src1, (LO16:i32 (imm:i64):$src2))
06694       // Pattern complexity = 7  cost = 1  size = 0
06695       if (Predicate_immZExt16(N1.getNode())) {
06696         SDNode *Result = Emit_14(N, PPC::XORI8, MVT::i64);
06697         return Result;
06698       }
06699 
06700       // Pattern: (xor:i64 G8RC:i64:$src1, (imm:i64)<<P:Predicate_imm16ShiftedZExt>><<X:HI16>>:$src2)
06701       // Emits: (XORIS8:i64 G8RC:i64:$src1, (HI16:i32 (imm:i64):$src2))
06702       // Pattern complexity = 7  cost = 1  size = 0
06703       if (Predicate_imm16ShiftedZExt(N1.getNode())) {
06704         SDNode *Result = Emit_7(N, PPC::XORIS8, MVT::i64);
06705         return Result;
06706       }
06707     }
06708   }
06709 
06710   // Pattern: (xor:i64 G8RC:i64:$rS, G8RC:i64:$rB)
06711   // Emits: (XOR8:i64 G8RC:i64:$rS, G8RC:i64:$rB)
06712   // Pattern complexity = 3  cost = 1  size = 0
06713   SDNode *Result = Emit_3(N, PPC::XOR8, MVT::i64);
06714   return Result;
06715 }
06716 
06717 SDNode *Emit_91(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06718   SDValue N0 = N.getOperand(0);
06719   SDValue N1 = N.getOperand(1);
06720   SDValue N10 = N1.getOperand(0);
06721   SDValue N11 = N1.getOperand(1);
06722   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N10, N11);
06723 }
06724 SDNode *Emit_92(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
06725   SDValue N0 = N.getOperand(0);
06726   SDValue N1 = N.getOperand(1);
06727   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N1, N1);
06728 }
06729 SDNode *Select_ISD_XOR_v4i32(const SDValue &N) {
06730   {
06731     SDValue N0 = N.getOperand(0);
06732     if (N0.getOpcode() == ISD::OR) {
06733       SDValue N00 = N0.getOperand(0);
06734       SDValue N01 = N0.getOperand(1);
06735       SDValue N1 = N.getOperand(1);
06736 
06737       // Pattern: (xor:v4i32 (or:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB), (build_vector:v4i32)<<P:Predicate_immAllOnesV>>)
06738       // Emits: (VNOR:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
06739       // Pattern complexity = 10  cost = 1  size = 0
06740       if (N1.getOpcode() == ISD::BUILD_VECTOR &&
06741           Predicate_immAllOnesV(N1.getNode())) {
06742         SDNode *Result = Emit_87(N, PPC::VNOR, MVT::v4i32);
06743         return Result;
06744       }
06745 
06746       // Pattern: (xor:v4i32 (or:v4i32 VRRC:v4i32:$A, VRRC:v4i32:$B), (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>)
06747       // Emits: (VNOR:v4i32 VRRC:v16i8:$A, VRRC:v16i8:$B)
06748       // Pattern complexity = 10  cost = 1  size = 0
06749       if (N1.getOpcode() == ISD::BIT_CONVERT &&
06750           Predicate_immAllOnesV_bc(N1.getNode())) {
06751         SDNode *Result = Emit_87(N, PPC::VNOR, MVT::v4i32);
06752         return Result;
06753       }
06754     }
06755 
06756     // Pattern: (xor:v4i32 (build_vector:v4i32)<<P:Predicate_immAllOnesV>>, (or:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB))
06757     // Emits: (VNOR:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
06758     // Pattern complexity = 10  cost = 1  size = 0
06759     if (N0.getOpcode() == ISD::BUILD_VECTOR &&
06760         Predicate_immAllOnesV(N0.getNode())) {
06761       SDValue N1 = N.getOperand(1);
06762       if (N1.getOpcode() == ISD::OR) {
06763         SDNode *Result = Emit_91(N, PPC::VNOR, MVT::v4i32);
06764         return Result;
06765       }
06766     }
06767 
06768     // Pattern: (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, (or:v4i32 VRRC:v4i32:$A, VRRC:v4i32:$B))
06769     // Emits: (VNOR:v4i32 VRRC:v16i8:$A, VRRC:v16i8:$B)
06770     // Pattern complexity = 10  cost = 1  size = 0
06771     if (N0.getOpcode() == ISD::BIT_CONVERT &&
06772         Predicate_immAllOnesV_bc(N0.getNode())) {
06773       SDValue N1 = N.getOperand(1);
06774       if (N1.getOpcode() == ISD::OR) {
06775         SDNode *Result = Emit_91(N, PPC::VNOR, MVT::v4i32);
06776         return Result;
06777       }
06778     }
06779     {
06780       SDValue N1 = N.getOperand(1);
06781 
06782       // Pattern: (xor:v4i32 VRRC:v4i32:$vA, (build_vector:v4i32)<<P:Predicate_immAllOnesV>>)
06783       // Emits: (VNOR:v4i32 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06784       // Pattern complexity = 7  cost = 1  size = 0
06785       if (N1.getOpcode() == ISD::BUILD_VECTOR &&
06786           Predicate_immAllOnesV(N1.getNode())) {
06787         SDNode *Result = Emit_88(N, PPC::VNOR, MVT::v4i32);
06788         return Result;
06789       }
06790 
06791       // Pattern: (xor:v4i32 VRRC:v4i32:$vA, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>)
06792       // Emits: (VNOR:v4i32 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06793       // Pattern complexity = 7  cost = 1  size = 0
06794       if (N1.getOpcode() == ISD::BIT_CONVERT &&
06795           Predicate_immAllOnesV_bc(N1.getNode())) {
06796         SDNode *Result = Emit_88(N, PPC::VNOR, MVT::v4i32);
06797         return Result;
06798       }
06799     }
06800 
06801     // Pattern: (xor:v4i32 (build_vector:v4i32)<<P:Predicate_immAllOnesV>>, VRRC:v4i32:$vA)
06802     // Emits: (VNOR:v4i32 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06803     // Pattern complexity = 7  cost = 1  size = 0
06804     if (N0.getOpcode() == ISD::BUILD_VECTOR &&
06805         Predicate_immAllOnesV(N0.getNode())) {
06806       SDNode *Result = Emit_92(N, PPC::VNOR, MVT::v4i32);
06807       return Result;
06808     }
06809 
06810     // Pattern: (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, VRRC:v4i32:$vA)
06811     // Emits: (VNOR:v4i32 VRRC:v16i8:$vA, VRRC:v16i8:$vA)
06812     // Pattern complexity = 7  cost = 1  size = 0
06813     if (N0.getOpcode() == ISD::BIT_CONVERT &&
06814         Predicate_immAllOnesV_bc(N0.getNode())) {
06815       SDNode *Result = Emit_92(N, PPC::VNOR, MVT::v4i32);
06816       return Result;
06817     }
06818   }
06819 
06820   // Pattern: (xor:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
06821   // Emits: (VXOR:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
06822   // Pattern complexity = 3  cost = 1  size = 0
06823   SDNode *Result = Emit_3(N, PPC::VXOR, MVT::v4i32);
06824   return Result;
06825 }
06826 
06827 SDNode *Emit_93(const SDValue &N, unsigned Opc0, unsigned Opc1, MVT VT0, MVT VT1) DISABLE_INLINE {
06828   SDValue N0 = N.getOperand(0);
06829   SDValue Tmp2(CurDAG->getTargetNode(Opc0, N.getDebugLoc(), VT0, N0, N0), 0);
06830   SDValue Tmp3 = CurDAG->getTargetConstant(0x0ULL, MVT::i32);
06831   SDValue Tmp4 = CurDAG->getTargetConstant(0x20ULL, MVT::i32);
06832   return CurDAG->SelectNodeTo(N.getNode(), Opc1, VT1, Tmp2, Tmp3, Tmp4);
06833 }
06834 SDNode *Select_ISD_ZERO_EXTEND_i64(const SDValue &N) {
06835   SDValue N0 = N.getOperand(0);
06836   if (N0.getNode()->getValueType(0) == MVT::i32) {
06837     SDNode *Result = Emit_93(N, PPC::OR4To8, PPC::RLDICL, MVT::i64, MVT::i64);
06838     return Result;
06839   }
06840 
06841   CannotYetSelect(N);
06842   return NULL;
06843 }
06844 
06845 SDNode *Emit_94(const SDValue &N, unsigned Opc0, unsigned NumInputRootOps) DISABLE_INLINE {
06846   SDValue Chain = N.getOperand(0);
06847   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
06848   SmallVector<SDValue, 8> Ops0;
06849   SDValue InFlag(0, 0);
06850   if (HasInFlag) {
06851     InFlag = N.getOperand(N.getNumOperands()-1);
06852   }
06853   for (unsigned i = NumInputRootOps + 1, e = N.getNumOperands()-(HasInFlag?1:0); i != e; ++i) {
06854     Ops0.push_back(N.getOperand(i));
06855   }
06856   Ops0.push_back(Chain);
06857   if (HasInFlag)
06858     Ops0.push_back(InFlag);
06859   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, MVT::Flag, &Ops0[0], Ops0.size());
06860   Chain = SDValue(ResNode, 0);
06861   InFlag = SDValue(ResNode, 1);
06862   const SDValue Froms[] = {
06863     SDValue(N.getNode(), 1),
06864     SDValue(N.getNode(), 0)
06865   };
06866   const SDValue Tos[] = {
06867     InFlag,
06868     SDValue(Chain.getNode(), Chain.getResNo())
06869   };
06870   ReplaceUses(Froms, Tos, 2);
06871   return ResNode;
06872 }
06873 SDNode *Select_PPCISD_BCTRL_ELF(const SDValue &N) {
06874 
06875   // Pattern: (PPCbctrl_ELF:isVoid)
06876   // Emits: (BCTRL_ELF:isVoid)
06877   // Pattern complexity = 3  cost = 1  size = 0
06878   if ((!PPCSubTarget.isPPC64())) {
06879     SDNode *Result = Emit_94(N, PPC::BCTRL_ELF, 0);
06880     return Result;
06881   }
06882 
06883   // Pattern: (PPCbctrl_ELF:isVoid)
06884   // Emits: (BCTRL8_ELF:isVoid)
06885   // Pattern complexity = 3  cost = 1  size = 0
06886   if ((PPCSubTarget.isPPC64())) {
06887     SDNode *Result = Emit_94(N, PPC::BCTRL8_ELF, 0);
06888     return Result;
06889   }
06890 
06891   CannotYetSelect(N);
06892   return NULL;
06893 }
06894 
06895 SDNode *Select_PPCISD_BCTRL_Macho(const SDValue &N) {
06896 
06897   // Pattern: (PPCbctrl_Macho:isVoid)
06898   // Emits: (BCTRL_Macho:isVoid)
06899   // Pattern complexity = 3  cost = 1  size = 0
06900   if ((!PPCSubTarget.isPPC64())) {
06901     SDNode *Result = Emit_94(N, PPC::BCTRL_Macho, 0);
06902     return Result;
06903   }
06904 
06905   // Pattern: (PPCbctrl_Macho:isVoid)
06906   // Emits: (BCTRL8_Macho:isVoid)
06907   // Pattern complexity = 3  cost = 1  size = 0
06908   if ((PPCSubTarget.isPPC64())) {
06909     SDNode *Result = Emit_94(N, PPC::BCTRL8_Macho, 0);
06910     return Result;
06911   }
06912 
06913   CannotYetSelect(N);
06914   return NULL;
06915 }
06916 
06917 SDNode *Emit_95(const SDValue &N, unsigned Opc0, unsigned NumInputRootOps) DISABLE_INLINE {
06918   SDValue Chain = N.getOperand(0);
06919   SDValue N1 = N.getOperand(1);
06920   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
06921   SmallVector<SDValue, 8> Ops0;
06922   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
06923   SDValue InFlag(0, 0);
06924   if (HasInFlag) {
06925     InFlag = N.getOperand(N.getNumOperands()-1);
06926   }
06927   Ops0.push_back(Tmp0);
06928   for (unsigned i = NumInputRootOps + 1, e = N.getNumOperands()-(HasInFlag?1:0); i != e; ++i) {
06929     Ops0.push_back(N.getOperand(i));
06930   }
06931   Ops0.push_back(Chain);
06932   if (HasInFlag)
06933     Ops0.push_back(InFlag);
06934   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, MVT::Flag, &Ops0[0], Ops0.size());
06935   Chain = SDValue(ResNode, 0);
06936   InFlag = SDValue(ResNode, 1);
06937   const SDValue Froms[] = {
06938     SDValue(N.getNode(), 1),
06939     SDValue(N.getNode(), 0)
06940   };
06941   const SDValue Tos[] = {
06942     InFlag,
06943     SDValue(Chain.getNode(), Chain.getResNo())
06944   };
06945   ReplaceUses(Froms, Tos, 2);
06946   return ResNode;
06947 }
06948 SDNode *Emit_96(const SDValue &N, unsigned Opc0, unsigned NumInputRootOps) DISABLE_INLINE {
06949   SDValue Chain = N.getOperand(0);
06950   SDValue N1 = N.getOperand(1);
06951   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
06952   SmallVector<SDValue, 8> Ops0;
06953   SDValue Tmp0 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i64);
06954   SDValue InFlag(0, 0);
06955   if (HasInFlag) {
06956     InFlag = N.getOperand(N.getNumOperands()-1);
06957   }
06958   Ops0.push_back(Tmp0);
06959   for (unsigned i = NumInputRootOps + 1, e = N.getNumOperands()-(HasInFlag?1:0); i != e; ++i) {
06960     Ops0.push_back(N.getOperand(i));
06961   }
06962   Ops0.push_back(Chain);
06963   if (HasInFlag)
06964     Ops0.push_back(InFlag);
06965   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, MVT::Flag, &Ops0[0], Ops0.size());
06966   Chain = SDValue(ResNode, 0);
06967   InFlag = SDValue(ResNode, 1);
06968   const SDValue Froms[] = {
06969     SDValue(N.getNode(), 1),
06970     SDValue(N.getNode(), 0)
06971   };
06972   const SDValue Tos[] = {
06973     InFlag,
06974     SDValue(Chain.getNode(), Chain.getResNo())
06975   };
06976   ReplaceUses(Froms, Tos, 2);
06977   return ResNode;
06978 }
06979 SDNode *Emit_97(const SDValue &N, unsigned Opc0, unsigned NumInputRootOps) DISABLE_INLINE {
06980   SDValue Chain = N.getOperand(0);
06981   SDValue N1 = N.getOperand(1);
06982   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
06983   SmallVector<SDValue, 8> Ops0;
06984   SDValue InFlag(0, 0);
06985   if (HasInFlag) {
06986     InFlag = N.getOperand(N.getNumOperands()-1);
06987   }
06988   Ops0.push_back(N1);
06989   for (unsigned i = NumInputRootOps + 1, e = N.getNumOperands()-(HasInFlag?1:0); i != e; ++i) {
06990     Ops0.push_back(N.getOperand(i));
06991   }
06992   Ops0.push_back(Chain);
06993   if (HasInFlag)
06994     Ops0.push_back(InFlag);
06995   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, MVT::Flag, &Ops0[0], Ops0.size());
06996   Chain = SDValue(ResNode, 0);
06997   InFlag = SDValue(ResNode, 1);
06998   const SDValue Froms[] = {
06999     SDValue(N.getNode(), 1),
07000     SDValue(N.getNode(), 0)
07001   };
07002   const SDValue Tos[] = {
07003     InFlag,
07004     SDValue(Chain.getNode(), Chain.getResNo())
07005   };
07006   ReplaceUses(Froms, Tos, 2);
07007   return ResNode;
07008 }
07009 SDNode *Select_PPCISD_CALL_ELF(const SDValue &N) {
07010   SDValue Chain = N.getOperand(0);
07011   SDValue N1 = N.getOperand(1);
07012   if (N1.getOpcode() == ISD::Constant) {
07013 
07014     // Pattern: (PPCcall_ELF:isVoid (imm:i32):$func)
07015     // Emits: (BLA_ELF:isVoid (imm:i32):$func)
07016     // Pattern complexity = 6  cost = 1  size = 0
07017     if (N1.getNode()->getValueType(0) == MVT::i32) {
07018       SDNode *Result = Emit_95(N, PPC::BLA_ELF, 1);
07019       return Result;
07020     }
07021 
07022     // Pattern: (PPCcall_ELF:isVoid (imm:i64):$func)
07023     // Emits: (BLA8_ELF:isVoid (imm:i64):$func)
07024     // Pattern complexity = 6  cost = 1  size = 0
07025     if (N1.getNode()->getValueType(0) == MVT::i64) {
07026       SDNode *Result = Emit_96(N, PPC::BLA8_ELF, 1);
07027       return Result;
07028     }
07029   }
07030 
07031   // Pattern: (PPCcall_ELF:isVoid (tglobaladdr:i32):$dst)
07032   // Emits: (BL_ELF:isVoid (tglobaladdr:iPTR):$dst)
07033   // Pattern complexity = 6  cost = 1  size = 0
07034   if (N1.getOpcode() == ISD::TargetGlobalAddress &&
07035       N1.getNode()->getValueType(0) == MVT::i32) {
07036     SDNode *Result = Emit_97(N, PPC::BL_ELF, 1);
07037     return Result;
07038   }
07039 
07040   // Pattern: (PPCcall_ELF:isVoid (texternalsym:i32):$dst)
07041   // Emits: (BL_ELF:isVoid (texternalsym:iPTR):$dst)
07042   // Pattern complexity = 6  cost = 1  size = 0
07043   if (N1.getOpcode() == ISD::TargetExternalSymbol &&
07044       N1.getNode()->getValueType(0) == MVT::i32) {
07045     SDNode *Result = Emit_97(N, PPC::BL_ELF, 1);
07046     return Result;
07047   }
07048 
07049   // Pattern: (PPCcall_ELF:isVoid (tglobaladdr:i64):$dst)
07050   // Emits: (BL8_ELF:isVoid (tglobaladdr:iPTR):$dst)
07051   // Pattern complexity = 6  cost = 1  size = 0
07052   if (N1.getOpcode() == ISD::TargetGlobalAddress &&
07053       N1.getNode()->getValueType(0) == MVT::i64) {
07054     SDNode *Result = Emit_97(N, PPC::BL8_ELF, 1);
07055     return Result;
07056   }
07057 
07058   // Pattern: (PPCcall_ELF:isVoid (texternalsym:i64):$dst)
07059   // Emits: (BL8_ELF:isVoid (texternalsym:iPTR):$dst)
07060   // Pattern complexity = 6  cost = 1  size = 0
07061   if (N1.getOpcode() == ISD::TargetExternalSymbol &&
07062       N1.getNode()->getValueType(0) == MVT::i64) {
07063     SDNode *Result = Emit_97(N, PPC::BL8_ELF, 1);
07064     return Result;
07065   }
07066 
07067   CannotYetSelect(N);
07068   return NULL;
07069 }
07070 
07071 SDNode *Select_PPCISD_CALL_Macho(const SDValue &N) {
07072   SDValue Chain = N.getOperand(0);
07073   SDValue N1 = N.getOperand(1);
07074   if (N1.getOpcode() == ISD::Constant) {
07075 
07076     // Pattern: (PPCcall_Macho:isVoid (imm:i32):$func)
07077     // Emits: (BLA_Macho:isVoid (imm:i32):$func)
07078     // Pattern complexity = 6  cost = 1  size = 0
07079     if (N1.getNode()->getValueType(0) == MVT::i32) {
07080       SDNode *Result = Emit_95(N, PPC::BLA_Macho, 1);
07081       return Result;
07082     }
07083 
07084     // Pattern: (PPCcall_Macho:isVoid (imm:i64):$func)
07085     // Emits: (BLA8_Macho:isVoid (imm:i64):$func)
07086     // Pattern complexity = 6  cost = 1  size = 0
07087     if (N1.getNode()->getValueType(0) == MVT::i64) {
07088       SDNode *Result = Emit_96(N, PPC::BLA8_Macho, 1);
07089       return Result;
07090     }
07091   }
07092 
07093   // Pattern: (PPCcall_Macho:isVoid (tglobaladdr:i32):$dst)
07094   // Emits: (BL_Macho:isVoid (tglobaladdr:iPTR):$dst)
07095   // Pattern complexity = 6  cost = 1  size = 0
07096   if (N1.getOpcode() == ISD::TargetGlobalAddress &&
07097       N1.getNode()->getValueType(0) == MVT::i32) {
07098     SDNode *Result = Emit_97(N, PPC::BL_Macho, 1);
07099     return Result;
07100   }
07101 
07102   // Pattern: (PPCcall_Macho:isVoid (texternalsym:i32):$dst)
07103   // Emits: (BL_Macho:isVoid (texternalsym:iPTR):$dst)
07104   // Pattern complexity = 6  cost = 1  size = 0
07105   if (N1.getOpcode() == ISD::TargetExternalSymbol &&
07106       N1.getNode()->getValueType(0) == MVT::i32) {
07107     SDNode *Result = Emit_97(N, PPC::BL_Macho, 1);
07108     return Result;
07109   }
07110 
07111   // Pattern: (PPCcall_Macho:isVoid (tglobaladdr:i64):$dst)
07112   // Emits: (BL8_Macho:isVoid (tglobaladdr:iPTR):$dst)
07113   // Pattern complexity = 6  cost = 1  size = 0
07114   if (N1.getOpcode() == ISD::TargetGlobalAddress &&
07115       N1.getNode()->getValueType(0) == MVT::i64) {
07116     SDNode *Result = Emit_97(N, PPC::BL8_Macho, 1);
07117     return Result;
07118   }
07119 
07120   // Pattern: (PPCcall_Macho:isVoid (texternalsym:i64):$dst)
07121   // Emits: (BL8_Macho:isVoid (texternalsym:iPTR):$dst)
07122   // Pattern complexity = 6  cost = 1  size = 0
07123   if (N1.getOpcode() == ISD::TargetExternalSymbol &&
07124       N1.getNode()->getValueType(0) == MVT::i64) {
07125     SDNode *Result = Emit_97(N, PPC::BL8_Macho, 1);
07126     return Result;
07127   }
07128 
07129   CannotYetSelect(N);
07130   return NULL;
07131 }
07132 
07133 SDNode *Emit_98(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1) DISABLE_INLINE {
07134   SDValue Chain = N.getOperand(0);
07135   SDValue N1 = N.getOperand(1);
07136   SDValue N2 = N.getOperand(2);
07137   SDValue Ops0[] = { N1, CPTmpN2_0, CPTmpN2_1, Chain };
07138   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, Ops0, 4);
07139 }
07140 SDNode *Select_PPCISD_DYNALLOC_i32(const SDValue &N) {
07141   SDValue Chain = N.getOperand(0);
07142   SDValue N1 = N.getOperand(1);
07143   SDValue N2 = N.getOperand(2);
07144   SDValue CPTmpN2_0;
07145   SDValue CPTmpN2_1;
07146   if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1) &&
07147       N1.getNode()->getValueType(0) == MVT::i32 &&
07148       N2.getNode()->getValueType(0) == TLI.getPointerTy()) {
07149     SDNode *Result = Emit_98(N, PPC::DYNALLOC, MVT::i32, CPTmpN2_0, CPTmpN2_1);
07150     return Result;
07151   }
07152 
07153   CannotYetSelect(N);
07154   return NULL;
07155 }
07156 
07157 SDNode *Select_PPCISD_DYNALLOC_i64(const SDValue &N) {
07158   SDValue Chain = N.getOperand(0);
07159   SDValue N1 = N.getOperand(1);
07160   SDValue N2 = N.getOperand(2);
07161   SDValue CPTmpN2_0;
07162   SDValue CPTmpN2_1;
07163   if (SelectAddrImm(N, N2, CPTmpN2_0, CPTmpN2_1) &&
07164       N1.getNode()->getValueType(0) == MVT::i64 &&
07165       N2.getNode()->getValueType(0) == TLI.getPointerTy()) {
07166     SDNode *Result = Emit_98(N, PPC::DYNALLOC8, MVT::i64, CPTmpN2_0, CPTmpN2_1);
07167     return Result;
07168   }
07169 
07170   CannotYetSelect(N);
07171   return NULL;
07172 }
07173 
07174 SDNode *Select_PPCISD_EXTSW_32_i32(const SDValue &N) {
07175   SDNode *Result = Emit_28(N, PPC::EXTSW_32, MVT::i32);
07176   return Result;
07177 }
07178 
07179 SDNode *Select_PPCISD_FADDRTZ_f64(const SDValue &N) {
07180   SDNode *Result = Emit_10(N, PPC::FADDrtz, MVT::f64);
07181   return Result;
07182 }
07183 
07184 SDNode *Select_PPCISD_FCFID_f64(const SDValue &N) {
07185   SDNode *Result = Emit_28(N, PPC::FCFID, MVT::f64);
07186   return Result;
07187 }
07188 
07189 SDNode *Select_PPCISD_FCTIDZ_f64(const SDValue &N) {
07190   SDNode *Result = Emit_28(N, PPC::FCTIDZ, MVT::f64);
07191   return Result;
07192 }
07193 
07194 SDNode *Select_PPCISD_FCTIWZ_f64(const SDValue &N) {
07195   SDNode *Result = Emit_28(N, PPC::FCTIWZ, MVT::f64);
07196   return Result;
07197 }
07198 
07199 SDNode *Emit_99(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
07200   SDValue N0 = N.getOperand(0);
07201   SDValue N1 = N.getOperand(1);
07202   SDValue N2 = N.getOperand(2);
07203   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, N0, N1, N2);
07204 }
07205 SDNode *Select_PPCISD_FSEL_f32(const SDValue &N) {
07206   SDNode *Result = Emit_99(N, PPC::FSELS, MVT::f32);
07207   return Result;
07208 }
07209 
07210 SDNode *Select_PPCISD_FSEL_f64(const SDValue &N) {
07211   SDNode *Result = Emit_99(N, PPC::FSELD, MVT::f64);
07212   return Result;
07213 }
07214 
07215 SDNode *Select_PPCISD_Hi_i32(const SDValue &N) {
07216   SDValue N0 = N.getOperand(0);
07217 
07218   // Pattern: (PPChi:i32 (tglobaladdr:i32):$in, 0:i32)
07219   // Emits: (LIS:i32 (tglobaladdr:i32):$in)
07220   // Pattern complexity = 11  cost = 1  size = 0
07221   if (N0.getOpcode() == ISD::TargetGlobalAddress) {
07222     SDValue N1 = N.getOperand(1);
07223     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07224     if (Tmp0) {
07225       int64_t CN1 = Tmp0->getSExtValue();
07226       if (CN1 == INT64_C(0)) {
07227         SDNode *Result = Emit_67(N, PPC::LIS, MVT::i32);
07228         return Result;
07229       }
07230     }
07231   }
07232 
07233   // Pattern: (PPChi:i32 (tconstpool:i32):$in, 0:i32)
07234   // Emits: (LIS:i32 (tconstpool:i32):$in)
07235   // Pattern complexity = 11  cost = 1  size = 0
07236   if (N0.getOpcode() == ISD::TargetConstantPool) {
07237     SDValue N1 = N.getOperand(1);
07238     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07239     if (Tmp0) {
07240       int64_t CN1 = Tmp0->getSExtValue();
07241       if (CN1 == INT64_C(0)) {
07242         SDNode *Result = Emit_67(N, PPC::LIS, MVT::i32);
07243         return Result;
07244       }
07245     }
07246   }
07247 
07248   // Pattern: (PPChi:i32 (tjumptable:i32):$in, 0:i32)
07249   // Emits: (LIS:i32 (tjumptable:i32):$in)
07250   // Pattern complexity = 11  cost = 1  size = 0
07251   if (N0.getOpcode() == ISD::TargetJumpTable) {
07252     SDValue N1 = N.getOperand(1);
07253     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07254     if (Tmp0) {
07255       int64_t CN1 = Tmp0->getSExtValue();
07256       if (CN1 == INT64_C(0)) {
07257         SDNode *Result = Emit_67(N, PPC::LIS, MVT::i32);
07258         return Result;
07259       }
07260     }
07261   }
07262 
07263   CannotYetSelect(N);
07264   return NULL;
07265 }
07266 
07267 SDNode *Select_PPCISD_Hi_i64(const SDValue &N) {
07268   SDValue N0 = N.getOperand(0);
07269 
07270   // Pattern: (PPChi:i64 (tglobaladdr:i64):$in, 0:i64)
07271   // Emits: (LIS8:i64 (tglobaladdr:i64):$in)
07272   // Pattern complexity = 11  cost = 1  size = 0
07273   if (N0.getOpcode() == ISD::TargetGlobalAddress) {
07274     SDValue N1 = N.getOperand(1);
07275     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07276     if (Tmp0) {
07277       int64_t CN1 = Tmp0->getSExtValue();
07278       if (CN1 == INT64_C(0)) {
07279         SDNode *Result = Emit_67(N, PPC::LIS8, MVT::i64);
07280         return Result;
07281       }
07282     }
07283   }
07284 
07285   // Pattern: (PPChi:i64 (tconstpool:i64):$in, 0:i64)
07286   // Emits: (LIS8:i64 (tconstpool:i64):$in)
07287   // Pattern complexity = 11  cost = 1  size = 0
07288   if (N0.getOpcode() == ISD::TargetConstantPool) {
07289     SDValue N1 = N.getOperand(1);
07290     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07291     if (Tmp0) {
07292       int64_t CN1 = Tmp0->getSExtValue();
07293       if (CN1 == INT64_C(0)) {
07294         SDNode *Result = Emit_67(N, PPC::LIS8, MVT::i64);
07295         return Result;
07296       }
07297     }
07298   }
07299 
07300   // Pattern: (PPChi:i64 (tjumptable:i64):$in, 0:i64)
07301   // Emits: (LIS8:i64 (tjumptable:i64):$in)
07302   // Pattern complexity = 11  cost = 1  size = 0
07303   if (N0.getOpcode() == ISD::TargetJumpTable) {
07304     SDValue N1 = N.getOperand(1);
07305     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07306     if (Tmp0) {
07307       int64_t CN1 = Tmp0->getSExtValue();
07308       if (CN1 == INT64_C(0)) {
07309         SDNode *Result = Emit_67(N, PPC::LIS8, MVT::i64);
07310         return Result;
07311       }
07312     }
07313   }
07314 
07315   CannotYetSelect(N);
07316   return NULL;
07317 }
07318 
07319 SDNode *Emit_100(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) DISABLE_INLINE {
07320   SDValue Chain = N.getOperand(0);
07321   SDValue N1 = N.getOperand(1);
07322   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, CPTmpN1_0, CPTmpN1_1, Chain);
07323 }
07324 SDNode *Select_PPCISD_LARX_i32(const SDValue &N) {
07325   SDValue Chain = N.getOperand(0);
07326   SDValue N1 = N.getOperand(1);
07327   SDValue CPTmpN1_0;
07328   SDValue CPTmpN1_1;
07329   if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
07330     SDNode *Result = Emit_100(N, PPC::LWARX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
07331     return Result;
07332   }
07333 
07334   CannotYetSelect(N);
07335   return NULL;
07336 }
07337 
07338 SDNode *Select_PPCISD_LARX_i64(const SDValue &N) {
07339   SDValue Chain = N.getOperand(0);
07340   SDValue N1 = N.getOperand(1);
07341   SDValue CPTmpN1_0;
07342   SDValue CPTmpN1_1;
07343   if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
07344     SDNode *Result = Emit_100(N, PPC::LDARX, MVT::i64, CPTmpN1_0, CPTmpN1_1);
07345     return Result;
07346   }
07347 
07348   CannotYetSelect(N);
07349   return NULL;
07350 }
07351 
07352 SDNode *Emit_101(const SDValue &N, unsigned Opc0, MVT VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) DISABLE_INLINE {
07353   SDValue Chain = N.getOperand(0);
07354   SDValue N1 = N.getOperand(1);
07355   SDValue N2 = N.getOperand(2);
07356   SDValue N3 = N.getOperand(3);
07357   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Other, CPTmpN1_0, CPTmpN1_1, Chain);
07358 }
07359 SDNode *Select_PPCISD_LBRX_i32(const SDValue &N) {
07360   SDValue Chain = N.getOperand(0);
07361   SDValue N1 = N.getOperand(1);
07362   SDValue CPTmpN1_0;
07363   SDValue CPTmpN1_1;
07364   if (SelectAddrIdxOnly(N, N1, CPTmpN1_0, CPTmpN1_1)) {
07365     SDValue N2 = N.getOperand(2);
07366     SDValue N3 = N.getOperand(3);
07367 
07368     // Pattern: (PPClbrx:i32 xoaddr:iPTR:$src, srcvalue:Other:$sv, i16:Other)
07369     // Emits: (LHBRX:i32 xoaddr:iPTR:$src)
07370     // Pattern complexity = 12  cost = 1  size = 0
07371     if (cast<VTSDNode>(N3)->getVT() == MVT::i16) {
07372       SDNode *Result = Emit_101(N, PPC::LHBRX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
07373       return Result;
07374     }
07375 
07376     // Pattern: (PPClbrx:i32 xoaddr:iPTR:$src, srcvalue:Other:$sv, i32:Other)
07377     // Emits: (LWBRX:i32 xoaddr:iPTR:$src)
07378     // Pattern complexity = 12  cost = 1  size = 0
07379     if (cast<VTSDNode>(N3)->getVT() == MVT::i32) {
07380       SDNode *Result = Emit_101(N, PPC::LWBRX, MVT::i32, CPTmpN1_0, CPTmpN1_1);
07381       return Result;
07382     }
07383   }
07384 
07385   CannotYetSelect(N);
07386   return NULL;
07387 }
07388 
07389 SDNode *Select_PPCISD_Lo_i32(const SDValue &N) {
07390   SDValue N0 = N.getOperand(0);
07391 
07392   // Pattern: (PPClo:i32 (tglobaladdr:i32):$in, 0:i32)
07393   // Emits: (LI:i32 (tglobaladdr:i32):$in)
07394   // Pattern complexity = 11  cost = 1  size = 0
07395   if (N0.getOpcode() == ISD::TargetGlobalAddress) {
07396     SDValue N1 = N.getOperand(1);
07397     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07398     if (Tmp0) {
07399       int64_t CN1 = Tmp0->getSExtValue();
07400       if (CN1 == INT64_C(0)) {
07401         SDNode *Result = Emit_67(N, PPC::LI, MVT::i32);
07402         return Result;
07403       }
07404     }
07405   }
07406 
07407   // Pattern: (PPClo:i32 (tconstpool:i32):$in, 0:i32)
07408   // Emits: (LI:i32 (tconstpool:i32):$in)
07409   // Pattern complexity = 11  cost = 1  size = 0
07410   if (N0.getOpcode() == ISD::TargetConstantPool) {
07411     SDValue N1 = N.getOperand(1);
07412     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07413     if (Tmp0) {
07414       int64_t CN1 = Tmp0->getSExtValue();
07415       if (CN1 == INT64_C(0)) {
07416         SDNode *Result = Emit_67(N, PPC::LI, MVT::i32);
07417         return Result;
07418       }
07419     }
07420   }
07421 
07422   // Pattern: (PPClo:i32 (tjumptable:i32):$in, 0:i32)
07423   // Emits: (LI:i32 (tjumptable:i32):$in)
07424   // Pattern complexity = 11  cost = 1  size = 0
07425   if (N0.getOpcode() == ISD::TargetJumpTable) {
07426     SDValue N1 = N.getOperand(1);
07427     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07428     if (Tmp0) {
07429       int64_t CN1 = Tmp0->getSExtValue();
07430       if (CN1 == INT64_C(0)) {
07431         SDNode *Result = Emit_67(N, PPC::LI, MVT::i32);
07432         return Result;
07433       }
07434     }
07435   }
07436 
07437   CannotYetSelect(N);
07438   return NULL;
07439 }
07440 
07441 SDNode *Select_PPCISD_Lo_i64(const SDValue &N) {
07442   SDValue N0 = N.getOperand(0);
07443 
07444   // Pattern: (PPClo:i64 (tglobaladdr:i64):$in, 0:i64)
07445   // Emits: (LI8:i64 (tglobaladdr:i64):$in)
07446   // Pattern complexity = 11  cost = 1  size = 0
07447   if (N0.getOpcode() == ISD::TargetGlobalAddress) {
07448     SDValue N1 = N.getOperand(1);
07449     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07450     if (Tmp0) {
07451       int64_t CN1 = Tmp0->getSExtValue();
07452       if (CN1 == INT64_C(0)) {
07453         SDNode *Result = Emit_67(N, PPC::LI8, MVT::i64);
07454         return Result;
07455       }
07456     }
07457   }
07458 
07459   // Pattern: (PPClo:i64 (tconstpool:i64):$in, 0:i64)
07460   // Emits: (LI8:i64 (tconstpool:i64):$in)
07461   // Pattern complexity = 11  cost = 1  size = 0
07462   if (N0.getOpcode() == ISD::TargetConstantPool) {
07463     SDValue N1 = N.getOperand(1);
07464     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07465     if (Tmp0) {
07466       int64_t CN1 = Tmp0->getSExtValue();
07467       if (CN1 == INT64_C(0)) {
07468         SDNode *Result = Emit_67(N, PPC::LI8, MVT::i64);
07469         return Result;
07470       }
07471     }
07472   }
07473 
07474   // Pattern: (PPClo:i64 (tjumptable:i64):$in, 0:i64)
07475   // Emits: (LI8:i64 (tjumptable:i64):$in)
07476   // Pattern complexity = 11  cost = 1  size = 0
07477   if (N0.getOpcode() == ISD::TargetJumpTable) {
07478     SDValue N1 = N.getOperand(1);
07479     ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1);
07480     if (Tmp0) {
07481       int64_t CN1 = Tmp0->getSExtValue();
07482       if (CN1 == INT64_C(0)) {
07483         SDNode *Result = Emit_67(N, PPC::LI8, MVT::i64);
07484         return Result;
07485       }
07486     }
07487   }
07488 
07489   CannotYetSelect(N);
07490   return NULL;
07491 }
07492 
07493 SDNode *Emit_102(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
07494   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag);
07495   SDValue InFlag(ResNode, 1);
07496   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
07497   return ResNode;
07498 }
07499 SDNode *Select_PPCISD_MFFS_f64(const SDValue &N) {
07500   SDNode *Result = Emit_102(N, PPC::MFFS, MVT::f64);
07501   return Result;
07502 }
07503 
07504 SDNode *Emit_103(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
07505   SDValue Chain = N.getOperand(0);
07506   SDValue N1 = N.getOperand(1);
07507   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
07508   SDValue InFlag(0, 0);
07509   if (HasInFlag) {
07510     InFlag = N.getOperand(N.getNumOperands()-1);
07511   }
07512   SDValue Ops0[] = { N1, Chain, InFlag };
07513   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, MVT::Flag, Ops0, HasInFlag ? 3 : 2);
07514   Chain = SDValue(ResNode, 0);
07515   InFlag = SDValue(ResNode, 1);
07516   const SDValue Froms[] = {
07517     SDValue(N.getNode(), 1),
07518     SDValue(N.getNode(), 0)
07519   };
07520   const SDValue Tos[] = {
07521     InFlag,
07522     SDValue(Chain.getNode(), Chain.getResNo())
07523   };
07524   ReplaceUses(Froms, Tos, 2);
07525   return ResNode;
07526 }
07527 SDNode *Select_PPCISD_MTCTR(const SDValue &N) {
07528   SDValue Chain = N.getOperand(0);
07529   SDValue N1 = N.getOperand(1);
07530 
07531   // Pattern: (PPCmtctr:isVoid GPRC:i32:$rS)
07532   // Emits: (MTCTR:isVoid GPRC:i32:$rS)
07533   // Pattern complexity = 3  cost = 1  size = 0
07534   if (N1.getNode()->getValueType(0) == MVT::i32) {
07535     SDNode *Result = Emit_103(N, PPC::MTCTR);
07536     return Result;
07537   }
07538 
07539   // Pattern: (PPCmtctr:isVoid G8RC:i64:$rS)
07540   // Emits: (MTCTR8:isVoid G8RC:i64:$rS)
07541   // Pattern complexity = 3  cost = 1  size = 0
07542   if (N1.getNode()->getValueType(0) == MVT::i64) {
07543     SDNode *Result = Emit_103(N, PPC::MTCTR8);
07544     return Result;
07545   }
07546 
07547   CannotYetSelect(N);
07548   return NULL;
07549 }
07550 
07551 SDNode *Emit_104(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
07552   SDValue N0 = N.getOperand(0);
07553   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32);
07554   SDValue InFlag = N.getOperand(1);
07555   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Flag, Tmp0, InFlag);
07556   InFlag = SDValue(ResNode, 0);
07557   ReplaceUses(SDValue(N.getNode(), 0), InFlag);
07558   return ResNode;
07559 }
07560 SDNode *Select_PPCISD_MTFSB0(const SDValue &N) {
07561   SDValue N0 = N.getOperand(0);
07562   if (N0.getOpcode() == ISD::Constant &&
07563       N0.getNode()->getValueType(0) == MVT::i32) {
07564     SDNode *Result = Emit_104(N, PPC::MTFSB0);
07565     return Result;
07566   }
07567 
07568   CannotYetSelect(N);
07569   return NULL;
07570 }
07571 
07572 SDNode *Select_PPCISD_MTFSB1(const SDValue &N) {
07573   SDValue N0 = N.getOperand(0);
07574   if (N0.getOpcode() == ISD::Constant &&
07575       N0.getNode()->getValueType(0) == MVT::i32) {
07576     SDNode *Result = Emit_104(N, PPC::MTFSB1);
07577     return Result;
07578   }
07579 
07580   CannotYetSelect(N);
07581   return NULL;
07582 }
07583 
07584 SDNode *Emit_105(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
07585   SDValue N0 = N.getOperand(0);
07586   SDValue N1 = N.getOperand(1);
07587   SDValue N2 = N.getOperand(2);
07588   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32);
07589   SDValue InFlag = N.getOperand(3);
07590   SDValue Ops0[] = { Tmp0, N1, N2, InFlag };
07591   return CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, Ops0, 4);
07592 }
07593 SDNode *Select_PPCISD_MTFSF_f64(const SDValue &N) {
07594   SDValue N0 = N.getOperand(0);
07595   if (N0.getOpcode() == ISD::Constant) {
07596     SDValue N1 = N.getOperand(1);
07597     SDValue N2 = N.getOperand(2);
07598     if (N0.getNode()->getValueType(0) == MVT::i32) {
07599       SDNode *Result = Emit_105(N, PPC::MTFSF, MVT::f64);
07600       return Result;
07601     }
07602   }
07603 
07604   CannotYetSelect(N);
07605   return NULL;
07606 }
07607 
07608 SDNode *Emit_106(const SDValue &N, unsigned Opc0) DISABLE_INLINE {
07609   SDValue Chain = N.getOperand(0);
07610   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
07611   SDValue Tmp0 = CurDAG->getTargetConstant(0x14ULL, MVT::i32);
07612   SDValue Tmp1 = CurDAG->getRegister(0, MVT::i32);
07613   SDValue InFlag(0, 0);
07614   if (HasInFlag) {
07615     InFlag = N.getOperand(N.getNumOperands()-1);
07616   }
07617   SDValue Ops0[] = { Tmp0, Tmp1, Chain, InFlag };
07618   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, HasInFlag ? 4 : 3);
07619 }
07620 SDNode *Select_PPCISD_RET_FLAG(const SDValue &N) {
07621   SDNode *Result = Emit_106(N, PPC::BLR);
07622   return Result;
07623 }
07624 
07625 SDNode *Select_PPCISD_SHL_i32(const SDValue &N) {
07626   SDValue N0 = N.getOperand(0);
07627   SDValue N1 = N.getOperand(1);
07628   if (N1.getNode()->getValueType(0) == MVT::i32) {
07629     SDNode *Result = Emit_3(N, PPC::SLW, MVT::i32);
07630     return Result;
07631   }
07632 
07633   CannotYetSelect(N);
07634   return NULL;
07635 }
07636 
07637 SDNode *Select_PPCISD_SHL_i64(const SDValue &N) {
07638   SDValue N0 = N.getOperand(0);
07639   SDValue N1 = N.getOperand(1);
07640   if (N1.getNode()->getValueType(0) == MVT::i32) {
07641     SDNode *Result = Emit_3(N, PPC::SLD, MVT::i64);
07642     return Result;
07643   }
07644 
07645   CannotYetSelect(N);
07646   return NULL;
07647 }
07648 
07649 SDNode *Select_PPCISD_SRA_i32(const SDValue &N) {
07650   SDValue N0 = N.getOperand(0);
07651   SDValue N1 = N.getOperand(1);
07652   if (N1.getNode()->getValueType(0) == MVT::i32) {
07653     SDNode *Result = Emit_3(N, PPC::SRAW, MVT::i32);
07654     return Result;
07655   }
07656 
07657   CannotYetSelect(N);
07658   return NULL;
07659 }
07660 
07661 SDNode *Select_PPCISD_SRA_i64(const SDValue &N) {
07662   SDValue N0 = N.getOperand(0);
07663   SDValue N1 = N.getOperand(1);
07664   if (N1.getNode()->getValueType(0) == MVT::i32) {
07665     SDNode *Result = Emit_3(N, PPC::SRAD, MVT::i64);
07666     return Result;
07667   }
07668 
07669   CannotYetSelect(N);
07670   return NULL;
07671 }
07672 
07673 SDNode *Select_PPCISD_SRL_i32(const SDValue &N) {
07674   SDValue N0 = N.getOperand(0);
07675   SDValue N1 = N.getOperand(1);
07676   if (N1.getNode()->getValueType(0) == MVT::i32) {
07677     SDNode *Result = Emit_3(N, PPC::SRW, MVT::i32);
07678     return Result;
07679   }
07680 
07681   CannotYetSelect(N);
07682   return NULL;
07683 }
07684 
07685 SDNode *Select_PPCISD_SRL_i64(const SDValue &N) {
07686   SDValue N0 = N.getOperand(0);
07687   SDValue N1 = N.getOperand(1);
07688   if (N1.getNode()->getValueType(0) == MVT::i32) {
07689     SDNode *Result = Emit_3(N, PPC::SRD, MVT::i64);
07690     return Result;
07691   }
07692 
07693   CannotYetSelect(N);
07694   return NULL;
07695 }
07696 
07697 SDNode *Emit_107(const SDValue &N, unsigned Opc0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1) DISABLE_INLINE {
07698   SDValue Chain = N.getOperand(0);
07699   SDValue N1 = N.getOperand(1);
07700   SDValue N2 = N.getOperand(2);
07701   SDValue N3 = N.getOperand(3);
07702   SDValue N4 = N.getOperand(4);
07703   SDValue Ops0[] = { N1, CPTmpN2_0, CPTmpN2_1, Chain };
07704   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 4);
07705 }
07706 SDNode *Select_PPCISD_STBRX(const SDValue &N) {
07707   SDValue Chain = N.getOperand(0);
07708   SDValue N1 = N.getOperand(1);
07709   SDValue N2 = N.getOperand(2);
07710   SDValue CPTmpN2_0;
07711   SDValue CPTmpN2_1;
07712   if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
07713     SDValue N3 = N.getOperand(3);
07714     SDValue N4 = N.getOperand(4);
07715 
07716     // Pattern: (PPCstbrx:isVoid GPRC:i32:$rS, xoaddr:iPTR:$dst, srcvalue:Other:$dummy, i16:Other)
07717     // Emits: (STHBRX:isVoid GPRC:i32:$rS, xoaddr:iPTR:$dst)
07718     // Pattern complexity = 12  cost = 1  size = 0
07719     if (cast<VTSDNode>(N4)->getVT() == MVT::i16) {
07720       SDNode *Result = Emit_107(N, PPC::STHBRX, CPTmpN2_0, CPTmpN2_1);
07721       return Result;
07722     }
07723 
07724     // Pattern: (PPCstbrx:isVoid GPRC:i32:$rS, xoaddr:iPTR:$dst, srcvalue:Other:$dummy, i32:Other)
07725     // Emits: (STWBRX:isVoid GPRC:i32:$rS, xoaddr:iPTR:$dst)
07726     // Pattern complexity = 12  cost = 1  size = 0
07727     if (cast<VTSDNode>(N4)->getVT() == MVT::i32) {
07728       SDNode *Result = Emit_107(N, PPC::STWBRX, CPTmpN2_0, CPTmpN2_1);
07729       return Result;
07730     }
07731   }
07732 
07733   CannotYetSelect(N);
07734   return NULL;
07735 }
07736 
07737 SDNode *Emit_108(const SDValue &N, unsigned Opc0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1) DISABLE_INLINE {
07738   SDValue Chain = N.getOperand(0);
07739   SDValue N1 = N.getOperand(1);
07740   SDValue N2 = N.getOperand(2);
07741   SDValue Ops0[] = { N1, CPTmpN2_0, CPTmpN2_1, Chain };
07742   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, Ops0, 4);
07743 }
07744 SDNode *Select_PPCISD_STCX(const SDValue &N) {
07745   SDValue Chain = N.getOperand(0);
07746   SDValue N1 = N.getOperand(1);
07747   SDValue N2 = N.getOperand(2);
07748   SDValue CPTmpN2_0;
07749   SDValue CPTmpN2_1;
07750   if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
07751 
07752     // Pattern: (PPCstcx:isVoid GPRC:i32:$rS, xoaddr:iPTR:$dst)
07753     // Emits: (STWCX:isVoid GPRC:i32:$rS, xoaddr:iPTR:$dst)
07754     // Pattern complexity = 12  cost = 1  size = 0
07755     if (N1.getNode()->getValueType(0) == MVT::i32) {
07756       SDNode *Result = Emit_108(N, PPC::STWCX, CPTmpN2_0, CPTmpN2_1);
07757       return Result;
07758     }
07759 
07760     // Pattern: (PPCstcx:isVoid G8RC:i64:$rS, xoaddr:iPTR:$dst)
07761     // Emits: (STDCX:isVoid G8RC:i64:$rS, xoaddr:iPTR:$dst)
07762     // Pattern complexity = 12  cost = 1  size = 0
07763     if (N1.getNode()->getValueType(0) == MVT::i64) {
07764       SDNode *Result = Emit_108(N, PPC::STDCX, CPTmpN2_0, CPTmpN2_1);
07765       return Result;
07766     }
07767   }
07768 
07769   CannotYetSelect(N);
07770   return NULL;
07771 }
07772 
07773 SDNode *Select_PPCISD_STD_32(const SDValue &N) {
07774   SDValue Chain = N.getOperand(0);
07775   SDValue N1 = N.getOperand(1);
07776   SDValue N2 = N.getOperand(2);
07777   SDValue CPTmpN2_0;
07778   SDValue CPTmpN2_1;
07779 
07780   // Pattern: (PPCstd_32:isVoid GPRC:i32:$rT, ixaddr:iPTR:$dst)
07781   // Emits: (STD_32:isVoid GPRC:i32:$rT, ixaddr:iPTR:$dst)
07782   // Pattern complexity = 12  cost = 1  size = 0
07783   if (SelectAddrImmShift(N, N2, CPTmpN2_0, CPTmpN2_1) &&
07784       N1.getNode()->getValueType(0) == MVT::i32) {
07785     SDNode *Result = Emit_108(N, PPC::STD_32, CPTmpN2_0, CPTmpN2_1);
07786     return Result;
07787   }
07788 
07789   // Pattern: (PPCstd_32:isVoid GPRC:i32:$rT, xaddr:iPTR:$dst)
07790   // Emits: (STDX_32:isVoid GPRC:i32:$rT, xaddr:iPTR:$dst)
07791   // Pattern complexity = 12  cost = 1  size = 0
07792   if (SelectAddrIdx(N, N2, CPTmpN2_0, CPTmpN2_1) &&
07793       N1.getNode()->getValueType(0) == MVT::i32) {
07794     SDNode *Result = Emit_108(N, PPC::STDX_32, CPTmpN2_0, CPTmpN2_1);
07795     return Result;
07796   }
07797 
07798   CannotYetSelect(N);
07799   return NULL;
07800 }
07801 
07802 SDNode *Select_PPCISD_STFIWX(const SDValue &N) {
07803   SDValue Chain = N.getOperand(0);
07804   SDValue N1 = N.getOperand(1);
07805   SDValue N2 = N.getOperand(2);
07806   SDValue CPTmpN2_0;
07807   SDValue CPTmpN2_1;
07808   if (SelectAddrIdxOnly(N, N2, CPTmpN2_0, CPTmpN2_1)) {
07809     SDNode *Result = Emit_108(N, PPC::STFIWX, CPTmpN2_0, CPTmpN2_1);
07810     return Result;
07811   }
07812 
07813   CannotYetSelect(N);
07814   return NULL;
07815 }
07816 
07817 SDNode *Emit_109(const SDValue &N, unsigned Opc0, unsigned NumInputRootOps) DISABLE_INLINE {
07818   SDValue Chain = N.getOperand(0);
07819   SDValue N1 = N.getOperand(1);
07820   SDValue N2 = N.getOperand(2);
07821   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
07822   SmallVector<SDValue, 8> Ops0;
07823   SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32);
07824   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32);
07825   SDValue InFlag(0, 0);
07826   if (HasInFlag) {
07827     InFlag = N.getOperand(N.getNumOperands()-1);
07828   }
07829   Ops0.push_back(Tmp0);
07830   Ops0.push_back(Tmp1);
07831   for (unsigned i = NumInputRootOps + 1, e = N.getNumOperands()-(HasInFlag?1:0); i != e; ++i) {
07832     Ops0.push_back(N.getOperand(i));
07833   }
07834   Ops0.push_back(Chain);
07835   if (HasInFlag)
07836     Ops0.push_back(InFlag);
07837   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, &Ops0[0], Ops0.size());
07838 }
07839 SDNode *Emit_110(const SDValue &N, unsigned Opc0, unsigned NumInputRootOps) DISABLE_INLINE {
07840   SDValue Chain = N.getOperand(0);
07841   SDValue N1 = N.getOperand(1);
07842   SDValue N2 = N.getOperand(2);
07843   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
07844   SmallVector<SDValue, 8> Ops0;
07845   SDValue Tmp0 = CurDAG->getTargetConstant(((uint64_t) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i64);
07846   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32);
07847   SDValue InFlag(0, 0);
07848   if (HasInFlag) {
07849     InFlag = N.getOperand(N.getNumOperands()-1);
07850   }
07851   Ops0.push_back(Tmp0);
07852   Ops0.push_back(Tmp1);
07853   for (unsigned i = NumInputRootOps + 1, e = N.getNumOperands()-(HasInFlag?1:0); i != e; ++i) {
07854     Ops0.push_back(N.getOperand(i));
07855   }
07856   Ops0.push_back(Chain);
07857   if (HasInFlag)
07858     Ops0.push_back(InFlag);
07859   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, &Ops0[0], Ops0.size());
07860 }
07861 SDNode *Emit_111(const SDValue &N, unsigned Opc0, unsigned NumInputRootOps) DISABLE_INLINE {
07862   SDValue Chain = N.getOperand(0);
07863   SDValue N1 = N.getOperand(1);
07864   SDValue N2 = N.getOperand(2);
07865   bool HasInFlag = (N.getOperand(N.getNumOperands()-1).getValueType() == MVT::Flag);
07866   SmallVector<SDValue, 8> Ops0;
07867   SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32);
07868   SDValue InFlag(0, 0);
07869   if (HasInFlag) {
07870     InFlag = N.getOperand(N.getNumOperands()-1);
07871   }
07872   Ops0.push_back(N1);
07873   Ops0.push_back(Tmp1);
07874   for (unsigned i = NumInputRootOps + 1, e = N.getNumOperands()-(HasInFlag?1:0); i != e; ++i) {
07875     Ops0.push_back(N.getOperand(i));
07876   }
07877   Ops0.push_back(Chain);
07878   if (HasInFlag)
07879     Ops0.push_back(InFlag);
07880   return CurDAG->SelectNodeTo(N.getNode(), Opc0, MVT::Other, &Ops0[0], Ops0.size());
07881 }
07882 SDNode *Select_PPCISD_TC_RETURN(const SDValue &N) {
07883   SDValue Chain = N.getOperand(0);
07884   SDValue N1 = N.getOperand(1);
07885   if (N1.getOpcode() == ISD::Constant) {
07886     SDValue N2 = N.getOperand(2);
07887     if (N2.getOpcode() == ISD::Constant) {
07888 
07889       // Pattern: (PPCtc_return:isVoid (imm:i32):$func, (imm:i32):$offset)
07890       // Emits: (TCRETURNai:isVoid (imm:i32):$func, (imm:i32):$offset)
07891       // Pattern complexity = 9  cost = 1  size = 0
07892       if (N1.getNode()->getValueType(0) == MVT::i32) {
07893         SDNode *Result = Emit_109(N, PPC::TCRETURNai, 2);
07894         return Result;
07895       }
07896 
07897       // Pattern: (PPCtc_return:isVoid (imm:i64):$func, (imm:i32):$offset)
07898       // Emits: (TCRETURNai8:isVoid (imm:i64):$func, (imm:i32):$offset)
07899       // Pattern complexity = 9  cost = 1  size = 0
07900       if (N1.getNode()->getValueType(0) == MVT::i64) {
07901         SDNode *Result = Emit_110(N, PPC::TCRETURNai8, 2);
07902         return Result;
07903       }
07904     }
07905   }
07906 
07907   // Pattern: (PPCtc_return:isVoid (tglobaladdr:i32):$dst, (imm:i32):$imm)
07908   // Emits: (TCRETURNdi:isVoid (tglobaladdr:iPTR):$dst, (imm:i32):$imm)
07909   // Pattern complexity = 9  cost = 1  size = 0
07910   if (N1.getOpcode() == ISD::TargetGlobalAddress) {
07911     SDValue N2 = N.getOperand(2);
07912     if (N2.getOpcode() == ISD::Constant &&
07913         N1.getNode()->getValueType(0) == MVT::i32) {
07914       SDNode *Result = Emit_111(N, PPC::TCRETURNdi, 2);
07915       return Result;
07916     }
07917   }
07918 
07919   // Pattern: (PPCtc_return:isVoid (texternalsym:i32):$dst, (imm:i32):$imm)
07920   // Emits: (TCRETURNdi:isVoid (texternalsym:iPTR):$dst, (imm:i32):$imm)
07921   // Pattern complexity = 9  cost = 1  size = 0
07922   if (N1.getOpcode() == ISD::TargetExternalSymbol) {
07923     SDValue N2 = N.getOperand(2);
07924     if (N2.getOpcode() == ISD::Constant &&
07925         N1.getNode()->getValueType(0) == MVT::i32) {
07926       SDNode *Result = Emit_111(N, PPC::TCRETURNdi, 2);
07927       return Result;
07928     }
07929   }
07930 
07931   // Pattern: (PPCtc_return:isVoid (tglobaladdr:i64):$dst, (imm:i32):$imm)
07932   // Emits: (TCRETURNdi8:isVoid (tglobaladdr:iPTR):$dst, (imm:i32):$imm)
07933   // Pattern complexity = 9  cost = 1  size = 0
07934   if (N1.getOpcode() == ISD::TargetGlobalAddress) {
07935     SDValue N2 = N.getOperand(2);
07936     if (N2.getOpcode() == ISD::Constant &&
07937         N1.getNode()->getValueType(0) == MVT::i64) {
07938       SDNode *Result = Emit_111(N, PPC::TCRETURNdi8, 2);
07939       return Result;
07940     }
07941   }
07942 
07943   // Pattern: (PPCtc_return:isVoid (texternalsym:i64):$dst, (imm:i32):$imm)
07944   // Emits: (TCRETURNdi8:isVoid (texternalsym:iPTR):$dst, (imm:i32):$imm)
07945   // Pattern complexity = 9  cost = 1  size = 0
07946   if (N1.getOpcode() == ISD::TargetExternalSymbol) {
07947     SDValue N2 = N.getOperand(2);
07948     if (N2.getOpcode() == ISD::Constant &&
07949         N1.getNode()->getValueType(0) == MVT::i64) {
07950       SDNode *Result = Emit_111(N, PPC::TCRETURNdi8, 2);
07951       return Result;
07952     }
07953   }
07954   SDValue N2 = N.getOperand(2);
07955   if (N2.getOpcode() == ISD::Constant) {
07956 
07957     // Pattern: (PPCtc_return:isVoid CTRRC:i32:$dst, (imm:i32):$imm)
07958     // Emits: (TCRETURNri:isVoid CTRRC:i32:$dst, (imm:i32):$imm)
07959     // Pattern complexity = 6  cost = 1  size = 0
07960     if (N1.getNode()->getValueType(0) == MVT::i32) {
07961       SDNode *Result = Emit_111(N, PPC::TCRETURNri, 2);
07962       return Result;
07963     }
07964 
07965     // Pattern: (PPCtc_return:isVoid CTRRC8:i64:$dst, (imm:i32):$imm)
07966     // Emits: (TCRETURNri8:isVoid CTRRC8:i64:$dst, (imm:i32):$imm)
07967     // Pattern complexity = 6  cost = 1  size = 0
07968     if (N1.getNode()->getValueType(0) == MVT::i64) {
07969       SDNode *Result = Emit_111(N, PPC::TCRETURNri8, 2);
07970       return Result;
07971     }
07972   }
07973 
07974   CannotYetSelect(N);
07975   return NULL;
07976 }
07977 
07978 SDNode *Select_PPCISD_VCMP_v16i8(const SDValue &N) {
07979   SDValue N0 = N.getOperand(0);
07980   SDValue N1 = N.getOperand(1);
07981   SDValue N2 = N.getOperand(2);
07982   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
07983   if (Tmp0) {
07984     int64_t CN1 = Tmp0->getSExtValue();
07985 
07986     // Pattern: (PPCvcmp:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, 6:i32)
07987     // Emits: (VCMPEQUB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
07988     // Pattern complexity = 8  cost = 1  size = 0
07989     if (CN1 == INT64_C(6)) {
07990       SDNode *Result = Emit_81(N, PPC::VCMPEQUB, MVT::v16i8);
07991       return Result;
07992     }
07993 
07994     // Pattern: (PPCvcmp:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, 774:i32)
07995     // Emits: (VCMPGTSB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
07996     // Pattern complexity = 8  cost = 1  size = 0
07997     if (CN1 == INT64_C(774)) {
07998       SDNode *Result = Emit_81(N, PPC::VCMPGTSB, MVT::v16i8);
07999       return Result;
08000     }
08001 
08002     // Pattern: (PPCvcmp:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, 518:i32)
08003     // Emits: (VCMPGTUB:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
08004     // Pattern complexity = 8  cost = 1  size = 0
08005     if (CN1 == INT64_C(518)) {
08006       SDNode *Result = Emit_81(N, PPC::VCMPGTUB, MVT::v16i8);
08007       return Result;
08008     }
08009   }
08010 
08011   CannotYetSelect(N);
08012   return NULL;
08013 }
08014 
08015 SDNode *Select_PPCISD_VCMP_v8i16(const SDValue &N) {
08016   SDValue N0 = N.getOperand(0);
08017   SDValue N1 = N.getOperand(1);
08018   SDValue N2 = N.getOperand(2);
08019   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
08020   if (Tmp0) {
08021     int64_t CN1 = Tmp0->getSExtValue();
08022 
08023     // Pattern: (PPCvcmp:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, 70:i32)
08024     // Emits: (VCMPEQUH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
08025     // Pattern complexity = 8  cost = 1  size = 0
08026     if (CN1 == INT64_C(70)) {
08027       SDNode *Result = Emit_81(N, PPC::VCMPEQUH, MVT::v8i16);
08028       return Result;
08029     }
08030 
08031     // Pattern: (PPCvcmp:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, 838:i32)
08032     // Emits: (VCMPGTSH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
08033     // Pattern complexity = 8  cost = 1  size = 0
08034     if (CN1 == INT64_C(838)) {
08035       SDNode *Result = Emit_81(N, PPC::VCMPGTSH, MVT::v8i16);
08036       return Result;
08037     }
08038 
08039     // Pattern: (PPCvcmp:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, 582:i32)
08040     // Emits: (VCMPGTUH:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
08041     // Pattern complexity = 8  cost = 1  size = 0
08042     if (CN1 == INT64_C(582)) {
08043       SDNode *Result = Emit_81(N, PPC::VCMPGTUH, MVT::v8i16);
08044       return Result;
08045     }
08046   }
08047 
08048   CannotYetSelect(N);
08049   return NULL;
08050 }
08051 
08052 SDNode *Select_PPCISD_VCMP_v4i32(const SDValue &N) {
08053   SDValue N0 = N.getOperand(0);
08054   SDValue N1 = N.getOperand(1);
08055   SDValue N2 = N.getOperand(2);
08056   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
08057   if (Tmp0) {
08058     int64_t CN1 = Tmp0->getSExtValue();
08059 
08060     // Pattern: (PPCvcmp:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, 134:i32)
08061     // Emits: (VCMPEQUW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
08062     // Pattern complexity = 8  cost = 1  size = 0
08063     if (CN1 == INT64_C(134)) {
08064       SDNode *Result = Emit_81(N, PPC::VCMPEQUW, MVT::v4i32);
08065       return Result;
08066     }
08067 
08068     // Pattern: (PPCvcmp:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, 902:i32)
08069     // Emits: (VCMPGTSW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
08070     // Pattern complexity = 8  cost = 1  size = 0
08071     if (CN1 == INT64_C(902)) {
08072       SDNode *Result = Emit_81(N, PPC::VCMPGTSW, MVT::v4i32);
08073       return Result;
08074     }
08075 
08076     // Pattern: (PPCvcmp:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, 646:i32)
08077     // Emits: (VCMPGTUW:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
08078     // Pattern complexity = 8  cost = 1  size = 0
08079     if (CN1 == INT64_C(646)) {
08080       SDNode *Result = Emit_81(N, PPC::VCMPGTUW, MVT::v4i32);
08081       return Result;
08082     }
08083   }
08084 
08085   CannotYetSelect(N);
08086   return NULL;
08087 }
08088 
08089 SDNode *Select_PPCISD_VCMP_v4f32(const SDValue &N) {
08090   SDValue N0 = N.getOperand(0);
08091   SDValue N1 = N.getOperand(1);
08092   SDValue N2 = N.getOperand(2);
08093   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
08094   if (Tmp0) {
08095     int64_t CN1 = Tmp0->getSExtValue();
08096 
08097     // Pattern: (PPCvcmp:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 966:i32)
08098     // Emits: (VCMPBFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08099     // Pattern complexity = 8  cost = 1  size = 0
08100     if (CN1 == INT64_C(966)) {
08101       SDNode *Result = Emit_81(N, PPC::VCMPBFP, MVT::v4f32);
08102       return Result;
08103     }
08104 
08105     // Pattern: (PPCvcmp:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 198:i32)
08106     // Emits: (VCMPEQFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08107     // Pattern complexity = 8  cost = 1  size = 0
08108     if (CN1 == INT64_C(198)) {
08109       SDNode *Result = Emit_81(N, PPC::VCMPEQFP, MVT::v4f32);
08110       return Result;
08111     }
08112 
08113     // Pattern: (PPCvcmp:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 454:i32)
08114     // Emits: (VCMPGEFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08115     // Pattern complexity = 8  cost = 1  size = 0
08116     if (CN1 == INT64_C(454)) {
08117       SDNode *Result = Emit_81(N, PPC::VCMPGEFP, MVT::v4f32);
08118       return Result;
08119     }
08120 
08121     // Pattern: (PPCvcmp:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 710:i32)
08122     // Emits: (VCMPGTFP:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08123     // Pattern complexity = 8  cost = 1  size = 0
08124     if (CN1 == INT64_C(710)) {
08125       SDNode *Result = Emit_81(N, PPC::VCMPGTFP, MVT::v4f32);
08126       return Result;
08127     }
08128   }
08129 
08130   CannotYetSelect(N);
08131   return NULL;
08132 }
08133 
08134 SDNode *Emit_112(const SDValue &N, unsigned Opc0, MVT VT0) DISABLE_INLINE {
08135   SDValue N0 = N.getOperand(0);
08136   SDValue N1 = N.getOperand(1);
08137   SDValue N2 = N.getOperand(2);
08138   SDNode *ResNode = CurDAG->SelectNodeTo(N.getNode(), Opc0, VT0, MVT::Flag, N0, N1);
08139   SDValue InFlag(ResNode, 1);
08140   ReplaceUses(SDValue(N.getNode(), 1), InFlag);
08141   return ResNode;
08142 }
08143 SDNode *Select_PPCISD_VCMPo_v16i8(const SDValue &N) {
08144   SDValue N0 = N.getOperand(0);
08145   SDValue N1 = N.getOperand(1);
08146   SDValue N2 = N.getOperand(2);
08147   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
08148   if (Tmp0) {
08149     int64_t CN1 = Tmp0->getSExtValue();
08150 
08151     // Pattern: (PPCvcmp_o:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, 6:i32)
08152     // Emits: (VCMPEQUBo:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
08153     // Pattern complexity = 8  cost = 1  size = 0
08154     if (CN1 == INT64_C(6)) {
08155       SDNode *Result = Emit_112(N, PPC::VCMPEQUBo, MVT::v16i8);
08156       return Result;
08157     }
08158 
08159     // Pattern: (PPCvcmp_o:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, 774:i32)
08160     // Emits: (VCMPGTSBo:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
08161     // Pattern complexity = 8  cost = 1  size = 0
08162     if (CN1 == INT64_C(774)) {
08163       SDNode *Result = Emit_112(N, PPC::VCMPGTSBo, MVT::v16i8);
08164       return Result;
08165     }
08166 
08167     // Pattern: (PPCvcmp_o:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB, 518:i32)
08168     // Emits: (VCMPGTUBo:v16i8 VRRC:v16i8:$vA, VRRC:v16i8:$vB)
08169     // Pattern complexity = 8  cost = 1  size = 0
08170     if (CN1 == INT64_C(518)) {
08171       SDNode *Result = Emit_112(N, PPC::VCMPGTUBo, MVT::v16i8);
08172       return Result;
08173     }
08174   }
08175 
08176   CannotYetSelect(N);
08177   return NULL;
08178 }
08179 
08180 SDNode *Select_PPCISD_VCMPo_v8i16(const SDValue &N) {
08181   SDValue N0 = N.getOperand(0);
08182   SDValue N1 = N.getOperand(1);
08183   SDValue N2 = N.getOperand(2);
08184   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
08185   if (Tmp0) {
08186     int64_t CN1 = Tmp0->getSExtValue();
08187 
08188     // Pattern: (PPCvcmp_o:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, 70:i32)
08189     // Emits: (VCMPEQUHo:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
08190     // Pattern complexity = 8  cost = 1  size = 0
08191     if (CN1 == INT64_C(70)) {
08192       SDNode *Result = Emit_112(N, PPC::VCMPEQUHo, MVT::v8i16);
08193       return Result;
08194     }
08195 
08196     // Pattern: (PPCvcmp_o:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, 838:i32)
08197     // Emits: (VCMPGTSHo:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
08198     // Pattern complexity = 8  cost = 1  size = 0
08199     if (CN1 == INT64_C(838)) {
08200       SDNode *Result = Emit_112(N, PPC::VCMPGTSHo, MVT::v8i16);
08201       return Result;
08202     }
08203 
08204     // Pattern: (PPCvcmp_o:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB, 582:i32)
08205     // Emits: (VCMPGTUHo:v8i16 VRRC:v8i16:$vA, VRRC:v8i16:$vB)
08206     // Pattern complexity = 8  cost = 1  size = 0
08207     if (CN1 == INT64_C(582)) {
08208       SDNode *Result = Emit_112(N, PPC::VCMPGTUHo, MVT::v8i16);
08209       return Result;
08210     }
08211   }
08212 
08213   CannotYetSelect(N);
08214   return NULL;
08215 }
08216 
08217 SDNode *Select_PPCISD_VCMPo_v4i32(const SDValue &N) {
08218   SDValue N0 = N.getOperand(0);
08219   SDValue N1 = N.getOperand(1);
08220   SDValue N2 = N.getOperand(2);
08221   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
08222   if (Tmp0) {
08223     int64_t CN1 = Tmp0->getSExtValue();
08224 
08225     // Pattern: (PPCvcmp_o:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, 134:i32)
08226     // Emits: (VCMPEQUWo:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
08227     // Pattern complexity = 8  cost = 1  size = 0
08228     if (CN1 == INT64_C(134)) {
08229       SDNode *Result = Emit_112(N, PPC::VCMPEQUWo, MVT::v4i32);
08230       return Result;
08231     }
08232 
08233     // Pattern: (PPCvcmp_o:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, 902:i32)
08234     // Emits: (VCMPGTSWo:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
08235     // Pattern complexity = 8  cost = 1  size = 0
08236     if (CN1 == INT64_C(902)) {
08237       SDNode *Result = Emit_112(N, PPC::VCMPGTSWo, MVT::v4i32);
08238       return Result;
08239     }
08240 
08241     // Pattern: (PPCvcmp_o:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB, 646:i32)
08242     // Emits: (VCMPGTUWo:v4i32 VRRC:v4i32:$vA, VRRC:v4i32:$vB)
08243     // Pattern complexity = 8  cost = 1  size = 0
08244     if (CN1 == INT64_C(646)) {
08245       SDNode *Result = Emit_112(N, PPC::VCMPGTUWo, MVT::v4i32);
08246       return Result;
08247     }
08248   }
08249 
08250   CannotYetSelect(N);
08251   return NULL;
08252 }
08253 
08254 SDNode *Select_PPCISD_VCMPo_v4f32(const SDValue &N) {
08255   SDValue N0 = N.getOperand(0);
08256   SDValue N1 = N.getOperand(1);
08257   SDValue N2 = N.getOperand(2);
08258   ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N2);
08259   if (Tmp0) {
08260     int64_t CN1 = Tmp0->getSExtValue();
08261 
08262     // Pattern: (PPCvcmp_o:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 966:i32)
08263     // Emits: (VCMPBFPo:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08264     // Pattern complexity = 8  cost = 1  size = 0
08265     if (CN1 == INT64_C(966)) {
08266       SDNode *Result = Emit_112(N, PPC::VCMPBFPo, MVT::v4f32);
08267       return Result;
08268     }
08269 
08270     // Pattern: (PPCvcmp_o:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 198:i32)
08271     // Emits: (VCMPEQFPo:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08272     // Pattern complexity = 8  cost = 1  size = 0
08273     if (CN1 == INT64_C(198)) {
08274       SDNode *Result = Emit_112(N, PPC::VCMPEQFPo, MVT::v4f32);
08275       return Result;
08276     }
08277 
08278     // Pattern: (PPCvcmp_o:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 454:i32)
08279     // Emits: (VCMPGEFPo:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08280     // Pattern complexity = 8  cost = 1  size = 0
08281     if (CN1 == INT64_C(454)) {
08282       SDNode *Result = Emit_112(N, PPC::VCMPGEFPo, MVT::v4f32);
08283       return Result;
08284     }
08285 
08286     // Pattern: (PPCvcmp_o:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB, 710:i32)
08287     // Emits: (VCMPGTFPo:v4f32 VRRC:v4f32:$vA, VRRC:v4f32:$vB)
08288     // Pattern complexity = 8  cost = 1  size = 0
08289     if (CN1 == INT64_C(710)) {
08290       SDNode *Result = Emit_112(N, PPC::VCMPGTFPo, MVT::v4f32);
08291       return Result;
08292     }
08293   }
08294 
08295   CannotYetSelect(N);
08296   return NULL;
08297 }
08298 
08299 SDNode *Select_PPCISD_VMADDFP_v4f32(const SDValue &N) {
08300   SDNode *Result = Emit_99(N, PPC::VMADDFP, MVT::v4f32);
08301   return Result;
08302 }
08303 
08304 SDNode *Select_PPCISD_VNMSUBFP_v4f32(const SDValue &N) {
08305   SDNode *Result = Emit_99(N, PPC::VNMSUBFP, MVT::v4f32);
08306   return Result;
08307 }
08308 
08309 SDNode *Select_PPCISD_VPERM_v16i8(const SDValue &N) {
08310   SDNode *Result = Emit_99(N, PPC::VPERM, MVT::v16i8);
08311   return Result;
08312 }
08313 
08314 SDNode *Select_INLINEASM(SDValue N) {
08315   std::vector<SDValue> Ops(N.getNode()->op_begin(), N.getNode()->op_end());
08316   SelectInlineAsmMemoryOperands(Ops);
08317 
08318   std::vector<MVT> VTs;
08319   VTs.push_back(MVT::Other);
08320   VTs.push_back(MVT::Flag);
08321   SDValue New = CurDAG->getNode(ISD::INLINEASM, VTs, &Ops[0], Ops.size());
08322   return New.getNode();
08323 }
08324 
08325 SDNode *Select_UNDEF(const SDValue &N) {
08326   return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::IMPLICIT_DEF,
08327                               N.getValueType());
08328 }
08329 
08330 SDNode *Select_DBG_LABEL(const SDValue &N) {
08331   SDValue Chain = N.getOperand(0);
08332   unsigned C = cast<LabelSDNode>(N)->getLabelID();
08333   SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);
08334   return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::DBG_LABEL,
08335                               MVT::Other, Tmp, Chain);
08336 }
08337 
08338 SDNode *Select_EH_LABEL(const SDValue &N) {
08339   SDValue Chain = N.getOperand(0);
08340   unsigned C = cast<LabelSDNode>(N)->getLabelID();
08341   SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);
08342   return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::EH_LABEL,
08343                               MVT::Other, Tmp, Chain);
08344 }
08345 
08346 SDNode *Select_DECLARE(const SDValue &N) {
08347   SDValue Chain = N.getOperand(0);
08348   SDValue N1 = N.getOperand(1);
08349   SDValue N2 = N.getOperand(2);
08350   if (!isa<FrameIndexSDNode>(N1) || !isa<GlobalAddressSDNode>(N2)) {
08351     CannotYetSelect(N);
08352   }
08353   int FI = cast<FrameIndexSDNode>(N1)->getIndex();
08354   GlobalValue *GV = cast<GlobalAddressSDNode>(N2)->getGlobal();
08355   SDValue Tmp1 = CurDAG->getTargetFrameIndex(FI, TLI.getPointerTy());
08356   SDValue Tmp2 = CurDAG->getTargetGlobalAddress(GV, TLI.getPointerTy());
08357   return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::DECLARE,
08358                               MVT::Other, Tmp1, Tmp2, Chain);
08359 }
08360 
08361 SDNode *Select_EXTRACT_SUBREG(const SDValue &N) {
08362   SDValue N0 = N.getOperand(0);
08363   SDValue N1 = N.getOperand(1);
08364   unsigned C = cast<ConstantSDNode>(N1)->getZExtValue();
08365   SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);
08366   return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::EXTRACT_SUBREG,
08367                               N.getValueType(), N0, Tmp);
08368 }
08369 
08370 SDNode *Select_INSERT_SUBREG(const SDValue &N) {
08371   SDValue N0 = N.getOperand(0);
08372   SDValue N1 = N.getOperand(1);
08373   SDValue N2 = N.getOperand(2);
08374   unsigned C = cast<ConstantSDNode>(N2)->getZExtValue();
08375   SDValue Tmp = CurDAG->getTargetConstant(C, MVT::i32);
08376   return CurDAG->SelectNodeTo(N.getNode(), TargetInstrInfo::INSERT_SUBREG,
08377                               N.getValueType(), N0, N1, Tmp);
08378 }
08379 
08380 // The main instruction selector code.
08381 SDNode *SelectCode(SDValue N) {
08382   MVT::SimpleValueType NVT = N.getNode()->getValueType(0).getSimpleVT();
08383   switch (N.getOpcode()) {
08384   default:
08385     assert(!N.isMachineOpcode() && "Node already selected!");
08386     break;
08387   case ISD::EntryToken:       // These nodes remain the same.
08388   case ISD::MEMOPERAND:
08389   case ISD::BasicBlock:
08390   case ISD::Register:
08391   case ISD::HANDLENODE:
08392   case ISD::TargetConstant:
08393   case ISD::TargetConstantFP:
08394   case ISD::TargetConstantPool:
08395   case ISD::TargetFrameIndex:
08396   case ISD::TargetExternalSymbol:
08397   case ISD::TargetJumpTable:
08398   case ISD::TargetGlobalTLSAddress:
08399   case ISD::TargetGlobalAddress:
08400   case ISD::TokenFactor:
08401   case ISD::CopyFromReg:
08402   case ISD::CopyToReg: {
08403     return NULL;
08404   }
08405   case ISD::AssertSext:
08406   case ISD::AssertZext: {
08407     ReplaceUses(N, N.getOperand(0));
08408     return NULL;
08409   }
08410   case ISD::INLINEASM: return Select_INLINEASM(N);
08411   case ISD::DBG_LABEL: return Select_DBG_LABEL(N);
08412   case ISD::EH_LABEL: return Select_EH_LABEL(N);
08413   case ISD::DECLARE: return Select_DECLARE(N);
08414   case ISD::EXTRACT_SUBREG: return Select_EXTRACT_SUBREG(N);
08415   case ISD::INSERT_SUBREG: return Select_INSERT_SUBREG(N);
08416   case ISD::UNDEF: return Select_UNDEF(N);
08417   case ISD::ADD: {
08418     switch (NVT) {
08419     case MVT::i32:
08420       return Select_ISD_ADD_i32(N);
08421     case MVT::i64:
08422       return Select_ISD_ADD_i64(N);
08423     case MVT::v16i8:
08424       return Select_ISD_ADD_v16i8(N);
08425     case MVT::v8i16:
08426       return Select_ISD_ADD_v8i16(N);
08427     case MVT::v4i32:
08428       return Select_ISD_ADD_v4i32(N);
08429     default:
08430       break;
08431     }
08432     break;
08433   }
08434   case ISD::ADDC: {
08435     switch (NVT) {
08436     case MVT::i32:
08437       return Select_ISD_ADDC_i32(N);
08438     case MVT::i64:
08439       return Select_ISD_ADDC_i64(N);
08440     default:
08441       break;
08442     }
08443     break;
08444   }
08445   case ISD::ADDE: {
08446     switch (NVT) {
08447     case MVT::i32:
08448       return Select_ISD_ADDE_i32(N);
08449     case MVT::i64:
08450       return Select_ISD_ADDE_i64(N);
08451     default:
08452       break;
08453     }
08454     break;
08455   }
08456   case ISD::AND: {
08457     switch (NVT) {
08458     case MVT::i32:
08459       return Select_ISD_AND_i32(N);
08460     case MVT::i64:
08461       return Select_ISD_AND_i64(N);
08462     case MVT::v4i32:
08463       return Select_ISD_AND_v4i32(N);
08464     default:
08465       break;
08466     }
08467     break;
08468   }
08469   case ISD::ANY_EXTEND: {
08470     switch (NVT) {
08471     case MVT::i64:
08472       return Select_ISD_ANY_EXTEND_i64(N);
08473     default:
08474       break;
08475     }
08476     break;
08477   }
08478   case ISD::ATOMIC_CMP_SWAP: {
08479     switch (NVT) {
08480     case MVT::i32:
08481       return Select_ISD_ATOMIC_CMP_SWAP_i32(N);
08482     case MVT::i64:
08483       return Select_ISD_ATOMIC_CMP_SWAP_i64(N);
08484     default:
08485       break;
08486     }
08487     break;
08488   }
08489   case ISD::ATOMIC_LOAD_ADD: {
08490     switch (NVT) {
08491     case MVT::i32:
08492       return Select_ISD_ATOMIC_LOAD_ADD_i32(N);
08493     case MVT::i64:
08494       return Select_ISD_ATOMIC_LOAD_ADD_i64(N);
08495     default:
08496       break;
08497     }
08498     break;
08499   }
08500   case ISD::ATOMIC_LOAD_AND: {
08501     switch (NVT) {
08502     case MVT::i32:
08503       return Select_ISD_ATOMIC_LOAD_AND_i32(N);
08504     case MVT::i64:
08505       return Select_ISD_ATOMIC_LOAD_AND_i64(N);
08506     default:
08507       break;
08508     }
08509     break;
08510   }
08511   case ISD::ATOMIC_LOAD_NAND: {
08512     switch (NVT) {
08513     case MVT::i32:
08514       return Select_ISD_ATOMIC_LOAD_NAND_i32(N);
08515     case MVT::i64:
08516       return Select_ISD_ATOMIC_LOAD_NAND_i64(N);
08517     default:
08518       break;
08519     }
08520     break;
08521   }
08522   case ISD::ATOMIC_LOAD_OR: {
08523     switch (NVT) {
08524     case MVT::i32:
08525       return Select_ISD_ATOMIC_LOAD_OR_i32(N);
08526     case MVT::i64:
08527       return Select_ISD_ATOMIC_LOAD_OR_i64(N);
08528     default:
08529       break;
08530     }
08531     break;
08532   }
08533   case ISD::ATOMIC_LOAD_SUB: {
08534     switch (NVT) {
08535     case MVT::i32:
08536       return Select_ISD_ATOMIC_LOAD_SUB_i32(N);
08537     case MVT::i64:
08538       return Select_ISD_ATOMIC_LOAD_SUB_i64(N);
08539     default:
08540       break;
08541     }
08542     break;
08543   }
08544   case ISD::ATOMIC_LOAD_XOR: {
08545     switch (NVT) {
08546     case MVT::i32:
08547       return Select_ISD_ATOMIC_LOAD_XOR_i32(N);
08548     case MVT::i64:
08549       return Select_ISD_ATOMIC_LOAD_XOR_i64(N);
08550     default:
08551       break;
08552     }
08553     break;
08554   }
08555   case ISD::ATOMIC_SWAP: {
08556     switch (NVT) {
08557     case MVT::i32:
08558       return Select_ISD_ATOMIC_SWAP_i32(N);
08559     case MVT::i64:
08560       return Select_ISD_ATOMIC_SWAP_i64(N);
08561     default:
08562       break;
08563     }
08564     break;
08565   }
08566   case ISD::BIT_CONVERT: {
08567     switch (NVT) {
08568     case MVT::v16i8:
08569       return Select_ISD_BIT_CONVERT_v16i8(N);
08570     case MVT::v8i16:
08571       return Select_ISD_BIT_CONVERT_v8i16(N);
08572     case MVT::v4i32:
08573       return Select_ISD_BIT_CONVERT_v4i32(N);
08574     case MVT::v4f32:
08575       return Select_ISD_BIT_CONVERT_v4f32(N);
08576     default:
08577       break;
08578     }
08579     break;
08580   }
08581   case ISD::BR: {
08582     switch (NVT) {
08583     default:
08584       return Select_ISD_BR(N);
08585       break;
08586     }
08587     break;
08588   }
08589   case ISD::BUILD_VECTOR: {
08590     switch (NVT) {
08591     case MVT::v16i8:
08592       return Select_ISD_BUILD_VECTOR_v16i8(N);
08593     case MVT::v8i16:
08594       return Select_ISD_BUILD_VECTOR_v8i16(N);
08595     case MVT::v4i32:
08596       return Select_ISD_BUILD_VECTOR_v4i32(N);
08597     default:
08598       break;
08599     }
08600     break;
08601   }
08602   case ISD::CALLSEQ_END: {
08603     switch (NVT) {
08604     default:
08605       return Select_ISD_CALLSEQ_END(N);
08606       break;
08607     }
08608     break;
08609   }
08610   case ISD::CALLSEQ_START: {
08611     switch (NVT) {
08612     default:
08613       return Select_ISD_CALLSEQ_START(N);
08614       break;
08615     }
08616     break;
08617   }
08618   case ISD::CTLZ: {
08619     switch (NVT) {
08620     case MVT::i32:
08621       return Select_ISD_CTLZ_i32(N);
08622     case MVT::i64:
08623       return Select_ISD_CTLZ_i64(N);
08624     default:
08625       break;
08626     }
08627     break;
08628   }
08629   case ISD::Constant: {
08630     switch (NVT) {
08631     case MVT::i32:
08632       return Select_ISD_Constant_i32(N);
08633     case MVT::i64:
08634       return Select_ISD_Constant_i64(N);
08635     default:
08636       break;
08637     }
08638     break;
08639   }
08640   case ISD::DEBUG_LOC: {
08641     switch (NVT) {
08642     default:
08643       return Select_ISD_DEBUG_LOC(N);
08644       break;
08645     }
08646     break;
08647   }
08648   case ISD::FABS: {
08649     switch (NVT) {
08650     case MVT::f32:
08651       return Select_ISD_FABS_f32(N);
08652     case MVT::f64:
08653       return Select_ISD_FABS_f64(N);
08654     default:
08655       break;
08656     }
08657     break;
08658   }
08659   case ISD::FADD: {
08660     switch (NVT) {
08661     case MVT::f32:
08662       return Select_ISD_FADD_f32(N);
08663     case MVT::f64:
08664       return Select_ISD_FADD_f64(N);
08665     case MVT::v4f32:
08666       return Select_ISD_FADD_v4f32(N);
08667     default:
08668       break;
08669     }
08670     break;
08671   }
08672   case ISD::FDIV: {
08673     switch (NVT) {
08674     case MVT::f32:
08675       return Select_ISD_FDIV_f32(N);
08676     case MVT::f64:
08677       return Select_ISD_FDIV_f64(N);
08678     default:
08679       break;
08680     }
08681     break;
08682   }
08683   case ISD::FMUL: {
08684     switch (NVT) {
08685     case MVT::f32:
08686       return Select_ISD_FMUL_f32(N);
08687     case MVT::f64:
08688       return Select_ISD_FMUL_f64(N);
08689     case MVT::v4f32:
08690       return Select_ISD_FMUL_v4f32(N);
08691     default:
08692       break;
08693     }
08694     break;
08695   }
08696   case ISD::FNEG: {
08697     switch (NVT) {
08698     case MVT::f32:
08699       return Select_ISD_FNEG_f32(N);
08700     case MVT::f64:
08701       return Select_ISD_FNEG_f64(N);
08702     default:
08703       break;
08704     }
08705     break;
08706   }
08707   case ISD::FP_EXTEND: {
08708     switch (NVT) {
08709     case MVT::f64:
08710       return Select_ISD_FP_EXTEND_f64(N);
08711     default:
08712       break;
08713     }
08714     break;
08715   }
08716   case ISD::FP_ROUND: {
08717     switch (NVT) {
08718     case MVT::f32:
08719       return Select_ISD_FP_ROUND_f32(N);
08720     default:
08721       break;
08722     }
08723     break;
08724   }
08725   case ISD::FSQRT: {
08726     switch (NVT) {
08727     case MVT::f32:
08728       return Select_ISD_FSQRT_f32(N);
08729     case MVT::f64:
08730       return Select_ISD_FSQRT_f64(N);
08731     default:
08732       break;
08733     }
08734     break;
08735   }
08736   case ISD::FSUB: {
08737     switch (NVT) {
08738     case MVT::f32:
08739       return Select_ISD_FSUB_f32(N);
08740     case MVT::f64:
08741       return Select_ISD_FSUB_f64(N);
08742     case MVT::v4f32:
08743       return Select_ISD_FSUB_v4f32(N);
08744     default:
08745       break;
08746     }
08747     break;
08748   }
08749   case ISD::INTRINSIC_VOID: {
08750     switch (NVT) {
08751     default:
08752       return Select_ISD_INTRINSIC_VOID(N);
08753       break;
08754     }
08755     break;
08756   }
08757   case ISD::INTRINSIC_WO_CHAIN: {
08758     switch (NVT) {
08759     case MVT::v16i8:
08760       return Select_ISD_INTRINSIC_WO_CHAIN_v16i8(N);
08761     case MVT::v8i16:
08762       return Select_ISD_INTRINSIC_WO_CHAIN_v8i16(N);
08763     case MVT::v4i32:
08764       return Select_ISD_INTRINSIC_WO_CHAIN_v4i32(N);
08765     case MVT::v4f32:
08766       return Select_ISD_INTRINSIC_WO_CHAIN_v4f32(N);
08767     default:
08768       break;
08769     }
08770     break;
08771   }
08772   case ISD::INTRINSIC_W_CHAIN: {
08773     switch (NVT) {
08774     case MVT::v16i8:
08775       return Select_ISD_INTRINSIC_W_CHAIN_v16i8(N);
08776     case MVT::v8i16:
08777       return Select_ISD_INTRINSIC_W_CHAIN_v8i16(N);
08778     case MVT::v4i32:
08779       return Select_ISD_INTRINSIC_W_CHAIN_v4i32(N);
08780     default:
08781       break;
08782     }
08783     break;
08784   }
08785   case ISD::LOAD: {
08786     switch (NVT) {
08787     case MVT::i32:
08788       return Select_ISD_LOAD_i32(N);
08789     case MVT::i64:
08790       return Select_ISD_LOAD_i64(N);
08791     case MVT::f32:
08792       return Select_ISD_LOAD_f32(N);
08793     case MVT::f64:
08794       return Select_ISD_LOAD_f64(N);
08795     case MVT::v4i32:
08796       return Select_ISD_LOAD_v4i32(N);
08797     default:
08798       break;
08799     }
08800     break;
08801   }
08802   case ISD::MEMBARRIER: {
08803     switch (NVT) {
08804     default:
08805       return Select_ISD_MEMBARRIER(N);
08806       break;
08807     }
08808     break;
08809   }
08810   case ISD::MUL: {
08811     switch (NVT) {
08812     case MVT::i32:
08813       return Select_ISD_MUL_i32(N);
08814     case MVT::i64:
08815       return Select_ISD_MUL_i64(N);
08816     default:
08817       break;
08818     }
08819     break;
08820   }
08821   case ISD::MULHS: {
08822     switch (NVT) {
08823     case MVT::i32:
08824       return Select_ISD_MULHS_i32(N);
08825     case MVT::i64:
08826       return Select_ISD_MULHS_i64(N);
08827     default:
08828       break;
08829     }
08830     break;
08831   }
08832   case ISD::MULHU: {
08833     switch (NVT) {
08834     case MVT::i32:
08835       return Select_ISD_MULHU_i32(N);
08836     case MVT::i64:
08837       return Select_ISD_MULHU_i64(N);
08838     default:
08839       break;
08840     }
08841     break;
08842   }
08843   case ISD::OR: {
08844     switch (NVT) {
08845     case MVT::i32:
08846       return Select_ISD_OR_i32(N);
08847     case MVT::i64:
08848       return Select_ISD_OR_i64(N);
08849     case MVT::v4i32:
08850       return Select_ISD_OR_v4i32(N);
08851     default:
08852       break;
08853     }
08854     break;
08855   }
08856   case ISD::ROTL: {
08857     switch (NVT) {
08858     case MVT::i32:
08859       return Select_ISD_ROTL_i32(N);
08860     case MVT::i64:
08861       return Select_ISD_ROTL_i64(N);
08862     default:
08863       break;
08864     }
08865     break;
08866   }
08867   case ISD::SDIV: {
08868     switch (NVT) {
08869     case MVT::i32:
08870       return Select_ISD_SDIV_i32(N);
08871     case MVT::i64:
08872       return Select_ISD_SDIV_i64(N);
08873     default:
08874       break;
08875     }
08876     break;
08877   }
08878   case ISD::SHL: {
08879     switch (NVT) {
08880     case MVT::i32:
08881       return Select_ISD_SHL_i32(N);
08882     case MVT::i64:
08883       return Select_ISD_SHL_i64(N);
08884     default:
08885       break;
08886     }
08887     break;
08888   }
08889   case ISD::SIGN_EXTEND: {
08890     switch (NVT) {
08891     case MVT::i64:
08892       return Select_ISD_SIGN_EXTEND_i64(N);
08893     default:
08894       break;
08895     }
08896     break;
08897   }
08898   case ISD::SIGN_EXTEND_INREG: {
08899     switch (NVT) {
08900     case MVT::i32:
08901       return Select_ISD_SIGN_EXTEND_INREG_i32(N);
08902     case MVT::i64:
08903       return Select_ISD_SIGN_EXTEND_INREG_i64(N);
08904     default:
08905       break;
08906     }
08907     break;
08908   }
08909   case ISD::SRA: {
08910     switch (NVT) {
08911     case MVT::i32:
08912       return Select_ISD_SRA_i32(N);
08913     case MVT::i64:
08914       return Select_ISD_SRA_i64(N);
08915     default:
08916       break;
08917     }
08918     break;
08919   }
08920   case ISD::SRL: {
08921     switch (NVT) {
08922     case MVT::i32:
08923       return Select_ISD_SRL_i32(N);
08924     case MVT::i64:
08925       return Select_ISD_SRL_i64(N);
08926     default:
08927       break;
08928     }
08929     break;
08930   }
08931   case ISD::STORE: {
08932     switch (NVT) {
08933     default:
08934       if (TLI.getPointerTy() == NVT)
08935         return Select_ISD_STORE_iPTR(N);
08936       return Select_ISD_STORE(N);
08937       break;
08938     }
08939     break;
08940   }
08941   case ISD::SUB: {
08942     switch (NVT) {
08943     case MVT::i32:
08944       return Select_ISD_SUB_i32(N);
08945     case MVT::i64:
08946       return Select_ISD_SUB_i64(N);
08947     case MVT::v16i8:
08948       return Select_ISD_SUB_v16i8(N);
08949     case MVT::v8i16:
08950       return Select_ISD_SUB_v8i16(N);
08951     case MVT::v4i32:
08952       return Select_ISD_SUB_v4i32(N);
08953     default:
08954       break;
08955     }
08956     break;
08957   }
08958   case ISD::SUBC: {
08959     switch (NVT) {
08960     case MVT::i32:
08961       return Select_ISD_SUBC_i32(N);
08962     case MVT::i64:
08963       return Select_ISD_SUBC_i64(N);
08964     default:
08965       break;
08966     }
08967     break;
08968   }
08969   case ISD::SUBE: {
08970     switch (NVT) {
08971     case MVT::i32:
08972       return Select_ISD_SUBE_i32(N);
08973     case MVT::i64:
08974       return Select_ISD_SUBE_i64(N);
08975     default:
08976       break;
08977     }
08978     break;
08979   }
08980   case ISD::TRAP: {
08981     switch (NVT) {
08982     default:
08983       return Select_ISD_TRAP(N);
08984       break;
08985     }
08986     break;
08987   }
08988   case ISD::TRUNCATE: {
08989     switch (NVT) {
08990     case MVT::i32:
08991       return Select_ISD_TRUNCATE_i32(N);
08992     default:
08993       break;
08994     }
08995     break;
08996   }
08997   case ISD::UDIV: {
08998     switch (NVT) {
08999     case MVT::i32:
09000       return Select_ISD_UDIV_i32(N);
09001     case MVT::i64:
09002       return Select_ISD_UDIV_i64(N);
09003     default:
09004       break;
09005     }
09006     break;
09007   }
09008   case ISD::VECTOR_SHUFFLE: {
09009     switch (NVT) {
09010     case MVT::v16i8:
09011       return Select_ISD_VECTOR_SHUFFLE_v16i8(N);
09012     default:
09013       break;
09014     }
09015     break;
09016   }
09017   case ISD::XOR: {
09018     switch (NVT) {
09019     case MVT::i32:
09020       return Select_ISD_XOR_i32(N);
09021     case MVT::i64:
09022       return Select_ISD_XOR_i64(N);
09023     case MVT::v4i32:
09024       return Select_ISD_XOR_v4i32(N);
09025     default:
09026       break;
09027     }
09028     break;
09029   }
09030   case ISD::ZERO_EXTEND: {
09031     switch (NVT) {
09032     case MVT::i64:
09033       return Select_ISD_ZERO_EXTEND_i64(N);
09034     default:
09035       break;
09036     }
09037     break;
09038   }
09039   case PPCISD::BCTRL_ELF: {
09040     switch (NVT) {
09041     default:
09042       return Select_PPCISD_BCTRL_ELF(N);
09043       break;
09044     }
09045     break;
09046   }
09047   case PPCISD::BCTRL_Macho: {
09048     switch (NVT) {
09049     default:
09050       return Select_PPCISD_BCTRL_Macho(N);
09051       break;
09052     }
09053     break;
09054   }
09055   case PPCISD::CALL_ELF: {
09056     switch (NVT) {
09057     default:
09058       return Select_PPCISD_CALL_ELF(N);
09059       break;
09060     }
09061     break;
09062   }
09063   case PPCISD::CALL_Macho: {
09064     switch (NVT) {
09065     default:
09066       return Select_PPCISD_CALL_Macho(N);
09067       break;
09068     }
09069     break;
09070   }
09071   case PPCISD::DYNALLOC: {
09072     switch (NVT) {
09073     case MVT::i32:
09074       return Select_PPCISD_DYNALLOC_i32(N);
09075     case MVT::i64:
09076       return Select_PPCISD_DYNALLOC_i64(N);
09077     default:
09078       break;
09079     }
09080     break;
09081   }
09082   case PPCISD::EXTSW_32: {
09083     switch (NVT) {
09084     case MVT::i32:
09085       return Select_PPCISD_EXTSW_32_i32(N);
09086     default:
09087       break;
09088     }
09089     break;
09090   }
09091   case PPCISD::FADDRTZ: {
09092     switch (NVT) {
09093     case MVT::f64:
09094       return Select_PPCISD_FADDRTZ_f64(N);
09095     default:
09096       break;
09097     }
09098     break;
09099   }
09100   case PPCISD::FCFID: {
09101     switch (NVT) {
09102     case MVT::f64:
09103       return Select_PPCISD_FCFID_f64(N);
09104     default:
09105       break;
09106     }
09107     break;
09108   }
09109   case PPCISD::FCTIDZ: {
09110     switch (NVT) {
09111     case MVT::f64:
09112       return Select_PPCISD_FCTIDZ_f64(N);
09113     default:
09114       break;
09115     }
09116     break;
09117   }
09118   case PPCISD::FCTIWZ: {
09119     switch (NVT) {
09120     case MVT::f64:
09121       return Select_PPCISD_FCTIWZ_f64(N);
09122     default:
09123       break;
09124     }
09125     break;
09126   }
09127   case PPCISD::FSEL: {
09128     switch (NVT) {
09129     case MVT::f32:
09130       return Select_PPCISD_FSEL_f32(N);
09131     case MVT::f64:
09132       return Select_PPCISD_FSEL_f64(N);
09133     default:
09134       break;
09135     }
09136     break;
09137   }
09138   case PPCISD::Hi: {
09139     switch (NVT) {
09140     case MVT::i32:
09141       return Select_PPCISD_Hi_i32(N);
09142     case MVT::i64:
09143       return Select_PPCISD_Hi_i64(N);
09144     default:
09145       break;
09146     }
09147     break;
09148   }
09149   case PPCISD::LARX: {
09150     switch (NVT) {
09151     case MVT::i32:
09152       return Select_PPCISD_LARX_i32(N);
09153     case MVT::i64:
09154       return Select_PPCISD_LARX_i64(N);
09155     default:
09156       break;
09157     }
09158     break;
09159   }
09160   case PPCISD::LBRX: {
09161     switch (NVT) {
09162     case MVT::i32:
09163       return Select_PPCISD_LBRX_i32(N);
09164     default:
09165       break;
09166     }
09167     break;
09168   }
09169   case PPCISD::Lo: {
09170     switch (NVT) {
09171     case MVT::i32:
09172       return Select_PPCISD_Lo_i32(N);
09173     case MVT::i64:
09174       return Select_PPCISD_Lo_i64(N);
09175     default:
09176       break;
09177     }
09178     break;
09179   }
09180   case PPCISD::MFFS: {
09181     switch (NVT) {
09182     case MVT::f64:
09183       return Select_PPCISD_MFFS_f64(N);
09184     default:
09185       break;
09186     }
09187     break;
09188   }
09189   case PPCISD::MTCTR: {
09190     switch (NVT) {
09191     default:
09192       return Select_PPCISD_MTCTR(N);
09193       break;
09194     }
09195     break;
09196   }
09197   case PPCISD::MTFSB0: {
09198     switch (NVT) {
09199     default:
09200       return Select_PPCISD_MTFSB0(N);
09201       break;
09202     }
09203     break;
09204   }
09205   case PPCISD::MTFSB1: {
09206     switch (NVT) {
09207     default:
09208       return Select_PPCISD_MTFSB1(N);
09209       break;
09210     }
09211     break;
09212   }
09213   case PPCISD::MTFSF: {
09214     switch (NVT) {
09215     case MVT::f64:
09216       return Select_PPCISD_MTFSF_f64(N);
09217     default:
09218       break;
09219     }
09220     break;
09221   }
09222   case PPCISD::RET_FLAG: {
09223     switch (NVT) {
09224     default:
09225       return Select_PPCISD_RET_FLAG(N);
09226       break;
09227     }
09228     break;
09229   }
09230   case PPCISD::SHL: {
09231     switch (NVT) {
09232     case MVT::i32:
09233       return Select_PPCISD_SHL_i32(N);
09234     case MVT::i64:
09235       return Select_PPCISD_SHL_i64(N);
09236     default:
09237       break;
09238     }
09239     break;
09240   }
09241   case PPCISD::SRA: {
09242     switch (NVT) {
09243     case MVT::i32:
09244       return Select_PPCISD_SRA_i32(N);
09245     case MVT::i64:
09246       return Select_PPCISD_SRA_i64(N);
09247     default:
09248       break;
09249     }
09250     break;
09251   }
09252   case PPCISD::SRL: {
09253     switch (NVT) {
09254     case MVT::i32:
09255       return Select_PPCISD_SRL_i32(N);
09256     case MVT::i64:
09257       return Select_PPCISD_SRL_i64(N);
09258     default:
09259       break;
09260     }
09261     break;
09262   }
09263   case PPCISD::STBRX: {
09264     switch (NVT) {
09265     default:
09266       return Select_PPCISD_STBRX(N);
09267       break;
09268     }
09269     break;
09270   }
09271   case PPCISD::STCX: {
09272     switch (NVT) {
09273     default:
09274       return Select_PPCISD_STCX(N);
09275       break;
09276     }
09277     break;
09278   }
09279   case PPCISD::STD_32: {
09280     switch (NVT) {
09281     default:
09282       return Select_PPCISD_STD_32(N);
09283       break;
09284     }
09285     break;
09286   }
09287   case PPCISD::STFIWX: {
09288     switch (NVT) {
09289     default:
09290       return Select_PPCISD_STFIWX(N);
09291       break;
09292     }
09293     break;
09294   }
09295   case PPCISD::TC_RETURN: {
09296     switch (NVT) {
09297     default:
09298       return Select_PPCISD_TC_RETURN(N);
09299       break;
09300     }
09301     break;
09302   }
09303   case PPCISD::VCMP: {
09304     switch (NVT) {
09305     case MVT::v16i8:
09306       return Select_PPCISD_VCMP_v16i8(N);
09307     case MVT::v8i16:
09308       return Select_PPCISD_VCMP_v8i16(N);
09309     case MVT::v4i32:
09310       return Select_PPCISD_VCMP_v4i32(N);
09311     case MVT::v4f32:
09312       return Select_PPCISD_VCMP_v4f32(N);
09313     default:
09314       break;
09315     }
09316     break;
09317   }
09318   case PPCISD::VCMPo: {
09319     switch (NVT) {
09320     case MVT::v16i8:
09321       return Select_PPCISD_VCMPo_v16i8(N);
09322     case MVT::v8i16:
09323       return Select_PPCISD_VCMPo_v8i16(N);
09324     case MVT::v4i32:
09325       return Select_PPCISD_VCMPo_v4i32(N);
09326     case MVT::v4f32:
09327       return Select_PPCISD_VCMPo_v4f32(N);
09328     default:
09329       break;
09330     }
09331     break;
09332   }
09333   case PPCISD::VMADDFP: {
09334     switch (NVT) {
09335     case MVT::v4f32:
09336       return Select_PPCISD_VMADDFP_v4f32(N);
09337     default:
09338       break;
09339     }
09340     break;
09341   }
09342   case PPCISD::VNMSUBFP: {
09343     switch (NVT) {
09344     case MVT::v4f32:
09345       return Select_PPCISD_VNMSUBFP_v4f32(N);
09346     default:
09347       break;
09348     }
09349     break;
09350   }
09351   case PPCISD::VPERM: {
09352     switch (NVT) {
09353     case MVT::v16i8:
09354       return Select_PPCISD_VPERM_v16i8(N);
09355     default:
09356       break;
09357     }
09358     break;
09359   }
09360   } // end of big switch.
09361 
09362   if (N.getOpcode() != ISD::INTRINSIC_W_CHAIN &&
09363       N.getOpcode() != ISD::INTRINSIC_WO_CHAIN &&
09364       N.getOpcode() != ISD::INTRINSIC_VOID) {
09365     CannotYetSelect(N);
09366   } else {
09367     CannotYetSelectIntrinsic(N);
09368   }
09369   return NULL;
09370 }
09371 
09372 void CannotYetSelect(SDValue N) DISABLE_INLINE {
09373   cerr << "Cannot yet select: ";
09374   N.getNode()->dump(CurDAG);
09375   cerr << '\n';
09376   abort();
09377 }
09378 
09379 void CannotYetSelectIntrinsic(SDValue N) DISABLE_INLINE {
09380   cerr << "Cannot yet select: ";
09381   unsigned iid = cast<ConstantSDNode>(N.getOperand(N.getOperand(0).getValueType() == MVT::Other))->getZExtValue();
09382   cerr << "intrinsic %"<< Intrinsic::getName((Intrinsic::ID)iid);
09383   cerr << '\n';
09384   abort();
09385 }
09386