LLVM API Documentation
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