//===- TableGen'erated file -------------------------------------*- C++ -*-===// // // DAG Instruction Selector for the ARM target // // Automatically generated file, do not edit! // //===----------------------------------------------------------------------===// // *** NOTE: This file is #included into the middle of the target // *** instruction selector class. These functions are really methods. // Include standard, target-independent definitions and methods used // by the instruction selector. #include "llvm/CodeGen/DAGISelHeader.h" // Node transformations. inline SDValue Transform_DSubReg_f64_other_reg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(5 + (1 - N->getZExtValue()), MVT::i32); } inline SDValue Transform_DSubReg_f64_reg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(5 + N->getZExtValue(), MVT::i32); } inline SDValue Transform_DSubReg_i16_reg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(5 + N->getZExtValue() / 4, MVT::i32); } inline SDValue Transform_DSubReg_i32_reg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(5 + N->getZExtValue() / 2, MVT::i32); } inline SDValue Transform_DSubReg_i8_reg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(5 + N->getZExtValue() / 8, MVT::i32); } inline SDValue Transform_SSubReg_f32_reg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(1 + N->getZExtValue(), MVT::i32); } inline SDValue Transform_SubReg_i16_lane(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(N->getZExtValue() & 3, MVT::i32); } inline SDValue Transform_SubReg_i32_lane(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(N->getZExtValue() & 1, MVT::i32); } inline SDValue Transform_SubReg_i8_lane(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(N->getZExtValue() & 7, MVT::i32); } inline SDValue Transform_VMOV_get_imm16(SDNode *N) { return ARM::getVMOVImm(N, 2, *CurDAG); } inline SDValue Transform_VMOV_get_imm32(SDNode *N) { return ARM::getVMOVImm(N, 4, *CurDAG); } inline SDValue Transform_VMOV_get_imm64(SDNode *N) { return ARM::getVMOVImm(N, 8, *CurDAG); } inline SDValue Transform_VMOV_get_imm8(SDNode *N) { return ARM::getVMOVImm(N, 1, *CurDAG); } inline SDValue Transform_hi16(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant((uint32_t)N->getZExtValue() >> 16, MVT::i32); } inline SDValue Transform_imm_comp_XFORM(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(~((uint32_t)N->getZExtValue()), MVT::i32); } inline SDValue Transform_imm_neg_XFORM(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(-(int)N->getZExtValue(), MVT::i32); } inline SDValue Transform_lo16(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant((uint32_t)N->getZExtValue() & 0xffff, MVT::i32); } inline SDValue Transform_so_imm2part_1(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getSOImmTwoPartFirst((unsigned)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_so_imm2part_2(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getSOImmTwoPartSecond((unsigned)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_so_imm_neg_XFORM(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(-(int)N->getZExtValue(), MVT::i32); } inline SDValue Transform_so_imm_not_XFORM(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(~(int)N->getZExtValue(), MVT::i32); } inline SDValue Transform_so_neg_imm2part_1(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getSOImmTwoPartFirst(-(int)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_so_neg_imm2part_2(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getSOImmTwoPartSecond(-(int)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_t2_so_imm2part_1(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getT2SOImmTwoPartFirst((unsigned)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_t2_so_imm2part_2(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getT2SOImmTwoPartSecond((unsigned)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_t2_so_imm_neg_XFORM(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(-((int)N->getZExtValue()), MVT::i32); } inline SDValue Transform_t2_so_imm_not_XFORM(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return CurDAG->getTargetConstant(~((uint32_t)N->getZExtValue()), MVT::i32); } inline SDValue Transform_t2_so_neg_imm2part_1(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getT2SOImmTwoPartFirst(-(int)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_t2_so_neg_imm2part_2(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getT2SOImmTwoPartSecond(-(int)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_thumb_immshifted_shamt(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getThumbImmValShift((unsigned)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } inline SDValue Transform_thumb_immshifted_val(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned V = ARM_AM::getThumbImmNonShiftedVal((unsigned)N->getZExtValue()); return CurDAG->getTargetConstant(V, MVT::i32); } // Predicate functions. inline bool Predicate_atomic_cmp_swap_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_cmp_swap_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_cmp_swap_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_cmp_swap_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_add_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_add_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_add_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_add_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_and_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_and_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_and_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_and_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_max_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_max_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_max_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_max_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_min_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_min_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_min_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_min_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_nand_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_nand_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_nand_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_nand_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_or_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_or_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_or_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_or_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_sub_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_sub_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_sub_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_sub_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_umax_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_umax_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_umax_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_umax_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_umin_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_umin_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_umin_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_umin_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_load_xor_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_load_xor_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_load_xor_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_load_xor_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_atomic_swap_16(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_atomic_swap_32(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_atomic_swap_64(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i64; } inline bool Predicate_atomic_swap_8(SDNode *N) { return cast<AtomicSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_bf_inv_mask_imm(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); uint32_t v = (uint32_t)N->getZExtValue(); if (v == 0xffffffff) return 0; // there can be 1's on either or both "outsides", all the "inside" // bits must be 0's unsigned int lsb = 0, msb = 31; while (v & (1 << msb)) --msb; while (v & (1 << lsb)) ++lsb; for (unsigned int i = lsb; i <= msb; ++i) { if (v & (1 << i)) return 0; } return 1; } inline bool Predicate_cvtff(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FF; } inline bool Predicate_cvtfs(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FS; } inline bool Predicate_cvtfu(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_FU; } inline bool Predicate_cvtsf(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SF; } inline bool Predicate_cvtss(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SS; } inline bool Predicate_cvtsu(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_SU; } inline bool Predicate_cvtuf(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_UF; } inline bool Predicate_cvtus(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_US; } inline bool Predicate_cvtuu(SDNode *N) { return cast<CvtRndSatSDNode>(N)->getCvtCode() == ISD::CVT_UU; } inline bool Predicate_extload(SDNode *N) { return cast<LoadSDNode>(N)->getExtensionType() == ISD::EXTLOAD; } inline bool Predicate_extloadf32(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::f32; } inline bool Predicate_extloadf64(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::f64; } inline bool Predicate_extloadi1(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i1; } inline bool Predicate_extloadi16(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_extloadi32(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_extloadi8(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_imm0_255(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)N->getZExtValue() < 256; } inline bool Predicate_imm0_255_comp(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ~((uint32_t)N->getZExtValue()) < 256; } inline bool Predicate_imm0_255_neg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)(-N->getZExtValue()) < 255; } inline bool Predicate_imm0_31(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (int32_t)N->getZExtValue() < 32; } inline bool Predicate_imm0_4095(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)N->getZExtValue() < 4096; } inline bool Predicate_imm0_4095_neg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)(-N->getZExtValue()) < 4096; } inline bool Predicate_imm0_65535(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)N->getZExtValue() < 65536; } inline bool Predicate_imm0_7(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)N->getZExtValue() < 8; } inline bool Predicate_imm0_7_neg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)-N->getZExtValue() < 8; } inline bool Predicate_imm16_31(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (int32_t)N->getZExtValue() >= 16 && (int32_t)N->getZExtValue() < 32; } inline bool Predicate_imm1_15(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 16; } inline bool Predicate_imm1_31(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (int32_t)N->getZExtValue() >= 1 && (int32_t)N->getZExtValue() < 32; } inline bool Predicate_imm8_255(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return (uint32_t)N->getZExtValue() >= 8 && (uint32_t)N->getZExtValue() < 256; } inline bool Predicate_imm8_255_neg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); unsigned Val = -N->getZExtValue(); return Val >= 8 && Val < 256; } inline bool Predicate_immAllOnes(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return N->isAllOnesValue(); } inline bool Predicate_immAllOnesV(SDNode *N) { return ISD::isBuildVectorAllOnes(N); } inline bool Predicate_immAllOnesV_bc(SDNode *N) { return ISD::isBuildVectorAllOnes(N); } inline bool Predicate_immAllZerosV(SDNode *N) { return ISD::isBuildVectorAllZeros(N); } inline bool Predicate_immAllZerosV_bc(SDNode *N) { return ISD::isBuildVectorAllZeros(N); } inline bool Predicate_istore(SDNode *N) { return !cast<StoreSDNode>(N)->isTruncatingStore(); } inline bool Predicate_itruncstore(SDNode *N) { return cast<StoreSDNode>(N)->isTruncatingStore(); } inline bool Predicate_lo16AllZero(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); // Returns true if all low 16-bits are 0. return (((uint32_t)N->getZExtValue()) & 0xFFFFUL) == 0; } inline bool Predicate_load(SDNode *N) { return cast<LoadSDNode>(N)->getExtensionType() == ISD::NON_EXTLOAD; } inline bool Predicate_post_store(SDNode *N) { ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode(); return AM == ISD::POST_INC || AM == ISD::POST_DEC; } inline bool Predicate_post_truncst(SDNode *N) { ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode(); return AM == ISD::POST_INC || AM == ISD::POST_DEC; } inline bool Predicate_post_truncstf32(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f32; } inline bool Predicate_post_truncsti1(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i1; } inline bool Predicate_post_truncsti16(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_post_truncsti32(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_post_truncsti8(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_pre_store(SDNode *N) { ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode(); return AM == ISD::PRE_INC || AM == ISD::PRE_DEC; } inline bool Predicate_pre_truncst(SDNode *N) { ISD::MemIndexedMode AM = cast<StoreSDNode>(N)->getAddressingMode(); return AM == ISD::PRE_INC || AM == ISD::PRE_DEC; } inline bool Predicate_pre_truncstf32(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f32; } inline bool Predicate_pre_truncsti1(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i1; } inline bool Predicate_pre_truncsti16(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_pre_truncsti32(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_pre_truncsti8(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_rot_imm(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); int32_t v = (int32_t)N->getZExtValue(); return v == 8 || v == 16 || v == 24; } inline bool Predicate_sext_16_node(SDNode *N) { return CurDAG->ComputeNumSignBits(SDValue(N,0)) >= 17; } inline bool Predicate_sextload(SDNode *N) { return cast<LoadSDNode>(N)->getExtensionType() == ISD::SEXTLOAD; } inline bool Predicate_sextloadi1(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i1; } inline bool Predicate_sextloadi16(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_sextloadi32(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_sextloadi8(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_so_imm(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::getSOImmVal(N->getZExtValue()) != -1; } inline bool Predicate_so_imm2part(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::isSOImmTwoPartVal((unsigned)N->getZExtValue()); } inline bool Predicate_so_imm_neg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::getSOImmVal(-(int)N->getZExtValue()) != -1; } inline bool Predicate_so_imm_not(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::getSOImmVal(~(int)N->getZExtValue()) != -1; } inline bool Predicate_so_neg_imm2part(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::isSOImmTwoPartVal(-(int)N->getZExtValue()); } inline bool Predicate_store(SDNode *N) { return !cast<StoreSDNode>(N)->isTruncatingStore(); } inline bool Predicate_t2_so_imm(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::getT2SOImmVal((uint32_t)N->getZExtValue()) != -1; } inline bool Predicate_t2_so_imm2part(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::isT2SOImmTwoPartVal((unsigned)N->getZExtValue()); } inline bool Predicate_t2_so_imm_neg(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::getT2SOImmVal(-((int)N->getZExtValue())) != -1; } inline bool Predicate_t2_so_imm_not(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::getT2SOImmVal(~((uint32_t)N->getZExtValue())) != -1; } inline bool Predicate_t2_so_neg_imm2part(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::isT2SOImmTwoPartVal(-(int)N->getZExtValue()); } inline bool Predicate_thumb_immshifted(SDNode *inN) { ConstantSDNode *N = cast<ConstantSDNode>(inN); return ARM_AM::isThumbImmShiftedVal((unsigned)N->getZExtValue()); } inline bool Predicate_truncstore(SDNode *N) { return cast<StoreSDNode>(N)->isTruncatingStore(); } inline bool Predicate_truncstoref32(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f32; } inline bool Predicate_truncstoref64(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::f64; } inline bool Predicate_truncstorei16(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_truncstorei32(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_truncstorei8(SDNode *N) { return cast<StoreSDNode>(N)->getMemoryVT() == MVT::i8; } inline bool Predicate_unindexedload(SDNode *N) { return cast<LoadSDNode>(N)->getAddressingMode() == ISD::UNINDEXED; } inline bool Predicate_unindexedstore(SDNode *N) { return cast<StoreSDNode>(N)->getAddressingMode() == ISD::UNINDEXED; } inline bool Predicate_vfp_f32imm(SDNode *inN) { ConstantFPSDNode *N = cast<ConstantFPSDNode>(inN); return ARM::getVFPf32Imm(N->getValueAPF()) != -1; } inline bool Predicate_vfp_f64imm(SDNode *inN) { ConstantFPSDNode *N = cast<ConstantFPSDNode>(inN); return ARM::getVFPf64Imm(N->getValueAPF()) != -1; } inline bool Predicate_vmovImm16(SDNode *N) { return ARM::getVMOVImm(N, 2, *CurDAG).getNode() != 0; } inline bool Predicate_vmovImm32(SDNode *N) { return ARM::getVMOVImm(N, 4, *CurDAG).getNode() != 0; } inline bool Predicate_vmovImm64(SDNode *N) { return ARM::getVMOVImm(N, 8, *CurDAG).getNode() != 0; } inline bool Predicate_vmovImm8(SDNode *N) { return ARM::getVMOVImm(N, 1, *CurDAG).getNode() != 0; } inline bool Predicate_vtFP(SDNode *inN) { VTSDNode *N = cast<VTSDNode>(inN); return N->getVT().isFloatingPoint(); } inline bool Predicate_vtInt(SDNode *inN) { VTSDNode *N = cast<VTSDNode>(inN); return N->getVT().isInteger(); } inline bool Predicate_zextload(SDNode *N) { return cast<LoadSDNode>(N)->getExtensionType() == ISD::ZEXTLOAD; } inline bool Predicate_zextloadi1(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i1; } inline bool Predicate_zextloadi16(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i16; } inline bool Predicate_zextloadi32(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i32; } inline bool Predicate_zextloadi8(SDNode *N) { return cast<LoadSDNode>(N)->getMemoryVT() == MVT::i8; } DISABLE_INLINE SDNode *Emit_0(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue N4 = N->getOperand(4); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N4)->getZExtValue()), MVT::i32); SDValue Ops0[] = { N1, N2, N3, Tmp3, Chain }; return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, 5); } SDNode *Select_ARMISD_BR2_JT(SDNode *N) { if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N4 = N->getOperand(4); if (N4.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_0(N, ARM::t2BR_JT); return Result; } } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_1(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N3)->getZExtValue()), MVT::i32); SDValue Ops0[] = { N1, N2, Tmp2, Chain }; return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, 4); } DISABLE_INLINE SDNode *Emit_2(SDNode *N, unsigned Opc0, SDValue &CPTmpN11_0, SDValue &CPTmpN11_1, SDValue &CPTmpN11_2) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Chain1 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SmallVector<SDValue, 8> InChains; if (Chain.getNode() != N1.getNode()) { InChains.push_back(Chain); } InChains.push_back(Chain1); Chain1 = CurDAG->getNode(ISD::TokenFactor, N->getDebugLoc(), MVT::Other, &InChains[0], InChains.size()); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N3)->getZExtValue()), MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N1.getNode())->getMemOperand(); SDValue Ops0[] = { CPTmpN11_0, CPTmpN11_1, CPTmpN11_2, N2, Tmp2, Chain1 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, 6); Chain1 = SDValue(ResNode, 0); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); const SDValue Froms[] = { SDValue(N1.getNode(), 1), SDValue(N, 0) }; const SDValue Tos[] = { SDValue(ResNode, 0), SDValue(Chain1.getNode(), Chain1.getResNo()) }; ReplaceUses(Froms, Tos, 2); return ResNode; } DISABLE_INLINE SDNode *Emit_3(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N3)->getZExtValue()), MVT::i32); SDValue Ops0[] = { N10, N11, N2, Tmp3, Chain }; return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, 5); } SDNode *Select_ARMISD_BR_JT(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (ARMbrjt:isVoid (ld:i32 addrmode2:i32:$target)<<P:Predicate_unindexedload>><<P:Predicate_load>>, (tjumptable:i32):$jt, (imm:i32):$id) // Emits: (BR_JTm:isVoid addrmode2:i32:$target, (tjumptable:i32):$jt, (imm:i32):$id) // Pattern complexity = 25 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::LOAD && N1.hasOneUse() && IsLegalAndProfitableToFold(N1.getNode(), N, N) && (Chain.getNode() == N1.getNode() || IsChainCompatible(Chain.getNode(), N1.getNode()))) { SDValue Chain1 = N1.getNode()->getOperand(0); if (Predicate_unindexedload(N1.getNode()) && Predicate_load(N1.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); SDValue CPTmpN11_0; SDValue CPTmpN11_1; SDValue CPTmpN11_2; if (SelectAddrMode2(N, N11, CPTmpN11_0, CPTmpN11_1, CPTmpN11_2)) { SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_2(N, ARM::BR_JTm, CPTmpN11_0, CPTmpN11_1, CPTmpN11_2); return Result; } } } } } // Pattern: (ARMbrjt:isVoid (add:i32 GPR:i32:$target, GPR:i32:$idx), (tjumptable:i32):$jt, (imm:i32):$id) // Emits: (BR_JTadd:isVoid GPR:i32:$target, GPR:i32:$idx, (tjumptable:i32):$jt, (imm:i32):$id) // Pattern complexity = 12 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::ADD) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_3(N, ARM::BR_JTadd); return Result; } } } // Pattern: (ARMbrjt:isVoid GPR:i32:$target, (tjumptable:i32):$jt, (imm:i32):$id) // Emits: (BR_JTr:isVoid GPR:i32:$target, (tjumptable:i32):$jt, (imm:i32):$id) // Pattern complexity = 9 cost = 1 size = 0 SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_1(N, ARM::BR_JTr); return Result; } } } // Pattern: (ARMbrjt:isVoid tGPR:i32:$target, (tjumptable:i32):$jt, (imm:i32):$id) // Emits: (tBR_JTr:isVoid tGPR:i32:$target, (tjumptable:i32):$jt, (imm:i32):$id) // Pattern complexity = 9 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_1(N, ARM::tBR_JTr); return Result; } } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_4(SDNode *N, unsigned Opc0, unsigned NumInputRootOps) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); bool HasInFlag = (N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Flag); SmallVector<SDValue, 8> Ops0; SDValue InFlag(0, 0); if (HasInFlag) { InFlag = N->getOperand(N->getNumOperands()-1); } Ops0.push_back(N1); for (unsigned i = NumInputRootOps + 1, e = N->getNumOperands()-(HasInFlag?1:0); i != e; ++i) { Ops0.push_back(N->getOperand(i)); } Ops0.push_back(Chain); if (HasInFlag) Ops0.push_back(InFlag); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, MVT::Flag, &Ops0[0], Ops0.size()); Chain = SDValue(ResNode, 0); InFlag = SDValue(ResNode, 1); const SDValue Froms[] = { SDValue(N, 1), SDValue(N, 0) }; const SDValue Tos[] = { InFlag, SDValue(Chain.getNode(), Chain.getResNo()) }; ReplaceUses(Froms, Tos, 2); return ResNode; } SDNode *Select_ARMISD_CALL(SDNode *N) { // Pattern: (ARMcall:isVoid (tglobaladdr:iPTR):$func) // Emits: (BL:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_4(N, ARM::BL, 1); return Result; } } // Pattern: (ARMcall:isVoid (tglobaladdr:iPTR):$func) // Emits: (BLr9:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_4(N, ARM::BLr9, 1); return Result; } } // Pattern: (ARMcall:isVoid (tglobaladdr:iPTR):$func) // Emits: (tBLXi:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_4(N, ARM::tBLXi, 1); return Result; } } // Pattern: (ARMcall:isVoid (tglobaladdr:iPTR):$func) // Emits: (tBLXi_r9:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_4(N, ARM::tBLXi_r9, 1); return Result; } } // Pattern: (ARMcall:isVoid (texternalsym:iPTR):$func) // Emits: (tBLXi:isVoid (texternalsym:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetExternalSymbol) { SDNode *Result = Emit_4(N, ARM::tBLXi, 1); return Result; } } // Pattern: (ARMcall:isVoid (texternalsym:iPTR):$func) // Emits: (tBLXi_r9:isVoid (texternalsym:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetExternalSymbol) { SDNode *Result = Emit_4(N, ARM::tBLXi_r9, 1); return Result; } } // Pattern: (ARMcall:isVoid (texternalsym:iPTR):$func) // Emits: (BL:isVoid (texternalsym:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetExternalSymbol) { SDNode *Result = Emit_4(N, ARM::BL, 1); return Result; } } // Pattern: (ARMcall:isVoid (texternalsym:iPTR):$func) // Emits: (BLr9:isVoid (texternalsym:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetExternalSymbol) { SDNode *Result = Emit_4(N, ARM::BLr9, 1); return Result; } } // Pattern: (ARMcall:isVoid GPR:i32:$func) // Emits: (BLX:isVoid GPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::BLX, 1); return Result; } } // Pattern: (ARMcall:isVoid GPR:i32:$func) // Emits: (BLXr9:isVoid GPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::BLXr9, 1); return Result; } } // Pattern: (ARMcall:isVoid GPR:i32:$dst) // Emits: (tBLXr:isVoid GPR:i32:$dst) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::tBLXr, 1); return Result; } } // Pattern: (ARMcall:isVoid GPR:i32:$dst) // Emits: (tBLXr_r9:isVoid GPR:i32:$dst) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::tBLXr_r9, 1); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_CALL_NOLINK(SDNode *N) { // Pattern: (ARMcall_nolink:isVoid GPR:i32:$func) // Emits: (BX:isVoid GPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::BX, 1); return Result; } } // Pattern: (ARMcall_nolink:isVoid GPR:i32:$func) // Emits: (BXr9:isVoid GPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::BXr9, 1); return Result; } } // Pattern: (ARMcall_nolink:isVoid tGPR:i32:$func) // Emits: (tBX:isVoid tGPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::tBX, 1); return Result; } } // Pattern: (ARMcall_nolink:isVoid tGPR:i32:$func) // Emits: (tBXr9:isVoid tGPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::tBXr9, 1); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_5(SDNode *N, unsigned Opc0, unsigned NumInputRootOps) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); bool HasInFlag = (N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Flag); SmallVector<SDValue, 8> Ops0; SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag(0, 0); if (HasInFlag) { InFlag = N->getOperand(N->getNumOperands()-1); } Ops0.push_back(N1); Ops0.push_back(Tmp1); Ops0.push_back(Tmp2); for (unsigned i = NumInputRootOps + 1, e = N->getNumOperands()-(HasInFlag?1:0); i != e; ++i) { Ops0.push_back(N->getOperand(i)); } Ops0.push_back(Chain); if (HasInFlag) Ops0.push_back(InFlag); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, MVT::Flag, &Ops0[0], Ops0.size()); Chain = SDValue(ResNode, 0); InFlag = SDValue(ResNode, 1); const SDValue Froms[] = { SDValue(N, 1), SDValue(N, 0) }; const SDValue Tos[] = { InFlag, SDValue(Chain.getNode(), Chain.getResNo()) }; ReplaceUses(Froms, Tos, 2); return ResNode; } SDNode *Select_ARMISD_CALL_PRED(SDNode *N) { // Pattern: (ARMcall_pred:isVoid (tglobaladdr:iPTR):$func) // Emits: (BL_pred:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_5(N, ARM::BL_pred, 1); return Result; } } // Pattern: (ARMcall_pred:isVoid (tglobaladdr:iPTR):$func) // Emits: (BLr9_pred:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_5(N, ARM::BLr9_pred, 1); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_6(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_7(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_8(SDNode *N, unsigned Opc0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_9(SDNode *N, unsigned Opc0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } SDNode *Select_ARMISD_CMP(SDNode *N) { // Pattern: (ARMcmp:isVoid GPR:i32:$a, so_reg:i32:$b) // Emits: (CMPrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_8(N, ARM::CMPrs, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ARMcmp:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2CMPrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_9(N, ARM::t2CMPrs, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (ARMcmp:isVoid GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (CMPri:isVoid GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_6(N, ARM::CMPri); return Result; } } // Pattern: (ARMcmp:isVoid tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_255>>:$rhs) // Emits: (tCMPi8:isVoid tGPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_imm0_255(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_6(N, ARM::tCMPi8); return Result; } } // Pattern: (ARMcmp:isVoid GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2CMPri:isVoid GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_6(N, ARM::t2CMPri); return Result; } } // Pattern: (ARMcmp:isVoid GPR:i32:$a, GPR:i32:$b) // Emits: (CMPrr:isVoid GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_7(N, ARM::CMPrr); return Result; } } // Pattern: (ARMcmp:isVoid tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tCMPr:isVoid tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_7(N, ARM::tCMPr); return Result; } } // Pattern: (ARMcmp:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2CMPrr:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_7(N, ARM::t2CMPrr); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_CMPFP(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (arm_cmpfp:isVoid DPR:f64:$a, DPR:f64:$b) // Emits: (VCMPED:isVoid DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_7(N, ARM::VCMPED); return Result; } // Pattern: (arm_cmpfp:isVoid SPR:f32:$a, SPR:f32:$b) // Emits: (VCMPES:isVoid SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_7(N, ARM::VCMPES); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_10(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, N0, Tmp1, Tmp2); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } SDNode *Select_ARMISD_CMPFPw0(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); // Pattern: (arm_cmpfp0:isVoid DPR:f64:$a) // Emits: (VCMPEZD:isVoid DPR:f64:$a) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_10(N, ARM::VCMPEZD); return Result; } // Pattern: (arm_cmpfp0:isVoid SPR:f32:$a) // Emits: (VCMPEZS:isVoid SPR:f32:$a) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_10(N, ARM::VCMPEZS); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_11(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, Tmp3, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_12(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N01, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_13(SDNode *N, unsigned Opc0, SDValue &CPTmpN01_0, SDValue &CPTmpN01_1, SDValue &CPTmpN01_2) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_14(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp3, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_15(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N11, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_16(SDNode *N, unsigned Opc0, SDValue &CPTmpN11_0, SDValue &CPTmpN11_1, SDValue &CPTmpN11_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN11_0, CPTmpN11_1, CPTmpN11_2, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_17(SDNode *N, unsigned Opc0, SDValue &CPTmpN11_0, SDValue &CPTmpN11_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN11_0, CPTmpN11_1, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_18(SDNode *N, unsigned Opc0, SDValue &CPTmpN01_0, SDValue &CPTmpN01_1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, CPTmpN01_0, CPTmpN01_1, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_19(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_t2_so_imm_neg_XFORM(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_20(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_so_imm_neg_XFORM(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_21(SDNode *N, unsigned Opc0, SDValue &CPTmpN00_0, SDValue &CPTmpN00_1, SDValue &CPTmpN00_2) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_22(SDNode *N, unsigned Opc0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1, SDValue &CPTmpN0_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_23(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp3, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_24(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N01, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_25(SDNode *N, unsigned Opc0, SDValue &CPTmpN01_0, SDValue &CPTmpN01_1, SDValue &CPTmpN01_2) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_26(SDNode *N, unsigned Opc0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_27(SDNode *N, unsigned Opc0, SDValue &CPTmpN01_0, SDValue &CPTmpN01_1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN01_0, CPTmpN01_1, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_28(SDNode *N, unsigned Opc0, SDValue &CPTmpN00_0, SDValue &CPTmpN00_1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, CPTmpN00_0, CPTmpN00_1, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } SDNode *Select_ARMISD_CMPZ(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid (and:i32 GPR:i32:$a, so_reg:i32:$b), 0:i32) // Emits: (TSTrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 23 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue CPTmpN01_0; SDValue CPTmpN01_1; SDValue CPTmpN01_2; if (SelectShifterOperandReg(N, N01, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2)) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_13(N, ARM::TSTrs, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 GPR:i32:$a, so_reg:i32:$b), 0:i32) // Emits: (TEQrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 23 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue CPTmpN01_0; SDValue CPTmpN01_1; SDValue CPTmpN01_2; if (SelectShifterOperandReg(N, N01, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2)) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_13(N, ARM::TEQrs, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2); return Result; } } } } // Pattern: (ARMcmpZ:isVoid GPR:i32:$a, (sub:i32 0:i32, so_reg:i32:$b)) // Emits: (CMNzrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 23 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SUB) { SDValue N10 = N1.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N11 = N1.getNode()->getOperand(1); SDValue CPTmpN11_0; SDValue CPTmpN11_1; SDValue CPTmpN11_2; if (SelectShifterOperandReg(N, N11, CPTmpN11_0, CPTmpN11_1, CPTmpN11_2) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_16(N, ARM::CMNzrs, CPTmpN11_0, CPTmpN11_1, CPTmpN11_2); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (and:i32 so_reg:i32:$b, GPR:i32:$a), 0:i32) // Emits: (TSTrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 23 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue CPTmpN00_0; SDValue CPTmpN00_1; SDValue CPTmpN00_2; if (SelectShifterOperandReg(N, N00, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_21(N, ARM::TSTrs, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 so_reg:i32:$b, GPR:i32:$a), 0:i32) // Emits: (TEQrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 23 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue CPTmpN00_0; SDValue CPTmpN00_1; SDValue CPTmpN00_2; if (SelectShifterOperandReg(N, N00, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_21(N, ARM::TEQrs, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (sub:i32 0:i32, so_reg:i32:$b), GPR:i32:$a) // Emits: (CMNzrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 23 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SUB) { SDValue N00 = N0.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue CPTmpN01_0; SDValue CPTmpN01_1; SDValue CPTmpN01_2; if (SelectShifterOperandReg(N, N01, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2)) { SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_25(N, ARM::CMNzrs, CPTmpN01_0, CPTmpN01_1, CPTmpN01_2); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid GPR:i32:$lhs, (sub:i32 0:i32, t2_so_reg:i32:$rhs)) // Emits: (t2CMNzrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 20 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SUB) { SDValue N10 = N1.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N11 = N1.getNode()->getOperand(1); SDValue CPTmpN11_0; SDValue CPTmpN11_1; if (SelectT2ShifterOperandReg(N, N11, CPTmpN11_0, CPTmpN11_1) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_17(N, ARM::t2CMNzrs, CPTmpN11_0, CPTmpN11_1); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (and:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs), 0:i32) // Emits: (t2TSTrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 20 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue CPTmpN01_0; SDValue CPTmpN01_1; if (SelectT2ShifterOperandReg(N, N01, CPTmpN01_0, CPTmpN01_1)) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_18(N, ARM::t2TSTrs, CPTmpN01_0, CPTmpN01_1); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs), 0:i32) // Emits: (t2TEQrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 20 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue CPTmpN01_0; SDValue CPTmpN01_1; if (SelectT2ShifterOperandReg(N, N01, CPTmpN01_0, CPTmpN01_1)) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_18(N, ARM::t2TEQrs, CPTmpN01_0, CPTmpN01_1); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (sub:i32 0:i32, t2_so_reg:i32:$rhs), GPR:i32:$lhs) // Emits: (t2CMNzrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 20 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SUB) { SDValue N00 = N0.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue CPTmpN01_0; SDValue CPTmpN01_1; if (SelectT2ShifterOperandReg(N, N01, CPTmpN01_0, CPTmpN01_1)) { SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_27(N, ARM::t2CMNzrs, CPTmpN01_0, CPTmpN01_1); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (and:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs), 0:i32) // Emits: (t2TSTrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 20 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue CPTmpN00_0; SDValue CPTmpN00_1; if (SelectT2ShifterOperandReg(N, N00, CPTmpN00_0, CPTmpN00_1)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_28(N, ARM::t2TSTrs, CPTmpN00_0, CPTmpN00_1); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs), 0:i32) // Emits: (t2TEQrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 20 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue CPTmpN00_0; SDValue CPTmpN00_1; if (SelectT2ShifterOperandReg(N, N00, CPTmpN00_0, CPTmpN00_1)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_28(N, ARM::t2TEQrs, CPTmpN00_0, CPTmpN00_1); return Result; } } } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid (and:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b), 0:i32) // Emits: (TSTri:isVoid GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 15 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_11(N, ARM::TSTri); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b), 0:i32) // Emits: (TEQri:isVoid GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 15 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_11(N, ARM::TEQri); return Result; } } } } SDValue N1 = N->getOperand(1); // Pattern: (ARMcmpZ:isVoid GPR:i32:$a, so_reg:i32:$b) // Emits: (CMPzrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_8(N, ARM::CMPzrs, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ARMcmpZ:isVoid GPR:i32:$a, (sub:i32 0:i32, (imm:i32)<<P:Predicate_so_imm>>:$b)) // Emits: (CMNzri:isVoid GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 15 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::SUB) { SDValue N10 = N1.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N11.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_14(N, ARM::CMNzri); return Result; } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid GPR:i32:$lhs, (sub:i32 0:i32, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs)) // Emits: (t2CMNzri:isVoid GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SUB) { SDValue N10 = N1.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N11.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_14(N, ARM::t2CMNzri); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (and:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs), 0:i32) // Emits: (t2TSTri:isVoid GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 15 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_11(N, ARM::t2TSTri); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs), 0:i32) // Emits: (t2TEQri:isVoid GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 15 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_11(N, ARM::t2TEQri); return Result; } } } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid so_reg:i32:$b, GPR:i32:$a) // Emits: (CMPzrs:isVoid GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_22(N, ARM::CMPzrs, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } } // Pattern: (ARMcmpZ:isVoid (sub:i32 0:i32, (imm:i32)<<P:Predicate_so_imm>>:$b), GPR:i32:$a) // Emits: (CMNzri:isVoid GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 15 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SUB) { SDValue N00 = N0.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_23(N, ARM::CMNzri); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid (sub:i32 0:i32, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs), GPR:i32:$lhs) // Emits: (t2CMNzri:isVoid GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 15 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SUB) { SDValue N00 = N0.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_23(N, ARM::t2CMNzri); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2CMPzrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_9(N, ARM::t2CMPzrs, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (ARMcmpZ:isVoid t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2CMPzrs:isVoid GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_26(N, ARM::t2CMPzrs, CPTmpN0_0, CPTmpN0_1); return Result; } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid (and:i32 GPR:i32:$a, GPR:i32:$b), 0:i32) // Emits: (TSTrr:isVoid GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 11 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_12(N, ARM::TSTrr); return Result; } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 GPR:i32:$a, GPR:i32:$b), 0:i32) // Emits: (TEQrr:isVoid GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 11 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_12(N, ARM::TEQrr); return Result; } } } // Pattern: (ARMcmpZ:isVoid GPR:i32:$a, (sub:i32 0:i32, GPR:i32:$b)) // Emits: (CMNzrr:isVoid GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 11 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SUB) { SDValue N10 = N1.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N11 = N1.getNode()->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_15(N, ARM::CMNzrr); return Result; } } } } } if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid tGPR:i32:$lhs, (sub:i32 0:i32, tGPR:i32:$rhs)) // Emits: (tCMNz:isVoid tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 11 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SUB) { SDValue N10 = N1.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N11 = N1.getNode()->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_15(N, ARM::tCMNz); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (and:i32 tGPR:i32:$lhs, tGPR:i32:$rhs), 0:i32) // Emits: (tTST:isVoid tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 11 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_12(N, ARM::tTST); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMcmpZ:isVoid GPR:i32:$lhs, (sub:i32 0:i32, GPR:i32:$rhs)) // Emits: (t2CMNzrr:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 11 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SUB) { SDValue N10 = N1.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N11 = N1.getNode()->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_15(N, ARM::t2CMNzrr); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (and:i32 GPR:i32:$lhs, GPR:i32:$rhs), 0:i32) // Emits: (t2TSTrr:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 11 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_12(N, ARM::t2TSTrr); return Result; } } } // Pattern: (ARMcmpZ:isVoid (xor:i32 GPR:i32:$lhs, GPR:i32:$rhs), 0:i32) // Emits: (t2TEQrr:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 11 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_12(N, ARM::t2TEQrr); return Result; } } } } // Pattern: (ARMcmpZ:isVoid (sub:i32 0:i32, GPR:i32:$b), GPR:i32:$a) // Emits: (CMNzrr:isVoid GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 11 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SUB) { SDValue N00 = N0.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_24(N, ARM::CMNzrr); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (sub:i32 0:i32, tGPR:i32:$rhs), tGPR:i32:$lhs) // Emits: (tCMNz:isVoid tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 11 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SUB) { SDValue N00 = N0.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_24(N, ARM::tCMNz); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid (sub:i32 0:i32, GPR:i32:$rhs), GPR:i32:$lhs) // Emits: (t2CMNzrr:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 11 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SUB) { SDValue N00 = N0.getNode()->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_24(N, ARM::t2CMNzrr); return Result; } } } } } // Pattern: (ARMcmpZ:isVoid GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (CMPzri:isVoid GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_6(N, ARM::CMPzri); return Result; } } // Pattern: (ARMcmpZ:isVoid tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_255>>:$rhs) // Emits: (tCMPzi8:isVoid tGPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_imm0_255(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_6(N, ARM::tCMPzi8); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (ARMcmpZ:isVoid GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2CMPzri:isVoid GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_6(N, ARM::t2CMPzri); return Result; } // Pattern: (ARMcmpZ:isVoid GPR:i32:$src, (imm:i32)<<P:Predicate_t2_so_imm_neg>><<X:t2_so_imm_neg_XFORM>>:$imm) // Emits: (t2CMNzri:isVoid GPR:i32:$src, (t2_so_imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_t2_so_imm_neg>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm_neg(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_19(N, ARM::t2CMNzri); return Result; } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (ARMcmpZ:isVoid GPR:i32:$src, (imm:i32)<<P:Predicate_so_imm_neg>><<X:so_imm_neg_XFORM>>:$imm) // Emits: (CMNzri:isVoid GPR:i32:$src, (so_imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_so_imm_neg>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm_neg(N1.getNode()) && N0.getValueType() == MVT::i32) { SDNode *Result = Emit_20(N, ARM::CMNzri); return Result; } // Pattern: (ARMcmpZ:isVoid GPR:i32:$a, GPR:i32:$b) // Emits: (CMPzrr:isVoid GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_7(N, ARM::CMPzrr); return Result; } } // Pattern: (ARMcmpZ:isVoid tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tCMPzr:isVoid tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_7(N, ARM::tCMPzr); return Result; } } // Pattern: (ARMcmpZ:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2CMPzrr:isVoid GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_7(N, ARM::t2CMPzrr); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_29(SDNode *N, unsigned Opc0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); return CurDAG->SelectNodeTo(N, Opc0, MVT::i32, N0, N1); } SDNode *Select_ARMISD_EH_SJLJ_SETJMP_i32(SDNode *N) { // Pattern: (ARMeh_sjlj_setjmp:i32 GPR:i32:$src, GPR:i32:$val) // Emits: (Int_eh_sjlj_setjmp:isVoid GPR:i32:$src, GPR:i32:$val) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_29(N, ARM::Int_eh_sjlj_setjmp); return Result; } } // Pattern: (ARMeh_sjlj_setjmp:i32 tGPR:i32:$src, tGPR:i32:$val) // Emits: (tInt_eh_sjlj_setjmp:isVoid tGPR:i32:$src, tGPR:i32:$val) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_29(N, ARM::tInt_eh_sjlj_setjmp); return Result; } } // Pattern: (ARMeh_sjlj_setjmp:i32 GPR:i32:$src, tGPR:i32:$val) // Emits: (t2Int_eh_sjlj_setjmp:isVoid GPR:i32:$src, tGPR:i32:$val) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_29(N, ARM::t2Int_eh_sjlj_setjmp); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_30(SDNode *N, unsigned Opc0) { SDValue Tmp0 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp1 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(0); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Flag, Tmp0, Tmp1, InFlag); InFlag = SDValue(ResNode, 0); ReplaceUses(SDValue(N, 0), InFlag); return ResNode; } SDNode *Select_ARMISD_FMSTAT(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_30(N, ARM::FMSTAT); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_31(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0, Tmp1, Tmp2); } DISABLE_INLINE SDNode *Emit_32(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, unsigned Opc3, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2, MVT::SimpleValueType VT3) { SDValue N0 = N->getOperand(0); SDValue Tmp0(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0), 0); SDValue Tmp2 = CurDAG->getTargetConstant(0x1ULL, MVT::i32); SDValue Tmp3(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Tmp0, N0, Tmp2), 0); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp6(CurDAG->getMachineNode(Opc2, N->getDebugLoc(), VT2, Tmp3, Tmp4, Tmp5), 0); SDValue Tmp7 = CurDAG->getTargetConstant(0x1ULL, MVT::i32); return CurDAG->SelectNodeTo(N, Opc3, VT3, Tmp6, Tmp7); } SDNode *Select_ARMISD_FTOSI_f32(SDNode *N) { // Pattern: (arm_ftosi:f32 DPR:f64:$a) // Emits: (VTOSIZD:f32 DPR:f64:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_31(N, ARM::VTOSIZD, MVT::f32); return Result; } } // Pattern: (arm_ftosi:f32 SPR:f32:$a) // Emits: (VTOSIZS:f32 SPR:f32:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_31(N, ARM::VTOSIZS, MVT::f32); return Result; } } // Pattern: (arm_ftosi:f32 SPR:f32:$a) // Emits: (EXTRACT_SUBREG:f32 (VCVTf2sd_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$a, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 4 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_32(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VCVTf2sd_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f64, MVT::f64, MVT::f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_FTOUI_f32(SDNode *N) { // Pattern: (arm_ftoui:f32 DPR:f64:$a) // Emits: (VTOUIZD:f32 DPR:f64:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_31(N, ARM::VTOUIZD, MVT::f32); return Result; } } // Pattern: (arm_ftoui:f32 SPR:f32:$a) // Emits: (VTOUIZS:f32 SPR:f32:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_31(N, ARM::VTOUIZS, MVT::f32); return Result; } } // Pattern: (arm_ftoui:f32 SPR:f32:$a) // Emits: (EXTRACT_SUBREG:f32 (VCVTf2ud_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$a, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 4 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_32(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VCVTf2ud_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f64, MVT::f64, MVT::f32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_33(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Chain); } DISABLE_INLINE SDNode *Emit_34(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, N1, Chain); } SDNode *Select_ARMISD_MEMBARRIER(SDNode *N) { // Pattern: (ARMMemBarrierV7:isVoid) // Emits: (Int_MemBarrierV7:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV7Ops())) { SDNode *Result = Emit_33(N, ARM::Int_MemBarrierV7); return Result; } // Pattern: (ARMMemBarrierV6:isVoid GPR:i32:$zero) // Emits: (Int_MemBarrierV6:isVoid GPR:i32:$zero) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_34(N, ARM::Int_MemBarrierV6); return Result; } } // Pattern: (ARMMemBarrierV7:isVoid) // Emits: (t2Int_MemBarrierV7:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_33(N, ARM::t2Int_MemBarrierV7); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_35(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_36(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0, Tmp1); } DISABLE_INLINE SDNode *Emit_37(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue Chain0 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N0.getNode())->getMemOperand(); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, N010, Tmp1, Chain0); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); ReplaceUses(SDValue(N0.getNode(), 1), SDValue(ResNode, 1)); return ResNode; } SDNode *Select_ARMISD_PIC_ADD_i32(SDNode *N) { // Pattern: (ARMpic_add:i32 (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_load>>, (imm:i32):$cp) // Emits: (tLDRpci_pic:i32 (tconstpool:i32):$addr, (imm:i32):$cp) // Pattern complexity = 16 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::LOAD && N0.hasOneUse() && IsLegalAndProfitableToFold(N0.getNode(), N, N)) { SDValue Chain0 = N0.getNode()->getOperand(0); if (Predicate_unindexedload(N0.getNode()) && Predicate_load(N0.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::TargetConstantPool) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_37(N, ARM::tLDRpci_pic, MVT::i32); return Result; } } } } } } // Pattern: (ARMpic_add:i32 (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_load>>, (imm:i32):$cp) // Emits: (t2LDRpci_pic:i32 (tconstpool:i32):$addr, (imm:i32):$cp) // Pattern complexity = 16 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::LOAD && N0.hasOneUse() && IsLegalAndProfitableToFold(N0.getNode(), N, N)) { SDValue Chain0 = N0.getNode()->getOperand(0); if (Predicate_unindexedload(N0.getNode()) && Predicate_load(N0.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::TargetConstantPool) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_37(N, ARM::t2LDRpci_pic, MVT::i32); return Result; } } } } } } // Pattern: (ARMpic_add:i32 GPR:i32:$a, (imm:i32):$cp) // Emits: (PICADD:i32 GPR:i32:$a, (imm:i32):$cp) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::PICADD, MVT::i32); return Result; } } // Pattern: (ARMpic_add:i32 GPR:i32:$lhs, (imm:i32):$cp) // Emits: (tPICADD:i32 GPR:i32:$lhs, (imm:i32):$cp) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_36(N, ARM::tPICADD, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_RBIT_i32(SDNode *N) { // Pattern: (ARMrbit:i32 GPR:i32:$src) // Emits: (RBIT:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6T2Ops())) { SDNode *Result = Emit_31(N, ARM::RBIT, MVT::i32); return Result; } // Pattern: (ARMrbit:i32 GPR:i32:$src) // Emits: (t2RBIT:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_31(N, ARM::t2RBIT, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_38(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); bool HasInFlag = (N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Flag); SDValue Tmp0 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp1 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag(0, 0); if (HasInFlag) { InFlag = N->getOperand(N->getNumOperands()-1); } SDValue Ops0[] = { Tmp0, Tmp1, Chain, InFlag }; return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, HasInFlag ? 4 : 3); } DISABLE_INLINE SDNode *Emit_39(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); bool HasInFlag = (N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Flag); SDValue InFlag(0, 0); if (HasInFlag) { InFlag = N->getOperand(N->getNumOperands()-1); } SDValue Ops0[] = { Chain, InFlag }; return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, HasInFlag ? 2 : 1); } SDNode *Select_ARMISD_RET_FLAG(SDNode *N) { // Pattern: (ARMretflag:isVoid) // Emits: (BX_RET:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_38(N, ARM::BX_RET); return Result; } // Pattern: (ARMretflag:isVoid) // Emits: (tBX_RET:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb())) { SDNode *Result = Emit_39(N, ARM::tBX_RET); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_40(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(1); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3, InFlag }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ARMISD_RRX_i32(SDNode *N) { // Pattern: (ARMrrx:i32 GPR:i32:$src) // Emits: (MOVrx:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_40(N, ARM::MOVrx, MVT::i32); return Result; } // Pattern: (ARMrrx:i32 GPR:i32:$src) // Emits: (t2MOVrx:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_40(N, ARM::t2MOVrx, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_SITOF_f32(SDNode *N) { // Pattern: (arm_sitof:f32 SPR:f32:$a) // Emits: (VSITOS:f32 SPR:f32:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_31(N, ARM::VSITOS, MVT::f32); return Result; } // Pattern: (arm_sitof:f32 SPR:f32:$a) // Emits: (EXTRACT_SUBREG:f32 (VCVTs2fd_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2i32), SPR:f32:$a, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 4 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_32(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VCVTs2fd_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2i32, MVT::f64, MVT::f64, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_SITOF_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_31(N, ARM::VSITOD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_41(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, N0, Tmp1, Tmp2); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_42(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, N0); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } SDNode *Select_ARMISD_SRA_FLAG_i32(SDNode *N) { // Pattern: (ARMsra_flag:i32 GPR:i32:$src) // Emits: (MOVsra_flag:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_41(N, ARM::MOVsra_flag, MVT::i32); return Result; } // Pattern: (ARMsra_flag:i32 GPR:i32:$src) // Emits: (t2MOVsra_flag:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_42(N, ARM::t2MOVsra_flag, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_SRL_FLAG_i32(SDNode *N) { // Pattern: (ARMsrl_flag:i32 GPR:i32:$src) // Emits: (MOVsrl_flag:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_41(N, ARM::MOVsrl_flag, MVT::i32); return Result; } // Pattern: (ARMsrl_flag:i32 GPR:i32:$src) // Emits: (t2MOVsrl_flag:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_42(N, ARM::t2MOVsrl_flag, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_SYNCBARRIER(SDNode *N) { // Pattern: (ARMSyncBarrierV7:isVoid) // Emits: (Int_SyncBarrierV7:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV7Ops())) { SDNode *Result = Emit_33(N, ARM::Int_SyncBarrierV7); return Result; } // Pattern: (ARMSyncBarrierV6:isVoid GPR:i32:$zero) // Emits: (Int_SyncBarrierV6:isVoid GPR:i32:$zero) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_34(N, ARM::Int_SyncBarrierV6); return Result; } } // Pattern: (ARMSyncBarrierV7:isVoid) // Emits: (t2Int_SyncBarrierV7:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_33(N, ARM::t2Int_SyncBarrierV7); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_43(SDNode *N, unsigned Opc0) { return CurDAG->SelectNodeTo(N, Opc0, MVT::i32); } SDNode *Select_ARMISD_THREAD_POINTER_i32(SDNode *N) { // Pattern: (ARMthread_pointer:i32) // Emits: (TPsoft:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_43(N, ARM::TPsoft); return Result; } // Pattern: (ARMthread_pointer:i32) // Emits: (tTPsoft:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb())) { SDNode *Result = Emit_43(N, ARM::tTPsoft); return Result; } // Pattern: (ARMthread_pointer:i32) // Emits: (t2TPsoft:isVoid) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_43(N, ARM::t2TPsoft); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_UITOF_f32(SDNode *N) { // Pattern: (arm_uitof:f32 SPR:f32:$a) // Emits: (VUITOS:f32 SPR:f32:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_31(N, ARM::VUITOS, MVT::f32); return Result; } // Pattern: (arm_uitof:f32 SPR:f32:$a) // Emits: (EXTRACT_SUBREG:f32 (VCVTu2fd_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2i32), SPR:f32:$a, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 4 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_32(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VCVTu2fd_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2i32, MVT::f64, MVT::f64, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_UITOF_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_31(N, ARM::VUITOD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_44(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ARMISD_VCEQ_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_44(N, ARM::VCEQv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCEQ_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_44(N, ARM::VCEQv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCEQ_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_44(N, ARM::VCEQv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCEQ_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_44(N, ARM::VCEQv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCEQ_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (NEONvceq:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VCEQv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_44(N, ARM::VCEQv2i32, MVT::v2i32); return Result; } // Pattern: (NEONvceq:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VCEQfd:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_44(N, ARM::VCEQfd, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCEQ_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (NEONvceq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VCEQv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_44(N, ARM::VCEQv4i32, MVT::v4i32); return Result; } // Pattern: (NEONvceq:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VCEQfq:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_44(N, ARM::VCEQfq, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGE_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_44(N, ARM::VCGEsv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGE_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_44(N, ARM::VCGEsv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGE_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_44(N, ARM::VCGEsv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGE_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_44(N, ARM::VCGEsv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGE_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (NEONvcge:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VCGEsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_44(N, ARM::VCGEsv2i32, MVT::v2i32); return Result; } // Pattern: (NEONvcge:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VCGEfd:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_44(N, ARM::VCGEfd, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGE_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (NEONvcge:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VCGEsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_44(N, ARM::VCGEsv4i32, MVT::v4i32); return Result; } // Pattern: (NEONvcge:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VCGEfq:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_44(N, ARM::VCGEfq, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGEU_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_44(N, ARM::VCGEuv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGEU_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_44(N, ARM::VCGEuv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGEU_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_44(N, ARM::VCGEuv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGEU_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_44(N, ARM::VCGEuv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGEU_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_44(N, ARM::VCGEuv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGEU_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_44(N, ARM::VCGEuv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGT_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_44(N, ARM::VCGTsv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGT_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_44(N, ARM::VCGTsv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGT_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_44(N, ARM::VCGTsv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGT_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_44(N, ARM::VCGTsv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGT_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (NEONvcgt:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VCGTsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_44(N, ARM::VCGTsv2i32, MVT::v2i32); return Result; } // Pattern: (NEONvcgt:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VCGTfd:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_44(N, ARM::VCGTfd, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGT_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (NEONvcgt:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VCGTsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_44(N, ARM::VCGTsv4i32, MVT::v4i32); return Result; } // Pattern: (NEONvcgt:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VCGTfq:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_44(N, ARM::VCGTfq, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGTU_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_44(N, ARM::VCGTuv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGTU_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_44(N, ARM::VCGTuv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGTU_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_44(N, ARM::VCGTuv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGTU_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_44(N, ARM::VCGTuv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGTU_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_44(N, ARM::VCGTuv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VCGTU_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_44(N, ARM::VCGTuv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUP_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_31(N, ARM::VDUP8d, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUP_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_31(N, ARM::VDUP8q, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUP_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_31(N, ARM::VDUP16d, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUP_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_31(N, ARM::VDUP16q, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUP_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_31(N, ARM::VDUP32d, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUP_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_31(N, ARM::VDUP32q, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_45(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N00, Tmp1, Tmp2); } SDNode *Select_ARMISD_VDUP_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); // Pattern: (NEONvdup:v2f32 (bitconvert:f32 GPR:i32:$src)) // Emits: (VDUPfd:v2f32 GPR:i32:$src) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT) { SDValue N00 = N0.getNode()->getOperand(0); if (N0.getValueType() == MVT::f32 && N00.getValueType() == MVT::i32) { SDNode *Result = Emit_45(N, ARM::VDUPfd, MVT::v2f32); return Result; } } // Pattern: (NEONvdup:v2f32 SPR:f32:$src) // Emits: (VDUPfdf:v2f32 SPR:f32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_31(N, ARM::VDUPfdf, MVT::v2f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUP_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); // Pattern: (NEONvdup:v4f32 (bitconvert:f32 GPR:i32:$src)) // Emits: (VDUPfq:v4f32 GPR:i32:$src) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT) { SDValue N00 = N0.getNode()->getOperand(0); if (N0.getValueType() == MVT::f32 && N00.getValueType() == MVT::i32) { SDNode *Result = Emit_45(N, ARM::VDUPfq, MVT::v4f32); return Result; } } // Pattern: (NEONvdup:v4f32 SPR:f32:$src) // Emits: (VDUPfqf:v4f32 SPR:f32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_31(N, ARM::VDUPfqf, MVT::v4f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUPLANE_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_35(N, ARM::VDUPLN8d, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_46(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_DSubReg_i8_reg(Tmp1.getNode()); SDValue Tmp3(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp2), 0); SDValue Tmp4 = Transform_SubReg_i8_lane(Tmp1.getNode()); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp3, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 4); } SDNode *Select_ARMISD_VDUPLANE_v16i8(SDNode *N) { // Pattern: (NEONvduplane:v16i8 DPR:v8i8:$src, (imm:i32):$lane) // Emits: (VDUPLN8q:v16i8 DPR:v8i8:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_35(N, ARM::VDUPLN8q, MVT::v16i8); return Result; } } // Pattern: (NEONvduplane:v16i8 QPR:v16i8:$src, (imm:i32):$lane) // Emits: (VDUPLN8q:v16i8 (EXTRACT_SUBREG:v8i8 QPR:v16i8:$src, (DSubReg_i8_reg:i32 (imm:i32):$lane)), (SubReg_i8_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_46(N, TargetOpcode::EXTRACT_SUBREG, ARM::VDUPLN8q, MVT::v8i8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUPLANE_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_35(N, ARM::VDUPLN16d, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_47(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_DSubReg_i16_reg(Tmp1.getNode()); SDValue Tmp3(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp2), 0); SDValue Tmp4 = Transform_SubReg_i16_lane(Tmp1.getNode()); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp3, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 4); } SDNode *Select_ARMISD_VDUPLANE_v8i16(SDNode *N) { // Pattern: (NEONvduplane:v8i16 DPR:v4i16:$src, (imm:i32):$lane) // Emits: (VDUPLN16q:v8i16 DPR:v4i16:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_35(N, ARM::VDUPLN16q, MVT::v8i16); return Result; } } // Pattern: (NEONvduplane:v8i16 QPR:v8i16:$src, (imm:i32):$lane) // Emits: (VDUPLN16q:v8i16 (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_47(N, TargetOpcode::EXTRACT_SUBREG, ARM::VDUPLN16q, MVT::v4i16, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUPLANE_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_35(N, ARM::VDUPLN32d, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_48(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_DSubReg_i32_reg(Tmp1.getNode()); SDValue Tmp3(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp2), 0); SDValue Tmp4 = Transform_SubReg_i32_lane(Tmp1.getNode()); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp3, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 4); } SDNode *Select_ARMISD_VDUPLANE_v4i32(SDNode *N) { // Pattern: (NEONvduplane:v4i32 DPR:v2i32:$src, (imm:i32):$lane) // Emits: (VDUPLN32q:v4i32 DPR:v2i32:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_35(N, ARM::VDUPLN32q, MVT::v4i32); return Result; } } // Pattern: (NEONvduplane:v4i32 QPR:v4i32:$src, (imm:i32):$lane) // Emits: (VDUPLN32q:v4i32 (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_48(N, TargetOpcode::EXTRACT_SUBREG, ARM::VDUPLN32q, MVT::v2i32, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_49(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_f64_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp3), 0); SDValue Tmp5 = Transform_DSubReg_f64_other_reg(Tmp2.getNode()); return CurDAG->SelectNodeTo(N, Opc1, VT1, N0, Tmp4, Tmp5); } SDNode *Select_ARMISD_VDUPLANE_v2i64(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_49(N, TargetOpcode::EXTRACT_SUBREG, TargetOpcode::INSERT_SUBREG, MVT::i64, MVT::v2i64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUPLANE_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_35(N, ARM::VDUPLNfd, MVT::v2f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUPLANE_v4f32(SDNode *N) { // Pattern: (NEONvduplane:v4f32 DPR:v2f32:$src, (imm:i32):$lane) // Emits: (VDUPLNfq:v4f32 DPR:v2f32:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_35(N, ARM::VDUPLNfq, MVT::v4f32); return Result; } } // Pattern: (NEONvduplane:v4f32 QPR:v4f32:$src, (imm:i32):$lane) // Emits: (VDUPLNfq:v4f32 (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_48(N, TargetOpcode::EXTRACT_SUBREG, ARM::VDUPLNfq, MVT::v2f32, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VDUPLANE_v2f64(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2f64) { SDNode *Result = Emit_49(N, TargetOpcode::EXTRACT_SUBREG, TargetOpcode::INSERT_SUBREG, MVT::f64, MVT::v2f64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_50(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ARMISD_VEXT_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTd8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VEXT_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTq8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VEXT_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTd16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VEXT_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTq16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VEXT_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTd32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VEXT_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTq32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VEXT_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTdf, MVT::v2f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VEXT_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VEXTqf, MVT::v4f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VGETLANEs_i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (NEONvgetlanes:i32 DPR:v8i8:$src, (imm:i32):$lane) // Emits: (VGETLNs8:i32 DPR:v8i8:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_35(N, ARM::VGETLNs8, MVT::i32); return Result; } // Pattern: (NEONvgetlanes:i32 DPR:v4i16:$src, (imm:i32):$lane) // Emits: (VGETLNs16:i32 DPR:v4i16:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_35(N, ARM::VGETLNs16, MVT::i32); return Result; } } } SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (NEONvgetlanes:i32 QPR:v16i8:$src, (imm:i32):$lane) // Emits: (VGETLNs8:i32 (EXTRACT_SUBREG:v8i8 QPR:v16i8:$src, (DSubReg_i8_reg:i32 (imm:i32):$lane)), (SubReg_i8_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_46(N, TargetOpcode::EXTRACT_SUBREG, ARM::VGETLNs8, MVT::v8i8, MVT::i32); return Result; } // Pattern: (NEONvgetlanes:i32 QPR:v8i16:$src, (imm:i32):$lane) // Emits: (VGETLNs16:i32 (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_47(N, TargetOpcode::EXTRACT_SUBREG, ARM::VGETLNs16, MVT::v4i16, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VGETLANEu_i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (NEONvgetlaneu:i32 DPR:v8i8:$src, (imm:i32):$lane) // Emits: (VGETLNu8:i32 DPR:v8i8:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_35(N, ARM::VGETLNu8, MVT::i32); return Result; } // Pattern: (NEONvgetlaneu:i32 DPR:v4i16:$src, (imm:i32):$lane) // Emits: (VGETLNu16:i32 DPR:v4i16:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_35(N, ARM::VGETLNu16, MVT::i32); return Result; } } } SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (NEONvgetlaneu:i32 QPR:v16i8:$src, (imm:i32):$lane) // Emits: (VGETLNu8:i32 (EXTRACT_SUBREG:v8i8 QPR:v16i8:$src, (DSubReg_i8_reg:i32 (imm:i32):$lane)), (SubReg_i8_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_46(N, TargetOpcode::EXTRACT_SUBREG, ARM::VGETLNu8, MVT::v8i8, MVT::i32); return Result; } // Pattern: (NEONvgetlaneu:i32 QPR:v8i16:$src, (imm:i32):$lane) // Emits: (VGETLNu16:i32 (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_47(N, TargetOpcode::EXTRACT_SUBREG, ARM::VGETLNu16, MVT::v4i16, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VMOVDRR_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_44(N, ARM::VMOVDRR, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNs_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VQRSHRNsv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNs_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VQRSHRNsv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNs_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VQRSHRNsv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNsu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VQRSHRUNv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNsu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VQRSHRUNv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNsu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VQRSHRUNv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VQRSHRNuv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VQRSHRNuv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQRSHRNu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VQRSHRNuv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLs_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsiv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLsu_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLsuv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHLu_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VQSHLuiv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNs_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VQSHRNsv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNs_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VQSHRNsv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNs_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VQSHRNsv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNsu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VQSHRUNv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNsu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VQSHRUNv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNsu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VQSHRUNv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VQSHRNuv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VQSHRNuv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VQSHRNu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VQSHRNuv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV16_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV16d8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV16_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV16q8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV32_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV32d8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV32_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV32q8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV32_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV32d16, MVT::v4i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV32_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV32q16, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64d8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64q8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64d16, MVT::v4i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64q16, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64d32, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64q32, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64df, MVT::v2f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VREV64_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VREV64qf, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRN_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VRSHRNv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRN_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VRSHRNv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRN_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VRSHRNv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRs_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRsv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VRSHRu_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VRSHRuv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHL_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHLiv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLi_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_35(N, ARM::VSHLLi8, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLi_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_35(N, ARM::VSHLLi16, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLi_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_35(N, ARM::VSHLLi32, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLs_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_35(N, ARM::VSHLLsv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLs_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_35(N, ARM::VSHLLsv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLs_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_35(N, ARM::VSHLLsv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLu_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_35(N, ARM::VSHLLuv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLu_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_35(N, ARM::VSHLLuv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHLLu_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_35(N, ARM::VSHLLuv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRN_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_35(N, ARM::VSHRNv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRN_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_35(N, ARM::VSHRNv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRN_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_35(N, ARM::VSHRNv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRs_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRsv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSHRu_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::VSHRuv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSLI_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSLIv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv1i64, MVT::v1i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VSRI_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSRIv2i64, MVT::v2i64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VTST_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_44(N, ARM::VTSTv8i8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VTST_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_44(N, ARM::VTSTv16i8, MVT::v16i8); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VTST_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_44(N, ARM::VTSTv4i16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VTST_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_44(N, ARM::VTSTv8i16, MVT::v8i16); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VTST_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_44(N, ARM::VTSTv2i32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_VTST_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_44(N, ARM::VTSTv4i32, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_Wrapper_i32(SDNode *N) { // Pattern: (ARMWrapper:i32 (tglobaladdr:i32):$dst) // Emits: (t2LEApcrel:i32 (tglobaladdr:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!Subtarget->useMovt())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_31(N, ARM::t2LEApcrel, MVT::i32); return Result; } } // Pattern: (ARMWrapper:i32 (tconstpool:i32):$dst) // Emits: (t2LEApcrel:i32 (tconstpool:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_31(N, ARM::t2LEApcrel, MVT::i32); return Result; } } // Pattern: (ARMWrapper:i32 (tglobaladdr:i32):$dst) // Emits: (t2MOVi32imm:i32 (tglobaladdr:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (Subtarget->useMovt())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_31(N, ARM::t2MOVi32imm, MVT::i32); return Result; } } // Pattern: (ARMWrapper:i32 (tglobaladdr:i32):$dst) // Emits: (LEApcrel:i32 (tglobaladdr:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!Subtarget->useMovt())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_31(N, ARM::LEApcrel, MVT::i32); return Result; } } // Pattern: (ARMWrapper:i32 (tconstpool:i32):$dst) // Emits: (LEApcrel:i32 (tconstpool:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_31(N, ARM::LEApcrel, MVT::i32); return Result; } } // Pattern: (ARMWrapper:i32 (tglobaladdr:i32):$dst) // Emits: (MOVi32imm:i32 (tglobaladdr:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->useMovt())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_31(N, ARM::MOVi32imm, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); // Pattern: (ARMWrapper:i32 (tglobaladdr:i32):$dst) // Emits: (tLEApcrel:i32 (tglobaladdr:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_31(N, ARM::tLEApcrel, MVT::i32); return Result; } // Pattern: (ARMWrapper:i32 (tconstpool:i32):$dst) // Emits: (tLEApcrel:i32 (tconstpool:i32):$dst) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_31(N, ARM::tLEApcrel, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_WrapperJT_i32(SDNode *N) { // Pattern: (ARMWrapperJT:i32 (tjumptable:i32):$dst, (imm:i32):$id) // Emits: (t2LEApcrelJT:i32 (tjumptable:i32):$dst, (imm:i32):$id) // Pattern complexity = 9 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::t2LEApcrelJT, MVT::i32); return Result; } } } // Pattern: (ARMWrapperJT:i32 (tjumptable:i32):$dst, (imm:i32):$id) // Emits: (LEApcrelJT:i32 (tjumptable:i32):$dst, (imm:i32):$id) // Pattern complexity = 9 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::LEApcrelJT, MVT::i32); return Result; } } } // Pattern: (ARMWrapperJT:i32 (tjumptable:i32):$dst, (imm:i32):$id) // Emits: (tLEApcrelJT:i32 (tjumptable:i32):$dst, (imm:i32):$id) // Pattern complexity = 9 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::TargetJumpTable) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_35(N, ARM::tLEApcrelJT, MVT::i32); return Result; } } } CannotYetSelect(N); return NULL; } SDNode *Select_ARMISD_tCALL(SDNode *N) { // Pattern: (ARMtcall:isVoid (tglobaladdr:iPTR):$func) // Emits: (tBL:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_4(N, ARM::tBL, 1); return Result; } } if ((Subtarget->isThumb()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (ARMtcall:isVoid (tglobaladdr:iPTR):$func) // Emits: (tBLr9:isVoid (tglobaladdr:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::TargetGlobalAddress) { SDNode *Result = Emit_4(N, ARM::tBLr9, 1); return Result; } // Pattern: (ARMtcall:isVoid (texternalsym:iPTR):$func) // Emits: (tBLr9:isVoid (texternalsym:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::TargetExternalSymbol) { SDNode *Result = Emit_4(N, ARM::tBLr9, 1); return Result; } } // Pattern: (ARMtcall:isVoid (texternalsym:iPTR):$func) // Emits: (tBL:isVoid (texternalsym:i32):$func) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetExternalSymbol) { SDNode *Result = Emit_4(N, ARM::tBL, 1); return Result; } } // Pattern: (ARMtcall:isVoid GPR:i32:$func) // Emits: (tBLXr:isVoid GPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (!Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::tBLXr, 1); return Result; } } // Pattern: (ARMtcall:isVoid GPR:i32:$func) // Emits: (tBLXr_r9:isVoid GPR:i32:$func) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb()) && (Subtarget->hasV5TOps()) && (Subtarget->isTargetDarwin())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_4(N, ARM::tBLXr_r9, 1); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_51(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N10, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_52(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N101)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N100, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_53(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N10, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_54(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N101)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N100, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_55(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_56(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_57(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 7); } DISABLE_INLINE SDNode *Emit_58(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N01, N1, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_59(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N01, N1, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_60(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N110, N0, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_61(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N110, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_62(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N110, N0, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_63(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N1010, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_64(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N1010, N0, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_65(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_66(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, N1, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_67(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_imm_neg_XFORM(Tmp2.getNode()); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_68(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_69(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_imm_neg_XFORM(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_70(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_t2_so_imm_neg_XFORM(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_71(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_t2_so_imm2part_1(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, Ops0, 5), 0); SDValue Tmp7 = Transform_t2_so_imm2part_2(Tmp1.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp6, Tmp7, Tmp8, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_72(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_t2_so_neg_imm2part_1(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, Ops0, 5), 0); SDValue Tmp7 = Transform_t2_so_neg_imm2part_2(Tmp1.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp6, Tmp7, Tmp8, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_73(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_so_imm_neg_XFORM(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_74(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_so_imm2part_1(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, Ops0, 5), 0); SDValue Tmp7 = Transform_so_imm2part_2(Tmp1.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp6, Tmp7, Tmp8, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_75(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_so_neg_imm2part_1(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, Ops0, 5), 0); SDValue Tmp7 = Transform_so_neg_imm2part_2(Tmp1.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp6, Tmp7, Tmp8, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_76(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp11 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp12 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1000, N1100, N0, Tmp11, Tmp12 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_77(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N11, N0, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_78(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1000, N110, N0, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_79(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N110, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_80(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N1100, N0, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_81(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N11, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_82(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N1010 = N101.getNode()->getOperand(0); SDValue N10100 = N1010.getNode()->getOperand(0); SDValue N10101 = N1010.getNode()->getOperand(1); SDValue N1011 = N101.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N10100, N0, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_83(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N101, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_84(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N00, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_85(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N001)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N000, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_86(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N00, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_87(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N001)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N000, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_88(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1, SDValue &CPTmpN0_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 7); } DISABLE_INLINE SDNode *Emit_89(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N11, N0, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_90(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N010, N1, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_91(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N110, N100, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_92(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N010, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_93(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N010, N000, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_94(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N110, N100, N0, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_95(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N010, N1, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_96(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N010, N000, N1, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_97(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N101, N1000, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_98(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N0010, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_99(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N001, N0000, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_100(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N101, N1000, N0, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_101(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N0010, N1, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_102(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N001, N0000, N1, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_103(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_104(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp11 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp12 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1100, N1000, N0, Tmp11, Tmp12 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_105(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp11 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp12 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0000, N0100, N1, Tmp11, Tmp12 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_106(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp11 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp12 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0100, N0000, N1, Tmp11, Tmp12 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_107(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1100, N100, N0, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_108(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0000, N010, N1, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_109(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0100, N000, N1, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_110(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N11, N100, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_111(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N010, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_112(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, N000, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_113(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N110, N1000, N0, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_114(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N0100, N1, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_115(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N010, N0000, N1, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_116(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N110, N10, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_117(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N01, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_118(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N010, N00, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_119(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N10000 = N1000.getNode()->getOperand(0); SDValue N10001 = N1000.getNode()->getOperand(1); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N101, N10000, N0, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_120(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N0010 = N001.getNode()->getOperand(0); SDValue N00100 = N0010.getNode()->getOperand(0); SDValue N00101 = N0010.getNode()->getOperand(1); SDValue N0011 = N001.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N00100, N1, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_121(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp9 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp10 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N001, N00000, N1, Tmp9, Tmp10 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_122(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N101, N100, N0, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_123(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N001, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_124(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N001, N000, N1, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ISD_ADD_i32(SDNode *N) { if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp6) { int64_t CN7 = Tmp6->getSExtValue(); if (CN7 == INT64_C(16) && N1001.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32), (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32))) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 38 cost = 1 size = 0 { SDNode *Result = Emit_76(N, ARM::SMLABB, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32))) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 38 cost = 1 size = 0 SDNode *Result = Emit_104(N, ARM::SMLABB, MVT::i32); return Result; } } } } } } } } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6) { int64_t CN7 = Tmp6->getSExtValue(); if (CN7 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N0001.getValueType() == MVT::i32 && N001.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { // Pattern: (add:i32 (mul:i32 (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32), (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32)), GPR:i32:$acc) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 38 cost = 1 size = 0 { SDNode *Result = Emit_105(N, ARM::SMLABB, MVT::i32); return Result; } // Pattern: (add:i32 (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32)), GPR:i32:$acc) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 38 cost = 1 size = 0 SDNode *Result = Emit_106(N, ARM::SMLABB, MVT::i32); return Result; } } } } } } } } } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 255:i32)) // Emits: (UXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::ROTR) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_54(N, ARM::UXTABrr_rot, MVT::i32); return Result; } } // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 65535:i32)) // Emits: (UXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(65535)) && N10.getNode()->getOpcode() == ISD::ROTR) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_54(N, ARM::UXTAHrr_rot, MVT::i32); return Result; } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 255:i32)) // Emits: (t2UXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::ROTR) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_54(N, ARM::t2UXTABrr_rot, MVT::i32); return Result; } } // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 65535:i32)) // Emits: (t2UXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(65535)) && N10.getNode()->getOpcode() == ISD::ROTR) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_54(N, ARM::t2UXTAHrr_rot, MVT::i32); return Result; } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { // Pattern: (add:i32 (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 255:i32), GPR:i32:$LHS) // Emits: (UXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::ROTR) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_87(N, ARM::UXTABrr_rot, MVT::i32); return Result; } } } // Pattern: (add:i32 (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 65535:i32), GPR:i32:$LHS) // Emits: (UXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(65535)) && N00.getNode()->getOpcode() == ISD::ROTR) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_87(N, ARM::UXTAHrr_rot, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { // Pattern: (add:i32 (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 255:i32), GPR:i32:$LHS) // Emits: (t2UXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::ROTR) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_87(N, ARM::t2UXTABrr_rot, MVT::i32); return Result; } } } // Pattern: (add:i32 (and:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 65535:i32), GPR:i32:$LHS) // Emits: (t2UXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 34 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(65535)) && N00.getNode()->getOpcode() == ISD::ROTR) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_87(N, ARM::t2UXTAHrr_rot, MVT::i32); return Result; } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32), (sra:i32 GPR:i32:$b, 16:i32))) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 if (N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N1001.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_78(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32))) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_80(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32)), 16:i32)) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::SRA) { SDValue N1010 = N101.getNode()->getOperand(0); if (N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N10101.getValueType() == MVT::i32 && N1011.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_82(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32))) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_107(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32), (sra:i32 GPR:i32:$b, 16:i32)), GPR:i32:$acc) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 if (N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N0001.getValueType() == MVT::i32 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_108(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } } } } // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32)), GPR:i32:$acc) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_109(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), (sra:i32 GPR:i32:$a, 16:i32))) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N1001.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_113(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32)), GPR:i32:$acc) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_114(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } } } } } // Pattern: (add:i32 (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), (sra:i32 GPR:i32:$a, 16:i32)), GPR:i32:$acc) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 if (N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N0001.getValueType() == MVT::i32 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_115(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), GPR:i32:$a), 16:i32)) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::SRA) { SDValue N1000 = N100.getNode()->getOperand(0); if (N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N10001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_119(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } } } } } if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::MUL) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32)), 16:i32), GPR:i32:$acc) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::SRA) { SDValue N0010 = N001.getNode()->getOperand(0); if (N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N00101.getValueType() == MVT::i32 && N0011.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_120(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } } } } // Pattern: (add:i32 (sra:i32 (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), GPR:i32:$a), 16:i32), GPR:i32:$acc) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 30 cost = 1 size = 0 if (N000.getNode()->getOpcode() == ISD::SRA) { SDValue N0000 = N000.getNode()->getOperand(0); if (N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N00001.getValueType() == MVT::i32 && N0001.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_121(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 GPR:i32:$RHS, 255:i32)) // Emits: (UXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(255))) { SDNode *Result = Emit_53(N, ARM::UXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 GPR:i32:$RHS, 65535:i32)) // Emits: (UXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(65535))) { SDNode *Result = Emit_53(N, ARM::UXTAHrr, MVT::i32); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 GPR:i32:$RHS, 255:i32)) // Emits: (t2UXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(255))) { SDNode *Result = Emit_53(N, ARM::t2UXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (and:i32 GPR:i32:$RHS, 65535:i32)) // Emits: (t2UXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N10, Tmp0, INT64_C(65535))) { SDNode *Result = Emit_53(N, ARM::t2UXTAHrr, MVT::i32); return Result; } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { // Pattern: (add:i32 (and:i32 GPR:i32:$RHS, 255:i32), GPR:i32:$LHS) // Emits: (UXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(255))) { SDNode *Result = Emit_86(N, ARM::UXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 (and:i32 GPR:i32:$RHS, 65535:i32), GPR:i32:$LHS) // Emits: (UXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDNode *Result = Emit_86(N, ARM::UXTAHrr, MVT::i32); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { // Pattern: (add:i32 (and:i32 GPR:i32:$RHS, 255:i32), GPR:i32:$LHS) // Emits: (t2UXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(255))) { SDNode *Result = Emit_86(N, ARM::t2UXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 (and:i32 GPR:i32:$RHS, 65535:i32), GPR:i32:$LHS) // Emits: (t2UXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 27 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDNode *Result = Emit_86(N, ARM::t2UXTAHrr, MVT::i32); return Result; } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 GPR:i32:$b, 16:i32))) // Emits: (SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_62(N, ARM::SMLATT, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 GPR:i32:$b, 16:i32)), 16:i32)) // Emits: (SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::SRA) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N1011.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_64(N, ARM::SMLAWT, MVT::i32); return Result; } } } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 GPR:i32:$b, 16:i32))) // Emits: (t2SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_62(N, ARM::t2SMLATT, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 GPR:i32:$b, 16:i32)), 16:i32)) // Emits: (t2SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::SRA) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N1011.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_64(N, ARM::t2SMLAWT, MVT::i32); return Result; } } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 GPR:i32:$a, 16:i32))) // Emits: (SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_94(N, ARM::SMLATT, MVT::i32); return Result; } } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 GPR:i32:$b, 16:i32)), GPR:i32:$acc) // Emits: (SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDNode *Result = Emit_95(N, ARM::SMLATT, MVT::i32); return Result; } // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 GPR:i32:$a, 16:i32)), GPR:i32:$acc) // Emits: (SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 SDNode *Result = Emit_96(N, ARM::SMLATT, MVT::i32); return Result; } } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32:$a), 16:i32)) // Emits: (SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::SRA) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N1001.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_100(N, ARM::SMLAWT, MVT::i32); return Result; } } } } } } } } if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::MUL) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 GPR:i32:$b, 16:i32)), 16:i32), GPR:i32:$acc) // Emits: (SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::SRA) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N0011.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_101(N, ARM::SMLAWT, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 (sra:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32:$a), 16:i32), GPR:i32:$acc) // Emits: (SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 if (N000.getNode()->getOpcode() == ISD::SRA) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N0001.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_102(N, ARM::SMLAWT, MVT::i32); return Result; } } } } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 GPR:i32:$a, 16:i32))) // Emits: (t2SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N101.getValueType() == MVT::i32 && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_94(N, ARM::t2SMLATT, MVT::i32); return Result; } } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 GPR:i32:$b, 16:i32)), GPR:i32:$acc) // Emits: (t2SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDNode *Result = Emit_95(N, ARM::t2SMLATT, MVT::i32); return Result; } // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 GPR:i32:$a, 16:i32)), GPR:i32:$acc) // Emits: (t2SMLATT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 SDNode *Result = Emit_96(N, ARM::t2SMLATT, MVT::i32); return Result; } } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32:$a), 16:i32)) // Emits: (t2SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::SRA) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N1001.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_100(N, ARM::t2SMLAWT, MVT::i32); return Result; } } } } } } } } if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::MUL) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 GPR:i32:$b, 16:i32)), 16:i32), GPR:i32:$acc) // Emits: (t2SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::SRA) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N0011.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_101(N, ARM::t2SMLAWT, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 (sra:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32:$a), 16:i32), GPR:i32:$acc) // Emits: (t2SMLAWT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 22 cost = 1 size = 0 if (N000.getNode()->getOpcode() == ISD::SRA) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N0001.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_102(N, ARM::t2SMLAWT, MVT::i32); return Result; } } } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sra:i32 GPR:i32:$b, 16:i32))) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (cast<VTSDNode>(N101.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_61(N, ARM::SMLABT, MVT::i32); return Result; } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sext_inreg:i32 GPR:i32:$b, i16:Other))) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (cast<VTSDNode>(N111.getNode())->getVT() == MVT::i16 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_61(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 GPR:i32:$a, (sext_inreg:i32 GPR:i32:$b, i16:Other)), 16:i32)) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); if (cast<VTSDNode>(N1011.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_63(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sra:i32 GPR:i32:$b, 16:i32))) // Emits: (t2SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (cast<VTSDNode>(N101.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_61(N, ARM::t2SMLABT, MVT::i32); return Result; } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sext_inreg:i32 GPR:i32:$b, i16:Other))) // Emits: (t2SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (cast<VTSDNode>(N111.getNode())->getVT() == MVT::i16 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_61(N, ARM::t2SMLATB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 GPR:i32:$a, (sext_inreg:i32 GPR:i32:$b, i16:Other)), 16:i32)) // Emits: (t2SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); if (cast<VTSDNode>(N1011.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_63(N, ARM::t2SMLAWB, MVT::i32); return Result; } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sext_inreg:i32 GPR:i32:$a, i16:Other))) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (cast<VTSDNode>(N111.getNode())->getVT() == MVT::i16 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_91(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sra:i32 GPR:i32:$b, 16:i32)), GPR:i32:$acc) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N011.getValueType() == MVT::i32) { SDNode *Result = Emit_92(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sext_inreg:i32 GPR:i32:$a, i16:Other)), GPR:i32:$acc) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_93(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), (sra:i32 GPR:i32:$a, 16:i32))) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (cast<VTSDNode>(N101.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_91(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sext_inreg:i32 GPR:i32:$b, i16:Other)), GPR:i32:$acc) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_92(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), (sra:i32 GPR:i32:$a, 16:i32)), GPR:i32:$acc) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N011.getValueType() == MVT::i32) { SDNode *Result = Emit_93(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), GPR:i32:$a), 16:i32)) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); if (cast<VTSDNode>(N1001.getNode())->getVT() == MVT::i16) { SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_97(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::MUL) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (sra:i32 (mul:i32 GPR:i32:$a, (sext_inreg:i32 GPR:i32:$b, i16:Other)), 16:i32), GPR:i32:$acc) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); if (cast<VTSDNode>(N0011.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N01.getValueType() == MVT::i32) { SDNode *Result = Emit_98(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 (sra:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), GPR:i32:$a), 16:i32), GPR:i32:$acc) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N000.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); if (cast<VTSDNode>(N0001.getNode())->getVT() == MVT::i16) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N01.getValueType() == MVT::i32) { SDNode *Result = Emit_99(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sext_inreg:i32 GPR:i32:$a, i16:Other))) // Emits: (t2SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (cast<VTSDNode>(N111.getNode())->getVT() == MVT::i16 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_91(N, ARM::t2SMLABT, MVT::i32); return Result; } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sra:i32 GPR:i32:$b, 16:i32)), GPR:i32:$acc) // Emits: (t2SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N011.getValueType() == MVT::i32) { SDNode *Result = Emit_92(N, ARM::t2SMLABT, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sext_inreg:i32 GPR:i32:$a, i16:Other)), GPR:i32:$acc) // Emits: (t2SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_93(N, ARM::t2SMLABT, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), (sra:i32 GPR:i32:$a, 16:i32))) // Emits: (t2SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (cast<VTSDNode>(N101.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_91(N, ARM::t2SMLATB, MVT::i32); return Result; } } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sext_inreg:i32 GPR:i32:$b, i16:Other)), GPR:i32:$acc) // Emits: (t2SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_92(N, ARM::t2SMLATB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), (sra:i32 GPR:i32:$a, 16:i32)), GPR:i32:$acc) // Emits: (t2SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N011.getValueType() == MVT::i32) { SDNode *Result = Emit_93(N, ARM::t2SMLATB, MVT::i32); return Result; } } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), GPR:i32:$a), 16:i32)) // Emits: (t2SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); if (cast<VTSDNode>(N1001.getNode())->getVT() == MVT::i16) { SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_97(N, ARM::t2SMLAWB, MVT::i32); return Result; } } } } } } } if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::MUL) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (sra:i32 (mul:i32 GPR:i32:$a, (sext_inreg:i32 GPR:i32:$b, i16:Other)), 16:i32), GPR:i32:$acc) // Emits: (t2SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); if (cast<VTSDNode>(N0011.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N01.getValueType() == MVT::i32) { SDNode *Result = Emit_98(N, ARM::t2SMLAWB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 (sra:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), GPR:i32:$a), 16:i32), GPR:i32:$acc) // Emits: (t2SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 17 cost = 1 size = 0 if (N000.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); if (cast<VTSDNode>(N0001.getNode())->getVT() == MVT::i16) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N01.getValueType() == MVT::i32) { SDNode *Result = Emit_99(N, ARM::t2SMLAWB, MVT::i32); return Result; } } } } } } } } // Pattern: (add:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (ADDrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_57(N, ARM::ADDrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$a, (sra:i32 GPR:i32:$b, 16:i32))) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (Predicate_sext_16_node(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_79(N, ARM::SMLABT, MVT::i32); return Result; } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), GPR:i32<<P:Predicate_sext_16_node>>:$b)) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (Predicate_sext_16_node(N11.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_81(N, ARM::SMLATB, MVT::i32); return Result; } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 GPR:i32:$a, GPR:i32<<P:Predicate_sext_16_node>>:$b), 16:i32)) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (Predicate_sext_16_node(N101.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_83(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (ADDrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_88(N, ARM::ADDrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32<<P:Predicate_sext_16_node>>:$a)) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); if (Predicate_sext_16_node(N11.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_110(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$a, (sra:i32 GPR:i32:$b, 16:i32)), GPR:i32:$acc) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (Predicate_sext_16_node(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N011.getValueType() == MVT::i32) { SDNode *Result = Emit_111(N, ARM::SMLABT, MVT::i32); return Result; } } } } } // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32<<P:Predicate_sext_16_node>>:$a), GPR:i32:$acc) // Emits: (SMLABT:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (Predicate_sext_16_node(N01.getNode())) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_112(N, ARM::SMLABT, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$b, (sra:i32 GPR:i32:$a, 16:i32))) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (Predicate_sext_16_node(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SRA) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N111.getValueType() == MVT::i32) { SDNode *Result = Emit_116(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:i32 (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), GPR:i32<<P:Predicate_sext_16_node>>:$b), GPR:i32:$acc) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); if (Predicate_sext_16_node(N01.getNode())) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_117(N, ARM::SMLATB, MVT::i32); return Result; } } } } } // Pattern: (add:i32 (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$b, (sra:i32 GPR:i32:$a, 16:i32)), GPR:i32:$acc) // Emits: (SMLATB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (Predicate_sext_16_node(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N011.getValueType() == MVT::i32) { SDNode *Result = Emit_118(N, ARM::SMLATB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (sra:i32 (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$b, GPR:i32:$a), 16:i32)) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::MUL) { SDValue N100 = N10.getNode()->getOperand(0); if (Predicate_sext_16_node(N100.getNode())) { SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_122(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::MUL) { SDValue N000 = N00.getNode()->getOperand(0); // Pattern: (add:i32 (sra:i32 (mul:i32 GPR:i32:$a, GPR:i32<<P:Predicate_sext_16_node>>:$b), 16:i32), GPR:i32:$acc) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N001 = N00.getNode()->getOperand(1); if (Predicate_sext_16_node(N001.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N01.getValueType() == MVT::i32) { SDNode *Result = Emit_123(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } // Pattern: (add:i32 (sra:i32 (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$b, GPR:i32:$a), 16:i32), GPR:i32:$acc) // Emits: (SMLAWB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 15 cost = 1 size = 0 if (Predicate_sext_16_node(N000.getNode())) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N01.getValueType() == MVT::i32) { SDNode *Result = Emit_124(N, ARM::SMLAWB, MVT::i32); return Result; } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::ROTR) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N101.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i8:Other)) // Emits: (SXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i8 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_52(N, ARM::SXTABrr_rot, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i16:Other)) // Emits: (SXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_52(N, ARM::SXTAHrr_rot, MVT::i32); return Result; } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::ROTR) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N101.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i8:Other)) // Emits: (t2SXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i8 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_52(N, ARM::t2SXTABrr_rot, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i16:Other)) // Emits: (t2SXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_52(N, ARM::t2SXTAHrr_rot, MVT::i32); return Result; } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::ROTR) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N001.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); // Pattern: (add:i32 (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i8:Other), GPR:i32:$LHS) // Emits: (SXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i8) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_85(N, ARM::SXTABrr_rot, MVT::i32); return Result; } } // Pattern: (add:i32 (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i16:Other), GPR:i32:$LHS) // Emits: (SXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_85(N, ARM::SXTAHrr_rot, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::ROTR) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N001.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); // Pattern: (add:i32 (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i8:Other), GPR:i32:$LHS) // Emits: (t2SXTABrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i8) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_85(N, ARM::t2SXTABrr_rot, MVT::i32); return Result; } } // Pattern: (add:i32 (sext_inreg:i32 (rotr:i32 GPR:i32:$RHS, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i16:Other), GPR:i32:$LHS) // Emits: (t2SXTAHrr_rot:i32 GPR:i32:$LHS, GPR:i32:$RHS, (imm:i32):$rot) // Pattern complexity = 13 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N001.getValueType() == MVT::i32) { SDNode *Result = Emit_85(N, ARM::t2SXTAHrr_rot, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sext_inreg:i32 GPR:i32:$b, i16:Other))) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 12 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (cast<VTSDNode>(N101.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (cast<VTSDNode>(N111.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_60(N, ARM::SMLABB, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (add:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2ADDrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_68(N, ARM::t2ADDrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sext_inreg:i32 GPR:i32:$b, i16:Other))) // Emits: (t2SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 12 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (cast<VTSDNode>(N101.getNode())->getVT() == MVT::i16) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (cast<VTSDNode>(N111.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_60(N, ARM::t2SMLABB, MVT::i32); return Result; } } } } } } // Pattern: (add:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sext_inreg:i32 GPR:i32:$b, i16:Other)), GPR:i32:$acc) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 12 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_90(N, ARM::SMLABB, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (add:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2ADDrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_103(N, ARM::t2ADDrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (add:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sext_inreg:i32 GPR:i32:$b, i16:Other)), GPR:i32:$acc) // Emits: (t2SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 12 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_90(N, ARM::t2SMLABB, MVT::i32); return Result; } } } } } // Pattern: (add:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_imm0_255_neg>><<X:imm_neg_XFORM>>:$imm) // Emits: (t2SUBri:i32 GPR:i32:$src, (imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_imm0_255_neg>>:$imm)) // Pattern complexity = 8 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_imm0_255_neg(N1.getNode())) { SDNode *Result = Emit_69(N, ARM::t2SUBri, MVT::i32); return Result; } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); // Pattern: (add:i32 GPR:i32:$acc, (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$a, GPR:i32<<P:Predicate_sext_16_node>>:$b)) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 8 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); if (Predicate_sext_16_node(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (Predicate_sext_16_node(N11.getNode())) { SDNode *Result = Emit_77(N, ARM::SMLABB, MVT::i32); return Result; } } } } // Pattern: (add:i32 (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$a, GPR:i32<<P:Predicate_sext_16_node>>:$b), GPR:i32:$acc) // Emits: (SMLABB:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$acc) // Pattern complexity = 8 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (Predicate_sext_16_node(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (Predicate_sext_16_node(N01.getNode())) { SDNode *Result = Emit_59(N, ARM::SMLABB, MVT::i32); return Result; } } } } // Pattern: (add:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (ADDri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::ADDri, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (add:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_7>>:$rhs) // Emits: (tADDi3:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm0_7(N1.getNode())) { SDNode *Result = Emit_65(N, ARM::tADDi3, MVT::i32); return Result; } // Pattern: (add:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm8_255>>:$rhs) // Emits: (tADDi8:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm8_255(N1.getNode())) { SDNode *Result = Emit_65(N, ARM::tADDi8, MVT::i32); return Result; } // Pattern: (add:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_7_neg>><<X:imm_neg_XFORM>>:$rhs) // Emits: (tSUBi3:i32 tGPR:i32:$lhs, (imm_neg_XFORM:i32 (imm:i32):$rhs)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm0_7_neg(N1.getNode())) { SDNode *Result = Emit_67(N, ARM::tSUBi3, MVT::i32); return Result; } // Pattern: (add:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm8_255_neg>><<X:imm_neg_XFORM>>:$rhs) // Emits: (tSUBi8:i32 tGPR:i32:$lhs, (imm_neg_XFORM:i32 (imm:i32):$rhs)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm8_255_neg(N1.getNode())) { SDNode *Result = Emit_67(N, ARM::tSUBi8, MVT::i32); return Result; } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (add:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2ADDri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::t2ADDri, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_4095>>:$rhs) // Emits: (t2ADDri12:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm0_4095(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::t2ADDri12, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_t2_so_imm_neg>><<X:t2_so_imm_neg_XFORM>>:$imm) // Emits: (t2SUBri:i32 GPR:i32:$src, (t2_so_imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_t2_so_imm_neg>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm_neg(N1.getNode())) { SDNode *Result = Emit_70(N, ARM::t2SUBri, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_imm0_4095_neg>><<X:imm_neg_XFORM>>:$imm) // Emits: (t2SUBri12:i32 GPR:i32:$src, (imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_imm0_4095_neg>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm0_4095_neg(N1.getNode())) { SDNode *Result = Emit_69(N, ARM::t2SUBri12, MVT::i32); return Result; } } } // Pattern: (add:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_so_imm_neg>><<X:so_imm_neg_XFORM>>:$imm) // Emits: (SUBri:i32 GPR:i32:$src, (so_imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_so_imm_neg>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm_neg(N1.getNode())) { SDNode *Result = Emit_73(N, ARM::SUBri, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (add:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_t2_so_imm2part>>:$RHS) // Emits: (t2ADDri:i32 (t2ADDri:i32 GPR:i32:$LHS, (t2_so_imm2part_1:i32 (imm:i32):$RHS)), (t2_so_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 if (Predicate_t2_so_imm2part(N1.getNode())) { SDNode *Result = Emit_71(N, ARM::t2ADDri, ARM::t2ADDri, MVT::i32, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_t2_so_neg_imm2part>>:$RHS) // Emits: (t2SUBri:i32 (t2SUBri:i32 GPR:i32:$LHS, (t2_so_neg_imm2part_1:i32 (imm:i32):$RHS)), (t2_so_neg_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 if (Predicate_t2_so_neg_imm2part(N1.getNode())) { SDNode *Result = Emit_72(N, ARM::t2SUBri, ARM::t2SUBri, MVT::i32, MVT::i32); return Result; } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (add:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_so_imm2part>>:$RHS) // Emits: (ADDri:i32 (ADDri:i32 GPR:i32:$LHS, (so_imm2part_1:i32 (imm:i32):$RHS)), (so_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 if (Predicate_so_imm2part(N1.getNode())) { SDNode *Result = Emit_74(N, ARM::ADDri, ARM::ADDri, MVT::i32, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_so_neg_imm2part>>:$RHS) // Emits: (SUBri:i32 (SUBri:i32 GPR:i32:$LHS, (so_neg_imm2part_1:i32 (imm:i32):$RHS)), (so_neg_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 if (Predicate_so_neg_imm2part(N1.getNode())) { SDNode *Result = Emit_75(N, ARM::SUBri, ARM::SUBri, MVT::i32, MVT::i32); return Result; } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 GPR:i32:$RHS, i8:Other)) // Emits: (SXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i8) { SDNode *Result = Emit_51(N, ARM::SXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 GPR:i32:$RHS, i16:Other)) // Emits: (SXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_51(N, ARM::SXTAHrr, MVT::i32); return Result; } } } // Pattern: (add:i32 (mul:i32 GPR:i32:$a, GPR:i32:$b), GPR:i32:$c) // Emits: (MLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_58(N, ARM::MLA, MVT::i32); return Result; } } // Pattern: (add:i32 (mulhs:i32 GPR:i32:$a, GPR:i32:$b), GPR:i32:$c) // Emits: (SMMLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MULHS) { SDNode *Result = Emit_59(N, ARM::SMMLA, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 GPR:i32:$RHS, i8:Other)) // Emits: (t2SXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i8) { SDNode *Result = Emit_51(N, ARM::t2SXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$LHS, (sext_inreg:i32 GPR:i32:$RHS, i16:Other)) // Emits: (t2SXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_51(N, ARM::t2SXTAHrr, MVT::i32); return Result; } } } // Pattern: (add:i32 (mul:i32 GPR:i32:$a, GPR:i32:$b), GPR:i32:$c) // Emits: (t2MLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_59(N, ARM::t2MLA, MVT::i32); return Result; } // Pattern: (add:i32 (mulhs:i32 GPR:i32:$a, GPR:i32:$b), GPR:i32:$c) // Emits: (t2SMMLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MULHS) { SDNode *Result = Emit_59(N, ARM::t2SMMLA, MVT::i32); return Result; } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); // Pattern: (add:i32 (sext_inreg:i32 GPR:i32:$RHS, i8:Other), GPR:i32:$LHS) // Emits: (SXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i8) { SDNode *Result = Emit_84(N, ARM::SXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 (sext_inreg:i32 GPR:i32:$RHS, i16:Other), GPR:i32:$LHS) // Emits: (SXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_84(N, ARM::SXTAHrr, MVT::i32); return Result; } } } // Pattern: (add:i32 GPR:i32:$c, (mul:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (MLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_89(N, ARM::MLA, MVT::i32); return Result; } } // Pattern: (add:i32 GPR:i32:$c, (mulhs:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (SMMLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MULHS) { SDNode *Result = Emit_77(N, ARM::SMMLA, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); // Pattern: (add:i32 (sext_inreg:i32 GPR:i32:$RHS, i8:Other), GPR:i32:$LHS) // Emits: (t2SXTABrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i8) { SDNode *Result = Emit_84(N, ARM::t2SXTABrr, MVT::i32); return Result; } // Pattern: (add:i32 (sext_inreg:i32 GPR:i32:$RHS, i16:Other), GPR:i32:$LHS) // Emits: (t2SXTAHrr:i32 GPR:i32:$LHS, GPR:i32:$RHS) // Pattern complexity = 6 cost = 1 size = 0 if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_84(N, ARM::t2SXTAHrr, MVT::i32); return Result; } } SDValue N1 = N->getOperand(1); // Pattern: (add:i32 GPR:i32:$c, (mul:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (t2MLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_77(N, ARM::t2MLA, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$c, (mulhs:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (t2SMMLA:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MULHS) { SDNode *Result = Emit_77(N, ARM::t2SMMLA, MVT::i32); return Result; } } // Pattern: (add:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (ADDrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_56(N, ARM::ADDrr, MVT::i32); return Result; } // Pattern: (add:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tADDrr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_66(N, ARM::tADDrr, MVT::i32); return Result; } // Pattern: (add:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2ADDrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_56(N, ARM::t2ADDrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_125(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N10, N11, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_126(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N10, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_127(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N00, N01, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_128(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N00, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ISD_ADD_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); // Pattern: (add:v8i8 DPR:v8i8:$src1, (NEONvshrs:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 DPR:v8i8:$src1, (NEONvshru:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 DPR:v8i8:$src1, (NEONvrshrs:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 DPR:v8i8:$src1, (NEONvrshru:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv8i8, MVT::v8i8); return Result; } } } // Pattern: (add:v8i8 (NEONvshrs:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM), DPR:v8i8:$src1) // Emits: (VSRAsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 (NEONvshru:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM), DPR:v8i8:$src1) // Emits: (VSRAuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 (NEONvrshrs:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM), DPR:v8i8:$src1) // Emits: (VRSRAsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 (NEONvrshru:v8i8 DPR:v8i8:$src2, (imm:i32):$SIMM), DPR:v8i8:$src1) // Emits: (VRSRAuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 DPR:v8i8:$src1, (mul:v8i8 DPR:v8i8:$src2, DPR:v8i8:$src3)) // Emits: (VMLAv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLAv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 (mul:v8i8 DPR:v8i8:$src2, DPR:v8i8:$src3), DPR:v8i8:$src1) // Emits: (VMLAv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_127(N, ARM::VMLAv8i8, MVT::v8i8); return Result; } } // Pattern: (add:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VADDv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv8i8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ADD_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); // Pattern: (add:v16i8 QPR:v16i8:$src1, (NEONvshrs:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 QPR:v16i8:$src1, (NEONvshru:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 QPR:v16i8:$src1, (NEONvrshrs:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 QPR:v16i8:$src1, (NEONvrshru:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv16i8, MVT::v16i8); return Result; } } } // Pattern: (add:v16i8 (NEONvshrs:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM), QPR:v16i8:$src1) // Emits: (VSRAsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 (NEONvshru:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM), QPR:v16i8:$src1) // Emits: (VSRAuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 (NEONvrshrs:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM), QPR:v16i8:$src1) // Emits: (VRSRAsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 (NEONvrshru:v16i8 QPR:v16i8:$src2, (imm:i32):$SIMM), QPR:v16i8:$src1) // Emits: (VRSRAuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 QPR:v16i8:$src1, (mul:v16i8 QPR:v16i8:$src2, QPR:v16i8:$src3)) // Emits: (VMLAv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, QPR:v16i8:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLAv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 (mul:v16i8 QPR:v16i8:$src2, QPR:v16i8:$src3), QPR:v16i8:$src1) // Emits: (VMLAv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, QPR:v16i8:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_127(N, ARM::VMLAv16i8, MVT::v16i8); return Result; } } // Pattern: (add:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VADDv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv16i8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_129(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N111)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N10, N110, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_130(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N101)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N11, N100, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_131(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N011)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N00, N010, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_132(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N001)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N01, N000, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } SDNode *Select_ISD_ADD_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:v4i16 DPR:v4i16:$src1, (mul:v4i16 DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane))) // Emits: (VMLAslv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4i16) { SDNode *Result = Emit_129(N, ARM::VMLAslv4i16, MVT::v4i16); return Result; } } } // Pattern: (add:v4i16 DPR:v4i16:$src1, (mul:v4i16 (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane), DPR:v4i16:$src2)) // Emits: (VMLAslv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4i16) { SDNode *Result = Emit_130(N, ARM::VMLAslv4i16, MVT::v4i16); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:v4i16 (mul:v4i16 DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)), DPR:v4i16:$src1) // Emits: (VMLAslv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v4i16) { SDNode *Result = Emit_131(N, ARM::VMLAslv4i16, MVT::v4i16); return Result; } } } } // Pattern: (add:v4i16 (mul:v4i16 (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane), DPR:v4i16:$src2), DPR:v4i16:$src1) // Emits: (VMLAslv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v4i16) { SDNode *Result = Emit_132(N, ARM::VMLAslv4i16, MVT::v4i16); return Result; } } } } { SDValue N1 = N->getOperand(1); // Pattern: (add:v4i16 DPR:v4i16:$src1, (NEONvshrs:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 DPR:v4i16:$src1, (NEONvshru:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 DPR:v4i16:$src1, (NEONvrshrs:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 DPR:v4i16:$src1, (NEONvrshru:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv4i16, MVT::v4i16); return Result; } } } // Pattern: (add:v4i16 (NEONvshrs:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM), DPR:v4i16:$src1) // Emits: (VSRAsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 (NEONvshru:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM), DPR:v4i16:$src1) // Emits: (VSRAuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 (NEONvrshrs:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM), DPR:v4i16:$src1) // Emits: (VRSRAsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 (NEONvrshru:v4i16 DPR:v4i16:$src2, (imm:i32):$SIMM), DPR:v4i16:$src1) // Emits: (VRSRAuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 DPR:v4i16:$src1, (mul:v4i16 DPR:v4i16:$src2, DPR:v4i16:$src3)) // Emits: (VMLAv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLAv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 (mul:v4i16 DPR:v4i16:$src2, DPR:v4i16:$src3), DPR:v4i16:$src1) // Emits: (VMLAv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_127(N, ARM::VMLAv4i16, MVT::v4i16); return Result; } } // Pattern: (add:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VADDv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv4i16, MVT::v4i16); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_133(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N111)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i16_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N110, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i16_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N0, N10, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } DISABLE_INLINE SDNode *Emit_134(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N101)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i16_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N100, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i16_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N0, N11, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } DISABLE_INLINE SDNode *Emit_135(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N011)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i16_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N010, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i16_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, N00, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } DISABLE_INLINE SDNode *Emit_136(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N001)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i16_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N000, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i16_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, N01, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } SDNode *Select_ISD_ADD_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:v8i16 QPR:v8i16:$src1, (mul:v8i16 QPR:v8i16:$src2, (NEONvduplane:v8i16 DPR_8:v4i16:$src3, (imm:i32):$lane))) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4i16) { SDNode *Result = Emit_129(N, ARM::VMLAslv8i16, MVT::v8i16); return Result; } } } // Pattern: (add:v8i16 QPR:v8i16:$src1, (mul:v8i16 (NEONvduplane:v8i16 DPR_8:v4i16:$src3, (imm:i32):$lane), QPR:v8i16:$src2)) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4i16) { SDNode *Result = Emit_130(N, ARM::VMLAslv8i16, MVT::v8i16); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:v8i16 (mul:v8i16 QPR:v8i16:$src2, (NEONvduplane:v8i16 DPR_8:v4i16:$src3, (imm:i32):$lane)), QPR:v8i16:$src1) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v4i16) { SDNode *Result = Emit_131(N, ARM::VMLAslv8i16, MVT::v8i16); return Result; } } } } // Pattern: (add:v8i16 (mul:v8i16 (NEONvduplane:v8i16 DPR_8:v4i16:$src3, (imm:i32):$lane), QPR:v8i16:$src2), QPR:v8i16:$src1) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v4i16) { SDNode *Result = Emit_132(N, ARM::VMLAslv8i16, MVT::v8i16); return Result; } } } } } { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:v8i16 QPR:v8i16:$src1, (mul:v8i16 QPR:v8i16:$src2, (NEONvduplane:v8i16 QPR:v8i16:$src3, (imm:i32):$lane))) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src3, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v8i16) { SDNode *Result = Emit_133(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } // Pattern: (add:v8i16 QPR:v8i16:$src1, (mul:v8i16 (NEONvduplane:v8i16 QPR:v8i16:$src3, (imm:i32):$lane), QPR:v8i16:$src2)) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src3, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v8i16) { SDNode *Result = Emit_134(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:v8i16 (mul:v8i16 QPR:v8i16:$src2, (NEONvduplane:v8i16 QPR:v8i16:$src3, (imm:i32):$lane)), QPR:v8i16:$src1) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src3, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v8i16) { SDNode *Result = Emit_135(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } } // Pattern: (add:v8i16 (mul:v8i16 (NEONvduplane:v8i16 QPR:v8i16:$src3, (imm:i32):$lane), QPR:v8i16:$src2), QPR:v8i16:$src1) // Emits: (VMLAslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src3, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v8i16) { SDNode *Result = Emit_136(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } } } if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); // Pattern: (add:v8i16 QPR:v8i16:$src1, (NEONvshrs:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 QPR:v8i16:$src1, (NEONvshru:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 QPR:v8i16:$src1, (NEONvrshrs:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 QPR:v8i16:$src1, (NEONvrshru:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv8i16, MVT::v8i16); return Result; } } } // Pattern: (add:v8i16 (NEONvshrs:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM), QPR:v8i16:$src1) // Emits: (VSRAsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 (NEONvshru:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM), QPR:v8i16:$src1) // Emits: (VSRAuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 (NEONvrshrs:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM), QPR:v8i16:$src1) // Emits: (VRSRAsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 (NEONvrshru:v8i16 QPR:v8i16:$src2, (imm:i32):$SIMM), QPR:v8i16:$src1) // Emits: (VRSRAuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 QPR:v8i16:$src1, (mul:v8i16 QPR:v8i16:$src2, QPR:v8i16:$src3)) // Emits: (VMLAv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, QPR:v8i16:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLAv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 (mul:v8i16 QPR:v8i16:$src2, QPR:v8i16:$src3), QPR:v8i16:$src1) // Emits: (VMLAv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, QPR:v8i16:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_127(N, ARM::VMLAv8i16, MVT::v8i16); return Result; } } // Pattern: (add:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VADDv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv8i16, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ADD_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:v2i32 DPR:v2i32:$src1, (mul:v2i32 DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane))) // Emits: (VMLAslv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2i32) { SDNode *Result = Emit_129(N, ARM::VMLAslv2i32, MVT::v2i32); return Result; } } } // Pattern: (add:v2i32 DPR:v2i32:$src1, (mul:v2i32 (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane), DPR:v2i32:$src2)) // Emits: (VMLAslv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2i32) { SDNode *Result = Emit_130(N, ARM::VMLAslv2i32, MVT::v2i32); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:v2i32 (mul:v2i32 DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)), DPR:v2i32:$src1) // Emits: (VMLAslv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v2i32) { SDNode *Result = Emit_131(N, ARM::VMLAslv2i32, MVT::v2i32); return Result; } } } } // Pattern: (add:v2i32 (mul:v2i32 (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane), DPR:v2i32:$src2), DPR:v2i32:$src1) // Emits: (VMLAslv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v2i32) { SDNode *Result = Emit_132(N, ARM::VMLAslv2i32, MVT::v2i32); return Result; } } } } { SDValue N1 = N->getOperand(1); // Pattern: (add:v2i32 DPR:v2i32:$src1, (NEONvshrs:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 DPR:v2i32:$src1, (NEONvshru:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 DPR:v2i32:$src1, (NEONvrshrs:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 DPR:v2i32:$src1, (NEONvrshru:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv2i32, MVT::v2i32); return Result; } } } // Pattern: (add:v2i32 (NEONvshrs:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM), DPR:v2i32:$src1) // Emits: (VSRAsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 (NEONvshru:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM), DPR:v2i32:$src1) // Emits: (VSRAuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 (NEONvrshrs:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM), DPR:v2i32:$src1) // Emits: (VRSRAsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 (NEONvrshru:v2i32 DPR:v2i32:$src2, (imm:i32):$SIMM), DPR:v2i32:$src1) // Emits: (VRSRAuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 DPR:v2i32:$src1, (mul:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src3)) // Emits: (VMLAv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLAv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 (mul:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src3), DPR:v2i32:$src1) // Emits: (VMLAv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_127(N, ARM::VMLAv2i32, MVT::v2i32); return Result; } } // Pattern: (add:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VADDv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv2i32, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_137(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N111)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i32_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N110, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i32_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N0, N10, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } DISABLE_INLINE SDNode *Emit_138(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N101)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i32_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N100, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i32_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N0, N11, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } DISABLE_INLINE SDNode *Emit_139(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N011)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i32_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N010, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i32_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, N00, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } DISABLE_INLINE SDNode *Emit_140(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N001)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_DSubReg_i32_reg(Tmp3.getNode()); SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N000, Tmp4), 0); SDValue Tmp6 = Transform_SubReg_i32_lane(Tmp3.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, N01, Tmp5, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 6); } SDNode *Select_ISD_ADD_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:v4i32 QPR:v4i32:$src1, (mul:v4i32 QPR:v4i32:$src2, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane))) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2i32) { SDNode *Result = Emit_129(N, ARM::VMLAslv4i32, MVT::v4i32); return Result; } } } // Pattern: (add:v4i32 QPR:v4i32:$src1, (mul:v4i32 (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane), QPR:v4i32:$src2)) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2i32) { SDNode *Result = Emit_130(N, ARM::VMLAslv4i32, MVT::v4i32); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:v4i32 (mul:v4i32 QPR:v4i32:$src2, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)), QPR:v4i32:$src1) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v2i32) { SDNode *Result = Emit_131(N, ARM::VMLAslv4i32, MVT::v4i32); return Result; } } } } // Pattern: (add:v4i32 (mul:v4i32 (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane), QPR:v4i32:$src2), QPR:v4i32:$src1) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v2i32) { SDNode *Result = Emit_132(N, ARM::VMLAslv4i32, MVT::v4i32); return Result; } } } } } { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (add:v4i32 QPR:v4i32:$src1, (mul:v4i32 QPR:v4i32:$src2, (NEONvduplane:v4i32 QPR:v4i32:$src3, (imm:i32):$lane))) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4i32) { SDNode *Result = Emit_137(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } // Pattern: (add:v4i32 QPR:v4i32:$src1, (mul:v4i32 (NEONvduplane:v4i32 QPR:v4i32:$src3, (imm:i32):$lane), QPR:v4i32:$src2)) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4i32) { SDNode *Result = Emit_138(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (add:v4i32 (mul:v4i32 QPR:v4i32:$src2, (NEONvduplane:v4i32 QPR:v4i32:$src3, (imm:i32):$lane)), QPR:v4i32:$src1) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v4i32) { SDNode *Result = Emit_139(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } } // Pattern: (add:v4i32 (mul:v4i32 (NEONvduplane:v4i32 QPR:v4i32:$src3, (imm:i32):$lane), QPR:v4i32:$src2), QPR:v4i32:$src1) // Emits: (VMLAslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v4i32) { SDNode *Result = Emit_140(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } } } if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); // Pattern: (add:v4i32 QPR:v4i32:$src1, (NEONvshrs:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 QPR:v4i32:$src1, (NEONvshru:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 QPR:v4i32:$src1, (NEONvrshrs:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 QPR:v4i32:$src1, (NEONvrshru:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv4i32, MVT::v4i32); return Result; } } } // Pattern: (add:v4i32 (NEONvshrs:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM), QPR:v4i32:$src1) // Emits: (VSRAsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 (NEONvshru:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM), QPR:v4i32:$src1) // Emits: (VSRAuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 (NEONvrshrs:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM), QPR:v4i32:$src1) // Emits: (VRSRAsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 (NEONvrshru:v4i32 QPR:v4i32:$src2, (imm:i32):$SIMM), QPR:v4i32:$src1) // Emits: (VRSRAuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 QPR:v4i32:$src1, (mul:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src3)) // Emits: (VMLAv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLAv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 (mul:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src3), QPR:v4i32:$src1) // Emits: (VMLAv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_127(N, ARM::VMLAv4i32, MVT::v4i32); return Result; } } // Pattern: (add:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VADDv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv4i32, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ADD_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); // Pattern: (add:v1i64 DPR:v1i64:$src1, (NEONvshrs:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv1i64, MVT::v1i64); return Result; } } // Pattern: (add:v1i64 DPR:v1i64:$src1, (NEONvshru:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv1i64, MVT::v1i64); return Result; } } // Pattern: (add:v1i64 DPR:v1i64:$src1, (NEONvrshrs:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv1i64, MVT::v1i64); return Result; } } // Pattern: (add:v1i64 DPR:v1i64:$src1, (NEONvrshru:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv1i64, MVT::v1i64); return Result; } } } // Pattern: (add:v1i64 (NEONvshrs:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM), DPR:v1i64:$src1) // Emits: (VSRAsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv1i64, MVT::v1i64); return Result; } } // Pattern: (add:v1i64 (NEONvshru:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM), DPR:v1i64:$src1) // Emits: (VSRAuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv1i64, MVT::v1i64); return Result; } } // Pattern: (add:v1i64 (NEONvrshrs:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM), DPR:v1i64:$src1) // Emits: (VRSRAsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv1i64, MVT::v1i64); return Result; } } // Pattern: (add:v1i64 (NEONvrshru:v1i64 DPR:v1i64:$src2, (imm:i32):$SIMM), DPR:v1i64:$src1) // Emits: (VRSRAuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv1i64, MVT::v1i64); return Result; } } } // Pattern: (add:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VADDv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv1i64, MVT::v1i64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ADD_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); // Pattern: (add:v2i64 QPR:v2i64:$src1, (NEONvshrs:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM)) // Emits: (VSRAsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAsv2i64, MVT::v2i64); return Result; } } // Pattern: (add:v2i64 QPR:v2i64:$src1, (NEONvshru:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM)) // Emits: (VSRAuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VSRAuv2i64, MVT::v2i64); return Result; } } // Pattern: (add:v2i64 QPR:v2i64:$src1, (NEONvrshrs:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAsv2i64, MVT::v2i64); return Result; } } // Pattern: (add:v2i64 QPR:v2i64:$src1, (NEONvrshru:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM)) // Emits: (VRSRAuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_126(N, ARM::VRSRAuv2i64, MVT::v2i64); return Result; } } } // Pattern: (add:v2i64 (NEONvshrs:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM), QPR:v2i64:$src1) // Emits: (VSRAsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAsv2i64, MVT::v2i64); return Result; } } // Pattern: (add:v2i64 (NEONvshru:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM), QPR:v2i64:$src1) // Emits: (VSRAuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VSRAuv2i64, MVT::v2i64); return Result; } } // Pattern: (add:v2i64 (NEONvrshrs:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM), QPR:v2i64:$src1) // Emits: (VRSRAsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRs) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAsv2i64, MVT::v2i64); return Result; } } // Pattern: (add:v2i64 (NEONvrshru:v2i64 QPR:v2i64:$src2, (imm:i32):$SIMM), QPR:v2i64:$src1) // Emits: (VRSRAuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2, (imm:i32):$SIMM) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VRSHRu) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_128(N, ARM::VRSRAuv2i64, MVT::v2i64); return Result; } } } // Pattern: (add:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VADDv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDv2i64, MVT::v2i64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_141(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_142(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_143(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_144(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_145(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, Tmp2, Tmp3, Tmp4 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_146(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, N1, Tmp3, Tmp4 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_147(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_imm_neg_XFORM(Tmp2.getNode()); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, Tmp3, Tmp4, Tmp5 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_148(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1, SDValue &CPTmpN0_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 6); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_149(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 5); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } SDNode *Select_ISD_ADDC_i32(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (addc:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (ADDSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_143(N, ARM::ADDSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (addc:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (ADDSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_148(N, ARM::ADDSrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (addc:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2ADDSrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_144(N, ARM::t2ADDSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (addc:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2ADDSrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_149(N, ARM::t2ADDSrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (addc:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (ADDSri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_141(N, ARM::ADDSri, MVT::i32); return Result; } } // Pattern: (addc:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2ADDSri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_141(N, ARM::t2ADDSri, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (addc:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_7>>:$rhs) // Emits: (tADDi3:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_7>>:$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm0_7(N1.getNode())) { SDNode *Result = Emit_145(N, ARM::tADDi3, MVT::i32); return Result; } // Pattern: (addc:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm8_255>>:$rhs) // Emits: (tADDi8:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm8_255>>:$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm8_255(N1.getNode())) { SDNode *Result = Emit_145(N, ARM::tADDi8, MVT::i32); return Result; } // Pattern: (addc:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_7_neg>><<X:imm_neg_XFORM>>:$rhs) // Emits: (tSUBi3:i32 tGPR:i32:$lhs, (imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_imm0_7_neg>>:$rhs)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm0_7_neg(N1.getNode())) { SDNode *Result = Emit_147(N, ARM::tSUBi3, MVT::i32); return Result; } // Pattern: (addc:i32 tGPR:i32:$lhs, (imm:i32)<<P:Predicate_imm8_255_neg>><<X:imm_neg_XFORM>>:$rhs) // Emits: (tSUBi8:i32 tGPR:i32:$lhs, (imm_neg_XFORM:i32 (imm:i32)<<P:Predicate_imm8_255_neg>>:$rhs)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm8_255_neg(N1.getNode())) { SDNode *Result = Emit_147(N, ARM::tSUBi8, MVT::i32); return Result; } } } // Pattern: (addc:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (ADDSrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_142(N, ARM::ADDSrr, MVT::i32); return Result; } // Pattern: (addc:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2ADDSrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_142(N, ARM::t2ADDSrr, MVT::i32); return Result; } // Pattern: (addc:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tADDrr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_146(N, ARM::tADDrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_150(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 6); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_151(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N0, N1, Tmp2, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 6); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_152(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp2, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 8); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_153(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue InFlag = N->getOperand(2); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, N0, Tmp1, InFlag); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_154(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue InFlag = N->getOperand(2); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, N0, N1, InFlag); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_155(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 5); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_156(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { Tmp0, N0, N1, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 6); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_157(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, Tmp2, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 7); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_158(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N0, CPTmpN1_0, CPTmpN1_1, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 4); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_159(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1, SDValue &CPTmpN0_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2, Tmp2, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 8); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_160(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1, SDValue &CPTmpN0_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 5); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_161(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, Tmp2, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 7); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_162(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 4); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } SDNode *Select_ISD_ADDE_i32(SDNode *N) { // Pattern: (adde:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (ADCrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_152(N, ARM::ADCrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (adde:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (ADCSSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_155(N, ARM::ADCSSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (adde:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (ADCrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_159(N, ARM::ADCrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } // Pattern: (adde:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (ADCSSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_160(N, ARM::ADCSSrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } // Pattern: (adde:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2ADCrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_157(N, ARM::t2ADCrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (adde:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2ADCSrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_158(N, ARM::t2ADCSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (adde:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2ADCrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_161(N, ARM::t2ADCrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (adde:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2ADCSrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_162(N, ARM::t2ADCSrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (adde:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (ADCri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_150(N, ARM::ADCri, MVT::i32); return Result; } } // Pattern: (adde:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (ADCSSri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_153(N, ARM::ADCSSri, MVT::i32); return Result; } } // Pattern: (adde:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2ADCri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_150(N, ARM::t2ADCri, MVT::i32); return Result; } } // Pattern: (adde:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2ADCSri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_153(N, ARM::t2ADCSri, MVT::i32); return Result; } } // Pattern: (adde:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (ADCrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_151(N, ARM::ADCrr, MVT::i32); return Result; } // Pattern: (adde:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (ADCSSrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_154(N, ARM::ADCSSrr, MVT::i32); return Result; } // Pattern: (adde:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tADC:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_156(N, ARM::tADC, MVT::i32); return Result; } // Pattern: (adde:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2ADCrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_151(N, ARM::t2ADCrr, MVT::i32); return Result; } // Pattern: (adde:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2ADCSrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_154(N, ARM::t2ADCSrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_163(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0, Tmp2, Tmp3); } DISABLE_INLINE SDNode *Emit_164(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_165(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N10)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_166(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N10, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_167(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN10_0, SDValue &CPTmpN10_1, SDValue &CPTmpN10_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN10_0, CPTmpN10_1, CPTmpN10_2, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 7); } DISABLE_INLINE SDNode *Emit_168(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, N10, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_169(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN10_0, SDValue &CPTmpN10_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, CPTmpN10_0, CPTmpN10_1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_170(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0x18ULL, MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_171(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0x8ULL, MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_172(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_t2_so_imm_not_XFORM(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_173(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_so_imm_not_XFORM(Tmp1.getNode()); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_174(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_175(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N00)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_176(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_177(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N00, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_178(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN00_0, SDValue &CPTmpN00_1, SDValue &CPTmpN00_2) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 7); } DISABLE_INLINE SDNode *Emit_179(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N1, N00, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_180(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN00_0, SDValue &CPTmpN00_1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN00_0, CPTmpN00_1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } SDNode *Select_ISD_AND_i32(SDNode *N) { if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0 && CheckAndMask(N0, Tmp0, INT64_C(16711935))) { // Pattern: (and:i32 (shl:i32 GPR:i32:$Src, 8:i32), 16711935:i32) // Emits: (t2UXTB16r_rot:i32 GPR:i32:$Src, 24:i32) // Pattern complexity = 32 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SHL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_170(N, ARM::t2UXTB16r_rot, MVT::i32); return Result; } } } // Pattern: (and:i32 (srl:i32 GPR:i32:$Src, 8:i32), 16711935:i32) // Emits: (t2UXTB16r_rot:i32 GPR:i32:$Src, 8:i32) // Pattern complexity = 32 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_171(N, ARM::t2UXTB16r_rot, MVT::i32); return Result; } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { if (CheckAndMask(N0, Tmp0, INT64_C(16711935))) { // Pattern: (and:i32 (shl:i32 GPR:i32:$Src, 8:i32), 16711935:i32) // Emits: (UXTB16r_rot:i32 GPR:i32:$Src, 24:i32) // Pattern complexity = 32 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SHL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_170(N, ARM::UXTB16r_rot, MVT::i32); return Result; } } } // Pattern: (and:i32 (srl:i32 GPR:i32:$Src, 8:i32), 16711935:i32) // Emits: (UXTB16r_rot:i32 GPR:i32:$Src, 8:i32) // Pattern complexity = 32 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_171(N, ARM::UXTB16r_rot, MVT::i32); return Result; } } } } // Pattern: (and:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 255:i32) // Emits: (UXTBr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 31 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(255)) && N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode()) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_164(N, ARM::UXTBr_rot, MVT::i32); return Result; } } // Pattern: (and:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 65535:i32) // Emits: (UXTHr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 31 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(65535)) && N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode()) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_164(N, ARM::UXTHr_rot, MVT::i32); return Result; } } // Pattern: (and:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 16711935:i32) // Emits: (UXTB16r_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 31 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(16711935)) && N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode()) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_164(N, ARM::UXTB16r_rot, MVT::i32); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { // Pattern: (and:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 255:i32) // Emits: (t2UXTBr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 31 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(255)) && N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode()) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_164(N, ARM::t2UXTBr_rot, MVT::i32); return Result; } } // Pattern: (and:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 65535:i32) // Emits: (t2UXTHr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 31 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(65535)) && N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode()) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_164(N, ARM::t2UXTHr_rot, MVT::i32); return Result; } } // Pattern: (and:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), 16711935:i32) // Emits: (t2UXTB16r_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 31 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(16711935)) && N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode()) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_164(N, ARM::t2UXTB16r_rot, MVT::i32); return Result; } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { // Pattern: (and:i32 GPR:i32:$src, 255:i32) // Emits: (UXTBr:i32 GPR:i32:$src) // Pattern complexity = 24 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(255))) { SDNode *Result = Emit_163(N, ARM::UXTBr, MVT::i32); return Result; } // Pattern: (and:i32 GPR:i32:$src, 65535:i32) // Emits: (UXTHr:i32 GPR:i32:$src) // Pattern complexity = 24 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(65535))) { SDNode *Result = Emit_163(N, ARM::UXTHr, MVT::i32); return Result; } // Pattern: (and:i32 GPR:i32:$src, 16711935:i32) // Emits: (UXTB16r:i32 GPR:i32:$src) // Pattern complexity = 24 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(16711935))) { SDNode *Result = Emit_163(N, ARM::UXTB16r, MVT::i32); return Result; } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { // Pattern: (and:i32 GPR:i32:$src, 255:i32) // Emits: (t2UXTBr:i32 GPR:i32:$src) // Pattern complexity = 24 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(255))) { SDNode *Result = Emit_163(N, ARM::t2UXTBr, MVT::i32); return Result; } // Pattern: (and:i32 GPR:i32:$src, 65535:i32) // Emits: (t2UXTHr:i32 GPR:i32:$src) // Pattern complexity = 24 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(65535))) { SDNode *Result = Emit_163(N, ARM::t2UXTHr, MVT::i32); return Result; } // Pattern: (and:i32 GPR:i32:$src, 16711935:i32) // Emits: (t2UXTB16r:i32 GPR:i32:$src) // Pattern complexity = 24 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(16711935))) { SDNode *Result = Emit_163(N, ARM::t2UXTB16r, MVT::i32); return Result; } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (and:i32 GPR:i32:$a, (xor:i32 so_reg:i32:$b, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (BICrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 22 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); SDValue CPTmpN10_0; SDValue CPTmpN10_1; SDValue CPTmpN10_2; if (SelectShifterOperandReg(N, N10, CPTmpN10_0, CPTmpN10_1, CPTmpN10_2)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_167(N, ARM::BICrs, MVT::i32, CPTmpN10_0, CPTmpN10_1, CPTmpN10_2); return Result; } } } } // Pattern: (and:i32 (xor:i32 so_reg:i32:$b, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$a) // Emits: (BICrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 22 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue CPTmpN00_0; SDValue CPTmpN00_1; SDValue CPTmpN00_2; if (SelectShifterOperandReg(N, N00, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_178(N, ARM::BICrs, MVT::i32, CPTmpN00_0, CPTmpN00_1, CPTmpN00_2); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (and:i32 GPR:i32:$lhs, (xor:i32 t2_so_reg:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (t2BICrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 19 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); SDValue CPTmpN10_0; SDValue CPTmpN10_1; if (SelectT2ShifterOperandReg(N, N10, CPTmpN10_0, CPTmpN10_1)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_169(N, ARM::t2BICrs, MVT::i32, CPTmpN10_0, CPTmpN10_1); return Result; } } } } // Pattern: (and:i32 (xor:i32 t2_so_reg:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$lhs) // Emits: (t2BICrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 19 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue CPTmpN00_0; SDValue CPTmpN00_1; if (SelectT2ShifterOperandReg(N, N00, CPTmpN00_0, CPTmpN00_1)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_180(N, ARM::t2BICrs, MVT::i32, CPTmpN00_0, CPTmpN00_1); return Result; } } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (and:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (ANDrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_57(N, ARM::ANDrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (and:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (ANDrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_88(N, ARM::ANDrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } // Pattern: (and:i32 GPR:i32:$a, (xor:i32 (imm:i32)<<P:Predicate_so_imm>>:$b, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (BICri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 14 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_165(N, ARM::BICri, MVT::i32); return Result; } } } } // Pattern: (and:i32 GPR:i32:$lhs, (xor:i32 (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (t2BICri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_165(N, ARM::t2BICri, MVT::i32); return Result; } } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (and:i32 GPR:i32:$a, (xor:i32 (imm:i32)<<P:Predicate_immAllOnes>>, (imm:i32)<<P:Predicate_so_imm>>:$b)) // Emits: (BICri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 14 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N11.getNode())) { SDNode *Result = Emit_174(N, ARM::BICri, MVT::i32); return Result; } } } } if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::Constant) { // Pattern: (and:i32 (xor:i32 (imm:i32)<<P:Predicate_so_imm>>:$b, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$a) // Emits: (BICri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_so_imm(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_175(N, ARM::BICri, MVT::i32); return Result; } } // Pattern: (and:i32 (xor:i32 (imm:i32)<<P:Predicate_immAllOnes>>, (imm:i32)<<P:Predicate_so_imm>>:$b), GPR:i32:$a) // Emits: (BICri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_immAllOnes(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N01.getNode())) { SDNode *Result = Emit_176(N, ARM::BICri, MVT::i32); return Result; } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (and:i32 GPR:i32:$lhs, (xor:i32 (imm:i32)<<P:Predicate_immAllOnes>>, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs)) // Emits: (t2BICri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N11.getNode())) { SDNode *Result = Emit_174(N, ARM::t2BICri, MVT::i32); return Result; } } } } if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::Constant) { // Pattern: (and:i32 (xor:i32 (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$lhs) // Emits: (t2BICri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_t2_so_imm(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_175(N, ARM::t2BICri, MVT::i32); return Result; } } // Pattern: (and:i32 (xor:i32 (imm:i32)<<P:Predicate_immAllOnes>>, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs), GPR:i32:$lhs) // Emits: (t2BICri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_immAllOnes(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N01.getNode())) { SDNode *Result = Emit_176(N, ARM::t2BICri, MVT::i32); return Result; } } } } // Pattern: (and:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2ANDrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_68(N, ARM::t2ANDrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (and:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2ANDrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_103(N, ARM::t2ANDrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (and:i32 GPR:i32:$a, (xor:i32 GPR:i32:$b, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (BICrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 10 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_166(N, ARM::BICrr, MVT::i32); return Result; } } } // Pattern: (and:i32 tGPR:i32:$lhs, (xor:i32 tGPR:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (tBIC:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 10 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_168(N, ARM::tBIC, MVT::i32); return Result; } } } // Pattern: (and:i32 GPR:i32:$lhs, (xor:i32 GPR:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (t2BICrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 10 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_166(N, ARM::t2BICrr, MVT::i32); return Result; } } } // Pattern: (and:i32 (xor:i32 GPR:i32:$b, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$a) // Emits: (BICrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 10 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_177(N, ARM::BICrr, MVT::i32); return Result; } } } // Pattern: (and:i32 (xor:i32 tGPR:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>), tGPR:i32:$lhs) // Emits: (tBIC:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 10 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_179(N, ARM::tBIC, MVT::i32); return Result; } } } // Pattern: (and:i32 (xor:i32 GPR:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$lhs) // Emits: (t2BICrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 10 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_177(N, ARM::t2BICrr, MVT::i32); return Result; } } } if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { // Pattern: (and:i32 tGPR:i32:$src, 255:i32) // Emits: (tUXTB:i32 tGPR:i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(255))) { SDNode *Result = Emit_163(N, ARM::tUXTB, MVT::i32); return Result; } // Pattern: (and:i32 tGPR:i32:$src, 65535:i32) // Emits: (tUXTH:i32 tGPR:i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CheckAndMask(N0, Tmp0, INT64_C(65535))) { SDNode *Result = Emit_163(N, ARM::tUXTH, MVT::i32); return Result; } } } // Pattern: (and:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (ANDri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::ANDri, MVT::i32); return Result; } } // Pattern: (and:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_bf_inv_mask_imm>>:$imm) // Emits: (BFC:i32 GPR:i32:$src, (imm:i32):$imm) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6T2Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_bf_inv_mask_imm(N1.getNode())) { SDNode *Result = Emit_35(N, ARM::BFC, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (and:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2ANDri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::t2ANDri, MVT::i32); return Result; } // Pattern: (and:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_bf_inv_mask_imm>>:$imm) // Emits: (t2BFC:i32 GPR:i32:$src, (imm:i32):$imm) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_bf_inv_mask_imm(N1.getNode())) { SDNode *Result = Emit_35(N, ARM::t2BFC, MVT::i32); return Result; } // Pattern: (and:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_t2_so_imm_not>><<X:t2_so_imm_not_XFORM>>:$imm) // Emits: (t2BICri:i32 GPR:i32:$src, (t2_so_imm_not_XFORM:i32 (imm:i32)<<P:Predicate_t2_so_imm_not>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm_not(N1.getNode())) { SDNode *Result = Emit_172(N, ARM::t2BICri, MVT::i32); return Result; } } } if ((!Subtarget->isThumb())) { // Pattern: (and:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_so_imm_not>><<X:so_imm_not_XFORM>>:$imm) // Emits: (BICri:i32 GPR:i32:$src, (so_imm_not_XFORM:i32 (imm:i32)<<P:Predicate_so_imm_not>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm_not(N1.getNode())) { SDNode *Result = Emit_173(N, ARM::BICri, MVT::i32); return Result; } } // Pattern: (and:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (ANDrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_56(N, ARM::ANDrr, MVT::i32); return Result; } // Pattern: (and:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tAND:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_66(N, ARM::tAND, MVT::i32); return Result; } // Pattern: (and:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2ANDrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_56(N, ARM::t2ANDrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_181(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N11, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_182(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N01, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_AND_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (and:v2i32 DPR:v2i32:$src1, (xor:v2i32 DPR:v2i32:$src2, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>)) // Emits: (VBICd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N11.getNode())) { SDNode *Result = Emit_51(N, ARM::VBICd, MVT::v2i32); return Result; } } // Pattern: (and:v2i32 DPR:v2i32:$src1, (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src2)) // Emits: (VBICd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N10.getNode())) { SDNode *Result = Emit_181(N, ARM::VBICd, MVT::v2i32); return Result; } } } if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (and:v2i32 (xor:v2i32 DPR:v2i32:$src2, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>), DPR:v2i32:$src1) // Emits: (VBICd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N01.getNode())) { SDNode *Result = Emit_84(N, ARM::VBICd, MVT::v2i32); return Result; } } // Pattern: (and:v2i32 (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src2), DPR:v2i32:$src1) // Emits: (VBICd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N00.getNode())) { SDNode *Result = Emit_182(N, ARM::VBICd, MVT::v2i32); return Result; } } } // Pattern: (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VANDd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VANDd, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_AND_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (and:v4i32 QPR:v4i32:$src1, (xor:v4i32 QPR:v4i32:$src2, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>)) // Emits: (VBICq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N11.getNode())) { SDNode *Result = Emit_51(N, ARM::VBICq, MVT::v4i32); return Result; } } // Pattern: (and:v4i32 QPR:v4i32:$src1, (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src2)) // Emits: (VBICq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N10.getNode())) { SDNode *Result = Emit_181(N, ARM::VBICq, MVT::v4i32); return Result; } } } if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (and:v4i32 (xor:v4i32 QPR:v4i32:$src2, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>), QPR:v4i32:$src1) // Emits: (VBICq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N01.getNode())) { SDNode *Result = Emit_84(N, ARM::VBICq, MVT::v4i32); return Result; } } // Pattern: (and:v4i32 (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src2), QPR:v4i32:$src1) // Emits: (VBICq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N00.getNode())) { SDNode *Result = Emit_182(N, ARM::VBICq, MVT::v4i32); return Result; } } } // Pattern: (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VANDq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VANDq, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_183(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { N1, N2, N3, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, Ops0, 4); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } SDNode *Select_ISD_ATOMIC_CMP_SWAP_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_cmp_swap:i32 GPR:i32:$ptr, GPR:i32:$old, GPR:i32:$new)<<P:Predicate_atomic_cmp_swap_8>> // Emits: (ATOMIC_CMP_SWAP_I8:i32 GPR:i32:$ptr, GPR:i32:$old, GPR:i32:$new) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_cmp_swap_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_183(N, ARM::ATOMIC_CMP_SWAP_I8, MVT::i32); return Result; } } // Pattern: (atomic_cmp_swap:i32 GPR:i32:$ptr, GPR:i32:$old, GPR:i32:$new)<<P:Predicate_atomic_cmp_swap_16>> // Emits: (ATOMIC_CMP_SWAP_I16:i32 GPR:i32:$ptr, GPR:i32:$old, GPR:i32:$new) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_cmp_swap_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_183(N, ARM::ATOMIC_CMP_SWAP_I16, MVT::i32); return Result; } } // Pattern: (atomic_cmp_swap:i32 GPR:i32:$ptr, GPR:i32:$old, GPR:i32:$new)<<P:Predicate_atomic_cmp_swap_32>> // Emits: (ATOMIC_CMP_SWAP_I32:i32 GPR:i32:$ptr, GPR:i32:$old, GPR:i32:$new) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_cmp_swap_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_183(N, ARM::ATOMIC_CMP_SWAP_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_184(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, N1, N2, Chain); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } SDNode *Select_ISD_ATOMIC_LOAD_ADD_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_load_add:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_add_8>> // Emits: (ATOMIC_LOAD_ADD_I8:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_add_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_ADD_I8, MVT::i32); return Result; } } // Pattern: (atomic_load_add:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_add_16>> // Emits: (ATOMIC_LOAD_ADD_I16:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_add_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_ADD_I16, MVT::i32); return Result; } } // Pattern: (atomic_load_add:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_add_32>> // Emits: (ATOMIC_LOAD_ADD_I32:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_add_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_ADD_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ATOMIC_LOAD_AND_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_load_and:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_and_8>> // Emits: (ATOMIC_LOAD_AND_I8:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_and_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_AND_I8, MVT::i32); return Result; } } // Pattern: (atomic_load_and:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_and_16>> // Emits: (ATOMIC_LOAD_AND_I16:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_and_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_AND_I16, MVT::i32); return Result; } } // Pattern: (atomic_load_and:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_and_32>> // Emits: (ATOMIC_LOAD_AND_I32:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_and_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_AND_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ATOMIC_LOAD_NAND_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_load_nand:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_nand_8>> // Emits: (ATOMIC_LOAD_NAND_I8:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_nand_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_NAND_I8, MVT::i32); return Result; } } // Pattern: (atomic_load_nand:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_nand_16>> // Emits: (ATOMIC_LOAD_NAND_I16:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_nand_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_NAND_I16, MVT::i32); return Result; } } // Pattern: (atomic_load_nand:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_nand_32>> // Emits: (ATOMIC_LOAD_NAND_I32:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_nand_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_NAND_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ATOMIC_LOAD_OR_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_load_or:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_or_8>> // Emits: (ATOMIC_LOAD_OR_I8:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_or_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_OR_I8, MVT::i32); return Result; } } // Pattern: (atomic_load_or:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_or_16>> // Emits: (ATOMIC_LOAD_OR_I16:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_or_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_OR_I16, MVT::i32); return Result; } } // Pattern: (atomic_load_or:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_or_32>> // Emits: (ATOMIC_LOAD_OR_I32:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_or_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_OR_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ATOMIC_LOAD_SUB_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_load_sub:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_sub_8>> // Emits: (ATOMIC_LOAD_SUB_I8:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_sub_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_SUB_I8, MVT::i32); return Result; } } // Pattern: (atomic_load_sub:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_sub_16>> // Emits: (ATOMIC_LOAD_SUB_I16:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_sub_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_SUB_I16, MVT::i32); return Result; } } // Pattern: (atomic_load_sub:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_sub_32>> // Emits: (ATOMIC_LOAD_SUB_I32:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_sub_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_SUB_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ATOMIC_LOAD_XOR_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_load_xor:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_xor_8>> // Emits: (ATOMIC_LOAD_XOR_I8:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_xor_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_XOR_I8, MVT::i32); return Result; } } // Pattern: (atomic_load_xor:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_xor_16>> // Emits: (ATOMIC_LOAD_XOR_I16:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_xor_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_XOR_I16, MVT::i32); return Result; } } // Pattern: (atomic_load_xor:i32 GPR:i32:$ptr, GPR:i32:$incr)<<P:Predicate_atomic_load_xor_32>> // Emits: (ATOMIC_LOAD_XOR_I32:i32 GPR:i32:$ptr, GPR:i32:$incr) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_load_xor_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_LOAD_XOR_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ATOMIC_SWAP_i32(SDNode *N) { SDValue Chain = N->getOperand(0); // Pattern: (atomic_swap:i32 GPR:i32:$ptr, GPR:i32:$new)<<P:Predicate_atomic_swap_8>> // Emits: (ATOMIC_SWAP_I8:i32 GPR:i32:$ptr, GPR:i32:$new) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_swap_8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_SWAP_I8, MVT::i32); return Result; } } // Pattern: (atomic_swap:i32 GPR:i32:$ptr, GPR:i32:$new)<<P:Predicate_atomic_swap_16>> // Emits: (ATOMIC_SWAP_I16:i32 GPR:i32:$ptr, GPR:i32:$new) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_swap_16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_SWAP_I16, MVT::i32); return Result; } } // Pattern: (atomic_swap:i32 GPR:i32:$ptr, GPR:i32:$new)<<P:Predicate_atomic_swap_32>> // Emits: (ATOMIC_SWAP_I32:i32 GPR:i32:$ptr, GPR:i32:$new) // Pattern complexity = 4 cost = 11 size = 0 if (Predicate_atomic_swap_32(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_184(N, ARM::ATOMIC_SWAP_I32, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_i32(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_31(N, ARM::VMOVRS, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_f32(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_31(N, ARM::VMOVSR, MVT::f32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_185(SDNode *N) { SDValue N0 = N->getOperand(0); ReplaceUses(SDValue(N, 0), N0); return NULL; } SDNode *Select_ISD_BIT_CONVERT_f64(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:f64 DPR:v1i64:$src) // Emits: DPR:f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v1i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:f64 DPR:v2i32:$src) // Emits: DPR:f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:f64 DPR:v4i16:$src) // Emits: DPR:f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:f64 DPR:v8i8:$src) // Emits: DPR:f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:f64 DPR:v2f32:$src) // Emits: DPR:f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v8i8(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v8i8 DPR:v1i64:$src) // Emits: DPR:v8i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v1i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i8 DPR:v2i32:$src) // Emits: DPR:v8i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i8 DPR:v4i16:$src) // Emits: DPR:v8i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i8 DPR:f64:$src) // Emits: DPR:v8i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i8 DPR:v2f32:$src) // Emits: DPR:v8i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v16i8(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v16i8 QPR:v2i64:$src) // Emits: QPR:v16i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v16i8 QPR:v4i32:$src) // Emits: QPR:v16i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v16i8 QPR:v8i16:$src) // Emits: QPR:v16i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v16i8 QPR:v2f64:$src) // Emits: QPR:v16i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v16i8 QPR:v4f32:$src) // Emits: QPR:v16i8:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v4i16(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v4i16 DPR:v1i64:$src) // Emits: DPR:v4i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v1i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i16 DPR:v2i32:$src) // Emits: DPR:v4i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i16 DPR:v8i8:$src) // Emits: DPR:v4i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i16 DPR:f64:$src) // Emits: DPR:v4i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i16 DPR:v2f32:$src) // Emits: DPR:v4i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v8i16(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v8i16 QPR:v2i64:$src) // Emits: QPR:v8i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i16 QPR:v4i32:$src) // Emits: QPR:v8i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i16 QPR:v16i8:$src) // Emits: QPR:v8i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i16 QPR:v2f64:$src) // Emits: QPR:v8i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v8i16 QPR:v4f32:$src) // Emits: QPR:v8i16:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v2i32(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v2i32 DPR:v1i64:$src) // Emits: DPR:v2i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v1i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i32 DPR:v4i16:$src) // Emits: DPR:v2i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i32 DPR:v8i8:$src) // Emits: DPR:v2i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i32 DPR:f64:$src) // Emits: DPR:v2i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i32 DPR:v2f32:$src) // Emits: DPR:v2i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v4i32(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v4i32 QPR:v2i64:$src) // Emits: QPR:v4i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i32 QPR:v8i16:$src) // Emits: QPR:v4i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i32 QPR:v16i8:$src) // Emits: QPR:v4i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i32 QPR:v2f64:$src) // Emits: QPR:v4i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4i32 QPR:v4f32:$src) // Emits: QPR:v4i32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v1i64(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v1i64 DPR:v2i32:$src) // Emits: DPR:v1i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v1i64 DPR:v4i16:$src) // Emits: DPR:v1i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v1i64 DPR:v8i8:$src) // Emits: DPR:v1i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v1i64 DPR:f64:$src) // Emits: DPR:v1i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v1i64 DPR:v2f32:$src) // Emits: DPR:v1i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v2i64(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v2i64 QPR:v4i32:$src) // Emits: QPR:v2i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i64 QPR:v8i16:$src) // Emits: QPR:v2i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i64 QPR:v16i8:$src) // Emits: QPR:v2i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i64 QPR:v2f64:$src) // Emits: QPR:v2i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2i64 QPR:v4f32:$src) // Emits: QPR:v2i64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v2f32(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v2f32 DPR:f64:$src) // Emits: DPR:v2f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f32 DPR:v1i64:$src) // Emits: DPR:v2f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v1i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f32 DPR:v2i32:$src) // Emits: DPR:v2f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f32 DPR:v4i16:$src) // Emits: DPR:v2f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f32 DPR:v8i8:$src) // Emits: DPR:v2f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i8) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v4f32(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v4f32 QPR:v2i64:$src) // Emits: QPR:v4f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4f32 QPR:v4i32:$src) // Emits: QPR:v4f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4f32 QPR:v8i16:$src) // Emits: QPR:v4f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4f32 QPR:v16i8:$src) // Emits: QPR:v4f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v4f32 QPR:v2f64:$src) // Emits: QPR:v4f32:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2f64) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BIT_CONVERT_v2f64(SDNode *N) { SDValue N0 = N->getOperand(0); // Pattern: (bitconvert:v2f64 QPR:v2i64:$src) // Emits: QPR:v2f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v2i64) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f64 QPR:v4i32:$src) // Emits: QPR:v2f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f64 QPR:v8i16:$src) // Emits: QPR:v2f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v8i16) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f64 QPR:v16i8:$src) // Emits: QPR:v2f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v16i8) { SDNode *Result = Emit_185(N); return Result; } // Pattern: (bitconvert:v2f64 QPR:v4f32:$src) // Emits: QPR:v2f64:$src // Pattern complexity = 3 cost = 0 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_185(N); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BR(SDNode *N) { // Pattern: (br:isVoid (bb:Other):$target) // Emits: (B:isVoid (bb:Other):$target) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::BasicBlock) { SDNode *Result = Emit_34(N, ARM::B); return Result; } } // Pattern: (br:isVoid (bb:Other):$target) // Emits: (tB:isVoid (bb:Other):$target) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::BasicBlock) { SDNode *Result = Emit_34(N, ARM::tB); return Result; } } // Pattern: (br:isVoid (bb:Other):$target) // Emits: (t2B:isVoid (bb:Other):$target) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::BasicBlock) { SDNode *Result = Emit_34(N, ARM::t2B); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BRIND(SDNode *N) { // Pattern: (brind:isVoid GPR:i32:$dst) // Emits: (BRIND:isVoid GPR:i32:$dst) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_34(N, ARM::BRIND); return Result; } } // Pattern: (brind:isVoid GPR:i32:$dst) // Emits: (tBRIND:isVoid GPR:i32:$dst) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_34(N, ARM::tBRIND); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BSWAP_i32(SDNode *N) { // Pattern: (bswap:i32 GPR:i32:$src) // Emits: (REV:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDNode *Result = Emit_31(N, ARM::REV, MVT::i32); return Result; } // Pattern: (bswap:i32 tGPR:i32:$src) // Emits: (tREV:i32 tGPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDNode *Result = Emit_31(N, ARM::tREV, MVT::i32); return Result; } // Pattern: (bswap:i32 GPR:i32:$src) // Emits: (t2REV:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_31(N, ARM::t2REV, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_186(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp1 = Transform_VMOV_get_imm8(SDValue(N, 0).getNode()); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, Tmp1, Tmp2, Tmp3); } SDNode *Select_ISD_BUILD_VECTOR_v8i8(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm8(N)) { SDNode *Result = Emit_186(N, ARM::VMOVv8i8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BUILD_VECTOR_v16i8(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm8(N)) { SDNode *Result = Emit_186(N, ARM::VMOVv16i8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_187(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp1 = Transform_VMOV_get_imm16(SDValue(N, 0).getNode()); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, Tmp1, Tmp2, Tmp3); } SDNode *Select_ISD_BUILD_VECTOR_v4i16(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm16(N)) { SDNode *Result = Emit_187(N, ARM::VMOVv4i16, MVT::v4i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BUILD_VECTOR_v8i16(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm16(N)) { SDNode *Result = Emit_187(N, ARM::VMOVv8i16, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_188(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp1 = Transform_VMOV_get_imm32(SDValue(N, 0).getNode()); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, Tmp1, Tmp2, Tmp3); } SDNode *Select_ISD_BUILD_VECTOR_v2i32(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm32(N)) { SDNode *Result = Emit_188(N, ARM::VMOVv2i32, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BUILD_VECTOR_v4i32(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm32(N)) { SDNode *Result = Emit_188(N, ARM::VMOVv4i32, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_189(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp1 = Transform_VMOV_get_imm64(SDValue(N, 0).getNode()); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, Tmp1, Tmp2, Tmp3); } SDNode *Select_ISD_BUILD_VECTOR_v1i64(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm64(N)) { SDNode *Result = Emit_189(N, ARM::VMOVv1i64, MVT::v1i64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_BUILD_VECTOR_v2i64(SDNode *N) { if ((Subtarget->hasNEON()) && Predicate_vmovImm64(N)) { SDNode *Result = Emit_189(N, ARM::VMOVv2i64, MVT::v2i64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_190(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); bool HasInFlag = (N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Flag); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag(0, 0); if (HasInFlag) { InFlag = N->getOperand(N->getNumOperands()-1); } SDValue Ops0[] = { N1, N2, Tmp2, Tmp3, Chain, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, MVT::Flag, Ops0, HasInFlag ? 6 : 5); Chain = SDValue(ResNode, 0); InFlag = SDValue(ResNode, 1); const SDValue Froms[] = { SDValue(N, 1), SDValue(N, 0) }; const SDValue Tos[] = { InFlag, SDValue(Chain.getNode(), Chain.getResNo()) }; ReplaceUses(Froms, Tos, 2); return ResNode; } DISABLE_INLINE SDNode *Emit_191(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); bool HasInFlag = (N->getOperand(N->getNumOperands()-1).getValueType() == MVT::Flag); SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue InFlag(0, 0); if (HasInFlag) { InFlag = N->getOperand(N->getNumOperands()-1); } SDValue Ops0[] = { Tmp0, Tmp1, Chain, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, MVT::Flag, Ops0, HasInFlag ? 4 : 3); Chain = SDValue(ResNode, 0); InFlag = SDValue(ResNode, 1); const SDValue Froms[] = { SDValue(N, 1), SDValue(N, 0) }; const SDValue Tos[] = { InFlag, SDValue(Chain.getNode(), Chain.getResNo()) }; ReplaceUses(Froms, Tos, 2); return ResNode; } SDNode *Select_ISD_CALLSEQ_END(SDNode *N) { // Pattern: (ARMcallseq_end:isVoid (timm:i32):$amt1, (timm:i32):$amt2) // Emits: (ADJCALLSTACKUP:isVoid (timm:i32):$amt1, (timm:i32):$amt2) // Pattern complexity = 9 cost = 1 size = 0 { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetConstant) { SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::TargetConstant) { SDNode *Result = Emit_190(N, ARM::ADJCALLSTACKUP); return Result; } } } // Pattern: (ARMcallseq_end:isVoid (imm:i32):$amt1, (imm:i32):$amt2) // Emits: (tADJCALLSTACKUP:isVoid (imm:i32):$amt1, (imm:i32):$amt2) // Pattern complexity = 9 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_191(N, ARM::tADJCALLSTACKUP); return Result; } } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_192(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp1, Tmp2, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, MVT::Flag, Ops0, 4); Chain = SDValue(ResNode, 0); SDValue InFlag(ResNode, 1); const SDValue Froms[] = { SDValue(N, 1), SDValue(N, 0) }; const SDValue Tos[] = { InFlag, SDValue(Chain.getNode(), Chain.getResNo()) }; ReplaceUses(Froms, Tos, 2); return ResNode; } DISABLE_INLINE SDNode *Emit_193(SDNode *N, unsigned Opc0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, MVT::Flag, Tmp0, Chain); Chain = SDValue(ResNode, 0); SDValue InFlag(ResNode, 1); const SDValue Froms[] = { SDValue(N, 1), SDValue(N, 0) }; const SDValue Tos[] = { InFlag, SDValue(Chain.getNode(), Chain.getResNo()) }; ReplaceUses(Froms, Tos, 2); return ResNode; } SDNode *Select_ISD_CALLSEQ_START(SDNode *N) { // Pattern: (ARMcallseq_start:isVoid (timm:i32):$amt) // Emits: (ADJCALLSTACKDOWN:isVoid (timm:i32):$amt) // Pattern complexity = 6 cost = 1 size = 0 { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::TargetConstant) { SDNode *Result = Emit_192(N, ARM::ADJCALLSTACKDOWN); return Result; } } // Pattern: (ARMcallseq_start:isVoid (imm:i32):$amt) // Emits: (tADJCALLSTACKDOWN:isVoid (imm:i32):$amt) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_193(N, ARM::tADJCALLSTACKDOWN); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_CTLZ_i32(SDNode *N) { // Pattern: (ctlz:i32 GPR:i32:$src) // Emits: (CLZ:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TOps())) { SDNode *Result = Emit_31(N, ARM::CLZ, MVT::i32); return Result; } // Pattern: (ctlz:i32 GPR:i32:$src) // Emits: (t2CLZ:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_31(N, ARM::t2CLZ, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_194(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_195(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, Tmp0, Tmp1, Tmp2); } DISABLE_INLINE SDNode *Emit_196(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32); SDValue Tmp1 = Transform_so_imm_not_XFORM(Tmp0.getNode()); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_197(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_198(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp1 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_thumb_immshifted_val(Tmp2.getNode()); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp1, Tmp3, Tmp4, Tmp5 }; SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, Ops0, 4), 0); SDValue Tmp7 = Transform_thumb_immshifted_shamt(Tmp2.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp0, Tmp6, Tmp7, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_199(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp1 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_imm_comp_XFORM(Tmp2.getNode()); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp1, Tmp3, Tmp4, Tmp5 }; SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, Ops0, 4), 0); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp0, Tmp6, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 4); } DISABLE_INLINE SDNode *Emit_200(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N)->getZExtValue()), MVT::i32); SDValue Tmp1 = Transform_t2_so_imm_not_XFORM(Tmp0.getNode()); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_Constant_i32(SDNode *N) { // Pattern: (imm:i32)<<P:Predicate_t2_so_imm>>:$src // Emits: (t2MOVi:i32 (imm:i32):$src) // Pattern complexity = 5 cost = 1 size = 0 if ((Subtarget->isThumb2()) && Predicate_t2_so_imm(N)) { SDNode *Result = Emit_194(N, ARM::t2MOVi, MVT::i32); return Result; } // Pattern: (imm:i32)<<P:Predicate_so_imm>>:$src // Emits: (MOVi:i32 (imm:i32):$src) // Pattern complexity = 4 cost = 1 size = 0 if ((!Subtarget->isThumb()) && Predicate_so_imm(N)) { SDNode *Result = Emit_194(N, ARM::MOVi, MVT::i32); return Result; } // Pattern: (imm:i32)<<P:Predicate_imm0_65535>>:$src // Emits: (MOVi16:i32 (imm:i32):$src) // Pattern complexity = 4 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6T2Ops()) && Predicate_imm0_65535(N)) { SDNode *Result = Emit_195(N, ARM::MOVi16, MVT::i32); return Result; } // Pattern: (imm:i32)<<P:Predicate_so_imm_not>><<X:so_imm_not_XFORM>>:$imm // Emits: (MVNi:i32 (so_imm_not_XFORM:i32 (imm:i32):$imm)) // Pattern complexity = 4 cost = 1 size = 0 if ((!Subtarget->isThumb()) && Predicate_so_imm_not(N)) { SDNode *Result = Emit_196(N, ARM::MVNi, MVT::i32); return Result; } // Pattern: (imm:i32)<<P:Predicate_so_imm2part>>:$src // Emits: (MOVi2pieces:i32 (imm:i32):$src) // Pattern complexity = 4 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!Subtarget->hasV6T2Ops()) && Predicate_so_imm2part(N)) { SDNode *Result = Emit_195(N, ARM::MOVi2pieces, MVT::i32); return Result; } // Pattern: (imm:i32)<<P:Predicate_imm0_255>>:$src // Emits: (tMOVi8:i32 (imm:i32):$src) // Pattern complexity = 4 cost = 1 size = 0 if ((Subtarget->isThumb1Only()) && Predicate_imm0_255(N)) { SDNode *Result = Emit_197(N, ARM::tMOVi8, MVT::i32); return Result; } if ((Subtarget->isThumb2())) { // Pattern: (imm:i32)<<P:Predicate_imm0_65535>>:$src // Emits: (t2MOVi16:i32 (imm:i32):$src) // Pattern complexity = 4 cost = 1 size = 0 if (Predicate_imm0_65535(N)) { SDNode *Result = Emit_195(N, ARM::t2MOVi16, MVT::i32); return Result; } // Pattern: (imm:i32)<<P:Predicate_t2_so_imm_not>><<X:t2_so_imm_not_XFORM>>:$src // Emits: (t2MVNi:i32 (t2_so_imm_not_XFORM:i32 (imm:i32)<<P:Predicate_t2_so_imm_not>>:$src)) // Pattern complexity = 4 cost = 1 size = 0 if (Predicate_t2_so_imm_not(N)) { SDNode *Result = Emit_200(N, ARM::t2MVNi, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only())) { // Pattern: (imm:i32)<<P:Predicate_thumb_immshifted>>:$src // Emits: (tLSLri:i32 (tMOVi8:i32 (thumb_immshifted_val:i32 (imm:i32):$src)), (thumb_immshifted_shamt:i32 (imm:i32):$src)) // Pattern complexity = 4 cost = 2 size = 0 if (Predicate_thumb_immshifted(N)) { SDNode *Result = Emit_198(N, ARM::tMOVi8, ARM::tLSLri, MVT::i32, MVT::i32); return Result; } // Pattern: (imm:i32)<<P:Predicate_imm0_255_comp>>:$src // Emits: (tMVN:i32 (tMOVi8:i32 (imm_comp_XFORM:i32 (imm:i32):$src))) // Pattern complexity = 4 cost = 2 size = 0 if (Predicate_imm0_255_comp(N)) { SDNode *Result = Emit_199(N, ARM::tMOVi8, ARM::tMVN, MVT::i32, MVT::i32); return Result; } } // Pattern: (imm:i32):$src // Emits: (MOVi32imm:i32 (imm:i32):$src) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6T2Ops())) { SDNode *Result = Emit_195(N, ARM::MOVi32imm, MVT::i32); return Result; } // Pattern: (imm:i32):$src // Emits: (t2MOVi32imm:i32 (imm:i32):$src) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_195(N, ARM::t2MOVi32imm, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_201(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Tmp0 = CurDAG->getTargetConstantFP(*cast<ConstantFPSDNode>(N)->getConstantFPValue(), cast<ConstantFPSDNode>(N)->getValueType(0)); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, Tmp0, Tmp1, Tmp2); } SDNode *Select_ISD_ConstantFP_f32(SDNode *N) { if ((Subtarget->hasVFP3()) && Predicate_vfp_f32imm(N)) { SDNode *Result = Emit_201(N, ARM::FCONSTS, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_ConstantFP_f64(SDNode *N) { if ((Subtarget->hasVFP3()) && Predicate_vfp_f64imm(N)) { SDNode *Result = Emit_201(N, ARM::FCONSTD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_EXTRACT_VECTOR_ELT_i32(SDNode *N) { // Pattern: (extractelt:i32 DPR:v2i32:$src, (imm:iPTR):$lane) // Emits: (VGETLNi32:i32 DPR:v2i32:$src, (imm:i32):$lane) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_35(N, ARM::VGETLNi32, MVT::i32); return Result; } } // Pattern: (extractelt:i32 QPR:v4i32:$src, (imm:iPTR):$lane) // Emits: (VGETLNi32:i32 (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 6 cost = 2 size = 0 SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_48(N, TargetOpcode::EXTRACT_SUBREG, ARM::VGETLNi32, MVT::v2i32, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_202(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(ARM::DPR_VFP2RegClassID, MVT::i32); SDValue Tmp2(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp1), 0); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_SSubReg_f32_reg(Tmp3.getNode()); return CurDAG->SelectNodeTo(N, Opc1, VT1, Tmp2, Tmp4); } DISABLE_INLINE SDNode *Emit_203(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(ARM::QPR_VFP2RegClassID, MVT::i32); SDValue Tmp2(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp1), 0); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp4 = Transform_SSubReg_f32_reg(Tmp3.getNode()); return CurDAG->SelectNodeTo(N, Opc1, VT1, Tmp2, Tmp4); } SDNode *Select_ISD_EXTRACT_VECTOR_ELT_f32(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (extractelt:f32 DPR:v2f32:$src1, (imm:iPTR):$src2) // Emits: (EXTRACT_SUBREG:f32 (COPY_TO_REGCLASS:v2f32 DPR:v2f32:$src1, DPR_VFP2:f64), (SSubReg_f32_reg:i32 (imm:i32):$src2)) // Pattern complexity = 6 cost = 2 size = 0 if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_202(N, TargetOpcode::COPY_TO_REGCLASS, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f32); return Result; } // Pattern: (extractelt:f32 QPR:v4f32:$src1, (imm:iPTR):$src2) // Emits: (EXTRACT_SUBREG:f32 (COPY_TO_REGCLASS:v4f32 QPR:v4f32:$src1, QPR_VFP2:v16i8), (SSubReg_f32_reg:i32 (imm:i32):$src2)) // Pattern complexity = 6 cost = 2 size = 0 if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_203(N, TargetOpcode::COPY_TO_REGCLASS, TargetOpcode::EXTRACT_SUBREG, MVT::v4f32, MVT::f32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_204(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp2 = Transform_DSubReg_f64_reg(Tmp1.getNode()); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0, Tmp2); } SDNode *Select_ISD_EXTRACT_VECTOR_ELT_f64(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && N0.getValueType() == MVT::v2f64) { SDNode *Result = Emit_204(N, TargetOpcode::EXTRACT_SUBREG, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FABS_f32(SDNode *N) { // Pattern: (fabs:f32 SPR:f32:$a) // Emits: (VABSS:f32 SPR:f32:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_31(N, ARM::VABSS, MVT::f32); return Result; } // Pattern: (fabs:f32 SPR:f32:$a) // Emits: (EXTRACT_SUBREG:f32 (VABSfd_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$a, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 4 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_32(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VABSfd_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f64, MVT::f64, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FABS_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_31(N, ARM::VABSD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_205(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N000, N001, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_206(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, unsigned Opc3, unsigned Opc4, unsigned Opc5, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2, MVT::SimpleValueType VT3, MVT::SimpleValueType VT4, MVT::SimpleValueType VT5) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0), 0); SDValue Tmp2 = CurDAG->getTargetConstant(0x1ULL, MVT::i32); SDValue Tmp3(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Tmp0, N0, Tmp2), 0); SDValue Tmp4(CurDAG->getMachineNode(Opc2, N->getDebugLoc(), VT2), 0); SDValue Tmp6 = CurDAG->getTargetConstant(0x1ULL, MVT::i32); SDValue Tmp7(CurDAG->getMachineNode(Opc3, N->getDebugLoc(), VT3, Tmp4, N1, Tmp6), 0); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops4[] = { Tmp3, Tmp7, Tmp8, Tmp9 }; SDValue Tmp10(CurDAG->getMachineNode(Opc4, N->getDebugLoc(), VT4, Ops4, 4), 0); SDValue Tmp11 = CurDAG->getTargetConstant(0x1ULL, MVT::i32); return CurDAG->SelectNodeTo(N, Opc5, VT5, Tmp10, Tmp11); } DISABLE_INLINE SDNode *Emit_207(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N100, N101, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ISD_FADD_f32(SDNode *N) { if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { { SDValue N0 = N->getOperand(0); // Pattern: (fadd:f32 (fneg:f32 (fmul:f32 SPR:f32:$a, SPR:f32:$b)), SPR:f32:$dstin) // Emits: (VMLSS:f32 SPR:f32:$dstin, SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FNEG) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_205(N, ARM::VMLSS, MVT::f32); return Result; } } // Pattern: (fadd:f32 SPR:f32:$dstin, (fneg:f32 (fmul:f32 SPR:f32:$a, SPR:f32:$b))) // Emits: (VMLSS:f32 SPR:f32:$dstin, SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FNEG) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_207(N, ARM::VMLSS, MVT::f32); return Result; } } } // Pattern: (fadd:f32 (fmul:f32 SPR:f32:$a, SPR:f32:$b), SPR:f32:$dstin) // Emits: (VMLAS:f32 SPR:f32:$dstin, SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_127(N, ARM::VMLAS, MVT::f32); return Result; } // Pattern: (fadd:f32 SPR:f32:$dstin, (fmul:f32 SPR:f32:$a, SPR:f32:$b)) // Emits: (VMLAS:f32 SPR:f32:$dstin, SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 6 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_125(N, ARM::VMLAS, MVT::f32); return Result; } } // Pattern: (fadd:f32 SPR:f32:$a, SPR:f32:$b) // Emits: (VADDS:f32 SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDS, MVT::f32); return Result; } // Pattern: (fadd:f32 SPR:f32:$a, SPR:f32:$b) // Emits: (EXTRACT_SUBREG:f32 (VADDfd_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$a, 1:i32), (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$b, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 6 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_206(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VADDfd_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f64, MVT::v2f32, MVT::f64, MVT::f64, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FADD_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { { SDValue N0 = N->getOperand(0); // Pattern: (fadd:f64 (fneg:f64 (fmul:f64 DPR:f64:$a, DPR:f64:$b)), DPR:f64:$dstin) // Emits: (VMLSD:f64 DPR:f64:$dstin, DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FNEG) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_205(N, ARM::VMLSD, MVT::f64); return Result; } } // Pattern: (fadd:f64 DPR:f64:$dstin, (fneg:f64 (fmul:f64 DPR:f64:$a, DPR:f64:$b))) // Emits: (VMLSD:f64 DPR:f64:$dstin, DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FNEG) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_207(N, ARM::VMLSD, MVT::f64); return Result; } } } // Pattern: (fadd:f64 (fmul:f64 DPR:f64:$a, DPR:f64:$b), DPR:f64:$dstin) // Emits: (VMLAD:f64 DPR:f64:$dstin, DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_127(N, ARM::VMLAD, MVT::f64); return Result; } // Pattern: (fadd:f64 DPR:f64:$dstin, (fmul:f64 DPR:f64:$a, DPR:f64:$b)) // Emits: (VMLAD:f64 DPR:f64:$dstin, DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 6 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_125(N, ARM::VMLAD, MVT::f64); return Result; } } // Pattern: (fadd:f64 DPR:f64:$a, DPR:f64:$b) // Emits: (VADDD:f64 DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FADD_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (fadd:v2f32 DPR:v2f32:$src1, (fmul:v2f32 DPR:v2f32:$src2, (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane))) // Emits: (VMLAslfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2f32) { SDNode *Result = Emit_129(N, ARM::VMLAslfd, MVT::v2f32); return Result; } } } // Pattern: (fadd:v2f32 DPR:v2f32:$src1, (fmul:v2f32 (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane), DPR:v2f32:$src2)) // Emits: (VMLAslfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2f32) { SDNode *Result = Emit_130(N, ARM::VMLAslfd, MVT::v2f32); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::FMUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (fadd:v2f32 (fmul:v2f32 DPR:v2f32:$src2, (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane)), DPR:v2f32:$src1) // Emits: (VMLAslfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v2f32) { SDNode *Result = Emit_131(N, ARM::VMLAslfd, MVT::v2f32); return Result; } } } } // Pattern: (fadd:v2f32 (fmul:v2f32 (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane), DPR:v2f32:$src2), DPR:v2f32:$src1) // Emits: (VMLAslfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v2f32) { SDNode *Result = Emit_132(N, ARM::VMLAslfd, MVT::v2f32); return Result; } } } } // Pattern: (fadd:v2f32 DPR:v2f32:$src1, (fmul:v2f32 DPR:v2f32:$src2, DPR:v2f32:$src3)) // Emits: (VMLAfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR:v2f32:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_125(N, ARM::VMLAfd, MVT::v2f32); return Result; } } // Pattern: (fadd:v2f32 (fmul:v2f32 DPR:v2f32:$src2, DPR:v2f32:$src3), DPR:v2f32:$src1) // Emits: (VMLAfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR:v2f32:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_127(N, ARM::VMLAfd, MVT::v2f32); return Result; } } // Pattern: (fadd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VADDfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDfd, MVT::v2f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FADD_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (fadd:v4f32 QPR:v4f32:$src1, (fmul:v4f32 QPR:v4f32:$src2, (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane))) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2f32) { SDNode *Result = Emit_129(N, ARM::VMLAslfq, MVT::v4f32); return Result; } } } // Pattern: (fadd:v4f32 QPR:v4f32:$src1, (fmul:v4f32 (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane), QPR:v4f32:$src2)) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2f32) { SDNode *Result = Emit_130(N, ARM::VMLAslfq, MVT::v4f32); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::FMUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (fadd:v4f32 (fmul:v4f32 QPR:v4f32:$src2, (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane)), QPR:v4f32:$src1) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v2f32) { SDNode *Result = Emit_131(N, ARM::VMLAslfq, MVT::v4f32); return Result; } } } } // Pattern: (fadd:v4f32 (fmul:v4f32 (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane), QPR:v4f32:$src2), QPR:v4f32:$src1) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v2f32) { SDNode *Result = Emit_132(N, ARM::VMLAslfq, MVT::v4f32); return Result; } } } } } { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (fadd:v4f32 QPR:v4f32:$src1, (fmul:v4f32 QPR:v4f32:$src2, (NEONvduplane:v4f32 QPR:v4f32:$src3, (imm:i32):$lane))) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4f32) { SDNode *Result = Emit_137(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslfq, MVT::v2f32, MVT::v4f32); return Result; } } } // Pattern: (fadd:v4f32 QPR:v4f32:$src1, (fmul:v4f32 (NEONvduplane:v4f32 QPR:v4f32:$src3, (imm:i32):$lane), QPR:v4f32:$src2)) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4f32) { SDNode *Result = Emit_138(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslfq, MVT::v2f32, MVT::v4f32); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::FMUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (fadd:v4f32 (fmul:v4f32 QPR:v4f32:$src2, (NEONvduplane:v4f32 QPR:v4f32:$src3, (imm:i32):$lane)), QPR:v4f32:$src1) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N010.getValueType() == MVT::v4f32) { SDNode *Result = Emit_139(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslfq, MVT::v2f32, MVT::v4f32); return Result; } } } } // Pattern: (fadd:v4f32 (fmul:v4f32 (NEONvduplane:v4f32 QPR:v4f32:$src3, (imm:i32):$lane), QPR:v4f32:$src2), QPR:v4f32:$src1) // Emits: (VMLAslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N00.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N000.getValueType() == MVT::v4f32) { SDNode *Result = Emit_140(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLAslfq, MVT::v2f32, MVT::v4f32); return Result; } } } } } if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); // Pattern: (fadd:v4f32 QPR:v4f32:$src1, (fmul:v4f32 QPR:v4f32:$src2, QPR:v4f32:$src3)) // Emits: (VMLAfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, QPR:v4f32:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_125(N, ARM::VMLAfq, MVT::v4f32); return Result; } } // Pattern: (fadd:v4f32 (fmul:v4f32 QPR:v4f32:$src2, QPR:v4f32:$src3), QPR:v4f32:$src1) // Emits: (VMLAfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, QPR:v4f32:$src3) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_127(N, ARM::VMLAfq, MVT::v4f32); return Result; } } // Pattern: (fadd:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VADDfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VADDfq, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FDIV_f32(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_44(N, ARM::VDIVS, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FDIV_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_44(N, ARM::VDIVD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_208(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_209(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N0, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_FMUL_f32(SDNode *N) { if ((!HonorSignDependentRoundingFPMath())) { SDValue N0 = N->getOperand(0); // Pattern: (fmul:f32 (fneg:f32 SPR:f32:$a), SPR:f32:$b) // Emits: (VNMULS:f32 SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FNEG) { SDNode *Result = Emit_208(N, ARM::VNMULS, MVT::f32); return Result; } // Pattern: (fmul:f32 SPR:f32:$b, (fneg:f32 SPR:f32:$a)) // Emits: (VNMULS:f32 SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 6 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FNEG) { SDNode *Result = Emit_209(N, ARM::VNMULS, MVT::f32); return Result; } } // Pattern: (fmul:f32 SPR:f32:$a, SPR:f32:$b) // Emits: (VMULS:f32 SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_44(N, ARM::VMULS, MVT::f32); return Result; } // Pattern: (fmul:f32 SPR:f32:$a, SPR:f32:$b) // Emits: (EXTRACT_SUBREG:f32 (VMULfd_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$a, 1:i32), (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$b, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 6 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_206(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VMULfd_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f64, MVT::v2f32, MVT::f64, MVT::f64, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FMUL_f64(SDNode *N) { if ((!HonorSignDependentRoundingFPMath())) { SDValue N0 = N->getOperand(0); // Pattern: (fmul:f64 (fneg:f64 DPR:f64:$a), DPR:f64:$b) // Emits: (VNMULD:f64 DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FNEG) { SDNode *Result = Emit_208(N, ARM::VNMULD, MVT::f64); return Result; } // Pattern: (fmul:f64 DPR:f64:$b, (fneg:f64 DPR:f64:$a)) // Emits: (VNMULD:f64 DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 6 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FNEG) { SDNode *Result = Emit_209(N, ARM::VNMULD, MVT::f64); return Result; } } // Pattern: (fmul:f64 DPR:f64:$a, DPR:f64:$b) // Emits: (VMULD:f64 DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_44(N, ARM::VMULD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FMUL_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); // Pattern: (fmul:v2f32 DPR:v2f32:$src1, (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src2, (imm:i32):$lane)) // Emits: (VMULslfd:v2f32 DPR:v2f32:$src1, DPR_VFP2:v2f32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v2f32) { SDNode *Result = Emit_126(N, ARM::VMULslfd, MVT::v2f32); return Result; } } } // Pattern: (fmul:v2f32 (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src2, (imm:i32):$lane), DPR:v2f32:$src1) // Emits: (VMULslfd:v2f32 DPR:v2f32:$src1, DPR_VFP2:v2f32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v2f32) { SDNode *Result = Emit_128(N, ARM::VMULslfd, MVT::v2f32); return Result; } } } } // Pattern: (fmul:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VMULfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VMULfd, MVT::v2f32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_210(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_i32_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N10, Tmp3), 0); SDValue Tmp5 = Transform_SubReg_i32_lane(Tmp2.getNode()); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N0, Tmp4, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_211(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_i32_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N00, Tmp3), 0); SDValue Tmp5 = Transform_SubReg_i32_lane(Tmp2.getNode()); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, Tmp4, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } SDNode *Select_ISD_FMUL_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); // Pattern: (fmul:v4f32 QPR:v4f32:$src1, (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src2, (imm:i32):$lane)) // Emits: (VMULslfq:v4f32 QPR:v4f32:$src1, DPR_VFP2:v2f32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v2f32) { SDNode *Result = Emit_126(N, ARM::VMULslfq, MVT::v4f32); return Result; } } } // Pattern: (fmul:v4f32 (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src2, (imm:i32):$lane), QPR:v4f32:$src1) // Emits: (VMULslfq:v4f32 QPR:v4f32:$src1, DPR_VFP2:v2f32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v2f32) { SDNode *Result = Emit_128(N, ARM::VMULslfq, MVT::v4f32); return Result; } } } } { SDValue N0 = N->getOperand(0); // Pattern: (fmul:v4f32 QPR:v4f32:$src1, (NEONvduplane:v4f32 QPR:v4f32:$src2, (imm:i32):$lane)) // Emits: (VMULslfq:v4f32 QPR:v4f32:$src1, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 9 cost = 2 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v4f32) { SDNode *Result = Emit_210(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMULslfq, MVT::v2f32, MVT::v4f32); return Result; } } } // Pattern: (fmul:v4f32 (NEONvduplane:v4f32 QPR:v4f32:$src2, (imm:i32):$lane), QPR:v4f32:$src1) // Emits: (VMULslfq:v4f32 QPR:v4f32:$src1, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 9 cost = 2 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v4f32) { SDNode *Result = Emit_211(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMULslfq, MVT::v2f32, MVT::v4f32); return Result; } } } } // Pattern: (fmul:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VMULfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VMULfq, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_212(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N01, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_FNEG_f32(SDNode *N) { // Pattern: (fneg:f32 (fmul:f32 SPR:f32:$a, SPR:f32:$b)) // Emits: (VNMULS:f32 SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 6 cost = 1 size = 0 if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_212(N, ARM::VNMULS, MVT::f32); return Result; } } // Pattern: (fneg:f32 SPR:f32:$a) // Emits: (VNEGS:f32 SPR:f32:$a) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_31(N, ARM::VNEGS, MVT::f32); return Result; } // Pattern: (fneg:f32 SPR:f32:$a) // Emits: (EXTRACT_SUBREG:f32 (VNEGf32d_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$a, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 4 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_32(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VNEGf32d_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f64, MVT::f64, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FNEG_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { // Pattern: (fneg:f64 (fmul:f64 DPR:f64:$a, DPR:f64:$b)) // Emits: (VNMULD:f64 DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_212(N, ARM::VNMULD, MVT::f64); return Result; } } // Pattern: (fneg:f64 DPR:f64:$a) // Emits: (VNEGD:f64 DPR:f64:$a) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_31(N, ARM::VNEGD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FNEG_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VNEGf32d, MVT::v2f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FNEG_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_31(N, ARM::VNEGf32q, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FP_EXTEND_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_31(N, ARM::VCVTDS, MVT::f64); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FP_ROUND_f32(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_31(N, ARM::VCVTSD, MVT::f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FP_TO_SINT_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_31(N, ARM::VCVTf2sd, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FP_TO_SINT_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_31(N, ARM::VCVTf2sq, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FP_TO_UINT_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v2f32) { SDNode *Result = Emit_31(N, ARM::VCVTf2ud, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FP_TO_UINT_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v4f32) { SDNode *Result = Emit_31(N, ARM::VCVTf2uq, MVT::v4i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FSQRT_f32(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_31(N, ARM::VSQRTS, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FSQRT_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_31(N, ARM::VSQRTD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FSUB_f32(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); // Pattern: (fsub:f32 (fneg:f32 (fmul:f32 SPR:f32:$a, SPR:f32:$b)), SPR:f32:$dstin) // Emits: (VNMLAS:f32 SPR:f32:$dstin, SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FNEG) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_205(N, ARM::VNMLAS, MVT::f32); return Result; } } // Pattern: (fsub:f32 (fmul:f32 SPR:f32:$a, SPR:f32:$b), SPR:f32:$dstin) // Emits: (VNMLSS:f32 SPR:f32:$dstin, SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_127(N, ARM::VNMLSS, MVT::f32); return Result; } } // Pattern: (fsub:f32 SPR:f32:$dstin, (fmul:f32 SPR:f32:$a, SPR:f32:$b)) // Emits: (VMLSS:f32 SPR:f32:$dstin, SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->useNEONForSinglePrecisionFP())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_125(N, ARM::VMLSS, MVT::f32); return Result; } } // Pattern: (fsub:f32 SPR:f32:$a, SPR:f32:$b) // Emits: (VSUBS:f32 SPR:f32:$a, SPR:f32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2()) && (!Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_44(N, ARM::VSUBS, MVT::f32); return Result; } // Pattern: (fsub:f32 SPR:f32:$a, SPR:f32:$b) // Emits: (EXTRACT_SUBREG:f32 (VSUBfd_sfp:f64 (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$a, 1:i32), (INSERT_SUBREG:f64 (IMPLICIT_DEF:v2f32), SPR:f32:$b, 1:i32)), 1:i32) // Pattern complexity = 3 cost = 6 size = 0 if ((Subtarget->hasNEON()) && (Subtarget->useNEONForSinglePrecisionFP())) { SDNode *Result = Emit_206(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, ARM::VSUBfd_sfp, TargetOpcode::EXTRACT_SUBREG, MVT::v2f32, MVT::f64, MVT::v2f32, MVT::f64, MVT::f64, MVT::f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FSUB_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue N0 = N->getOperand(0); // Pattern: (fsub:f64 (fneg:f64 (fmul:f64 DPR:f64:$a, DPR:f64:$b)), DPR:f64:$dstin) // Emits: (VNMLAD:f64 DPR:f64:$dstin, DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FNEG) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_205(N, ARM::VNMLAD, MVT::f64); return Result; } } // Pattern: (fsub:f64 (fmul:f64 DPR:f64:$a, DPR:f64:$b), DPR:f64:$dstin) // Emits: (VNMLSD:f64 DPR:f64:$dstin, DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 6 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_127(N, ARM::VNMLSD, MVT::f64); return Result; } } // Pattern: (fsub:f64 DPR:f64:$dstin, (fmul:f64 DPR:f64:$a, DPR:f64:$b)) // Emits: (VMLSD:f64 DPR:f64:$dstin, DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->useNEONForSinglePrecisionFP())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_125(N, ARM::VMLSD, MVT::f64); return Result; } } // Pattern: (fsub:f64 DPR:f64:$a, DPR:f64:$b) // Emits: (VSUBD:f64 DPR:f64:$a, DPR:f64:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasVFP2())) { SDNode *Result = Emit_44(N, ARM::VSUBD, MVT::f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FSUB_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (fsub:v2f32 DPR:v2f32:$src1, (fmul:v2f32 DPR:v2f32:$src2, (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane))) // Emits: (VMLSslfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2f32) { SDNode *Result = Emit_129(N, ARM::VMLSslfd, MVT::v2f32); return Result; } } } // Pattern: (fsub:v2f32 DPR:v2f32:$src1, (fmul:v2f32 (NEONvduplane:v2f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane), DPR:v2f32:$src2)) // Emits: (VMLSslfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2f32) { SDNode *Result = Emit_130(N, ARM::VMLSslfd, MVT::v2f32); return Result; } } } } // Pattern: (fsub:v2f32 DPR:v2f32:$src1, (fmul:v2f32 DPR:v2f32:$src2, DPR:v2f32:$src3)) // Emits: (VMLSfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2, DPR:v2f32:$src3) // Pattern complexity = 6 cost = 1 size = 0 SDNode *Result = Emit_125(N, ARM::VMLSfd, MVT::v2f32); return Result; } } // Pattern: (fsub:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VSUBfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBfd, MVT::v2f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_FSUB_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (fsub:v4f32 QPR:v4f32:$src1, (fmul:v4f32 QPR:v4f32:$src2, (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane))) // Emits: (VMLSslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2f32) { SDNode *Result = Emit_129(N, ARM::VMLSslfq, MVT::v4f32); return Result; } } } // Pattern: (fsub:v4f32 QPR:v4f32:$src1, (fmul:v4f32 (NEONvduplane:v4f32 DPR_VFP2:v2f32:$src3, (imm:i32):$lane), QPR:v4f32:$src2)) // Emits: (VMLSslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, DPR_VFP2:v2f32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2f32) { SDNode *Result = Emit_130(N, ARM::VMLSslfq, MVT::v4f32); return Result; } } } } } { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (fsub:v4f32 QPR:v4f32:$src1, (fmul:v4f32 QPR:v4f32:$src2, (NEONvduplane:v4f32 QPR:v4f32:$src3, (imm:i32):$lane))) // Emits: (VMLSslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4f32) { SDNode *Result = Emit_137(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLSslfq, MVT::v2f32, MVT::v4f32); return Result; } } } // Pattern: (fsub:v4f32 QPR:v4f32:$src1, (fmul:v4f32 (NEONvduplane:v4f32 QPR:v4f32:$src3, (imm:i32):$lane), QPR:v4f32:$src2)) // Emits: (VMLSslfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, (EXTRACT_SUBREG:v2f32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4f32) { SDNode *Result = Emit_138(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLSslfq, MVT::v2f32, MVT::v4f32); return Result; } } } } } if ((Subtarget->hasNEON())) { // Pattern: (fsub:v4f32 QPR:v4f32:$src1, (fmul:v4f32 QPR:v4f32:$src2, QPR:v4f32:$src3)) // Emits: (VMLSfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2, QPR:v4f32:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::FMUL) { SDNode *Result = Emit_125(N, ARM::VMLSfq, MVT::v4f32); return Result; } } // Pattern: (fsub:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VSUBfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBfq, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_INSERT_VECTOR_ELT_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_50(N, ARM::VSETLNi8, MVT::v8i8); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_213(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_i8_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp3), 0); SDValue Tmp6 = Transform_SubReg_i8_lane(Tmp2.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp4, N1, Tmp6, Tmp7, Tmp8 }; SDValue Tmp9(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Ops1, 5), 0); SDValue Tmp10 = Transform_DSubReg_i8_reg(Tmp2.getNode()); return CurDAG->SelectNodeTo(N, Opc2, VT2, N0, Tmp9, Tmp10); } SDNode *Select_ISD_INSERT_VECTOR_ELT_v16i8(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_213(N, TargetOpcode::EXTRACT_SUBREG, ARM::VSETLNi8, TargetOpcode::INSERT_SUBREG, MVT::v8i8, MVT::f64, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_INSERT_VECTOR_ELT_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_50(N, ARM::VSETLNi16, MVT::v4i16); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_214(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_i16_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp3), 0); SDValue Tmp6 = Transform_SubReg_i16_lane(Tmp2.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp4, N1, Tmp6, Tmp7, Tmp8 }; SDValue Tmp9(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Ops1, 5), 0); SDValue Tmp10 = Transform_DSubReg_i16_reg(Tmp2.getNode()); return CurDAG->SelectNodeTo(N, Opc2, VT2, N0, Tmp9, Tmp10); } SDNode *Select_ISD_INSERT_VECTOR_ELT_v8i16(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_214(N, TargetOpcode::EXTRACT_SUBREG, ARM::VSETLNi16, TargetOpcode::INSERT_SUBREG, MVT::v4i16, MVT::f64, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_INSERT_VECTOR_ELT_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_50(N, ARM::VSETLNi32, MVT::v2i32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_215(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_i32_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp3), 0); SDValue Tmp6 = Transform_SubReg_i32_lane(Tmp2.getNode()); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp4, N1, Tmp6, Tmp7, Tmp8 }; SDValue Tmp9(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Ops1, 5), 0); SDValue Tmp10 = Transform_DSubReg_i32_reg(Tmp2.getNode()); return CurDAG->SelectNodeTo(N, Opc2, VT2, N0, Tmp9, Tmp10); } SDNode *Select_ISD_INSERT_VECTOR_ELT_v4i32(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_215(N, TargetOpcode::EXTRACT_SUBREG, ARM::VSETLNi32, TargetOpcode::INSERT_SUBREG, MVT::v2i32, MVT::f64, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_216(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp1 = CurDAG->getTargetConstant(ARM::DPR_VFP2RegClassID, MVT::i32); SDValue Tmp2(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp1), 0); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp5 = Transform_SSubReg_f32_reg(Tmp4.getNode()); return CurDAG->SelectNodeTo(N, Opc1, VT1, Tmp2, N1, Tmp5); } SDNode *Select_ISD_INSERT_VECTOR_ELT_v2f32(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_216(N, TargetOpcode::COPY_TO_REGCLASS, TargetOpcode::INSERT_SUBREG, MVT::v2f32, MVT::v2f32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_217(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp1 = CurDAG->getTargetConstant(ARM::QPR_VFP2RegClassID, MVT::i32); SDValue Tmp2(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N0, Tmp1), 0); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp5 = Transform_SSubReg_f32_reg(Tmp4.getNode()); return CurDAG->SelectNodeTo(N, Opc1, VT1, Tmp2, N1, Tmp5); } SDNode *Select_ISD_INSERT_VECTOR_ELT_v4f32(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_217(N, TargetOpcode::COPY_TO_REGCLASS, TargetOpcode::INSERT_SUBREG, MVT::v4f32, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_218(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_f64_reg(Tmp2.getNode()); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0, N1, Tmp3); } SDNode *Select_ISD_INSERT_VECTOR_ELT_v2f64(SDNode *N) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant) { SDNode *Result = Emit_218(N, TargetOpcode::INSERT_SUBREG, MVT::v2f64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_219(SDNode *N, unsigned Opc0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1, SDValue &CPTmpN2_2, SDValue &CPTmpN2_3) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3, N3, Tmp4, Tmp5, Chain }; return CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, 8); } SDNode *Select_ISD_INTRINSIC_VOID(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(105)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3)) { SDValue N3 = N->getOperand(3); if (N2.getValueType() == MVT::i32) { // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, DPR:v8i8:$src) // Emits: (VST1d8:isVoid addrmode6:i32:$addr, DPR:v8i8:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_219(N, ARM::VST1d8, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, DPR:v4i16:$src) // Emits: (VST1d16:isVoid addrmode6:i32:$addr, DPR:v4i16:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_219(N, ARM::VST1d16, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, DPR:v2i32:$src) // Emits: (VST1d32:isVoid addrmode6:i32:$addr, DPR:v2i32:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_219(N, ARM::VST1d32, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, DPR:v2f32:$src) // Emits: (VST1df:isVoid addrmode6:i32:$addr, DPR:v2f32:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v2f32) { SDNode *Result = Emit_219(N, ARM::VST1df, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, DPR:v1i64:$src) // Emits: (VST1d64:isVoid addrmode6:i32:$addr, DPR:v1i64:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v1i64) { SDNode *Result = Emit_219(N, ARM::VST1d64, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, QPR:v16i8:$src) // Emits: (VST1q8:isVoid addrmode6:i32:$addr, QPR:v16i8:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v16i8) { SDNode *Result = Emit_219(N, ARM::VST1q8, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, QPR:v8i16:$src) // Emits: (VST1q16:isVoid addrmode6:i32:$addr, QPR:v8i16:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v8i16) { SDNode *Result = Emit_219(N, ARM::VST1q16, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, QPR:v4i32:$src) // Emits: (VST1q32:isVoid addrmode6:i32:$addr, QPR:v4i32:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v4i32) { SDNode *Result = Emit_219(N, ARM::VST1q32, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, QPR:v4f32:$src) // Emits: (VST1qf:isVoid addrmode6:i32:$addr, QPR:v4f32:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v4f32) { SDNode *Result = Emit_219(N, ARM::VST1qf, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } // Pattern: (intrinsic_void:isVoid 105:iPTR, addrmode6:i32:$addr, QPR:v2i64:$src) // Emits: (VST1q64:isVoid addrmode6:i32:$addr, QPR:v2i64:$src) // Pattern complexity = 23 cost = 1 size = 0 if (N3.getValueType() == MVT::v2i64) { SDNode *Result = Emit_219(N, ARM::VST1q64, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } } } CannotYetSelectIntrinsic(N); return NULL; } DISABLE_INLINE SDNode *Emit_220(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N2, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_221(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N2, N3, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_222(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N1, Tmp3, Tmp4); } DISABLE_INLINE SDNode *Emit_223(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue N4 = N->getOperand(4); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N2, N3, N4, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_224(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue N4 = N->getOperand(4); SDValue N5 = N->getOperand(5); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N2, N3, N4, N5, Tmp7, Tmp8 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 7); } DISABLE_INLINE SDNode *Emit_225(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue N4 = N->getOperand(4); SDValue N5 = N->getOperand(5); SDValue N6 = N->getOperand(6); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N2, N3, N4, N5, N6, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 8); } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v8i8 28:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VHADDsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(28)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VHADDsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 29:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VHADDuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(29)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VHADDuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 91:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VRHADDsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(91)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VRHADDsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 92:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VRHADDuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(92)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VRHADDuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 64:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQADDsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQADDsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 65:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQADDuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQADDuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 16:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VADDHNv8i8:v8i8 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VADDHNv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 88:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VRADDHNv8i8:v8i8 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(88)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VRADDHNv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 53:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMULpd:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(53)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMULpd, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 30:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VHSUBsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(30)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VHSUBsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 31:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VHSUBuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(31)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VHSUBuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 86:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQSUBsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQSUBsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 87:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQSUBuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQSUBuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 112:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VSUBHNv8i8:v8i8 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(112)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VSUBHNv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 98:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VRSUBHNv8i8:v8i8 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(98)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VRSUBHNv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 9:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VABDsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VABDsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 10:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VABDuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(10)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VABDuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 5:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VABAsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(5)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VABAsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 6:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VABAuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(6)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VABAuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 39:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMAXsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMAXsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 40:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMAXuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(40)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMAXuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 41:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMINsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMINsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 42:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMINuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(42)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMINuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 56:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VPADDi8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(56)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VPADDi8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 59:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VPMAXs8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(59)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VPMAXs8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 60:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VPMAXu8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(60)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VPMAXu8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 61:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VPMINs8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(61)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VPMINs8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 62:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VPMINu8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(62)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VPMINu8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 103:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VSHLsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VSHLsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 104:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VSHLuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VSHLuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 94:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VRSHLsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VRSHLsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 95:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VRSHLuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VRSHLuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 83:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQSHLsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQSHLsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 85:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQSHLuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQSHLuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 78:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQRSHLsv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 79:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VQRSHLuv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 11:iPTR, DPR:v8i8:$src) // Emits: (VABSv8i8:v8i8 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VABSv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 63:iPTR, DPR:v8i8:$src) // Emits: (VQABSv8i8:v8i8 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(63)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VQABSv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 73:iPTR, DPR:v8i8:$src) // Emits: (VQNEGv8i8:v8i8 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(73)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VQNEGv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 21:iPTR, DPR:v8i8:$src) // Emits: (VCLSv8i8:v8i8 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(21)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VCLSv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 22:iPTR, DPR:v8i8:$src) // Emits: (VCLZv8i8:v8i8 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(22)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VCLZv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 23:iPTR, DPR:v8i8:$src) // Emits: (VCNTd:v8i8 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(23)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VCNTd, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 49:iPTR, QPR:v8i16:$src) // Emits: (VMOVNv8i8:v8i8 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(49)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VMOVNv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 70:iPTR, QPR:v8i16:$src) // Emits: (VQMOVNsv8i8:v8i8 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(70)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VQMOVNsv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 72:iPTR, QPR:v8i16:$src) // Emits: (VQMOVNuv8i8:v8i8 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(72)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VQMOVNuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 71:iPTR, QPR:v8i16:$src) // Emits: (VQMOVNsuv8i8:v8i8 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(71)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VQMOVNsuv8i8, MVT::v8i8); return Result; } } // Pattern: (intrinsic_wo_chain:v8i8 117:iPTR, DPR:v8i8:$tbl1, DPR:v8i8:$src) // Emits: (VTBL1:v8i8 DPR:v8i8:$tbl1, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(117)) { SDNode *Result = Emit_220(N, ARM::VTBL1, MVT::v8i8); return Result; } // Pattern: (intrinsic_wo_chain:v8i8 118:iPTR, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$src) // Emits: (VTBL2:v8i8 DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(118)) { SDNode *Result = Emit_221(N, ARM::VTBL2, MVT::v8i8); return Result; } // Pattern: (intrinsic_wo_chain:v8i8 119:iPTR, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$src) // Emits: (VTBL3:v8i8 DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(119)) { SDNode *Result = Emit_223(N, ARM::VTBL3, MVT::v8i8); return Result; } // Pattern: (intrinsic_wo_chain:v8i8 120:iPTR, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$tbl4, DPR:v8i8:$src) // Emits: (VTBL4:v8i8 DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$tbl4, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(120)) { SDNode *Result = Emit_224(N, ARM::VTBL4, MVT::v8i8); return Result; } // Pattern: (intrinsic_wo_chain:v8i8 121:iPTR, DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$src) // Emits: (VTBX1:v8i8 DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(121)) { SDNode *Result = Emit_221(N, ARM::VTBX1, MVT::v8i8); return Result; } // Pattern: (intrinsic_wo_chain:v8i8 122:iPTR, DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$src) // Emits: (VTBX2:v8i8 DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(122)) { SDNode *Result = Emit_223(N, ARM::VTBX2, MVT::v8i8); return Result; } // Pattern: (intrinsic_wo_chain:v8i8 123:iPTR, DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$src) // Emits: (VTBX3:v8i8 DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(123)) { SDNode *Result = Emit_224(N, ARM::VTBX3, MVT::v8i8); return Result; } // Pattern: (intrinsic_wo_chain:v8i8 124:iPTR, DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$tbl4, DPR:v8i8:$src) // Emits: (VTBX4:v8i8 DPR:v8i8:$orig, DPR:v8i8:$tbl1, DPR:v8i8:$tbl2, DPR:v8i8:$tbl3, DPR:v8i8:$tbl4, DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(124)) { SDNode *Result = Emit_225(N, ARM::VTBX4, MVT::v8i8); return Result; } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v16i8 28:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VHADDsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(28)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VHADDsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 29:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VHADDuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(29)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VHADDuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 91:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VRHADDsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(91)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VRHADDsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 92:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VRHADDuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(92)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VRHADDuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 64:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQADDsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQADDsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 65:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQADDuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQADDuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 53:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VMULpq:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(53)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VMULpq, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 30:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VHSUBsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(30)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VHSUBsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 31:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VHSUBuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(31)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VHSUBuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 86:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQSUBsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQSUBsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 87:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQSUBuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQSUBuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 9:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VABDsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VABDsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 10:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VABDuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(10)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VABDuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 5:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2, QPR:v16i8:$src3) // Emits: (VABAsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, QPR:v16i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(5)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8 && N3.getValueType() == MVT::v16i8) { SDNode *Result = Emit_221(N, ARM::VABAsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 6:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2, QPR:v16i8:$src3) // Emits: (VABAuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, QPR:v16i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(6)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8 && N3.getValueType() == MVT::v16i8) { SDNode *Result = Emit_221(N, ARM::VABAuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 39:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VMAXsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VMAXsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 40:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VMAXuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(40)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VMAXuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 41:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VMINsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VMINsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 42:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VMINuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(42)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VMINuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 103:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VSHLsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VSHLsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 104:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VSHLuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VSHLuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 94:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VRSHLsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VRSHLsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 95:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VRSHLuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VRSHLuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 83:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQSHLsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQSHLsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 85:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQSHLuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQSHLuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 78:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQRSHLsv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 79:iPTR, QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VQRSHLuv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v16i8 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 11:iPTR, QPR:v16i8:$src) // Emits: (VABSv16i8:v16i8 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VABSv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 63:iPTR, QPR:v16i8:$src) // Emits: (VQABSv16i8:v16i8 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(63)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VQABSv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 73:iPTR, QPR:v16i8:$src) // Emits: (VQNEGv16i8:v16i8 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(73)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VQNEGv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 21:iPTR, QPR:v16i8:$src) // Emits: (VCLSv16i8:v16i8 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(21)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VCLSv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 22:iPTR, QPR:v16i8:$src) // Emits: (VCLZv16i8:v16i8 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(22)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VCLZv16i8, MVT::v16i8); return Result; } } // Pattern: (intrinsic_wo_chain:v16i8 23:iPTR, QPR:v16i8:$src) // Emits: (VCNTq:v16i8 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(23)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VCNTq, MVT::v16i8); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } DISABLE_INLINE SDNode *Emit_226(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N21)->getZExtValue()), MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N20, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_227(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N2, N10, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v4i16 68:iPTR, DPR:v4i16:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VQDMULHslv4i16:v4i16 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16 && N20.getValueType() == MVT::v4i16) { SDNode *Result = Emit_226(N, ARM::VQDMULHslv4i16, MVT::v4i16); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i16 74:iPTR, DPR:v4i16:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VQRDMULHslv4i16:v4i16 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16 && N20.getValueType() == MVT::v4i16) { SDNode *Result = Emit_226(N, ARM::VQRDMULHslv4i16, MVT::v4i16); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i16 68:iPTR, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane), DPR:v4i16:$src1) // Emits: (VQDMULHslv4i16:v4i16 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N10.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_227(N, ARM::VQDMULHslv4i16, MVT::v4i16); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i16 74:iPTR, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane), DPR:v4i16:$src1) // Emits: (VQRDMULHslv4i16:v4i16 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N10.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_227(N, ARM::VQRDMULHslv4i16, MVT::v4i16); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i16 28:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VHADDsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(28)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VHADDsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 29:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VHADDuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(29)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VHADDuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 91:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VRHADDsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(91)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VRHADDsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 92:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VRHADDuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(92)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VRHADDuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 64:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQADDsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQADDsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 65:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQADDuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQADDuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 16:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VADDHNv4i16:v4i16 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VADDHNv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 88:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VRADDHNv4i16:v4i16 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(88)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VRADDHNv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 68:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQDMULHv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQDMULHv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 74:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQRDMULHv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQRDMULHv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 30:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VHSUBsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(30)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VHSUBsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 31:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VHSUBuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(31)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VHSUBuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 86:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQSUBsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQSUBsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 87:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQSUBuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQSUBuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 112:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VSUBHNv4i16:v4i16 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(112)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VSUBHNv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 98:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VRSUBHNv4i16:v4i16 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(98)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VRSUBHNv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 9:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VABDsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VABDsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 10:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VABDuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(10)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VABDuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 5:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VABAsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(5)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VABAsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 6:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VABAuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(6)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VABAuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 39:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VMAXsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VMAXsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 40:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VMAXuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(40)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VMAXuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 41:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VMINsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VMINsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 42:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VMINuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(42)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VMINuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 56:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VPADDi16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(56)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VPADDi16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 57:iPTR, DPR:v8i8:$src) // Emits: (VPADDLsv8i8:v4i16 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(57)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VPADDLsv8i8, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 58:iPTR, DPR:v8i8:$src) // Emits: (VPADDLuv8i8:v4i16 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(58)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VPADDLuv8i8, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 54:iPTR, DPR:v4i16:$src1, DPR:v8i8:$src2) // Emits: (VPADALsv8i8:v4i16 DPR:v4i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(54)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VPADALsv8i8, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 55:iPTR, DPR:v4i16:$src1, DPR:v8i8:$src2) // Emits: (VPADALuv8i8:v4i16 DPR:v4i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(55)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VPADALuv8i8, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 59:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VPMAXs16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(59)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VPMAXs16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 60:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VPMAXu16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(60)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VPMAXu16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 61:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VPMINs16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(61)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VPMINs16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 62:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VPMINu16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(62)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VPMINu16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 103:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VSHLsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VSHLsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 104:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VSHLuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VSHLuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 94:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VRSHLsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VRSHLsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 95:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VRSHLuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VRSHLuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 83:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQSHLsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQSHLsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 85:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQSHLuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQSHLuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 78:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQRSHLsv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 79:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQRSHLuv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 11:iPTR, DPR:v4i16:$src) // Emits: (VABSv4i16:v4i16 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VABSv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 63:iPTR, DPR:v4i16:$src) // Emits: (VQABSv4i16:v4i16 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(63)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VQABSv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 73:iPTR, DPR:v4i16:$src) // Emits: (VQNEGv4i16:v4i16 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(73)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VQNEGv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 21:iPTR, DPR:v4i16:$src) // Emits: (VCLSv4i16:v4i16 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(21)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VCLSv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 22:iPTR, DPR:v4i16:$src) // Emits: (VCLZv4i16:v4i16 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(22)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VCLZv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 49:iPTR, QPR:v4i32:$src) // Emits: (VMOVNv4i16:v4i16 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(49)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VMOVNv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 70:iPTR, QPR:v4i32:$src) // Emits: (VQMOVNsv4i16:v4i16 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(70)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VQMOVNsv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 72:iPTR, QPR:v4i32:$src) // Emits: (VQMOVNuv4i16:v4i16 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(72)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VQMOVNuv4i16, MVT::v4i16); return Result; } } // Pattern: (intrinsic_wo_chain:v4i16 71:iPTR, QPR:v4i32:$src) // Emits: (VQMOVNsuv4i16:v4i16 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(71)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VQMOVNsuv4i16, MVT::v4i16); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } DISABLE_INLINE SDNode *Emit_228(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N21)->getZExtValue()), MVT::i32); SDValue Tmp5 = Transform_DSubReg_i16_reg(Tmp4.getNode()); SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N20, Tmp5), 0); SDValue Tmp7 = Transform_SubReg_i16_lane(Tmp4.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, Tmp6, Tmp7, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_229(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N2, N1, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_230(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N2, N1, N3, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_231(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp5 = Transform_DSubReg_i16_reg(Tmp4.getNode()); SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N10, Tmp5), 0); SDValue Tmp7 = Transform_SubReg_i16_lane(Tmp4.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N2, Tmp6, Tmp7, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v8i16 68:iPTR, QPR:v8i16:$src1, (NEONvduplane:v8i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VQDMULHslv8i16:v8i16 QPR:v8i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16 && N20.getValueType() == MVT::v4i16) { SDNode *Result = Emit_226(N, ARM::VQDMULHslv8i16, MVT::v8i16); return Result; } } } // Pattern: (intrinsic_wo_chain:v8i16 74:iPTR, QPR:v8i16:$src1, (NEONvduplane:v8i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VQRDMULHslv8i16:v8i16 QPR:v8i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16 && N20.getValueType() == MVT::v4i16) { SDNode *Result = Emit_226(N, ARM::VQRDMULHslv8i16, MVT::v8i16); return Result; } } } // Pattern: (intrinsic_wo_chain:v8i16 68:iPTR, (NEONvduplane:v8i16 DPR_8:v4i16:$src2, (imm:i32):$lane), QPR:v8i16:$src1) // Emits: (VQDMULHslv8i16:v8i16 QPR:v8i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N10.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_227(N, ARM::VQDMULHslv8i16, MVT::v8i16); return Result; } } } } // Pattern: (intrinsic_wo_chain:v8i16 74:iPTR, (NEONvduplane:v8i16 DPR_8:v4i16:$src2, (imm:i32):$lane), QPR:v8i16:$src1) // Emits: (VQRDMULHslv8i16:v8i16 QPR:v8i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N10.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_227(N, ARM::VQRDMULHslv8i16, MVT::v8i16); return Result; } } } } } } { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v8i16 68:iPTR, QPR:v8i16:$src1, (NEONvduplane:v8i16 QPR:v8i16:$src2, (imm:i32):$lane)) // Emits: (VQDMULHslv8i16:v8i16 QPR:v8i16:$src1, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src2, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16 && N20.getValueType() == MVT::v8i16) { SDNode *Result = Emit_228(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQDMULHslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } // Pattern: (intrinsic_wo_chain:v8i16 74:iPTR, QPR:v8i16:$src1, (NEONvduplane:v8i16 QPR:v8i16:$src2, (imm:i32):$lane)) // Emits: (VQRDMULHslv8i16:v8i16 QPR:v8i16:$src1, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src2, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16 && N20.getValueType() == MVT::v8i16) { SDNode *Result = Emit_228(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQRDMULHslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } // Pattern: (intrinsic_wo_chain:v8i16 68:iPTR, (NEONvduplane:v8i16 QPR:v8i16:$src2, (imm:i32):$lane), QPR:v8i16:$src1) // Emits: (VQDMULHslv8i16:v8i16 QPR:v8i16:$src1, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src2, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N10.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_231(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQDMULHslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } } // Pattern: (intrinsic_wo_chain:v8i16 74:iPTR, (NEONvduplane:v8i16 QPR:v8i16:$src2, (imm:i32):$lane), QPR:v8i16:$src1) // Emits: (VQRDMULHslv8i16:v8i16 QPR:v8i16:$src1, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src2, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N10.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_231(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQRDMULHslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } } } } if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v8i16 17:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VADDLsv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(17)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VADDLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 18:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VADDLuv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(18)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VADDLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 19:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2) // Emits: (VADDWsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(19)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VADDWsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 20:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2) // Emits: (VADDWuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(20)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VADDWuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 28:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VHADDsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(28)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VHADDsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 29:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VHADDuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(29)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VHADDuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 91:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VRHADDsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(91)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VRHADDsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 92:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VRHADDuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(92)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VRHADDuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 64:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQADDsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQADDsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 65:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQADDuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQADDuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 68:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQDMULHv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQDMULHv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 74:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQRDMULHv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQRDMULHv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 51:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMULLsv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(51)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMULLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 52:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMULLuv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(52)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMULLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 50:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VMULLp:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(50)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VMULLp, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 43:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VMLALsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VMLALsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 44:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VMLALuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VMLALuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 45:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VMLSLsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VMLSLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 46:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VMLSLuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VMLSLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 113:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VSUBLsv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(113)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VSUBLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 114:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VSUBLuv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(114)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VSUBLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 115:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2) // Emits: (VSUBWsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(115)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VSUBWsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 116:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2) // Emits: (VSUBWuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(116)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VSUBWuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 30:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VHSUBsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(30)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VHSUBsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 31:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VHSUBuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(31)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VHSUBuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 86:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQSUBsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQSUBsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 87:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQSUBuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQSUBuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 9:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VABDsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VABDsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 10:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VABDuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(10)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VABDuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 7:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VABDLsv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(7)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VABDLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 8:iPTR, DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VABDLuv8i16:v8i16 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(8)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i8) { SDNode *Result = Emit_220(N, ARM::VABDLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 5:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2, QPR:v8i16:$src3) // Emits: (VABAsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, QPR:v8i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(5)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16 && N3.getValueType() == MVT::v8i16) { SDNode *Result = Emit_221(N, ARM::VABAsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 6:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2, QPR:v8i16:$src3) // Emits: (VABAuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, QPR:v8i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(6)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16 && N3.getValueType() == MVT::v8i16) { SDNode *Result = Emit_221(N, ARM::VABAuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 3:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VABALsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(3)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VABALsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 4:iPTR, QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Emits: (VABALuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(4)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i8 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_221(N, ARM::VABALuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 39:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VMAXsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VMAXsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 40:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VMAXuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(40)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VMAXuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 41:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VMINsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VMINsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 42:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VMINuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(42)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VMINuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 57:iPTR, QPR:v16i8:$src) // Emits: (VPADDLsv16i8:v8i16 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(57)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VPADDLsv16i8, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 58:iPTR, QPR:v16i8:$src) // Emits: (VPADDLuv16i8:v8i16 QPR:v16i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(58)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v16i8) { SDNode *Result = Emit_222(N, ARM::VPADDLuv16i8, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 54:iPTR, QPR:v8i16:$src1, QPR:v16i8:$src2) // Emits: (VPADALsv16i8:v8i16 QPR:v8i16:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(54)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VPADALsv16i8, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 55:iPTR, QPR:v8i16:$src1, QPR:v16i8:$src2) // Emits: (VPADALuv16i8:v8i16 QPR:v8i16:$src1, QPR:v16i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(55)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v16i8) { SDNode *Result = Emit_220(N, ARM::VPADALuv16i8, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 103:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VSHLsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VSHLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 104:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VSHLuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VSHLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 94:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VRSHLsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VRSHLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 95:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VRSHLuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VRSHLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 83:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQSHLsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQSHLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 85:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQSHLuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQSHLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 78:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQRSHLsv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 79:iPTR, QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VQRSHLuv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i16 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 11:iPTR, QPR:v8i16:$src) // Emits: (VABSv8i16:v8i16 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VABSv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 63:iPTR, QPR:v8i16:$src) // Emits: (VQABSv8i16:v8i16 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(63)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VQABSv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 73:iPTR, QPR:v8i16:$src) // Emits: (VQNEGv8i16:v8i16 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(73)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VQNEGv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 21:iPTR, QPR:v8i16:$src) // Emits: (VCLSv8i16:v8i16 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(21)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VCLSv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 22:iPTR, QPR:v8i16:$src) // Emits: (VCLZv8i16:v8i16 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(22)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VCLZv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 47:iPTR, DPR:v8i8:$src) // Emits: (VMOVLsv8i16:v8i16 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(47)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VMOVLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 48:iPTR, DPR:v8i8:$src) // Emits: (VMOVLuv8i16:v8i16 DPR:v8i8:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(48)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i8) { SDNode *Result = Emit_222(N, ARM::VMOVLuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 19:iPTR, DPR:v8i8:$src2, QPR:v8i16:$src1) // Emits: (VADDWsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(19)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_229(N, ARM::VADDWsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 20:iPTR, DPR:v8i8:$src2, QPR:v8i16:$src1) // Emits: (VADDWuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(20)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_229(N, ARM::VADDWuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 43:iPTR, DPR:v8i8:$src2, QPR:v8i16:$src1, DPR:v8i8:$src3) // Emits: (VMLALsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i16 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_230(N, ARM::VMLALsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 44:iPTR, DPR:v8i8:$src2, QPR:v8i16:$src1, DPR:v8i8:$src3) // Emits: (VMLALuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i16 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_230(N, ARM::VMLALuv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 45:iPTR, DPR:v8i8:$src2, QPR:v8i16:$src1, DPR:v8i8:$src3) // Emits: (VMLSLsv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i16 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_230(N, ARM::VMLSLsv8i16, MVT::v8i16); return Result; } } // Pattern: (intrinsic_wo_chain:v8i16 46:iPTR, DPR:v8i8:$src2, QPR:v8i16:$src1, DPR:v8i8:$src3) // Emits: (VMLSLuv8i16:v8i16 QPR:v8i16:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v8i8 && N2.getValueType() == MVT::v8i16 && N3.getValueType() == MVT::v8i8) { SDNode *Result = Emit_230(N, ARM::VMLSLuv8i16, MVT::v8i16); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } DISABLE_INLINE SDNode *Emit_232(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N2)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v2i32 68:iPTR, DPR:v2i32:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VQDMULHslv2i32:v2i32 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32 && N20.getValueType() == MVT::v2i32) { SDNode *Result = Emit_226(N, ARM::VQDMULHslv2i32, MVT::v2i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i32 74:iPTR, DPR:v2i32:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VQRDMULHslv2i32:v2i32 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32 && N20.getValueType() == MVT::v2i32) { SDNode *Result = Emit_226(N, ARM::VQRDMULHslv2i32, MVT::v2i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i32 68:iPTR, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), DPR:v2i32:$src1) // Emits: (VQDMULHslv2i32:v2i32 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N10.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_227(N, ARM::VQDMULHslv2i32, MVT::v2i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v2i32 74:iPTR, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), DPR:v2i32:$src1) // Emits: (VQRDMULHslv2i32:v2i32 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N10.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_227(N, ARM::VQRDMULHslv2i32, MVT::v2i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v2i32 24:iPTR, DPR:v2f32:$src, (imm:i32):$SIMM) // Emits: (VCVTf2xsd:v2i32 DPR:v2f32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(24)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2f32) { SDNode *Result = Emit_232(N, ARM::VCVTf2xsd, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 25:iPTR, DPR:v2f32:$src, (imm:i32):$SIMM) // Emits: (VCVTf2xud:v2i32 DPR:v2f32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(25)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2f32) { SDNode *Result = Emit_232(N, ARM::VCVTf2xud, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 28:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VHADDsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(28)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VHADDsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 29:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VHADDuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(29)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VHADDuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 91:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VRHADDsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(91)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VRHADDsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 92:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VRHADDuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(92)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VRHADDuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 64:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQADDsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQADDsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 65:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQADDuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQADDuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 16:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VADDHNv2i32:v2i32 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VADDHNv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 88:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VRADDHNv2i32:v2i32 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(88)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VRADDHNv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 68:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQDMULHv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQDMULHv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 74:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQRDMULHv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQRDMULHv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 30:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VHSUBsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(30)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VHSUBsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 31:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VHSUBuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(31)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VHSUBuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 86:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQSUBsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQSUBsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 87:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQSUBuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQSUBuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 112:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VSUBHNv2i32:v2i32 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(112)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VSUBHNv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 98:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VRSUBHNv2i32:v2i32 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(98)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VRSUBHNv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 12:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VACGEd:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(12)) { SDNode *Result = Emit_220(N, ARM::VACGEd, MVT::v2i32); return Result; } // Pattern: (intrinsic_wo_chain:v2i32 14:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VACGTd:v2i32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(14)) { SDNode *Result = Emit_220(N, ARM::VACGTd, MVT::v2i32); return Result; } // Pattern: (intrinsic_wo_chain:v2i32 9:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VABDsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VABDsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 10:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VABDuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(10)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VABDuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 5:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VABAsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(5)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VABAsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 6:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VABAuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(6)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VABAuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 39:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VMAXsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VMAXsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 40:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VMAXuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(40)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VMAXuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 41:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VMINsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VMINsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 42:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VMINuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(42)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VMINuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 56:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VPADDi32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(56)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VPADDi32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 57:iPTR, DPR:v4i16:$src) // Emits: (VPADDLsv4i16:v2i32 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(57)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VPADDLsv4i16, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 58:iPTR, DPR:v4i16:$src) // Emits: (VPADDLuv4i16:v2i32 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(58)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VPADDLuv4i16, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 54:iPTR, DPR:v2i32:$src1, DPR:v4i16:$src2) // Emits: (VPADALsv4i16:v2i32 DPR:v2i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(54)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VPADALsv4i16, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 55:iPTR, DPR:v2i32:$src1, DPR:v4i16:$src2) // Emits: (VPADALuv4i16:v2i32 DPR:v2i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(55)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VPADALuv4i16, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 59:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VPMAXs32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(59)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VPMAXs32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 60:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VPMAXu32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(60)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VPMAXu32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 61:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VPMINs32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(61)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VPMINs32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 62:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VPMINu32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(62)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VPMINu32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 89:iPTR, DPR:v2i32:$src) // Emits: (VRECPEd:v2i32 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(89)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VRECPEd, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 96:iPTR, DPR:v2i32:$src) // Emits: (VRSQRTEd:v2i32 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(96)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VRSQRTEd, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 103:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VSHLsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VSHLsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 104:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VSHLuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VSHLuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 94:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VRSHLsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VRSHLsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 95:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VRSHLuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VRSHLuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 83:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQSHLsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQSHLsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 85:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQSHLuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQSHLuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 78:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQRSHLsv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 79:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQRSHLuv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 11:iPTR, DPR:v2i32:$src) // Emits: (VABSv2i32:v2i32 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VABSv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 63:iPTR, DPR:v2i32:$src) // Emits: (VQABSv2i32:v2i32 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(63)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VQABSv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 73:iPTR, DPR:v2i32:$src) // Emits: (VQNEGv2i32:v2i32 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(73)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VQNEGv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 21:iPTR, DPR:v2i32:$src) // Emits: (VCLSv2i32:v2i32 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(21)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VCLSv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 22:iPTR, DPR:v2i32:$src) // Emits: (VCLZv2i32:v2i32 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(22)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VCLZv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 49:iPTR, QPR:v2i64:$src) // Emits: (VMOVNv2i32:v2i32 QPR:v2i64:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(49)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i64) { SDNode *Result = Emit_222(N, ARM::VMOVNv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 70:iPTR, QPR:v2i64:$src) // Emits: (VQMOVNsv2i32:v2i32 QPR:v2i64:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(70)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i64) { SDNode *Result = Emit_222(N, ARM::VQMOVNsv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 72:iPTR, QPR:v2i64:$src) // Emits: (VQMOVNuv2i32:v2i32 QPR:v2i64:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(72)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i64) { SDNode *Result = Emit_222(N, ARM::VQMOVNuv2i32, MVT::v2i32); return Result; } } // Pattern: (intrinsic_wo_chain:v2i32 71:iPTR, QPR:v2i64:$src) // Emits: (VQMOVNsuv2i32:v2i32 QPR:v2i64:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(71)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i64) { SDNode *Result = Emit_222(N, ARM::VQMOVNsuv2i32, MVT::v2i32); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } DISABLE_INLINE SDNode *Emit_233(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N31)->getZExtValue()), MVT::i32); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N2, N30, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_234(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N21)->getZExtValue()), MVT::i32); SDValue Tmp5 = Transform_DSubReg_i32_reg(Tmp4.getNode()); SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N20, Tmp5), 0); SDValue Tmp7 = Transform_SubReg_i32_lane(Tmp4.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, Tmp6, Tmp7, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_235(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N31)->getZExtValue()), MVT::i32); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N2, N1, N30, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_236(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp5 = Transform_DSubReg_i32_reg(Tmp4.getNode()); SDValue Tmp6(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N10, Tmp5), 0); SDValue Tmp7 = Transform_SubReg_i32_lane(Tmp4.getNode()); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N2, Tmp6, Tmp7, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v4i32 68:iPTR, QPR:v4i32:$src1, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VQDMULHslv4i32:v4i32 QPR:v4i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32 && N20.getValueType() == MVT::v2i32) { SDNode *Result = Emit_226(N, ARM::VQDMULHslv4i32, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 74:iPTR, QPR:v4i32:$src1, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VQRDMULHslv4i32:v4i32 QPR:v4i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32 && N20.getValueType() == MVT::v2i32) { SDNode *Result = Emit_226(N, ARM::VQRDMULHslv4i32, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 51:iPTR, DPR:v4i16:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VMULLslsv4i16:v4i32 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(51)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16 && N20.getValueType() == MVT::v4i16) { SDNode *Result = Emit_226(N, ARM::VMULLslsv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 52:iPTR, DPR:v4i16:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VMULLsluv4i16:v4i32 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(52)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16 && N20.getValueType() == MVT::v4i16) { SDNode *Result = Emit_226(N, ARM::VMULLsluv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 69:iPTR, DPR:v4i16:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VQDMULLslv4i16:v4i32 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(69)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16 && N20.getValueType() == MVT::v4i16) { SDNode *Result = Emit_226(N, ARM::VQDMULLslv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 43:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLALslsv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_233(N, ARM::VMLALslsv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 44:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLALsluv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_233(N, ARM::VMLALsluv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 66:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VQDMLALslv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_233(N, ARM::VQDMLALslv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 45:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLSLslsv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_233(N, ARM::VMLSLslsv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 46:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLSLsluv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_233(N, ARM::VMLSLsluv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 67:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VQDMLSLslv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_233(N, ARM::VQDMLSLslv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 68:iPTR, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), QPR:v4i32:$src1) // Emits: (VQDMULHslv4i32:v4i32 QPR:v4i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N10.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_227(N, ARM::VQDMULHslv4i32, MVT::v4i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i32 74:iPTR, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), QPR:v4i32:$src1) // Emits: (VQRDMULHslv4i32:v4i32 QPR:v4i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N10.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_227(N, ARM::VQRDMULHslv4i32, MVT::v4i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i32 51:iPTR, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane), DPR:v4i16:$src1) // Emits: (VMULLslsv4i16:v4i32 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(51)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N10.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_227(N, ARM::VMULLslsv4i16, MVT::v4i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i32 52:iPTR, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane), DPR:v4i16:$src1) // Emits: (VMULLsluv4i16:v4i32 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(52)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N10.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_227(N, ARM::VMULLsluv4i16, MVT::v4i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i32 69:iPTR, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane), DPR:v4i16:$src1) // Emits: (VQDMULLslv4i16:v4i32 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(69)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N10.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_227(N, ARM::VQDMULLslv4i16, MVT::v4i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i32 43:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLALslsv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_235(N, ARM::VMLALslsv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 44:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLALsluv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_235(N, ARM::VMLALsluv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 66:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VQDMLALslv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_235(N, ARM::VQDMLALslv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 45:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLSLslsv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_235(N, ARM::VMLSLslsv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 46:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VMLSLsluv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_235(N, ARM::VMLSLsluv4i16, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 67:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane)) // Emits: (VQDMLSLslv4i16:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16 && N30.getValueType() == MVT::v4i16) { SDNode *Result = Emit_235(N, ARM::VQDMLSLslv4i16, MVT::v4i32); return Result; } } } } } { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v4i32 68:iPTR, QPR:v4i32:$src1, (NEONvduplane:v4i32 QPR:v4i32:$src2, (imm:i32):$lane)) // Emits: (VQDMULHslv4i32:v4i32 QPR:v4i32:$src1, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32 && N20.getValueType() == MVT::v4i32) { SDNode *Result = Emit_234(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQDMULHslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 74:iPTR, QPR:v4i32:$src1, (NEONvduplane:v4i32 QPR:v4i32:$src2, (imm:i32):$lane)) // Emits: (VQRDMULHslv4i32:v4i32 QPR:v4i32:$src1, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32 && N20.getValueType() == MVT::v4i32) { SDNode *Result = Emit_234(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQRDMULHslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } // Pattern: (intrinsic_wo_chain:v4i32 68:iPTR, (NEONvduplane:v4i32 QPR:v4i32:$src2, (imm:i32):$lane), QPR:v4i32:$src1) // Emits: (VQDMULHslv4i32:v4i32 QPR:v4i32:$src1, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N10.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_236(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQDMULHslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } } // Pattern: (intrinsic_wo_chain:v4i32 74:iPTR, (NEONvduplane:v4i32 QPR:v4i32:$src2, (imm:i32):$lane), QPR:v4i32:$src1) // Emits: (VQRDMULHslv4i32:v4i32 QPR:v4i32:$src1, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 14 cost = 2 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N10.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_236(N, TargetOpcode::EXTRACT_SUBREG, ARM::VQRDMULHslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } } } } if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v4i32 24:iPTR, QPR:v4f32:$src, (imm:i32):$SIMM) // Emits: (VCVTf2xsq:v4i32 QPR:v4f32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(24)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4f32) { SDNode *Result = Emit_232(N, ARM::VCVTf2xsq, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 25:iPTR, QPR:v4f32:$src, (imm:i32):$SIMM) // Emits: (VCVTf2xuq:v4i32 QPR:v4f32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(25)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4f32) { SDNode *Result = Emit_232(N, ARM::VCVTf2xuq, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 17:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VADDLsv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(17)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VADDLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 18:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VADDLuv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(18)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VADDLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 19:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2) // Emits: (VADDWsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(19)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VADDWsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 20:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2) // Emits: (VADDWuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(20)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VADDWuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 28:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VHADDsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(28)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VHADDsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 29:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VHADDuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(29)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VHADDuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 91:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VRHADDsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(91)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VRHADDsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 92:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VRHADDuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(92)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VRHADDuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 64:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQADDsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQADDsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 65:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQADDuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQADDuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 68:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQDMULHv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(68)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQDMULHv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 74:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQRDMULHv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(74)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQRDMULHv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 51:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VMULLsv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(51)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VMULLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 52:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VMULLuv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(52)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VMULLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 69:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VQDMULLv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(69)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VQDMULLv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 43:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VMLALsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VMLALsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 44:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VMLALuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VMLALuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 66:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VQDMLALv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VQDMLALv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 45:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VMLSLsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VMLSLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 46:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VMLSLuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VMLSLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 67:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VQDMLSLv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VQDMLSLv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 113:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VSUBLsv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(113)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VSUBLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 114:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VSUBLuv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(114)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VSUBLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 115:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2) // Emits: (VSUBWsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(115)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VSUBWsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 116:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2) // Emits: (VSUBWuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(116)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VSUBWuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 30:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VHSUBsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(30)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VHSUBsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 31:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VHSUBuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(31)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VHSUBuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 86:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQSUBsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQSUBsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 87:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQSUBuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQSUBuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 13:iPTR, QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VACGEq:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(13)) { SDNode *Result = Emit_220(N, ARM::VACGEq, MVT::v4i32); return Result; } // Pattern: (intrinsic_wo_chain:v4i32 15:iPTR, QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VACGTq:v4i32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(15)) { SDNode *Result = Emit_220(N, ARM::VACGTq, MVT::v4i32); return Result; } // Pattern: (intrinsic_wo_chain:v4i32 9:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VABDsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VABDsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 10:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VABDuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(10)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VABDuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 7:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VABDLsv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(7)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VABDLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 8:iPTR, DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VABDLuv4i32:v4i32 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(8)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i16) { SDNode *Result = Emit_220(N, ARM::VABDLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 5:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Emits: (VABAsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(5)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i32) { SDNode *Result = Emit_221(N, ARM::VABAsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 6:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Emits: (VABAuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(6)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i32) { SDNode *Result = Emit_221(N, ARM::VABAuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 3:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VABALsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(3)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VABALsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 4:iPTR, QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Emits: (VABALuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(4)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i16 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_221(N, ARM::VABALuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 39:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VMAXsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VMAXsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 40:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VMAXuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(40)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VMAXuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 41:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VMINsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VMINsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 42:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VMINuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(42)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VMINuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 57:iPTR, QPR:v8i16:$src) // Emits: (VPADDLsv8i16:v4i32 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(57)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VPADDLsv8i16, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 58:iPTR, QPR:v8i16:$src) // Emits: (VPADDLuv8i16:v4i32 QPR:v8i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(58)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v8i16) { SDNode *Result = Emit_222(N, ARM::VPADDLuv8i16, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 54:iPTR, QPR:v4i32:$src1, QPR:v8i16:$src2) // Emits: (VPADALsv8i16:v4i32 QPR:v4i32:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(54)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VPADALsv8i16, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 55:iPTR, QPR:v4i32:$src1, QPR:v8i16:$src2) // Emits: (VPADALuv8i16:v4i32 QPR:v4i32:$src1, QPR:v8i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(55)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v8i16) { SDNode *Result = Emit_220(N, ARM::VPADALuv8i16, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 89:iPTR, QPR:v4i32:$src) // Emits: (VRECPEq:v4i32 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(89)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VRECPEq, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 96:iPTR, QPR:v4i32:$src) // Emits: (VRSQRTEq:v4i32 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(96)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VRSQRTEq, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 103:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VSHLsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VSHLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 104:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VSHLuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VSHLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 94:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VRSHLsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VRSHLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 95:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VRSHLuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VRSHLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 83:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQSHLsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQSHLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 85:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQSHLuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQSHLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 78:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQRSHLsv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 79:iPTR, QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VQRSHLuv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i32 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 11:iPTR, QPR:v4i32:$src) // Emits: (VABSv4i32:v4i32 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VABSv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 63:iPTR, QPR:v4i32:$src) // Emits: (VQABSv4i32:v4i32 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(63)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VQABSv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 73:iPTR, QPR:v4i32:$src) // Emits: (VQNEGv4i32:v4i32 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(73)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VQNEGv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 21:iPTR, QPR:v4i32:$src) // Emits: (VCLSv4i32:v4i32 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(21)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VCLSv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 22:iPTR, QPR:v4i32:$src) // Emits: (VCLZv4i32:v4i32 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(22)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VCLZv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 47:iPTR, DPR:v4i16:$src) // Emits: (VMOVLsv4i32:v4i32 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(47)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VMOVLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 48:iPTR, DPR:v4i16:$src) // Emits: (VMOVLuv4i32:v4i32 DPR:v4i16:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(48)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i16) { SDNode *Result = Emit_222(N, ARM::VMOVLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 19:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1) // Emits: (VADDWsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(19)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_229(N, ARM::VADDWsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 20:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1) // Emits: (VADDWuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(20)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_229(N, ARM::VADDWuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 43:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, DPR:v4i16:$src3) // Emits: (VMLALsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_230(N, ARM::VMLALsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 44:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, DPR:v4i16:$src3) // Emits: (VMLALuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_230(N, ARM::VMLALuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 66:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, DPR:v4i16:$src3) // Emits: (VQDMLALv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_230(N, ARM::VQDMLALv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 45:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, DPR:v4i16:$src3) // Emits: (VMLSLsv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_230(N, ARM::VMLSLsv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 46:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, DPR:v4i16:$src3) // Emits: (VMLSLuv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_230(N, ARM::VMLSLuv4i32, MVT::v4i32); return Result; } } // Pattern: (intrinsic_wo_chain:v4i32 67:iPTR, DPR:v4i16:$src2, QPR:v4i32:$src1, DPR:v4i16:$src3) // Emits: (VQDMLSLv4i32:v4i32 QPR:v4i32:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v4i16 && N2.getValueType() == MVT::v4i32 && N3.getValueType() == MVT::v4i16) { SDNode *Result = Emit_230(N, ARM::VQDMLSLv4i32, MVT::v4i32); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v1i64 64:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQADDsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQADDsv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 65:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQADDuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQADDuv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 86:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQSUBsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQSUBsv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 87:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQSUBuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQSUBuv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 57:iPTR, DPR:v2i32:$src) // Emits: (VPADDLsv2i32:v1i64 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(57)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VPADDLsv2i32, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 58:iPTR, DPR:v2i32:$src) // Emits: (VPADDLuv2i32:v1i64 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(58)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VPADDLuv2i32, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 54:iPTR, DPR:v1i64:$src1, DPR:v2i32:$src2) // Emits: (VPADALsv2i32:v1i64 DPR:v1i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(54)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VPADALsv2i32, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 55:iPTR, DPR:v1i64:$src1, DPR:v2i32:$src2) // Emits: (VPADALuv2i32:v1i64 DPR:v1i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(55)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VPADALuv2i32, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 103:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VSHLsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VSHLsv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 104:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VSHLuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VSHLuv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 94:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VRSHLsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VRSHLsv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 95:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VRSHLuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VRSHLuv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 83:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQSHLsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQSHLsv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 85:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQSHLuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQSHLuv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 78:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQRSHLsv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv1i64, MVT::v1i64); return Result; } } // Pattern: (intrinsic_wo_chain:v1i64 79:iPTR, DPR:v1i64:$src1, DPR:v1i64:$src2) // Emits: (VQRSHLuv1i64:v1i64 DPR:v1i64:$src1, DPR:v1i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v1i64 && N2.getValueType() == MVT::v1i64) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv1i64, MVT::v1i64); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v2i64 51:iPTR, DPR:v2i32:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VMULLslsv2i32:v2i64 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(51)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32 && N20.getValueType() == MVT::v2i32) { SDNode *Result = Emit_226(N, ARM::VMULLslsv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 52:iPTR, DPR:v2i32:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VMULLsluv2i32:v2i64 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(52)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32 && N20.getValueType() == MVT::v2i32) { SDNode *Result = Emit_226(N, ARM::VMULLsluv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 69:iPTR, DPR:v2i32:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VQDMULLslv2i32:v2i64 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(69)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N20 = N2.getNode()->getOperand(0); SDValue N21 = N2.getNode()->getOperand(1); if (N21.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32 && N20.getValueType() == MVT::v2i32) { SDNode *Result = Emit_226(N, ARM::VQDMULLslv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 43:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLALslsv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_233(N, ARM::VMLALslsv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 44:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLALsluv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_233(N, ARM::VMLALsluv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 66:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VQDMLALslv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_233(N, ARM::VQDMLALslv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 45:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLSLslsv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_233(N, ARM::VMLSLslsv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 46:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLSLsluv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_233(N, ARM::VMLSLsluv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 67:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VQDMLSLslv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_233(N, ARM::VQDMLSLslv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 51:iPTR, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), DPR:v2i32:$src1) // Emits: (VMULLslsv2i32:v2i64 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(51)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N10.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_227(N, ARM::VMULLslsv2i32, MVT::v2i64); return Result; } } } } // Pattern: (intrinsic_wo_chain:v2i64 52:iPTR, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), DPR:v2i32:$src1) // Emits: (VMULLsluv2i32:v2i64 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(52)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N10.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_227(N, ARM::VMULLsluv2i32, MVT::v2i64); return Result; } } } } // Pattern: (intrinsic_wo_chain:v2i64 69:iPTR, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), DPR:v2i32:$src1) // Emits: (VQDMULLslv2i32:v2i64 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(69)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant) { SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N10.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_227(N, ARM::VQDMULLslv2i32, MVT::v2i64); return Result; } } } } // Pattern: (intrinsic_wo_chain:v2i64 43:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLALslsv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_235(N, ARM::VMLALslsv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 44:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLALsluv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_235(N, ARM::VMLALsluv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 66:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VQDMLALslv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_235(N, ARM::VQDMLALslv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 45:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLSLslsv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_235(N, ARM::VMLSLslsv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 46:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VMLSLsluv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_235(N, ARM::VMLSLsluv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 67:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane)) // Emits: (VQDMLSLslv2i32:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 14 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N3.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N30 = N3.getNode()->getOperand(0); SDValue N31 = N3.getNode()->getOperand(1); if (N31.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32 && N30.getValueType() == MVT::v2i32) { SDNode *Result = Emit_235(N, ARM::VQDMLSLslv2i32, MVT::v2i64); return Result; } } } // Pattern: (intrinsic_wo_chain:v2i64 17:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VADDLsv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(17)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VADDLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 18:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VADDLuv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(18)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VADDLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 19:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2) // Emits: (VADDWsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(19)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VADDWsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 20:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2) // Emits: (VADDWuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(20)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VADDWuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 64:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQADDsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(64)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQADDsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 65:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQADDuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(65)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQADDuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 51:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VMULLsv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(51)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VMULLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 52:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VMULLuv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(52)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VMULLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 69:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VQDMULLv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(69)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VQDMULLv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 43:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VMLALsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VMLALsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 44:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VMLALuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VMLALuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 66:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VQDMLALv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VQDMLALv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 45:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VMLSLsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VMLSLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 46:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VMLSLuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VMLSLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 67:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VQDMLSLv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VQDMLSLv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 113:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VSUBLsv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(113)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VSUBLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 114:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VSUBLuv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(114)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VSUBLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 115:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2) // Emits: (VSUBWsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(115)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VSUBWsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 116:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2) // Emits: (VSUBWuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(116)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VSUBWuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 86:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQSUBsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(86)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQSUBsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 87:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQSUBuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(87)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQSUBuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 7:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VABDLsv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(7)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VABDLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 8:iPTR, DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VABDLuv2i64:v2i64 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(8)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i32) { SDNode *Result = Emit_220(N, ARM::VABDLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 3:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VABALsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(3)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VABALsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 4:iPTR, QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Emits: (VABALuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(4)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i32 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_221(N, ARM::VABALuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 57:iPTR, QPR:v4i32:$src) // Emits: (VPADDLsv4i32:v2i64 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(57)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VPADDLsv4i32, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 58:iPTR, QPR:v4i32:$src) // Emits: (VPADDLuv4i32:v2i64 QPR:v4i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(58)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_222(N, ARM::VPADDLuv4i32, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 54:iPTR, QPR:v2i64:$src1, QPR:v4i32:$src2) // Emits: (VPADALsv4i32:v2i64 QPR:v2i64:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(54)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VPADALsv4i32, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 55:iPTR, QPR:v2i64:$src1, QPR:v4i32:$src2) // Emits: (VPADALuv4i32:v2i64 QPR:v2i64:$src1, QPR:v4i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(55)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v4i32) { SDNode *Result = Emit_220(N, ARM::VPADALuv4i32, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 103:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VSHLsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(103)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VSHLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 104:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VSHLuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(104)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VSHLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 94:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VRSHLsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(94)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VRSHLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 95:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VRSHLuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(95)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VRSHLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 83:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQSHLsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(83)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQSHLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 85:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQSHLuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(85)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQSHLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 78:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQRSHLsv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(78)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQRSHLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 79:iPTR, QPR:v2i64:$src1, QPR:v2i64:$src2) // Emits: (VQRSHLuv2i64:v2i64 QPR:v2i64:$src1, QPR:v2i64:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(79)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i64 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_220(N, ARM::VQRSHLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 47:iPTR, DPR:v2i32:$src) // Emits: (VMOVLsv2i64:v2i64 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(47)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VMOVLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 48:iPTR, DPR:v2i32:$src) // Emits: (VMOVLuv2i64:v2i64 DPR:v2i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(48)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_222(N, ARM::VMOVLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 19:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1) // Emits: (VADDWsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(19)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_229(N, ARM::VADDWsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 20:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1) // Emits: (VADDWuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(20)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64) { SDNode *Result = Emit_229(N, ARM::VADDWuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 43:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, DPR:v2i32:$src3) // Emits: (VMLALsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(43)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_230(N, ARM::VMLALsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 44:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, DPR:v2i32:$src3) // Emits: (VMLALuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(44)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_230(N, ARM::VMLALuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 66:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, DPR:v2i32:$src3) // Emits: (VQDMLALv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(66)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_230(N, ARM::VQDMLALv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 45:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, DPR:v2i32:$src3) // Emits: (VMLSLsv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(45)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_230(N, ARM::VMLSLsv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 46:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, DPR:v2i32:$src3) // Emits: (VMLSLuv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(46)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_230(N, ARM::VMLSLuv2i64, MVT::v2i64); return Result; } } // Pattern: (intrinsic_wo_chain:v2i64 67:iPTR, DPR:v2i32:$src2, QPR:v2i64:$src1, DPR:v2i32:$src3) // Emits: (VQDMLSLv2i64:v2i64 QPR:v2i64:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(67)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); if (N1.getValueType() == MVT::v2i32 && N2.getValueType() == MVT::v2i64 && N3.getValueType() == MVT::v2i32) { SDNode *Result = Emit_230(N, ARM::VQDMLSLv2i64, MVT::v2i64); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v2f32 26:iPTR, DPR:v2i32:$src, (imm:i32):$SIMM) // Emits: (VCVTxs2fd:v2f32 DPR:v2i32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(26)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_232(N, ARM::VCVTxs2fd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 27:iPTR, DPR:v2i32:$src, (imm:i32):$SIMM) // Emits: (VCVTxu2fd:v2f32 DPR:v2i32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(27)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v2i32) { SDNode *Result = Emit_232(N, ARM::VCVTxu2fd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 9:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VABDfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VABDfd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 39:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VMAXfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VMAXfd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 41:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VMINfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VMINfd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 56:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VPADDf:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(56)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VPADDf, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 59:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VPMAXf:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(59)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VPMAXf, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 61:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VPMINf:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(61)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VPMINf, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 89:iPTR, DPR:v2f32:$src) // Emits: (VRECPEfd:v2f32 DPR:v2f32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(89)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2f32) { SDNode *Result = Emit_222(N, ARM::VRECPEfd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 90:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VRECPSfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(90)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VRECPSfd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 96:iPTR, DPR:v2f32:$src) // Emits: (VRSQRTEfd:v2f32 DPR:v2f32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(96)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2f32) { SDNode *Result = Emit_222(N, ARM::VRSQRTEfd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 97:iPTR, DPR:v2f32:$src1, DPR:v2f32:$src2) // Emits: (VRSQRTSfd:v2f32 DPR:v2f32:$src1, DPR:v2f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(97)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v2f32 && N2.getValueType() == MVT::v2f32) { SDNode *Result = Emit_220(N, ARM::VRSQRTSfd, MVT::v2f32); return Result; } } // Pattern: (intrinsic_wo_chain:v2f32 11:iPTR, DPR:v2f32:$src) // Emits: (VABSfd:v2f32 DPR:v2f32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v2f32) { SDNode *Result = Emit_222(N, ARM::VABSfd, MVT::v2f32); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_WO_CHAIN_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); // Pattern: (intrinsic_wo_chain:v4f32 26:iPTR, QPR:v4i32:$src, (imm:i32):$SIMM) // Emits: (VCVTxs2fq:v4f32 QPR:v4i32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(26)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_232(N, ARM::VCVTxs2fq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 27:iPTR, QPR:v4i32:$src, (imm:i32):$SIMM) // Emits: (VCVTxu2fq:v4f32 QPR:v4i32:$src, (imm:i32):$SIMM) // Pattern complexity = 11 cost = 1 size = 0 if (CN1 == INT64_C(27)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N2.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::v4i32) { SDNode *Result = Emit_232(N, ARM::VCVTxu2fq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 9:iPTR, QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VABDfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(9)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4f32 && N2.getValueType() == MVT::v4f32) { SDNode *Result = Emit_220(N, ARM::VABDfq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 39:iPTR, QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VMAXfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(39)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4f32 && N2.getValueType() == MVT::v4f32) { SDNode *Result = Emit_220(N, ARM::VMAXfq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 41:iPTR, QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VMINfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(41)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4f32 && N2.getValueType() == MVT::v4f32) { SDNode *Result = Emit_220(N, ARM::VMINfq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 89:iPTR, QPR:v4f32:$src) // Emits: (VRECPEfq:v4f32 QPR:v4f32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(89)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4f32) { SDNode *Result = Emit_222(N, ARM::VRECPEfq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 90:iPTR, QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VRECPSfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(90)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4f32 && N2.getValueType() == MVT::v4f32) { SDNode *Result = Emit_220(N, ARM::VRECPSfq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 96:iPTR, QPR:v4f32:$src) // Emits: (VRSQRTEfq:v4f32 QPR:v4f32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(96)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4f32) { SDNode *Result = Emit_222(N, ARM::VRSQRTEfq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 97:iPTR, QPR:v4f32:$src1, QPR:v4f32:$src2) // Emits: (VRSQRTSfq:v4f32 QPR:v4f32:$src1, QPR:v4f32:$src2) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(97)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); if (N1.getValueType() == MVT::v4f32 && N2.getValueType() == MVT::v4f32) { SDNode *Result = Emit_220(N, ARM::VRSQRTSfq, MVT::v4f32); return Result; } } // Pattern: (intrinsic_wo_chain:v4f32 11:iPTR, QPR:v4f32:$src) // Emits: (VABSfq:v4f32 QPR:v4f32:$src) // Pattern complexity = 8 cost = 1 size = 0 if (CN1 == INT64_C(11)) { SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::v4f32) { SDNode *Result = Emit_222(N, ARM::VABSfq, MVT::v4f32); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } DISABLE_INLINE SDNode *Emit_237(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1, SDValue &CPTmpN2_2, SDValue &CPTmpN2_3) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3, Tmp3, Tmp4, Chain }; return CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, Ops0, 7); } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1d8, MVT::v8i8, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1q8, MVT::v16i8, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1d16, MVT::v4i16, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1q16, MVT::v8i16, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1d32, MVT::v2i32, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1q32, MVT::v4i32, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1d64, MVT::v1i64, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1q64, MVT::v2i64, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1df, MVT::v2f32, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } SDNode *Select_ISD_INTRINSIC_W_CHAIN_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(32)) { SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; SDValue CPTmpN2_3; if (SelectAddrMode6(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3) && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_237(N, ARM::VLD1qf, MVT::v4f32, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, CPTmpN2_3); return Result; } } } } CannotYetSelectIntrinsic(N); return NULL; } DISABLE_INLINE SDNode *Emit_238(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, Tmp1, Tmp2, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, Ops0, 5); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } DISABLE_INLINE SDNode *Emit_239(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp1, Tmp2, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, Ops0, 6); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } DISABLE_INLINE SDNode *Emit_240(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { N10, Tmp1, Tmp2, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, Ops0, 4); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } DISABLE_INLINE SDNode *Emit_241(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp1, Tmp2, Chain }; SDValue Tmp3(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, MVT::Other, Ops0, 6), 0); Chain = SDValue(Tmp3.getNode(), 1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs1 = MF->allocateMemRefsArray(1); MemRefs1[0] = cast<MemSDNode>(N)->getMemOperand(); SDNode *ResNode = CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Tmp3, Tmp4, Tmp5); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs1, MemRefs1 + 1); ReplaceUses(SDValue(N, 1), Chain); return ResNode; } DISABLE_INLINE SDNode *Emit_242(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp1 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp3, Tmp4, Chain }; SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, MVT::Other, Ops0, 6), 0); Chain = SDValue(Tmp5.getNode(), 1); SDValue Tmp6 = CurDAG->getTargetConstant(0x18ULL, MVT::i32); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp1, Tmp5, Tmp6, Tmp7, Tmp8 }; SDValue Tmp9(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Ops1, 5), 0); SDValue Tmp10 = CurDAG->getTargetConstant(0x18ULL, MVT::i32); SDValue Tmp11 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp12 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs2 = MF->allocateMemRefsArray(1); MemRefs2[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops2[] = { Tmp0, Tmp9, Tmp10, Tmp11, Tmp12 }; SDNode *ResNode = CurDAG->getMachineNode(Opc2, N->getDebugLoc(), VT2, Ops2, 5); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs2, MemRefs2 + 1); ReplaceUses(SDValue(N, 1), Chain); return ResNode; } DISABLE_INLINE SDNode *Emit_243(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2, SDValue &CPTmpN1_0, SDValue &CPTmpN1_1, SDValue &CPTmpN1_2) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp1 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN1_0, CPTmpN1_1, CPTmpN1_2, Tmp3, Tmp4, Chain }; SDValue Tmp5(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, MVT::Other, Ops0, 6), 0); Chain = SDValue(Tmp5.getNode(), 1); SDValue Tmp6 = CurDAG->getTargetConstant(0x10ULL, MVT::i32); SDValue Tmp7 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp8 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp1, Tmp5, Tmp6, Tmp7, Tmp8 }; SDValue Tmp9(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1, Ops1, 5), 0); SDValue Tmp10 = CurDAG->getTargetConstant(0x10ULL, MVT::i32); SDValue Tmp11 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp12 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs2 = MF->allocateMemRefsArray(1); MemRefs2[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops2[] = { Tmp0, Tmp9, Tmp10, Tmp11, Tmp12 }; SDNode *ResNode = CurDAG->getMachineNode(Opc2, N->getDebugLoc(), VT2, Ops2, 5); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs2, MemRefs2 + 1); ReplaceUses(SDValue(N, 1), Chain); return ResNode; } SDNode *Select_ISD_LOAD_i32(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 addrmodepc:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (PICLDR:i32 addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrModePC(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::PICLDR, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } if (Predicate_zextload(N)) { // Pattern: (ld:i32 addrmodepc:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>> // Emits: (PICLDRH:i32 addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_zextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrModePC(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::PICLDRH, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (ld:i32 addrmodepc:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>> // Emits: (PICLDRB:i32 addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_zextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrModePC(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::PICLDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } if (Predicate_sextload(N)) { // Pattern: (ld:i32 addrmodepc:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (PICLDRSH:i32 addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrModePC(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::PICLDRSH, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (ld:i32 addrmodepc:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (PICLDRSB:i32 addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrModePC(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::PICLDRSB, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } } } if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N) && Predicate_sextload(N)) { // Pattern: (ld:i32 t_addrmode_rr:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (tLDRSB:i32 t_addrmode_rr:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectThumbAddrModeRR(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::tLDRSB, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (ld:i32 t_addrmode_rr:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (tLDRSH:i32 t_addrmode_rr:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectThumbAddrModeRR(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::tLDRSH, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } } if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 addrmode2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (LDR:i32 addrmode2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDR, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if (Predicate_zextload(N)) { // Pattern: (ld:i32 addrmode3:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>> // Emits: (LDRH:i32 addrmode3:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode3(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRH, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 addrmode2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>> // Emits: (LDRB:i32 addrmode2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } if (Predicate_sextload(N)) { // Pattern: (ld:i32 addrmode3:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (LDRSH:i32 addrmode3:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode3(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRSH, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 addrmode3:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (LDRSB:i32 addrmode3:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode3(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRSB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } } } if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 t_addrmode_s4:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (tLDR:i32 t_addrmode_s4:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS4(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::tLDR, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if (Predicate_zextload(N)) { // Pattern: (ld:i32 t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>> // Emits: (tLDRB:i32 t_addrmode_s1:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS1(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::tLDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t_addrmode_s2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>> // Emits: (tLDRH:i32 t_addrmode_s2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::tLDRH, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } } } if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (t2LDRs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if (Predicate_zextload(N)) { // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>> // Emits: (t2LDRHs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRHs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>> // Emits: (t2LDRBs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRBs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } if (Predicate_sextload(N)) { // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (t2LDRSHs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRSHs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (t2LDRSBs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRSBs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } } } if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>> // Emits: (tLDRB:i32 t_addrmode_s1:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextload(N) && Predicate_zextloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS1(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::tLDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if (Predicate_extload(N)) { // Pattern: (ld:i32 t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>> // Emits: (tLDRB:i32 t_addrmode_s1:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS1(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::tLDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>> // Emits: (tLDRB:i32 t_addrmode_s1:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS1(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::tLDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t_addrmode_s2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>> // Emits: (tLDRH:i32 t_addrmode_s2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::tLDRH, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } } } if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>> // Emits: (t2LDRBs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextload(N) && Predicate_zextloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRBs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if (Predicate_extload(N)) { // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>> // Emits: (t2LDRBs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRBs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>> // Emits: (t2LDRBs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRBs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>> // Emits: (t2LDRHs:i32 t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectT2AddrModeSoReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::t2LDRHs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } } } if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 addrmode2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>> // Emits: (LDRB:i32 addrmode2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_zextload(N) && Predicate_zextloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if (Predicate_extload(N)) { // Pattern: (ld:i32 addrmode2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>> // Emits: (LDRB:i32 addrmode2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 addrmode2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>> // Emits: (LDRB:i32 addrmode2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 addrmode3:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>> // Emits: (LDRH:i32 addrmode3:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_extloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectAddrMode3(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_239(N, ARM::LDRH, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } } } if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N) && Predicate_sextload(N)) { // Pattern: (ld:i32 t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (tSXTB:i32 (tLDRB:i32 t_addrmode_s1:i32:$addr)) // Pattern complexity = 16 cost = 2 size = 0 if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS1(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_241(N, ARM::tLDRB, ARM::tSXTB, MVT::i32, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t_addrmode_s2:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (tSXTH:i32 (tLDRH:i32 t_addrmode_s2:i32:$addr)) // Pattern complexity = 16 cost = 2 size = 0 if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS2(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_241(N, ARM::tLDRH, ARM::tSXTH, MVT::i32, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } } if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { if (Predicate_sextload(N)) { // Pattern: (ld:i32 t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (tASRri:i32 (tLSLri:i32 (tLDRB:i32 t_addrmode_s1:i32:$addr), 24:i32), 24:i32) // Pattern complexity = 16 cost = 3 size = 0 if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS1(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_242(N, ARM::tLDRB, ARM::tLSLri, ARM::tASRri, MVT::i32, MVT::i32, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (ld:i32 t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (tASRri:i32 (tLSLri:i32 (tLDRH:i32 t_addrmode_s1:i32:$addr), 16:i32), 16:i32) // Pattern complexity = 16 cost = 3 size = 0 if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectThumbAddrModeS1(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_243(N, ARM::tLDRH, ARM::tLSLri, ARM::tASRri, MVT::i32, MVT::i32, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } } // Pattern: (ld:i32 t_addrmode_sp:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (tLDRspi:i32 t_addrmode_sp:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectThumbAddrModeSP(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::tLDRspi, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { if (Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (t2LDRi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (t2LDRi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } if (Predicate_zextload(N)) { if (Predicate_zextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>> // Emits: (t2LDRHi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRHi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>> // Emits: (t2LDRHi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRHi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } if (Predicate_zextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>> // Emits: (t2LDRBi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>> // Emits: (t2LDRBi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } if (Predicate_sextload(N)) { if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (t2LDRSHi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRSHi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (t2LDRSHi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRSHi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (t2LDRSBi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRSBi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (t2LDRSBi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRSBi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } if (Predicate_zextload(N) && Predicate_zextloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>> // Emits: (t2LDRBi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>> // Emits: (t2LDRBi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } if (Predicate_extload(N)) { if (Predicate_extloadi1(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>> // Emits: (t2LDRBi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>> // Emits: (t2LDRBi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } if (Predicate_extloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>> // Emits: (t2LDRBi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>> // Emits: (t2LDRBi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRBi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } if (Predicate_extloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; // Pattern: (ld:i32 t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>> // Emits: (t2LDRHi12:i32 t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRHi12, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } // Pattern: (ld:i32 t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>> // Emits: (t2LDRHi8:i32 t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::t2LDRHi8, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } } } if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N) && Predicate_extload(N)) { // Pattern: (ld:i32 addrmodepc:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>> // Emits: (PICLDRB:i32 addrmodepc:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_extloadi8(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrModePC(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::PICLDRB, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (ld:i32 addrmodepc:i32:$addr)<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>> // Emits: (PICLDRH:i32 addrmodepc:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_extloadi16(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrModePC(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::PICLDRH, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } } } // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (tLDRpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N) && Predicate_load(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::tLDRpci, MVT::i32); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N)) { // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_load>> // Emits: (t2LDRpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_load(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRpci, MVT::i32); return Result; } } } if (Predicate_zextload(N)) { // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi16>> // Emits: (t2LDRHpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_zextloadi16(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRHpci, MVT::i32); return Result; } } } // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi8>> // Emits: (t2LDRBpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_zextloadi8(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRBpci, MVT::i32); return Result; } } } } if (Predicate_sextload(N)) { // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi16>> // Emits: (t2LDRSHpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_sextloadi16(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRSHpci, MVT::i32); return Result; } } } // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_sextload>><<P:Predicate_sextloadi8>> // Emits: (t2LDRSBpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_sextloadi8(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRSBpci, MVT::i32); return Result; } } } } // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_zextload>><<P:Predicate_zextloadi1>> // Emits: (t2LDRBpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_zextload(N) && Predicate_zextloadi1(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRBpci, MVT::i32); return Result; } } } if (Predicate_extload(N)) { // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi1>> // Emits: (t2LDRBpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_extloadi1(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRBpci, MVT::i32); return Result; } } } // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi8>> // Emits: (t2LDRBpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_extloadi8(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRBpci, MVT::i32); return Result; } } } // Pattern: (ld:i32 (ARMWrapper:iPTR (tconstpool:iPTR):$addr))<<P:Predicate_unindexedload>><<P:Predicate_extload>><<P:Predicate_extloadi16>> // Emits: (t2LDRHpci:i32 (tconstpool:i32):$addr) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_extloadi16(N)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::Wrapper) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::TargetConstantPool) { SDNode *Result = Emit_240(N, ARM::t2LDRHpci, MVT::i32); return Result; } } } } } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_LOAD_f32(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N) && Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrMode5(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::VLDRS, MVT::f32, CPTmpN1_0, CPTmpN1_1); return Result; } } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_LOAD_f64(SDNode *N) { if ((Subtarget->hasVFP2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N) && Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrMode5(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::VLDRD, MVT::f64, CPTmpN1_0, CPTmpN1_1); return Result; } } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_LOAD_v2f64(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedload(N) && Predicate_load(N)) { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectAddrMode4(N, N1, CPTmpN1_0, CPTmpN1_1) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_238(N, ARM::VLDRQ, MVT::v2f64, CPTmpN1_0, CPTmpN1_1); return Result; } } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_244(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N10, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_245(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N10, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_246(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N10, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_247(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp10 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp11 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N100, Tmp10, Tmp11 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_248(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N10, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_249(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, N10, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_250(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N100, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_251(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N1, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_252(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N00, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_253(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N00, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_254(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp10 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp11 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N000, Tmp10, Tmp11 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_255(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N100, N00, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_256(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, N00, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_257(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N000, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_258(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N0, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_MUL_i32(SDNode *N) { if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SHL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SHL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp6) { int64_t CN7 = Tmp6->getSExtValue(); if (CN7 == INT64_C(16) && N001.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { // Pattern: (mul:i32 (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32), (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32)) // Emits: (SMULBB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 35 cost = 1 size = 0 { SDNode *Result = Emit_247(N, ARM::SMULBB, MVT::i32); return Result; } // Pattern: (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32)) // Emits: (SMULBB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 35 cost = 1 size = 0 SDNode *Result = Emit_254(N, ARM::SMULBB, MVT::i32); return Result; } } } } } // Pattern: (mul:i32 (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32), (sra:i32 GPR:i32:$b, 16:i32)) // Emits: (SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 27 cost = 1 size = 0 SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N001.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_248(N, ARM::SMULBT, MVT::i32); return Result; } } } } } } } } { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::SHL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N01.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { // Pattern: (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32)) // Emits: (SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 27 cost = 1 size = 0 { SDNode *Result = Emit_250(N, ARM::SMULTB, MVT::i32); return Result; } // Pattern: (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 (shl:i32 GPR:i32:$a, 16:i32), 16:i32)) // Emits: (SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 27 cost = 1 size = 0 SDNode *Result = Emit_255(N, ARM::SMULBT, MVT::i32); return Result; } } } } } } } } } // Pattern: (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), (sra:i32 GPR:i32:$a, 16:i32)) // Emits: (SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 27 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SHL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N001.getValueType() == MVT::i32 && N01.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_257(N, ARM::SMULTB, MVT::i32); return Result; } } } } } } } } // Pattern: (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 GPR:i32:$b, 16:i32)) // Emits: (SMULTT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N01.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_246(N, ARM::SMULTT, MVT::i32); return Result; } } } } } } } // Pattern: (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sra:i32 GPR:i32:$b, 16:i32)) // Emits: (t2SMULTT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N01.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_246(N, ARM::t2SMULTT, MVT::i32); return Result; } } } } } } } // Pattern: (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 GPR:i32:$a, 16:i32)) // Emits: (SMULTT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N01.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_253(N, ARM::SMULTT, MVT::i32); return Result; } } } } } } } // Pattern: (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sra:i32 GPR:i32:$a, 16:i32)) // Emits: (t2SMULTT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N01.getValueType() == MVT::i32 && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_253(N, ARM::t2SMULTT, MVT::i32); return Result; } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); // Pattern: (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sra:i32 GPR:i32:$b, 16:i32)) // Emits: (SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_245(N, ARM::SMULBT, MVT::i32); return Result; } } } } } // Pattern: (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sext_inreg:i32 GPR:i32:$b, i16:Other)) // Emits: (SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_245(N, ARM::SMULTB, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sra:i32 GPR:i32:$b, 16:i32)) // Emits: (t2SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_245(N, ARM::t2SMULBT, MVT::i32); return Result; } } } } } // Pattern: (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), (sext_inreg:i32 GPR:i32:$b, i16:Other)) // Emits: (t2SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_245(N, ARM::t2SMULTB, MVT::i32); return Result; } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); // Pattern: (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sext_inreg:i32 GPR:i32:$a, i16:Other)) // Emits: (SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_252(N, ARM::SMULBT, MVT::i32); return Result; } } } } } // Pattern: (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), (sra:i32 GPR:i32:$a, 16:i32)) // Emits: (SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_252(N, ARM::SMULTB, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), (sext_inreg:i32 GPR:i32:$a, i16:Other)) // Emits: (t2SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_252(N, ARM::t2SMULBT, MVT::i32); return Result; } } } } } // Pattern: (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), (sra:i32 GPR:i32:$a, 16:i32)) // Emits: (t2SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_252(N, ARM::t2SMULTB, MVT::i32); return Result; } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); // Pattern: (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$a, (sra:i32 GPR:i32:$b, 16:i32)) // Emits: (SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 12 cost = 1 size = 0 if (Predicate_sext_16_node(N0.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_249(N, ARM::SMULBT, MVT::i32); return Result; } } } } if (N0.getNode()->getOpcode() == ISD::SRA) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (Predicate_sext_16_node(N1.getNode()) && N01.getValueType() == MVT::i32) { // Pattern: (mul:i32 (sra:i32 GPR:i32:$a, 16:i32), GPR:i32<<P:Predicate_sext_16_node>>:$b) // Emits: (SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 12 cost = 1 size = 0 { SDNode *Result = Emit_251(N, ARM::SMULTB, MVT::i32); return Result; } // Pattern: (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32<<P:Predicate_sext_16_node>>:$a) // Emits: (SMULBT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 12 cost = 1 size = 0 SDNode *Result = Emit_256(N, ARM::SMULBT, MVT::i32); return Result; } } } } // Pattern: (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$b, (sra:i32 GPR:i32:$a, 16:i32)) // Emits: (SMULTB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 12 cost = 1 size = 0 if (Predicate_sext_16_node(N0.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRA) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_258(N, ARM::SMULTB, MVT::i32); return Result; } } } } // Pattern: (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sext_inreg:i32 GPR:i32:$b, i16:Other)) // Emits: (SMULBB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_244(N, ARM::SMULBB, MVT::i32); return Result; } } } } } // Pattern: (mul:i32 (sext_inreg:i32 GPR:i32:$a, i16:Other), (sext_inreg:i32 GPR:i32:$b, i16:Other)) // Emits: (t2SMULBB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 9 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (cast<VTSDNode>(N01.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (cast<VTSDNode>(N11.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_244(N, ARM::t2SMULBB, MVT::i32); return Result; } } } } } // Pattern: (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$a, GPR:i32<<P:Predicate_sext_16_node>>:$b) // Emits: (SMULBB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 5 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (Predicate_sext_16_node(N0.getNode())) { SDValue N1 = N->getOperand(1); if (Predicate_sext_16_node(N1.getNode())) { SDNode *Result = Emit_44(N, ARM::SMULBB, MVT::i32); return Result; } } } // Pattern: (mul:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (MUL:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_56(N, ARM::MUL, MVT::i32); return Result; } // Pattern: (mul:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tMUL:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_66(N, ARM::tMUL, MVT::i32); return Result; } // Pattern: (mul:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (t2MUL:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_44(N, ARM::t2MUL, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_MUL_v8i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VMULv8i8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_MUL_v16i8(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VMULv16i8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_MUL_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); // Pattern: (mul:v4i16 DPR:v4i16:$src1, (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VMULslv4i16:v4i16 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v4i16) { SDNode *Result = Emit_126(N, ARM::VMULslv4i16, MVT::v4i16); return Result; } } } // Pattern: (mul:v4i16 (NEONvduplane:v4i16 DPR_8:v4i16:$src2, (imm:i32):$lane), DPR:v4i16:$src1) // Emits: (VMULslv4i16:v4i16 DPR:v4i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v4i16) { SDNode *Result = Emit_128(N, ARM::VMULslv4i16, MVT::v4i16); return Result; } } } } // Pattern: (mul:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VMULv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VMULv4i16, MVT::v4i16); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_259(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_i16_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N10, Tmp3), 0); SDValue Tmp5 = Transform_SubReg_i16_lane(Tmp2.getNode()); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N0, Tmp4, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } DISABLE_INLINE SDNode *Emit_260(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_DSubReg_i16_reg(Tmp2.getNode()); SDValue Tmp4(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0, N00, Tmp3), 0); SDValue Tmp5 = Transform_SubReg_i16_lane(Tmp2.getNode()); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { N1, Tmp4, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } SDNode *Select_ISD_MUL_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); // Pattern: (mul:v8i16 QPR:v8i16:$src1, (NEONvduplane:v8i16 DPR_8:v4i16:$src2, (imm:i32):$lane)) // Emits: (VMULslv8i16:v8i16 QPR:v8i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v4i16) { SDNode *Result = Emit_126(N, ARM::VMULslv8i16, MVT::v8i16); return Result; } } } // Pattern: (mul:v8i16 (NEONvduplane:v8i16 DPR_8:v4i16:$src2, (imm:i32):$lane), QPR:v8i16:$src1) // Emits: (VMULslv8i16:v8i16 QPR:v8i16:$src1, DPR_8:v4i16:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v4i16) { SDNode *Result = Emit_128(N, ARM::VMULslv8i16, MVT::v8i16); return Result; } } } } { SDValue N0 = N->getOperand(0); // Pattern: (mul:v8i16 QPR:v8i16:$src1, (NEONvduplane:v8i16 QPR:v8i16:$src2, (imm:i32):$lane)) // Emits: (VMULslv8i16:v8i16 QPR:v8i16:$src1, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src2, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 9 cost = 2 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v8i16) { SDNode *Result = Emit_259(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMULslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } // Pattern: (mul:v8i16 (NEONvduplane:v8i16 QPR:v8i16:$src2, (imm:i32):$lane), QPR:v8i16:$src1) // Emits: (VMULslv8i16:v8i16 QPR:v8i16:$src1, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src2, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 9 cost = 2 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v8i16) { SDNode *Result = Emit_260(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMULslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } } // Pattern: (mul:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VMULv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VMULv8i16, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_MUL_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); // Pattern: (mul:v2i32 DPR:v2i32:$src1, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VMULslv2i32:v2i32 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v2i32) { SDNode *Result = Emit_126(N, ARM::VMULslv2i32, MVT::v2i32); return Result; } } } // Pattern: (mul:v2i32 (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), DPR:v2i32:$src1) // Emits: (VMULslv2i32:v2i32 DPR:v2i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v2i32) { SDNode *Result = Emit_128(N, ARM::VMULslv2i32, MVT::v2i32); return Result; } } } } // Pattern: (mul:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VMULv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VMULv2i32, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_MUL_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); // Pattern: (mul:v4i32 QPR:v4i32:$src1, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane)) // Emits: (VMULslv4i32:v4i32 QPR:v4i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v2i32) { SDNode *Result = Emit_126(N, ARM::VMULslv4i32, MVT::v4i32); return Result; } } } // Pattern: (mul:v4i32 (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src2, (imm:i32):$lane), QPR:v4i32:$src1) // Emits: (VMULslv4i32:v4i32 QPR:v4i32:$src1, DPR_VFP2:v2i32:$src2, (imm:i32):$lane) // Pattern complexity = 9 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v2i32) { SDNode *Result = Emit_128(N, ARM::VMULslv4i32, MVT::v4i32); return Result; } } } } { SDValue N0 = N->getOperand(0); // Pattern: (mul:v4i32 QPR:v4i32:$src1, (NEONvduplane:v4i32 QPR:v4i32:$src2, (imm:i32):$lane)) // Emits: (VMULslv4i32:v4i32 QPR:v4i32:$src1, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 9 cost = 2 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && N10.getValueType() == MVT::v4i32) { SDNode *Result = Emit_210(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMULslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } // Pattern: (mul:v4i32 (NEONvduplane:v4i32 QPR:v4i32:$src2, (imm:i32):$lane), QPR:v4i32:$src1) // Emits: (VMULslv4i32:v4i32 QPR:v4i32:$src1, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src2, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 9 cost = 2 size = 0 if (N0.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N00.getValueType() == MVT::v4i32) { SDNode *Result = Emit_211(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMULslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } } // Pattern: (mul:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VMULv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VMULv4i32, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_MULHS_i32(SDNode *N) { // Pattern: (mulhs:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (SMMUL:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDNode *Result = Emit_44(N, ARM::SMMUL, MVT::i32); return Result; } // Pattern: (mulhs:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (t2SMMUL:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_44(N, ARM::t2SMMUL, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_261(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp3 = Transform_hi16(Tmp2.getNode()); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_262(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); SDValue N11000 = N1100.getNode()->getOperand(0); SDValue N11001 = N1100.getNode()->getOperand(1); SDValue N111 = N11.getNode()->getOperand(1); SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); SDValue N11100 = N1110.getNode()->getOperand(0); SDValue N11101 = N1110.getNode()->getOperand(1); SDValue Tmp13 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp14 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N000, Tmp13, Tmp14); } DISABLE_INLINE SDNode *Emit_263(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N101)->getZExtValue()), MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N100, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_264(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xFFFFULL, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_265(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0x0ULL, MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N10, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_266(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N11)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N10, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_267(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0x10ULL, MVT::i32); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N10, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_268(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); SDValue N10000 = N1000.getNode()->getOperand(0); SDValue N10001 = N1000.getNode()->getOperand(1); SDValue N101 = N10.getNode()->getOperand(1); SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); SDValue N10100 = N1010.getNode()->getOperand(0); SDValue N10101 = N1010.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); SDValue Tmp13 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp14 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N000, Tmp13, Tmp14); } DISABLE_INLINE SDNode *Emit_269(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); SDValue N00100 = N0010.getNode()->getOperand(0); SDValue N00101 = N0010.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue Tmp13 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp14 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N00000, Tmp13, Tmp14); } DISABLE_INLINE SDNode *Emit_270(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N01000 = N0100.getNode()->getOperand(0); SDValue N01001 = N0100.getNode()->getOperand(1); SDValue N011 = N01.getNode()->getOperand(1); SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); SDValue N01100 = N0110.getNode()->getOperand(0); SDValue N01101 = N0110.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue Tmp13 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp14 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0000, Tmp13, Tmp14); } DISABLE_INLINE SDNode *Emit_271(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N001)->getZExtValue()), MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N000, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_272(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0x0ULL, MVT::i32); SDValue Tmp5 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp6 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N00, Tmp4, Tmp5, Tmp6 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_273(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N00, Tmp3, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_274(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp5 = CurDAG->getTargetConstant(0x10ULL, MVT::i32); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N10, N00, Tmp5, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ISD_OR_i32(SDNode *N) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::OR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::AND) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp3 && CheckAndMask(N100, Tmp3, INT64_C(65280)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6 && CheckAndMask(N1100, Tmp6, INT64_C(16711680)) && N1100.getNode()->getOpcode() == ISD::SRL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(4278190080)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::OR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::AND) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp3 && CheckAndMask(N100, Tmp3, INT64_C(65280)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6 && CheckAndMask(N1100, Tmp6, INT64_C(16711680)) && N1100.getNode()->getOpcode() == ISD::SRL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(4278190080)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::OR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::AND) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp3 && CheckAndMask(N100, Tmp3, INT64_C(65280)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6 && CheckAndMask(N1100, Tmp6, INT64_C(16711680)) && N1100.getNode()->getOpcode() == ISD::SRL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(4278190080)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::OR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::OR) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::AND) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp3) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(16711680)) && N1000.getNode()->getOpcode() == ISD::SRL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(65280)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(4278190080)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(65280)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(4278190080)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(16711680)) && N110.getNode()->getOpcode() == ISD::SRL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(4278190080)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(65280)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(16711680)) && N110.getNode()->getOpcode() == ISD::SRL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(16711680)) && N1000.getNode()->getOpcode() == ISD::SRL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(4278190080)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(65280)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(4278190080)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(16711680)) && N1010.getNode()->getOpcode() == ISD::SRL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(65280)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } if (N10.getNode()->getOpcode() == ISD::AND) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp3) { if (CheckAndMask(N100, Tmp3, INT64_C(4278190080)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(65280)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(16711680)) && N1110.getNode()->getOpcode() == ISD::SRL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(16711680)) && N1100.getNode()->getOpcode() == ISD::SRL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(65280)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } if (CheckAndMask(N100, Tmp3, INT64_C(16711680)) && N100.getNode()->getOpcode() == ISD::SRL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(65280)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(4278190080)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(4278190080)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(65280)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)))) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N100, Tmp3, INT64_C(65280)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6 && CheckAndMask(N1100, Tmp6, INT64_C(4278190080)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(16711680)) && N1110.getNode()->getOpcode() == ISD::SRL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::OR) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::AND) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(65280)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(16711680)) && N0010.getNode()->getOpcode() == ISD::SRL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(4278190080)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(16711680)) && N0000.getNode()->getOpcode() == ISD::SRL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(65280)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(4278190080)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(65280)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(4278190080)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(16711680)) && N010.getNode()->getOpcode() == ISD::SRL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(4278190080)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(65280)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(16711680)) && N010.getNode()->getOpcode() == ISD::SRL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(16711680)) && N0000.getNode()->getOpcode() == ISD::SRL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(4278190080)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(65280)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(4278190080)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(16711680)) && N0010.getNode()->getOpcode() == ISD::SRL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(65280)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } if (N00.getNode()->getOpcode() == ISD::AND) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { if (CheckAndMask(N000, Tmp0, INT64_C(4278190080)) && N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(65280)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(16711680)) && N0110.getNode()->getOpcode() == ISD::SRL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(16711680)) && N0100.getNode()->getOpcode() == ISD::SRL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(65280)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } if (CheckAndMask(N000, Tmp0, INT64_C(16711680)) && N000.getNode()->getOpcode() == ISD::SRL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(65280)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(4278190080)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(4278190080)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(65280)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } if (CheckAndMask(N000, Tmp0, INT64_C(65280)) && N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(16711680)) && N0100.getNode()->getOpcode() == ISD::SRL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(4278190080)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(4278190080)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(16711680)) && N0110.getNode()->getOpcode() == ISD::SRL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } } } if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::OR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::OR) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::AND) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp3) { // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(16711680)) && N1000.getNode()->getOpcode() == ISD::SRL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(65280)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(4278190080)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(65280)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(4278190080)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(16711680)) && N110.getNode()->getOpcode() == ISD::SRL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(4278190080)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(65280)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(16711680)) && N110.getNode()->getOpcode() == ISD::SRL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(16711680)) && N1000.getNode()->getOpcode() == ISD::SRL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(4278190080)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(65280)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(4278190080)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(16711680)) && N1010.getNode()->getOpcode() == ISD::SRL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(65280)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } if (N10.getNode()->getOpcode() == ISD::AND) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp3) { if (CheckAndMask(N100, Tmp3, INT64_C(4278190080)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6) { // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32)))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(65280)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(16711680)) && N1110.getNode()->getOpcode() == ISD::SRL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(16711680)) && N1100.getNode()->getOpcode() == ISD::SRL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(65280)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } if (CheckAndMask(N100, Tmp3, INT64_C(16711680)) && N100.getNode()->getOpcode() == ISD::SRL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6) { // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(65280)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(4278190080)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(4278190080)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(65280)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32)))) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N100, Tmp3, INT64_C(65280)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6 && CheckAndMask(N1100, Tmp6, INT64_C(4278190080)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(16711680)) && N1110.getNode()->getOpcode() == ISD::SRL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::OR) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::AND) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(65280)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(16711680)) && N0010.getNode()->getOpcode() == ISD::SRL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(4278190080)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(16711680)) && N0000.getNode()->getOpcode() == ISD::SRL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(65280)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(4278190080)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(65280)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(4278190080)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(16711680)) && N010.getNode()->getOpcode() == ISD::SRL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(4278190080)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(65280)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(16711680)) && N010.getNode()->getOpcode() == ISD::SRL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(16711680)) && N0000.getNode()->getOpcode() == ISD::SRL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(4278190080)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(65280)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(4278190080)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(16711680)) && N0010.getNode()->getOpcode() == ISD::SRL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(65280)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } if (N00.getNode()->getOpcode() == ISD::AND) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { if (CheckAndMask(N000, Tmp0, INT64_C(4278190080)) && N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32))), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(65280)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(16711680)) && N0110.getNode()->getOpcode() == ISD::SRL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32))), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(16711680)) && N0100.getNode()->getOpcode() == ISD::SRL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(65280)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } if (CheckAndMask(N000, Tmp0, INT64_C(16711680)) && N000.getNode()->getOpcode() == ISD::SRL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32))), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(65280)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(4278190080)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32))), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(4278190080)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(65280)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } if (CheckAndMask(N000, Tmp0, INT64_C(65280)) && N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32))), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(16711680)) && N0100.getNode()->getOpcode() == ISD::SRL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(4278190080)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (shl:i32 tGPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 16711680:i32))), (and:i32 (srl:i32 tGPR:i32:$src, 8:i32), 255:i32)) // Emits: (tREV16:i32 tGPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(4278190080)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(16711680)) && N0110.getNode()->getOpcode() == ISD::SRL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::tREV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(255)) && N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::OR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::OR) { SDValue N100 = N10.getNode()->getOperand(0); if (N100.getNode()->getOpcode() == ISD::AND) { SDValue N1000 = N100.getNode()->getOperand(0); SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp3) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(16711680)) && N1000.getNode()->getOpcode() == ISD::SRL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(65280)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(4278190080)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(65280)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(4278190080)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(16711680)) && N110.getNode()->getOpcode() == ISD::SRL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(4278190080)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(65280)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(16711680)) && N110.getNode()->getOpcode() == ISD::SRL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(16711680)) && N1000.getNode()->getOpcode() == ISD::SRL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(4278190080)) && N1010.getNode()->getOpcode() == ISD::SHL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(65280)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1000, Tmp3, INT64_C(4278190080)) && N1000.getNode()->getOpcode() == ISD::SHL) { SDValue N10000 = N1000.getNode()->getOperand(0); if (N000 == N10000) { SDValue N10001 = N1000.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N10001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::AND) { SDValue N1010 = N101.getNode()->getOperand(0); SDValue N1011 = N101.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1011.getNode()); if (Tmp6 && CheckAndMask(N1010, Tmp6, INT64_C(16711680)) && N1010.getNode()->getOpcode() == ISD::SRL) { SDValue N10100 = N1010.getNode()->getOperand(0); if (N000 == N10100) { SDValue N10101 = N1010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N10101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::AND) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N111.getNode()); if (Tmp9 && CheckAndMask(N110, Tmp9, INT64_C(65280)) && N110.getNode()->getOpcode() == ISD::SHL) { SDValue N1100 = N110.getNode()->getOperand(0); if (N000 == N1100) { SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N10001.getValueType() == MVT::i32 && N10101.getValueType() == MVT::i32 && N1101.getValueType() == MVT::i32) { SDNode *Result = Emit_268(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } if (N10.getNode()->getOpcode() == ISD::AND) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp3) { if (CheckAndMask(N100, Tmp3, INT64_C(4278190080)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(65280)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(16711680)) && N1110.getNode()->getOpcode() == ISD::SRL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(16711680)) && N1100.getNode()->getOpcode() == ISD::SRL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(65280)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } if (CheckAndMask(N100, Tmp3, INT64_C(16711680)) && N100.getNode()->getOpcode() == ISD::SRL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(65280)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(4278190080)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N1100, Tmp6, INT64_C(4278190080)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(65280)) && N1110.getNode()->getOpcode() == ISD::SHL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)))) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N100, Tmp3, INT64_C(65280)) && N100.getNode()->getOpcode() == ISD::SHL) { SDValue N1000 = N100.getNode()->getOperand(0); if (N000 == N1000) { SDValue N1001 = N100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::OR) { SDValue N110 = N11.getNode()->getOperand(0); if (N110.getNode()->getOpcode() == ISD::AND) { SDValue N1100 = N110.getNode()->getOperand(0); SDValue N1101 = N110.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N1101.getNode()); if (Tmp6 && CheckAndMask(N1100, Tmp6, INT64_C(4278190080)) && N1100.getNode()->getOpcode() == ISD::SHL) { SDValue N11000 = N1100.getNode()->getOperand(0); if (N000 == N11000) { SDValue N11001 = N1100.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N11001.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::AND) { SDValue N1110 = N111.getNode()->getOperand(0); SDValue N1111 = N111.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N1111.getNode()); if (Tmp9 && CheckAndMask(N1110, Tmp9, INT64_C(16711680)) && N1110.getNode()->getOpcode() == ISD::SRL) { SDValue N11100 = N1110.getNode()->getOperand(0); if (N000 == N11100) { SDValue N11101 = N1110.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N11101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N001.getValueType() == MVT::i32 && N1001.getValueType() == MVT::i32 && N11001.getValueType() == MVT::i32 && N11101.getValueType() == MVT::i32) { SDNode *Result = Emit_262(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::OR) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::AND) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(65280)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(16711680)) && N0010.getNode()->getOpcode() == ISD::SRL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(4278190080)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(16711680)) && N0000.getNode()->getOpcode() == ISD::SRL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(65280)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(4278190080)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(65280)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(4278190080)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(16711680)) && N010.getNode()->getOpcode() == ISD::SRL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(4278190080)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(65280)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(16711680)) && N010.getNode()->getOpcode() == ISD::SRL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(16711680)) && N0000.getNode()->getOpcode() == ISD::SRL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(4278190080)) && N0010.getNode()->getOpcode() == ISD::SHL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(65280)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32)), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32)), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0000, Tmp0, INT64_C(4278190080)) && N0000.getNode()->getOpcode() == ISD::SHL) { SDValue N00000 = N0000.getNode()->getOperand(0); SDValue N00001 = N0000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N00001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::AND) { SDValue N0010 = N001.getNode()->getOperand(0); SDValue N0011 = N001.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0011.getNode()); if (Tmp3 && CheckAndMask(N0010, Tmp3, INT64_C(16711680)) && N0010.getNode()->getOpcode() == ISD::SRL) { SDValue N00100 = N0010.getNode()->getOperand(0); if (N00000 == N00100) { SDValue N00101 = N0010.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N00101.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::AND) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp6 && CheckAndMask(N010, Tmp6, INT64_C(65280)) && N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); if (N00000 == N0100) { SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N00000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N00001.getValueType() == MVT::i32 && N00101.getValueType() == MVT::i32 && N0101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_269(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } if (N00.getNode()->getOpcode() == ISD::AND) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { if (CheckAndMask(N000, Tmp0, INT64_C(4278190080)) && N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(65280)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(16711680)) && N0110.getNode()->getOpcode() == ISD::SRL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(16711680)) && N0100.getNode()->getOpcode() == ISD::SRL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(65280)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } if (CheckAndMask(N000, Tmp0, INT64_C(16711680)) && N000.getNode()->getOpcode() == ISD::SRL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(65280)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(4278190080)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(4278190080)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(65280)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } if (CheckAndMask(N000, Tmp0, INT64_C(65280)) && N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::OR) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp3) { // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32), (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(16711680)) && N0100.getNode()->getOpcode() == ISD::SRL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(4278190080)) && N0110.getNode()->getOpcode() == ISD::SHL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } // Pattern: (or:i32 (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 65280:i32), (or:i32 (and:i32 (shl:i32 GPR:i32:$src, 8:i32), 4278190080:i32), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 16711680:i32))), (and:i32 (srl:i32 GPR:i32:$src, 8:i32), 255:i32)) // Emits: (t2REV16:i32 GPR:i32:$src) // Pattern complexity = 73 cost = 1 size = 0 if (CheckAndMask(N0100, Tmp3, INT64_C(4278190080)) && N0100.getNode()->getOpcode() == ISD::SHL) { SDValue N01000 = N0100.getNode()->getOperand(0); if (N0000 == N01000) { SDValue N01001 = N0100.getNode()->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N01001.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(8)) { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::AND) { SDValue N0110 = N011.getNode()->getOperand(0); SDValue N0111 = N011.getNode()->getOperand(1); ConstantSDNode *Tmp6 = dyn_cast<ConstantSDNode>(N0111.getNode()); if (Tmp6 && CheckAndMask(N0110, Tmp6, INT64_C(16711680)) && N0110.getNode()->getOpcode() == ISD::SRL) { SDValue N01100 = N0110.getNode()->getOperand(0); if (N0000 == N01100) { SDValue N01101 = N0110.getNode()->getOperand(1); ConstantSDNode *Tmp7 = dyn_cast<ConstantSDNode>(N01101.getNode()); if (Tmp7) { int64_t CN8 = Tmp7->getSExtValue(); if (CN8 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp9 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp9 && CheckAndMask(N10, Tmp9, INT64_C(255)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); if (N0000 == N100) { SDValue N101 = N10.getNode()->getOperand(1); ConstantSDNode *Tmp10 = dyn_cast<ConstantSDNode>(N101.getNode()); if (Tmp10) { int64_t CN11 = Tmp10->getSExtValue(); if (CN11 == INT64_C(8) && N0001.getValueType() == MVT::i32 && N01001.getValueType() == MVT::i32 && N01101.getValueType() == MVT::i32 && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_270(N, ARM::t2REV16, MVT::i32); return Result; } } } } } } } } } } } } } } } } } } } } } } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 4294901760:i32), (and:i32 (sra:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt), 65535:i32)) // Emits: (PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 26 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(4294901760))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(65535)) && N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_263(N, ARM::PKHTB, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(4294901760))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(65535))) { // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 4294901760:i32), (and:i32 (sra:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt), 65535:i32)) // Emits: (t2PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 26 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::SRA) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_263(N, ARM::t2PKHTB, MVT::i32); return Result; } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 4294901760:i32), (and:i32 (srl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt), 65535:i32)) // Emits: (t2PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt) // Pattern complexity = 26 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_15(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_263(N, ARM::t2PKHTB, MVT::i32); return Result; } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 4294901760:i32), (and:i32 (srl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt), 65535:i32)) // Emits: (PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt) // Pattern complexity = 26 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(4294901760))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(65535)) && N10.getNode()->getOpcode() == ISD::SRL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_15(N101.getNode()) && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_263(N, ARM::PKHTB, MVT::i32); return Result; } } } } // Pattern: (or:i32 (and:i32 (sra:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt), 65535:i32), (and:i32 GPR:i32:$src1, 4294901760:i32)) // Emits: (PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 26 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(65535)) && N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760)) && N001.getValueType() == MVT::i32) { SDNode *Result = Emit_271(N, ARM::PKHTB, MVT::i32); return Result; } } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(65535))) { // Pattern: (or:i32 (and:i32 (sra:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt), 65535:i32), (and:i32 GPR:i32:$src1, 4294901760:i32)) // Emits: (t2PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 26 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760)) && N001.getValueType() == MVT::i32) { SDNode *Result = Emit_271(N, ARM::t2PKHTB, MVT::i32); return Result; } } } } // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt), 65535:i32), (and:i32 GPR:i32:$src1, 4294901760:i32)) // Emits: (t2PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt) // Pattern complexity = 26 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_15(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760)) && N001.getValueType() == MVT::i32) { SDNode *Result = Emit_271(N, ARM::t2PKHTB, MVT::i32); return Result; } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(65535))) { // Pattern: (or:i32 (and:i32 (srl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt), 65535:i32), (and:i32 GPR:i32:$src1, 4294901760:i32)) // Emits: (PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm1_15>>:$shamt) // Pattern complexity = 26 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_15(N001.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760)) && N001.getValueType() == MVT::i32) { SDNode *Result = Emit_271(N, ARM::PKHTB, MVT::i32); return Result; } } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 65535:i32), (and:i32 (shl:i32 GPR:i32:$src2, (imm:i32):$shamt), 4294901760:i32)) // Emits: (PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 25 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760)) && N10.getNode()->getOpcode() == ISD::SHL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_263(N, ARM::PKHBT, MVT::i32); return Result; } } } } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 65535:i32), (and:i32 (shl:i32 GPR:i32:$src2, (imm:i32):$shamt), 4294901760:i32)) // Emits: (t2PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 25 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760)) && N10.getNode()->getOpcode() == ISD::SHL) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant && N101.getValueType() == MVT::i32) { SDNode *Result = Emit_263(N, ARM::t2PKHBT, MVT::i32); return Result; } } } } } } // Pattern: (or:i32 (and:i32 (shl:i32 GPR:i32:$src2, (imm:i32):$shamt), 4294901760:i32), (and:i32 GPR:i32:$src1, 65535:i32)) // Emits: (PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 25 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(4294901760)) && N00.getNode()->getOpcode() == ISD::SHL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(65535)) && N001.getValueType() == MVT::i32) { SDNode *Result = Emit_271(N, ARM::PKHBT, MVT::i32); return Result; } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (or:i32 (and:i32 (shl:i32 GPR:i32:$src2, (imm:i32):$shamt), 4294901760:i32), (and:i32 GPR:i32:$src1, 65535:i32)) // Emits: (t2PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32):$shamt) // Pattern complexity = 25 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(4294901760)) && N00.getNode()->getOpcode() == ISD::SHL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::Constant) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(65535)) && N001.getValueType() == MVT::i32) { SDNode *Result = Emit_271(N, ARM::t2PKHBT, MVT::i32); return Result; } } } } } // Pattern: (or:i32 GPR:i32:$lhs, (xor:i32 t2_so_reg:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (t2ORNrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 19 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); SDValue CPTmpN10_0; SDValue CPTmpN10_1; if (SelectT2ShifterOperandReg(N, N10, CPTmpN10_0, CPTmpN10_1)) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_169(N, ARM::t2ORNrs, MVT::i32, CPTmpN10_0, CPTmpN10_1); return Result; } } } } if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 65535:i32), (and:i32 GPR:i32:$src2, 4294901760:i32)) // Emits: (t2PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, 0:i32) // Pattern complexity = 19 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760))) { SDNode *Result = Emit_265(N, ARM::t2PKHBT, MVT::i32); return Result; } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 4294901760:i32), (srl:i32 GPR:i32:$src2, 16:i32)) // Emits: (t2PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, 16:i32) // Pattern complexity = 19 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(4294901760))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRL) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_267(N, ARM::t2PKHTB, MVT::i32); return Result; } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 65535:i32), (and:i32 GPR:i32:$src2, 4294901760:i32)) // Emits: (PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, 0:i32) // Pattern complexity = 19 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(4294901760))) { SDNode *Result = Emit_265(N, ARM::PKHBT, MVT::i32); return Result; } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 4294901760:i32), (srl:i32 GPR:i32:$src2, 16:i32)) // Emits: (PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, 16:i32) // Pattern complexity = 19 cost = 1 size = 0 if (CheckAndMask(N00, Tmp0, INT64_C(4294901760))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SRL) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(16) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_267(N, ARM::PKHTB, MVT::i32); return Result; } } } } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (or:i32 (xor:i32 t2_so_reg:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$lhs) // Emits: (t2ORNrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 19 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue CPTmpN00_0; SDValue CPTmpN00_1; if (SelectT2ShifterOperandReg(N, N00, CPTmpN00_0, CPTmpN00_1)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_180(N, ARM::t2ORNrs, MVT::i32, CPTmpN00_0, CPTmpN00_1); return Result; } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src2, 4294901760:i32), (and:i32 GPR:i32:$src1, 65535:i32)) // Emits: (t2PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, 0:i32) // Pattern complexity = 19 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(4294901760))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(65535))) { SDNode *Result = Emit_272(N, ARM::t2PKHBT, MVT::i32); return Result; } } } } // Pattern: (or:i32 (srl:i32 GPR:i32:$src2, 16:i32), (and:i32 GPR:i32:$src1, 4294901760:i32)) // Emits: (t2PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, 16:i32) // Pattern complexity = 19 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2 && CheckAndMask(N10, Tmp2, INT64_C(4294901760)) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_274(N, ARM::t2PKHTB, MVT::i32); return Result; } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); // Pattern: (or:i32 (and:i32 GPR:i32:$src2, 4294901760:i32), (and:i32 GPR:i32:$src1, 65535:i32)) // Emits: (PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, 0:i32) // Pattern complexity = 19 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(4294901760))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp1 && CheckAndMask(N10, Tmp1, INT64_C(65535))) { SDNode *Result = Emit_272(N, ARM::PKHBT, MVT::i32); return Result; } } } } // Pattern: (or:i32 (srl:i32 GPR:i32:$src2, 16:i32), (and:i32 GPR:i32:$src1, 4294901760:i32)) // Emits: (PKHTB:i32 GPR:i32:$src1, GPR:i32:$src2, 16:i32) // Pattern complexity = 19 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::SRL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp2 && CheckAndMask(N10, Tmp2, INT64_C(4294901760)) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_274(N, ARM::PKHTB, MVT::i32); return Result; } } } } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 65535:i32), (shl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt)) // Emits: (t2PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt) // Pattern complexity = 18 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SHL) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N11.getNode()) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_266(N, ARM::t2PKHBT, MVT::i32); return Result; } } } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src1, 65535:i32), (shl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt)) // Emits: (PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt) // Pattern complexity = 18 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::SHL) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N11.getNode()) && N11.getValueType() == MVT::i32) { SDNode *Result = Emit_266(N, ARM::PKHBT, MVT::i32); return Result; } } } } } // Pattern: (or:i32 (shl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt), (and:i32 GPR:i32:$src1, 65535:i32)) // Emits: (t2PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt) // Pattern complexity = 18 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SHL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N01.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0 && CheckAndMask(N10, Tmp0, INT64_C(65535)) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_273(N, ARM::t2PKHBT, MVT::i32); return Result; } } } } } // Pattern: (or:i32 (shl:i32 GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt), (and:i32 GPR:i32:$src1, 65535:i32)) // Emits: (PKHBT:i32 GPR:i32:$src1, GPR:i32:$src2, (imm:i32)<<P:Predicate_imm16_31>>:$shamt) // Pattern complexity = 18 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::SHL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_imm16_31(N01.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N11.getNode()); if (Tmp0 && CheckAndMask(N10, Tmp0, INT64_C(65535)) && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_273(N, ARM::PKHBT, MVT::i32); return Result; } } } } } // Pattern: (or:i32 (and:i32 GPR:i32:$src, 65535:i32), (imm:i32)<<P:Predicate_lo16AllZero>><<X:hi16>>:$imm) // Emits: (MOVTi16:i32 GPR:i32:$src, (hi16:i32 (imm:i32):$imm)) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6T2Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_lo16AllZero(N1.getNode())) { SDNode *Result = Emit_261(N, ARM::MOVTi16, MVT::i32); return Result; } } } } // Pattern: (or:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (ORRrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_57(N, ARM::ORRrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (or:i32 (and:i32 GPR:i32:$src, 65535:i32), (imm:i32)<<P:Predicate_lo16AllZero>><<X:hi16>>:$imm) // Emits: (t2MOVTi16:i32 GPR:i32:$src, (hi16:i32 (imm:i32):$imm)) // Pattern complexity = 15 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N01.getNode()); if (Tmp0 && CheckAndMask(N00, Tmp0, INT64_C(65535))) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_lo16AllZero(N1.getNode())) { SDNode *Result = Emit_261(N, ARM::t2MOVTi16, MVT::i32); return Result; } } } } // Pattern: (or:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (ORRrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_88(N, ARM::ORRrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); if (N10.getNode()->getOpcode() == ISD::Constant) { // Pattern: (or:i32 GPR:i32:$lhs, (xor:i32 (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (t2ORNri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_t2_so_imm(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_165(N, ARM::t2ORNri, MVT::i32); return Result; } } // Pattern: (or:i32 GPR:i32:$lhs, (xor:i32 (imm:i32)<<P:Predicate_immAllOnes>>, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs)) // Emits: (t2ORNri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_immAllOnes(N10.getNode())) { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N11.getNode())) { SDNode *Result = Emit_174(N, ARM::t2ORNri, MVT::i32); return Result; } } } } } if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::Constant) { // Pattern: (or:i32 (xor:i32 (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$lhs) // Emits: (t2ORNri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_t2_so_imm(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_175(N, ARM::t2ORNri, MVT::i32); return Result; } } // Pattern: (or:i32 (xor:i32 (imm:i32)<<P:Predicate_immAllOnes>>, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs), GPR:i32:$lhs) // Emits: (t2ORNri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 14 cost = 1 size = 0 if (Predicate_immAllOnes(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N01.getNode())) { SDNode *Result = Emit_176(N, ARM::t2ORNri, MVT::i32); return Result; } } } } // Pattern: (or:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2ORRrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_68(N, ARM::t2ORRrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (or:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2ORRrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_103(N, ARM::t2ORRrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (or:i32 GPR:i32:$lhs, (xor:i32 GPR:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>)) // Emits: (t2ORNrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N11.getNode())) { SDNode *Result = Emit_166(N, ARM::t2ORNrr, MVT::i32); return Result; } } } // Pattern: (or:i32 (xor:i32 GPR:i32:$rhs, (imm:i32)<<P:Predicate_immAllOnes>>), GPR:i32:$lhs) // Emits: (t2ORNrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 10 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N01.getNode())) { SDNode *Result = Emit_177(N, ARM::t2ORNrr, MVT::i32); return Result; } } // Pattern: (or:i32 GPR:i32:$src, 4294901760:i32) // Emits: (t2MOVTi16:i32 GPR:i32:$src, 65535:i32) // Pattern complexity = 8 cost = 1 size = 0 SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0 && CheckOrMask(N0, Tmp0, INT64_C(4294901760))) { SDNode *Result = Emit_264(N, ARM::t2MOVTi16, MVT::i32); return Result; } } // Pattern: (or:i32 GPR:i32:$src, 4294901760:i32) // Emits: (MOVTi16:i32 GPR:i32:$src, 65535:i32) // Pattern complexity = 8 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6T2Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0 && CheckOrMask(N0, Tmp0, INT64_C(4294901760))) { SDNode *Result = Emit_264(N, ARM::MOVTi16, MVT::i32); return Result; } } // Pattern: (or:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (ORRri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::ORRri, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (or:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2ORRri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::t2ORRri, MVT::i32); return Result; } // Pattern: (or:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_t2_so_imm_not>><<X:t2_so_imm_not_XFORM>>:$imm) // Emits: (t2ORNri:i32 GPR:i32:$src, (t2_so_imm_not_XFORM:i32 (imm:i32)<<P:Predicate_t2_so_imm_not>>:$imm)) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm_not(N1.getNode())) { SDNode *Result = Emit_172(N, ARM::t2ORNri, MVT::i32); return Result; } // Pattern: (or:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_t2_so_imm2part>>:$RHS) // Emits: (t2ORRri:i32 (t2ORRri:i32 GPR:i32:$LHS, (t2_so_imm2part_1:i32 (imm:i32):$RHS)), (t2_so_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 if (Predicate_t2_so_imm2part(N1.getNode())) { SDNode *Result = Emit_71(N, ARM::t2ORRri, ARM::t2ORRri, MVT::i32, MVT::i32); return Result; } } } if ((!Subtarget->isThumb())) { // Pattern: (or:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_so_imm2part>>:$RHS) // Emits: (ORRri:i32 (ORRri:i32 GPR:i32:$LHS, (so_imm2part_1:i32 (imm:i32):$RHS)), (so_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm2part(N1.getNode())) { SDNode *Result = Emit_74(N, ARM::ORRri, ARM::ORRri, MVT::i32, MVT::i32); return Result; } } // Pattern: (or:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (ORRrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_56(N, ARM::ORRrr, MVT::i32); return Result; } // Pattern: (or:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tORR:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_66(N, ARM::tORR, MVT::i32); return Result; } // Pattern: (or:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2ORRrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_56(N, ARM::t2ORRrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_275(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, N00, N10, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_276(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, N00, N11, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_277(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N01, N10, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_278(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N01, N11, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_279(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N010, N10, N00, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_280(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N010, N11, N00, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_281(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N011, N10, N00, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_282(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N011, N11, N00, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_283(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N10, N01, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_284(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N000, N11, N01, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_285(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N001, N10, N01, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_286(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue N10 = N1.getNode()->getOperand(0); SDValue N11 = N1.getNode()->getOperand(1); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N001, N11, N01, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ISD_OR_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); { SDValue N01 = N0.getNode()->getOperand(1); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::XOR) { SDValue N110 = N11.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1), (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>))) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N01 == N110) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N111.getNode())) { SDNode *Result = Emit_275(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1), (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1))) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N110.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N110.getNode())) { SDValue N111 = N11.getNode()->getOperand(1); if (N01 == N111) { SDNode *Result = Emit_275(N, ARM::VBSLd, MVT::v2i32); return Result; } } } } if (N10.getNode()->getOpcode() == ISD::XOR) { SDValue N100 = N10.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1), (and:v2i32 (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>), DPR:v2i32:$src3)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N01 == N100) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N101.getNode())) { SDNode *Result = Emit_276(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1), (and:v2i32 (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1), DPR:v2i32:$src3)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N100.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N100.getNode())) { SDValue N101 = N10.getNode()->getOperand(1); if (N01 == N101) { SDNode *Result = Emit_276(N, ARM::VBSLd, MVT::v2i32); return Result; } } } { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::XOR) { SDValue N110 = N11.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2), (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>))) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N00 == N110) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N111.getNode())) { SDNode *Result = Emit_277(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2), (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1))) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N110.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N110.getNode())) { SDValue N111 = N11.getNode()->getOperand(1); if (N00 == N111) { SDNode *Result = Emit_277(N, ARM::VBSLd, MVT::v2i32); return Result; } } } } if (N10.getNode()->getOpcode() == ISD::XOR) { SDValue N100 = N10.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2), (and:v2i32 (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>), DPR:v2i32:$src3)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N00 == N100) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N101.getNode())) { SDNode *Result = Emit_278(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2), (and:v2i32 (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1), DPR:v2i32:$src3)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N100.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N100.getNode())) { SDValue N101 = N10.getNode()->getOperand(1); if (N00 == N101) { SDNode *Result = Emit_278(N, ARM::VBSLd, MVT::v2i32); return Result; } } } } } if (N01.getNode()->getOpcode() == ISD::XOR) { SDValue N010 = N01.getNode()->getOperand(0); { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N011.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>)), (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N010 == N11) { SDNode *Result = Emit_279(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>)), (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N010 == N10) { SDNode *Result = Emit_280(N, ARM::VBSLd, MVT::v2i32); return Result; } } } } if (N010.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N010.getNode())) { SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1)), (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N011 == N11) { SDNode *Result = Emit_281(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 DPR:v2i32:$src3, (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1)), (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N011 == N10) { SDNode *Result = Emit_282(N, ARM::VBSLd, MVT::v2i32); return Result; } } } } } if (N00.getNode()->getOpcode() == ISD::XOR) { SDValue N000 = N00.getNode()->getOperand(0); { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N001.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>), DPR:v2i32:$src3), (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N000 == N11) { SDNode *Result = Emit_283(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 (xor:v2i32 DPR:v2i32:$src1, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>), DPR:v2i32:$src3), (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N000 == N10) { SDNode *Result = Emit_284(N, ARM::VBSLd, MVT::v2i32); return Result; } } } } if (N000.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N000.getNode())) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v2i32 (and:v2i32 (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1), DPR:v2i32:$src3), (and:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src1)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N001 == N11) { SDNode *Result = Emit_285(N, ARM::VBSLd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (and:v2i32 (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src1), DPR:v2i32:$src3), (and:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2)) // Emits: (VBSLd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N001 == N10) { SDNode *Result = Emit_286(N, ARM::VBSLd, MVT::v2i32); return Result; } } } } } { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v2i32 DPR:v2i32:$src1, (xor:v2i32 DPR:v2i32:$src2, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>)) // Emits: (VORNd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N11.getNode())) { SDNode *Result = Emit_51(N, ARM::VORNd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 DPR:v2i32:$src1, (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src2)) // Emits: (VORNd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N10.getNode())) { SDNode *Result = Emit_181(N, ARM::VORNd, MVT::v2i32); return Result; } } } if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (or:v2i32 (xor:v2i32 DPR:v2i32:$src2, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>), DPR:v2i32:$src1) // Emits: (VORNd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N01.getNode())) { SDNode *Result = Emit_84(N, ARM::VORNd, MVT::v2i32); return Result; } } // Pattern: (or:v2i32 (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src2), DPR:v2i32:$src1) // Emits: (VORNd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N00.getNode())) { SDNode *Result = Emit_182(N, ARM::VORNd, MVT::v2i32); return Result; } } } // Pattern: (or:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VORRd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VORRd, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_OR_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::AND) { SDValue N00 = N0.getNode()->getOperand(0); { SDValue N01 = N0.getNode()->getOperand(1); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::XOR) { SDValue N110 = N11.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1), (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>))) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N01 == N110) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N111.getNode())) { SDNode *Result = Emit_275(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1), (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1))) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N110.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N110.getNode())) { SDValue N111 = N11.getNode()->getOperand(1); if (N01 == N111) { SDNode *Result = Emit_275(N, ARM::VBSLq, MVT::v4i32); return Result; } } } } if (N10.getNode()->getOpcode() == ISD::XOR) { SDValue N100 = N10.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1), (and:v4i32 (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>), QPR:v4i32:$src3)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N01 == N100) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N101.getNode())) { SDNode *Result = Emit_276(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1), (and:v4i32 (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1), QPR:v4i32:$src3)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N100.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N100.getNode())) { SDValue N101 = N10.getNode()->getOperand(1); if (N01 == N101) { SDNode *Result = Emit_276(N, ARM::VBSLq, MVT::v4i32); return Result; } } } { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::XOR) { SDValue N110 = N11.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2), (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>))) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N00 == N110) { SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N111.getNode())) { SDNode *Result = Emit_277(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2), (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1))) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N110.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N110.getNode())) { SDValue N111 = N11.getNode()->getOperand(1); if (N00 == N111) { SDNode *Result = Emit_277(N, ARM::VBSLq, MVT::v4i32); return Result; } } } } if (N10.getNode()->getOpcode() == ISD::XOR) { SDValue N100 = N10.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2), (and:v4i32 (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>), QPR:v4i32:$src3)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N00 == N100) { SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N101.getNode())) { SDNode *Result = Emit_278(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2), (and:v4i32 (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1), QPR:v4i32:$src3)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N100.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N100.getNode())) { SDValue N101 = N10.getNode()->getOperand(1); if (N00 == N101) { SDNode *Result = Emit_278(N, ARM::VBSLq, MVT::v4i32); return Result; } } } } } if (N01.getNode()->getOpcode() == ISD::XOR) { SDValue N010 = N01.getNode()->getOperand(0); { SDValue N011 = N01.getNode()->getOperand(1); if (N011.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N011.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>)), (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N010 == N11) { SDNode *Result = Emit_279(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>)), (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N010 == N10) { SDNode *Result = Emit_280(N, ARM::VBSLq, MVT::v4i32); return Result; } } } } if (N010.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N010.getNode())) { SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1)), (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N011 == N11) { SDNode *Result = Emit_281(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 QPR:v4i32:$src3, (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1)), (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N011 == N10) { SDNode *Result = Emit_282(N, ARM::VBSLq, MVT::v4i32); return Result; } } } } } if (N00.getNode()->getOpcode() == ISD::XOR) { SDValue N000 = N00.getNode()->getOperand(0); { SDValue N001 = N00.getNode()->getOperand(1); if (N001.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N001.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>), QPR:v4i32:$src3), (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N000 == N11) { SDNode *Result = Emit_283(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 (xor:v4i32 QPR:v4i32:$src1, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>), QPR:v4i32:$src3), (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N000 == N10) { SDNode *Result = Emit_284(N, ARM::VBSLq, MVT::v4i32); return Result; } } } } if (N000.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N000.getNode())) { SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::AND) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v4i32 (and:v4i32 (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1), QPR:v4i32:$src3), (and:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src1)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N001 == N11) { SDNode *Result = Emit_285(N, ARM::VBSLq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (and:v4i32 (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src1), QPR:v4i32:$src3), (and:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2)) // Emits: (VBSLq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 16 cost = 1 size = 0 if (N001 == N10) { SDNode *Result = Emit_286(N, ARM::VBSLq, MVT::v4i32); return Result; } } } } } { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::XOR) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (or:v4i32 QPR:v4i32:$src1, (xor:v4i32 QPR:v4i32:$src2, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>)) // Emits: (VORNq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N11.getNode())) { SDNode *Result = Emit_51(N, ARM::VORNq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 QPR:v4i32:$src1, (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src2)) // Emits: (VORNq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N10.getNode())) { SDNode *Result = Emit_181(N, ARM::VORNq, MVT::v4i32); return Result; } } } if (N0.getNode()->getOpcode() == ISD::XOR) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (or:v4i32 (xor:v4i32 QPR:v4i32:$src2, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>), QPR:v4i32:$src1) // Emits: (VORNq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N01.getNode())) { SDNode *Result = Emit_84(N, ARM::VORNq, MVT::v4i32); return Result; } } // Pattern: (or:v4i32 (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src2), QPR:v4i32:$src1) // Emits: (VORNq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 10 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N00.getNode())) { SDNode *Result = Emit_182(N, ARM::VORNq, MVT::v4i32); return Result; } } } // Pattern: (or:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VORRq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VORRq, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_287(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN_0, SDValue &CPTmpN_1, SDValue &CPTmpN_2) { SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN_0, CPTmpN_1, CPTmpN_2, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } SDNode *Select_ISD_ROTR_i32(SDNode *N) { // Pattern: so_reg:i32:$src // Emits: (MOVs:i32 so_reg:i32:$src) // Pattern complexity = 12 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue CPTmpN_0; SDValue CPTmpN_1; SDValue CPTmpN_2; if (SelectShifterOperandReg(N, SDValue(N, 0), CPTmpN_0, CPTmpN_1, CPTmpN_2)) { SDNode *Result = Emit_287(N, ARM::MOVs, MVT::i32, CPTmpN_0, CPTmpN_1, CPTmpN_2); return Result; } } // Pattern: (rotr:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_imm1_31>>:$rhs) // Emits: (t2RORri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_31(N1.getNode()) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_55(N, ARM::t2RORri, MVT::i32); return Result; } } // Pattern: (rotr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tROR:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_66(N, ARM::tROR, MVT::i32); return Result; } } // Pattern: (rotr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2RORrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_56(N, ARM::t2RORrr, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_288(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue Tmp0(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0), 0); SDValue Tmp2 = CurDAG->getTargetConstant(0x0ULL, MVT::i32); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops1[] = { Tmp0, N0, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc1, VT1, Ops1, 5); } SDNode *Select_ISD_SCALAR_TO_VECTOR_v8i8(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_288(N, TargetOpcode::IMPLICIT_DEF, ARM::VSETLNi8, MVT::v8i8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_289(SDNode *N, unsigned Opc0, unsigned Opc1, unsigned Opc2, unsigned Opc3, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1, MVT::SimpleValueType VT2, MVT::SimpleValueType VT3) { SDValue N0 = N->getOperand(0); SDValue Tmp0(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0), 0); SDValue Tmp1(CurDAG->getMachineNode(Opc1, N->getDebugLoc(), VT1), 0); SDValue Tmp3 = CurDAG->getTargetConstant(0x0ULL, MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops2[] = { Tmp1, N0, Tmp3, Tmp4, Tmp5 }; SDValue Tmp6(CurDAG->getMachineNode(Opc2, N->getDebugLoc(), VT2, Ops2, 5), 0); SDValue Tmp7 = CurDAG->getTargetConstant(0x5ULL, MVT::i32); return CurDAG->SelectNodeTo(N, Opc3, VT3, Tmp0, Tmp6, Tmp7); } SDNode *Select_ISD_SCALAR_TO_VECTOR_v16i8(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_289(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::IMPLICIT_DEF, ARM::VSETLNi8, TargetOpcode::INSERT_SUBREG, MVT::v16i8, MVT::v8i8, MVT::f64, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SCALAR_TO_VECTOR_v4i16(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_288(N, TargetOpcode::IMPLICIT_DEF, ARM::VSETLNi16, MVT::v4i16, MVT::v4i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SCALAR_TO_VECTOR_v8i16(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_289(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::IMPLICIT_DEF, ARM::VSETLNi16, TargetOpcode::INSERT_SUBREG, MVT::v8i16, MVT::v4i16, MVT::f64, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SCALAR_TO_VECTOR_v2i32(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_288(N, TargetOpcode::IMPLICIT_DEF, ARM::VSETLNi32, MVT::v2i32, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SCALAR_TO_VECTOR_v4i32(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::i32) { SDNode *Result = Emit_289(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::IMPLICIT_DEF, ARM::VSETLNi32, TargetOpcode::INSERT_SUBREG, MVT::v4i32, MVT::v2i32, MVT::f64, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_290(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue Tmp0(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0), 0); SDValue Tmp2 = CurDAG->getTargetConstant(0x1ULL, MVT::i32); return CurDAG->SelectNodeTo(N, Opc1, VT1, Tmp0, N0, Tmp2); } SDNode *Select_ISD_SCALAR_TO_VECTOR_v2f32(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_290(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, MVT::v2f32, MVT::v2f32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SCALAR_TO_VECTOR_v4f32(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f32) { SDNode *Result = Emit_290(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, MVT::v4f32, MVT::v4f32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_291(SDNode *N, unsigned Opc0, unsigned Opc1, MVT::SimpleValueType VT0, MVT::SimpleValueType VT1) { SDValue N0 = N->getOperand(0); SDValue Tmp0(CurDAG->getMachineNode(Opc0, N->getDebugLoc(), VT0), 0); SDValue Tmp2 = CurDAG->getTargetConstant(0x5ULL, MVT::i32); return CurDAG->SelectNodeTo(N, Opc1, VT1, Tmp0, N0, Tmp2); } SDNode *Select_ISD_SCALAR_TO_VECTOR_v2f64(SDNode *N) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::f64) { SDNode *Result = Emit_291(N, TargetOpcode::IMPLICIT_DEF, TargetOpcode::INSERT_SUBREG, MVT::v2f64, MVT::v2f64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SHL_i32(SDNode *N) { // Pattern: so_reg:i32:$src // Emits: (MOVs:i32 so_reg:i32:$src) // Pattern complexity = 12 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue CPTmpN_0; SDValue CPTmpN_1; SDValue CPTmpN_2; if (SelectShifterOperandReg(N, SDValue(N, 0), CPTmpN_0, CPTmpN_1, CPTmpN_2)) { SDNode *Result = Emit_287(N, ARM::MOVs, MVT::i32, CPTmpN_0, CPTmpN_1, CPTmpN_2); return Result; } } // Pattern: (shl:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_imm1_31>>:$rhs) // Emits: (t2LSLri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_31(N1.getNode()) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_55(N, ARM::t2LSLri, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (shl:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Emits: (tLSLri:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_65(N, ARM::tLSLri, MVT::i32); return Result; } // Pattern: (shl:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tLSLrr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_66(N, ARM::tLSLrr, MVT::i32); return Result; } } // Pattern: (shl:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2LSLrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_56(N, ARM::t2LSLrr, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_292(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0, Tmp1, Tmp2); } DISABLE_INLINE SDNode *Emit_293(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N01)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_294(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N0000, Tmp6, Tmp7); } DISABLE_INLINE SDNode *Emit_295(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N000, Tmp6, Tmp7); } SDNode *Select_ISD_SIGN_EXTEND_INREG_i32(SDNode *N) { // Pattern: (sext_inreg:i32 (or:i32 (srl:i32 (and:i32 GPR:i32:$src, 65280:i32), 8:i32), (shl:i32 GPR:i32:$src, 8:i32)), i16:Other) // Emits: (REVSH:i32 GPR:i32:$src) // Pattern complexity = 30 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::AND) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0 && CheckAndMask(N0000, Tmp0, INT64_C(65280))) { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SHL) { SDValue N010 = N01.getNode()->getOperand(0); if (N0000 == N010) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp3) { int64_t CN4 = Tmp3->getSExtValue(); if (CN4 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_294(N, ARM::REVSH, MVT::i32); return Result; } } } } } } } } } } } } // Pattern: (sext_inreg:i32 (or:i32 (srl:i32 (and:i32 tGPR:i32:$src, 65280:i32), 8:i32), (shl:i32 tGPR:i32:$src, 8:i32)), i16:Other) // Emits: (tREVSH:i32 tGPR:i32:$src) // Pattern complexity = 30 cost = 1 size = 0 if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::AND) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0 && CheckAndMask(N0000, Tmp0, INT64_C(65280))) { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SHL) { SDValue N010 = N01.getNode()->getOperand(0); if (N0000 == N010) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp3) { int64_t CN4 = Tmp3->getSExtValue(); if (CN4 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_294(N, ARM::tREVSH, MVT::i32); return Result; } } } } } } } } } } } } // Pattern: (sext_inreg:i32 (or:i32 (srl:i32 (and:i32 GPR:i32:$src, 65280:i32), 8:i32), (shl:i32 GPR:i32:$src, 8:i32)), i16:Other) // Emits: (t2REVSH:i32 GPR:i32:$src) // Pattern complexity = 30 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRL) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::AND) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0 && CheckAndMask(N0000, Tmp0, INT64_C(65280))) { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp1 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp1) { int64_t CN2 = Tmp1->getSExtValue(); if (CN2 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SHL) { SDValue N010 = N01.getNode()->getOperand(0); if (N0000 == N010) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp3) { int64_t CN4 = Tmp3->getSExtValue(); if (CN4 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_294(N, ARM::t2REVSH, MVT::i32); return Result; } } } } } } } } } } } } // Pattern: (sext_inreg:i32 (or:i32 (shl:i32 GPR:i32:$src, 8:i32), (srl:i32 (and:i32 GPR:i32:$src, 65280:i32), 8:i32)), i16:Other) // Emits: (REVSH:i32 GPR:i32:$src) // Pattern complexity = 30 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SHL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRL) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp2 && CheckAndMask(N0100, Tmp2, INT64_C(65280)) && N000 == N0100) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp3) { int64_t CN4 = Tmp3->getSExtValue(); if (CN4 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_295(N, ARM::REVSH, MVT::i32); return Result; } } } } } } } } } } } // Pattern: (sext_inreg:i32 (or:i32 (shl:i32 tGPR:i32:$src, 8:i32), (srl:i32 (and:i32 tGPR:i32:$src, 65280:i32), 8:i32)), i16:Other) // Emits: (tREVSH:i32 tGPR:i32:$src) // Pattern complexity = 30 cost = 1 size = 0 if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SHL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRL) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp2 && CheckAndMask(N0100, Tmp2, INT64_C(65280)) && N000 == N0100) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp3) { int64_t CN4 = Tmp3->getSExtValue(); if (CN4 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_295(N, ARM::tREVSH, MVT::i32); return Result; } } } } } } } } } } } // Pattern: (sext_inreg:i32 (or:i32 (shl:i32 GPR:i32:$src, 8:i32), (srl:i32 (and:i32 GPR:i32:$src, 65280:i32), 8:i32)), i16:Other) // Emits: (t2REVSH:i32 GPR:i32:$src) // Pattern complexity = 30 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::OR) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SHL) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(8)) { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRL) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::AND) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp2 && CheckAndMask(N0100, Tmp2, INT64_C(65280)) && N000 == N0100) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp3 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp3) { int64_t CN4 = Tmp3->getSExtValue(); if (CN4 == INT64_C(8)) { SDValue N1 = N->getOperand(1); if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N001.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32) { SDNode *Result = Emit_295(N, ARM::t2REVSH, MVT::i32); return Result; } } } } } } } } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); // Pattern: (sext_inreg:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i8:Other) // Emits: (SXTBr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 10 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i8 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_293(N, ARM::SXTBr_rot, MVT::i32); return Result; } // Pattern: (sext_inreg:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i16:Other) // Emits: (SXTHr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 10 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_293(N, ARM::SXTHr_rot, MVT::i32); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::ROTR) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::Constant && Predicate_rot_imm(N01.getNode())) { SDValue N1 = N->getOperand(1); // Pattern: (sext_inreg:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i8:Other) // Emits: (t2SXTBr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 10 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i8 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_293(N, ARM::t2SXTBr_rot, MVT::i32); return Result; } // Pattern: (sext_inreg:i32 (rotr:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_rot_imm>>:$rot), i16:Other) // Emits: (t2SXTHr_rot:i32 GPR:i32:$src, (imm:i32):$rot) // Pattern complexity = 10 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16 && N01.getValueType() == MVT::i32) { SDNode *Result = Emit_293(N, ARM::t2SXTHr_rot, MVT::i32); return Result; } } } } if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (sext_inreg:i32 GPR:i32:$src, i8:Other) // Emits: (SXTBr:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i8) { SDNode *Result = Emit_292(N, ARM::SXTBr, MVT::i32); return Result; } // Pattern: (sext_inreg:i32 GPR:i32:$src, i16:Other) // Emits: (SXTHr:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_292(N, ARM::SXTHr, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (sext_inreg:i32 tGPR:i32:$src, i8:Other) // Emits: (tSXTB:i32 tGPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i8) { SDNode *Result = Emit_292(N, ARM::tSXTB, MVT::i32); return Result; } // Pattern: (sext_inreg:i32 tGPR:i32:$src, i16:Other) // Emits: (tSXTH:i32 tGPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_292(N, ARM::tSXTH, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (sext_inreg:i32 GPR:i32:$src, i8:Other) // Emits: (t2SXTBr:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i8) { SDNode *Result = Emit_292(N, ARM::t2SXTBr, MVT::i32); return Result; } // Pattern: (sext_inreg:i32 GPR:i32:$src, i16:Other) // Emits: (t2SXTHr:i32 GPR:i32:$src) // Pattern complexity = 3 cost = 1 size = 0 if (cast<VTSDNode>(N1.getNode())->getVT() == MVT::i16) { SDNode *Result = Emit_292(N, ARM::t2SXTHr, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SINT_TO_FP_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_31(N, ARM::VCVTs2fd, MVT::v2f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SINT_TO_FP_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_31(N, ARM::VCVTs2fq, MVT::v4f32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_296(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N010, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_297(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N010, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_298(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N010 = N01.getNode()->getOperand(0); SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); SDValue N011 = N01.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N0100, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_299(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N00, N01, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_300(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, N000, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_301(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp6 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp7 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, N000, Tmp6, Tmp7 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_302(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N000 = N00.getNode()->getOperand(0); SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); SDValue N001 = N00.getNode()->getOperand(1); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp8 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp9 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, N0000, Tmp8, Tmp9 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_303(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N01, N00, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_SRA_i32(SDNode *N) { if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32)), 16:i32) // Emits: (SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 27 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); if (N010.getNode()->getOpcode() == ISD::SHL) { SDValue N0100 = N010.getNode()->getOperand(0); SDValue N0101 = N010.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0101.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N0101.getValueType() == MVT::i32 && N011.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_298(N, ARM::SMULWB, MVT::i32); return Result; } } } } } } } } } // Pattern: (sra:i32 (mul:i32 (sra:i32 (shl:i32 GPR:i32:$b, 16:i32), 16:i32), GPR:i32:$a), 16:i32) // Emits: (SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 27 cost = 1 size = 0 if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); if (N000.getNode()->getOpcode() == ISD::SHL) { SDValue N0000 = N000.getNode()->getOperand(0); SDValue N0001 = N000.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp4 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp4) { int64_t CN5 = Tmp4->getSExtValue(); if (CN5 == INT64_C(16) && N0001.getValueType() == MVT::i32 && N001.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_302(N, ARM::SMULWB, MVT::i32); return Result; } } } } } } } } // Pattern: (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 GPR:i32:$b, 16:i32)), 16:i32) // Emits: (SMULWT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N011.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_297(N, ARM::SMULWT, MVT::i32); return Result; } } } } } } } // Pattern: (sra:i32 (mul:i32 GPR:i32:$a, (sra:i32 GPR:i32:$b, 16:i32)), 16:i32) // Emits: (t2SMULWT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SRA) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N011.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N011.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_297(N, ARM::t2SMULWT, MVT::i32); return Result; } } } } } } } // Pattern: (sra:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32:$a), 16:i32) // Emits: (SMULWT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N001.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_301(N, ARM::SMULWT, MVT::i32); return Result; } } } } } } } // Pattern: (sra:i32 (mul:i32 (sra:i32 GPR:i32:$b, 16:i32), GPR:i32:$a), 16:i32) // Emits: (t2SMULWT:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 19 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SRA) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N001.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16)) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp2 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp2) { int64_t CN3 = Tmp2->getSExtValue(); if (CN3 == INT64_C(16) && N001.getValueType() == MVT::i32 && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_301(N, ARM::t2SMULWT, MVT::i32); return Result; } } } } } } } // Pattern: (sra:i32 (mul:i32 GPR:i32:$a, (sext_inreg:i32 GPR:i32:$b, i16:Other)), 16:i32) // Emits: (SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_296(N, ARM::SMULWB, MVT::i32); return Result; } } } } } } // Pattern: (sra:i32 (mul:i32 GPR:i32:$a, (sext_inreg:i32 GPR:i32:$b, i16:Other)), 16:i32) // Emits: (t2SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); SDValue N01 = N0.getNode()->getOperand(1); if (N01.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N010 = N01.getNode()->getOperand(0); SDValue N011 = N01.getNode()->getOperand(1); if (cast<VTSDNode>(N011.getNode())->getVT() == MVT::i16) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_296(N, ARM::t2SMULWB, MVT::i32); return Result; } } } } } } // Pattern: (sra:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), GPR:i32:$a), 16:i32) // Emits: (SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_300(N, ARM::SMULWB, MVT::i32); return Result; } } } } } } // Pattern: (sra:i32 (mul:i32 (sext_inreg:i32 GPR:i32:$b, i16:Other), GPR:i32:$a), 16:i32) // Emits: (t2SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 14 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); if (N00.getNode()->getOpcode() == ISD::SIGN_EXTEND_INREG) { SDValue N000 = N00.getNode()->getOperand(0); SDValue N001 = N00.getNode()->getOperand(1); if (cast<VTSDNode>(N001.getNode())->getVT() == MVT::i16) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_300(N, ARM::t2SMULWB, MVT::i32); return Result; } } } } } } // Pattern: so_reg:i32:$src // Emits: (MOVs:i32 so_reg:i32:$src) // Pattern complexity = 12 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue CPTmpN_0; SDValue CPTmpN_1; SDValue CPTmpN_2; if (SelectShifterOperandReg(N, SDValue(N, 0), CPTmpN_0, CPTmpN_1, CPTmpN_2)) { SDNode *Result = Emit_287(N, ARM::MOVs, MVT::i32, CPTmpN_0, CPTmpN_1, CPTmpN_2); return Result; } } if ((!Subtarget->isThumb()) && (Subtarget->hasV5TEOps())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::MUL) { SDValue N00 = N0.getNode()->getOperand(0); // Pattern: (sra:i32 (mul:i32 GPR:i32:$a, GPR:i32<<P:Predicate_sext_16_node>>:$b), 16:i32) // Emits: (SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N01 = N0.getNode()->getOperand(1); if (Predicate_sext_16_node(N01.getNode())) { SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_299(N, ARM::SMULWB, MVT::i32); return Result; } } } } // Pattern: (sra:i32 (mul:i32 GPR:i32<<P:Predicate_sext_16_node>>:$b, GPR:i32:$a), 16:i32) // Emits: (SMULWB:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 12 cost = 1 size = 0 if (Predicate_sext_16_node(N00.getNode())) { SDValue N01 = N0.getNode()->getOperand(1); SDValue N1 = N->getOperand(1); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N1.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(16) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_303(N, ARM::SMULWB, MVT::i32); return Result; } } } } } // Pattern: (sra:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_imm1_31>>:$rhs) // Emits: (t2ASRri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_31(N1.getNode()) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_55(N, ARM::t2ASRri, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (sra:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Emits: (tASRri:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_65(N, ARM::tASRri, MVT::i32); return Result; } // Pattern: (sra:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tASRrr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_66(N, ARM::tASRrr, MVT::i32); return Result; } } // Pattern: (sra:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2ASRrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_56(N, ARM::t2ASRrr, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SRL_i32(SDNode *N) { // Pattern: so_reg:i32:$src // Emits: (MOVs:i32 so_reg:i32:$src) // Pattern complexity = 12 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue CPTmpN_0; SDValue CPTmpN_1; SDValue CPTmpN_2; if (SelectShifterOperandReg(N, SDValue(N, 0), CPTmpN_0, CPTmpN_1, CPTmpN_2)) { SDNode *Result = Emit_287(N, ARM::MOVs, MVT::i32, CPTmpN_0, CPTmpN_1, CPTmpN_2); return Result; } } // Pattern: (srl:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_imm1_31>>:$rhs) // Emits: (t2LSRri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_imm1_31(N1.getNode()) && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_55(N, ARM::t2LSRri, MVT::i32); return Result; } } if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (srl:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Emits: (tLSRri:i32 tGPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::Constant && N1.getValueType() == MVT::i32) { SDNode *Result = Emit_65(N, ARM::tLSRri, MVT::i32); return Result; } // Pattern: (srl:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tLSRrr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_66(N, ARM::tLSRrr, MVT::i32); return Result; } } // Pattern: (srl:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2LSRrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getValueType() == MVT::i32) { SDNode *Result = Emit_56(N, ARM::t2LSRrr, MVT::i32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_304(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN3_0, SDValue &CPTmpN3_1) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { N1, N2, CPTmpN3_0, CPTmpN3_1, Tmp3, Tmp4, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, Ops0, 7); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } DISABLE_INLINE SDNode *Emit_305(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN3_0) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue Tmp3 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { N1, N2, CPTmpN3_0, Tmp3, Tmp4, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Other, Ops0, 6); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } SDNode *Select_ISD_STORE_i32(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); if (Predicate_istore(N)) { // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset)<<P:Predicate_istore>><<P:Predicate_pre_store>> // Emits: (STR_PRE:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_pre_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; SDValue CPTmpN3_1; if (SelectAddrMode2Offset(N, N3, CPTmpN3_0, CPTmpN3_1) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_304(N, ARM::STR_PRE, MVT::i32, CPTmpN3_0, CPTmpN3_1); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset)<<P:Predicate_istore>><<P:Predicate_post_store>> // Emits: (STR_POST:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_post_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; SDValue CPTmpN3_1; if (SelectAddrMode2Offset(N, N3, CPTmpN3_0, CPTmpN3_1) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_304(N, ARM::STR_POST, MVT::i32, CPTmpN3_0, CPTmpN3_1); return Result; } } } if (Predicate_itruncstore(N)) { // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, am3offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti16>> // Emits: (STRH_PRE:i32 GPR:i32:$src, GPR:i32:$base, am3offset:i32:$offset) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_pre_truncst(N) && Predicate_pre_truncsti16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; SDValue CPTmpN3_1; if (SelectAddrMode3Offset(N, N3, CPTmpN3_0, CPTmpN3_1) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_304(N, ARM::STRH_PRE, MVT::i32, CPTmpN3_0, CPTmpN3_1); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, am3offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_post_truncst>><<P:Predicate_post_truncsti16>> // Emits: (STRH_POST:i32 GPR:i32:$src, GPR:i32:$base, am3offset:i32:$offset) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_post_truncst(N) && Predicate_post_truncsti16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; SDValue CPTmpN3_1; if (SelectAddrMode3Offset(N, N3, CPTmpN3_0, CPTmpN3_1) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_304(N, ARM::STRH_POST, MVT::i32, CPTmpN3_0, CPTmpN3_1); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti8>> // Emits: (STRB_PRE:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_pre_truncst(N) && Predicate_pre_truncsti8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; SDValue CPTmpN3_1; if (SelectAddrMode2Offset(N, N3, CPTmpN3_0, CPTmpN3_1) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_304(N, ARM::STRB_PRE, MVT::i32, CPTmpN3_0, CPTmpN3_1); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_post_truncst>><<P:Predicate_post_truncsti8>> // Emits: (STRB_POST:i32 GPR:i32:$src, GPR:i32:$base, am2offset:i32:$offset) // Pattern complexity = 13 cost = 1 size = 0 if (Predicate_post_truncst(N) && Predicate_post_truncsti8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; SDValue CPTmpN3_1; if (SelectAddrMode2Offset(N, N3, CPTmpN3_0, CPTmpN3_1) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_304(N, ARM::STRB_POST, MVT::i32, CPTmpN3_0, CPTmpN3_1); return Result; } } } } if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); if (Predicate_istore(N)) { // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset)<<P:Predicate_istore>><<P:Predicate_pre_store>> // Emits: (t2STR_PRE:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_pre_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; if (SelectT2AddrModeImm8Offset(N, N3, CPTmpN3_0) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_305(N, ARM::t2STR_PRE, MVT::i32, CPTmpN3_0); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset)<<P:Predicate_istore>><<P:Predicate_post_store>> // Emits: (t2STR_POST:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_post_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; if (SelectT2AddrModeImm8Offset(N, N3, CPTmpN3_0) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_305(N, ARM::t2STR_POST, MVT::i32, CPTmpN3_0); return Result; } } } if (Predicate_itruncstore(N)) { // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti16>> // Emits: (t2STRH_PRE:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_pre_truncst(N) && Predicate_pre_truncsti16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; if (SelectT2AddrModeImm8Offset(N, N3, CPTmpN3_0) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_305(N, ARM::t2STRH_PRE, MVT::i32, CPTmpN3_0); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_post_truncst>><<P:Predicate_post_truncsti16>> // Emits: (t2STRH_POST:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_post_truncst(N) && Predicate_post_truncsti16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; if (SelectT2AddrModeImm8Offset(N, N3, CPTmpN3_0) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_305(N, ARM::t2STRH_POST, MVT::i32, CPTmpN3_0); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_pre_truncst>><<P:Predicate_pre_truncsti8>> // Emits: (t2STRB_PRE:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_pre_truncst(N) && Predicate_pre_truncsti8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; if (SelectT2AddrModeImm8Offset(N, N3, CPTmpN3_0) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_305(N, ARM::t2STRB_PRE, MVT::i32, CPTmpN3_0); return Result; } } // Pattern: (ist:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset)<<P:Predicate_itruncstore>><<P:Predicate_post_truncst>><<P:Predicate_post_truncsti8>> // Emits: (t2STRB_POST:i32 GPR:i32:$src, GPR:i32:$base, t2am_imm8_offset:i32:$offset) // Pattern complexity = 10 cost = 1 size = 0 if (Predicate_post_truncst(N) && Predicate_post_truncsti8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue N3 = N->getOperand(3); SDValue CPTmpN3_0; if (SelectT2AddrModeImm8Offset(N, N3, CPTmpN3_0) && N1.getValueType() == MVT::i32 && N3.getValueType() == MVT::i32) { SDNode *Result = Emit_305(N, ARM::t2STRB_POST, MVT::i32, CPTmpN3_0); return Result; } } } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_306(SDNode *N, unsigned Opc0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { N1, CPTmpN2_0, CPTmpN2_1, Tmp2, Tmp3, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, 6); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } DISABLE_INLINE SDNode *Emit_307(SDNode *N, unsigned Opc0, SDValue &CPTmpN2_0, SDValue &CPTmpN2_1, SDValue &CPTmpN2_2) { SDValue Chain = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); MachineSDNode::mmo_iterator MemRefs0 = MF->allocateMemRefsArray(1); MemRefs0[0] = cast<MemSDNode>(N)->getMemOperand(); SDValue Ops0[] = { N1, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2, Tmp2, Tmp3, Chain }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, MVT::Other, Ops0, 7); cast<MachineSDNode>(ResNode)->setMemRefs(MemRefs0, MemRefs0 + 1); return ResNode; } SDNode *Select_ISD_STORE(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedstore(N)) { // Pattern: (st:isVoid GPR:i32:$src, addrmodepc:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (PICSTR:isVoid GPR:i32:$src, addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; if (SelectAddrModePC(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::PICSTR, CPTmpN2_0, CPTmpN2_1); return Result; } } if (Predicate_truncstore(N)) { // Pattern: (st:isVoid GPR:i32:$src, addrmodepc:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>> // Emits: (PICSTRH:isVoid GPR:i32:$src, addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_truncstorei16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; if (SelectAddrModePC(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::PICSTRH, CPTmpN2_0, CPTmpN2_1); return Result; } } // Pattern: (st:isVoid GPR:i32:$src, addrmodepc:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>> // Emits: (PICSTRB:isVoid GPR:i32:$src, addrmodepc:i32:$addr) // Pattern complexity = 23 cost = 1 size = 0 if (Predicate_truncstorei8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; if (SelectAddrModePC(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::PICSTRB, CPTmpN2_0, CPTmpN2_1); return Result; } } } // Pattern: (st:isVoid GPR:i32:$src, addrmode2:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (STR:isVoid GPR:i32:$src, addrmode2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectAddrMode2(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::STR, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } if (Predicate_truncstore(N)) { // Pattern: (st:isVoid GPR:i32:$src, addrmode3:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>> // Emits: (STRH:isVoid GPR:i32:$src, addrmode3:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_truncstorei16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectAddrMode3(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::STRH, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } // Pattern: (st:isVoid GPR:i32:$src, addrmode2:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>> // Emits: (STRB:isVoid GPR:i32:$src, addrmode2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_truncstorei8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectAddrMode2(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::STRB, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } } } } if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedstore(N)) { // Pattern: (st:isVoid tGPR:i32:$src, t_addrmode_s4:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (tSTR:isVoid tGPR:i32:$src, t_addrmode_s4:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectThumbAddrModeS4(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::tSTR, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } if (Predicate_truncstore(N)) { // Pattern: (st:isVoid tGPR:i32:$src, t_addrmode_s1:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>> // Emits: (tSTRB:isVoid tGPR:i32:$src, t_addrmode_s1:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_truncstorei8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectThumbAddrModeS1(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::tSTRB, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } // Pattern: (st:isVoid tGPR:i32:$src, t_addrmode_s2:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>> // Emits: (tSTRH:isVoid tGPR:i32:$src, t_addrmode_s2:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_truncstorei16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectThumbAddrModeS2(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::tSTRH, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } } } } if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedstore(N)) { // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (t2STRs:isVoid GPR:i32:$src, t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectT2AddrModeSoReg(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::t2STRs, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } if (Predicate_truncstore(N)) { // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>> // Emits: (t2STRBs:isVoid GPR:i32:$src, t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_truncstorei8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectT2AddrModeSoReg(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::t2STRBs, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_so_reg:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>> // Emits: (t2STRHs:isVoid GPR:i32:$src, t2addrmode_so_reg:i32:$addr) // Pattern complexity = 16 cost = 1 size = 0 if (Predicate_truncstorei16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; SDValue CPTmpN2_2; if (SelectT2AddrModeSoReg(N, N2, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_307(N, ARM::t2STRHs, CPTmpN2_0, CPTmpN2_1, CPTmpN2_2); return Result; } } } } } // Pattern: (st:isVoid tGPR:i32:$src, t_addrmode_sp:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (tSTRspi:isVoid tGPR:i32:$src, t_addrmode_sp:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedstore(N) && Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; if (SelectThumbAddrModeSP(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::tSTRspi, CPTmpN2_0, CPTmpN2_1); return Result; } } } if ((Subtarget->isThumb2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedstore(N)) { if (Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (t2STRi12:isVoid GPR:i32:$src, t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::t2STRi12, CPTmpN2_0, CPTmpN2_1); return Result; } // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (t2STRi8:isVoid GPR:i32:$src, t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::t2STRi8, CPTmpN2_0, CPTmpN2_1); return Result; } } if (Predicate_truncstore(N)) { if (Predicate_truncstorei8(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>> // Emits: (t2STRBi12:isVoid GPR:i32:$src, t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::t2STRBi12, CPTmpN2_0, CPTmpN2_1); return Result; } // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei8>> // Emits: (t2STRBi8:isVoid GPR:i32:$src, t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::t2STRBi8, CPTmpN2_0, CPTmpN2_1); return Result; } } if (Predicate_truncstorei16(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_imm12:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>> // Emits: (t2STRHi12:isVoid GPR:i32:$src, t2addrmode_imm12:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm12(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::t2STRHi12, CPTmpN2_0, CPTmpN2_1); return Result; } // Pattern: (st:isVoid GPR:i32:$src, t2addrmode_imm8:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_truncstore>><<P:Predicate_truncstorei16>> // Emits: (t2STRHi8:isVoid GPR:i32:$src, t2addrmode_imm8:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (SelectT2AddrModeImm8(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::i32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::t2STRHi8, CPTmpN2_0, CPTmpN2_1); return Result; } } } } } if ((Subtarget->hasVFP2())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedstore(N) && Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; if (SelectAddrMode5(N, N2, CPTmpN2_0, CPTmpN2_1)) { // Pattern: (st:isVoid DPR:f64:$src, addrmode5:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (VSTRD:isVoid DPR:f64:$src, addrmode5:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (N1.getValueType() == MVT::f64 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::VSTRD, CPTmpN2_0, CPTmpN2_1); return Result; } // Pattern: (st:isVoid SPR:f32:$src, addrmode5:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (VSTRS:isVoid SPR:f32:$src, addrmode5:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if (N1.getValueType() == MVT::f32 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::VSTRS, CPTmpN2_0, CPTmpN2_1); return Result; } } } } // Pattern: (st:isVoid QPR:v2f64:$src, addrmode4:i32:$addr)<<P:Predicate_unindexedstore>><<P:Predicate_store>> // Emits: (VSTRQ:isVoid QPR:v2f64:$src, addrmode4:i32:$addr) // Pattern complexity = 13 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue Chain = N->getOperand(0); if (Predicate_unindexedstore(N) && Predicate_store(N)) { SDValue N1 = N->getOperand(1); SDValue N2 = N->getOperand(2); SDValue CPTmpN2_0; SDValue CPTmpN2_1; if (SelectAddrMode4(N, N2, CPTmpN2_0, CPTmpN2_1) && N1.getValueType() == MVT::v2f64 && N2.getValueType() == MVT::i32) { SDNode *Result = Emit_306(N, ARM::VSTRQ, CPTmpN2_0, CPTmpN2_1); return Result; } } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_308(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp1, Tmp2, Tmp3, Tmp4 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } DISABLE_INLINE SDNode *Emit_309(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp4 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp5 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp2, N1, Tmp4, Tmp5 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_310(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_311(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 5); } SDNode *Select_ISD_SUB_i32(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (sub:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (SUBrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_57(N, ARM::SUBrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (sub:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (RSBrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_88(N, ARM::RSBrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (sub:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2SUBrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_68(N, ARM::t2SUBrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (sub:i32 t2_so_reg:i32:$lhs, GPR:i32:$rhs) // Emits: (t2RSBrs:i32 GPR:i32:$rhs, t2_so_reg:i32:$lhs) // Pattern complexity = 12 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_311(N, ARM::t2RSBrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (sub:i32 0:i32, tGPR:i32:$src) // Emits: (tRSB:i32 tGPR:i32:$src) // Pattern complexity = 8 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); ConstantSDNode *Tmp0 = dyn_cast<ConstantSDNode>(N0.getNode()); if (Tmp0) { int64_t CN1 = Tmp0->getSExtValue(); if (CN1 == INT64_C(0)) { SDNode *Result = Emit_309(N, ARM::tRSB, MVT::i32); return Result; } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (sub:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (SUBri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::SUBri, MVT::i32); return Result; } } // Pattern: (sub:i32 (imm:i32)<<P:Predicate_so_imm>>:$b, GPR:i32:$a) // Emits: (RSBri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N0.getNode())) { SDNode *Result = Emit_308(N, ARM::RSBri, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (sub:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2SUBri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::t2SUBri, MVT::i32); return Result; } // Pattern: (sub:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_imm0_4095>>:$rhs) // Emits: (t2SUBri12:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_imm0_4095(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::t2SUBri12, MVT::i32); return Result; } } } // Pattern: (sub:i32 (imm:i32)<<P:Predicate_t2_so_imm>>:$lhs, GPR:i32:$rhs) // Emits: (t2RSBri:i32 GPR:i32:$rhs, (imm:i32):$lhs) // Pattern complexity = 7 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N0.getNode())) { SDNode *Result = Emit_310(N, ARM::t2RSBri, MVT::i32); return Result; } } // Pattern: (sub:i32 GPR:i32:$c, (mul:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (MLS:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6T2Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_77(N, ARM::MLS, MVT::i32); return Result; } } // Pattern: (sub:i32 GPR:i32:$c, (mulhs:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (SMMLS:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (Subtarget->hasV6Ops())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MULHS) { SDNode *Result = Emit_77(N, ARM::SMMLS, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); // Pattern: (sub:i32 GPR:i32:$c, (mul:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (t2MLS:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_77(N, ARM::t2MLS, MVT::i32); return Result; } // Pattern: (sub:i32 GPR:i32:$c, (mulhs:i32 GPR:i32:$a, GPR:i32:$b)) // Emits: (t2SMMLS:i32 GPR:i32:$a, GPR:i32:$b, GPR:i32:$c) // Pattern complexity = 6 cost = 1 size = 0 if (N1.getNode()->getOpcode() == ISD::MULHS) { SDNode *Result = Emit_77(N, ARM::t2SMMLS, MVT::i32); return Result; } } // Pattern: (sub:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (SUBrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_56(N, ARM::SUBrr, MVT::i32); return Result; } // Pattern: (sub:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tSUBrr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_66(N, ARM::tSUBrr, MVT::i32); return Result; } // Pattern: (sub:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2SUBrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_56(N, ARM::t2SUBrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_312(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); return CurDAG->SelectNodeTo(N, Opc0, VT0, N1, Tmp1, Tmp2); } SDNode *Select_ISD_SUB_v8i8(SDNode *N) { // Pattern: (sub:v8i8 (build_vector:v8i8)<<P:Predicate_immAllZerosV>>, DPR:v8i8:$src) // Emits: (VNEGs8d:v8i8 DPR:v8i8:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllZerosV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs8d, MVT::v8i8); return Result; } } // Pattern: (sub:v8i8 (bitconvert:v8i8)<<P:Predicate_immAllZerosV_bc>>, DPR:v8i8:$src) // Emits: (VNEGs8d:v8i8 DPR:f64:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllZerosV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs8d, MVT::v8i8); return Result; } } if ((Subtarget->hasNEON())) { // Pattern: (sub:v8i8 DPR:v8i8:$src1, (mul:v8i8 DPR:v8i8:$src2, DPR:v8i8:$src3)) // Emits: (VMLSv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2, DPR:v8i8:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLSv8i8, MVT::v8i8); return Result; } } // Pattern: (sub:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Emits: (VSUBv8i8:v8i8 DPR:v8i8:$src1, DPR:v8i8:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBv8i8, MVT::v8i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SUB_v16i8(SDNode *N) { // Pattern: (sub:v16i8 (build_vector:v16i8)<<P:Predicate_immAllZerosV>>, QPR:v16i8:$src) // Emits: (VNEGs8q:v16i8 QPR:v16i8:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllZerosV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs8q, MVT::v16i8); return Result; } } // Pattern: (sub:v16i8 (bitconvert:v16i8)<<P:Predicate_immAllZerosV_bc>>, QPR:v16i8:$src) // Emits: (VNEGs8q:v16i8 QPR:v16i8:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllZerosV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs8q, MVT::v16i8); return Result; } } if ((Subtarget->hasNEON())) { // Pattern: (sub:v16i8 QPR:v16i8:$src1, (mul:v16i8 QPR:v16i8:$src2, QPR:v16i8:$src3)) // Emits: (VMLSv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2, QPR:v16i8:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLSv16i8, MVT::v16i8); return Result; } } // Pattern: (sub:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Emits: (VSUBv16i8:v16i8 QPR:v16i8:$src1, QPR:v16i8:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBv16i8, MVT::v16i8); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SUB_v4i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (sub:v4i16 DPR:v4i16:$src1, (mul:v4i16 DPR:v4i16:$src2, (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane))) // Emits: (VMLSslv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4i16) { SDNode *Result = Emit_129(N, ARM::VMLSslv4i16, MVT::v4i16); return Result; } } } // Pattern: (sub:v4i16 DPR:v4i16:$src1, (mul:v4i16 (NEONvduplane:v4i16 DPR_8:v4i16:$src3, (imm:i32):$lane), DPR:v4i16:$src2)) // Emits: (VMLSslv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4i16) { SDNode *Result = Emit_130(N, ARM::VMLSslv4i16, MVT::v4i16); return Result; } } } } } // Pattern: (sub:v4i16 (build_vector:v4i16)<<P:Predicate_immAllZerosV>>, DPR:v4i16:$src) // Emits: (VNEGs16d:v4i16 DPR:v4i16:$src) // Pattern complexity = 7 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllZerosV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs16d, MVT::v4i16); return Result; } } // Pattern: (sub:v4i16 (bitconvert:v4i16)<<P:Predicate_immAllZerosV_bc>>, DPR:v4i16:$src) // Emits: (VNEGs16d:v4i16 DPR:f64:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllZerosV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs16d, MVT::v4i16); return Result; } } if ((Subtarget->hasNEON())) { // Pattern: (sub:v4i16 DPR:v4i16:$src1, (mul:v4i16 DPR:v4i16:$src2, DPR:v4i16:$src3)) // Emits: (VMLSv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2, DPR:v4i16:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLSv4i16, MVT::v4i16); return Result; } } // Pattern: (sub:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Emits: (VSUBv4i16:v4i16 DPR:v4i16:$src1, DPR:v4i16:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBv4i16, MVT::v4i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SUB_v8i16(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (sub:v8i16 QPR:v8i16:$src1, (mul:v8i16 QPR:v8i16:$src2, (NEONvduplane:v8i16 DPR_8:v4i16:$src3, (imm:i32):$lane))) // Emits: (VMLSslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4i16) { SDNode *Result = Emit_129(N, ARM::VMLSslv8i16, MVT::v8i16); return Result; } } } // Pattern: (sub:v8i16 QPR:v8i16:$src1, (mul:v8i16 (NEONvduplane:v8i16 DPR_8:v4i16:$src3, (imm:i32):$lane), QPR:v8i16:$src2)) // Emits: (VMLSslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, DPR_8:v4i16:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4i16) { SDNode *Result = Emit_130(N, ARM::VMLSslv8i16, MVT::v8i16); return Result; } } } } } { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (sub:v8i16 QPR:v8i16:$src1, (mul:v8i16 QPR:v8i16:$src2, (NEONvduplane:v8i16 QPR:v8i16:$src3, (imm:i32):$lane))) // Emits: (VMLSslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src3, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v8i16) { SDNode *Result = Emit_133(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLSslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } // Pattern: (sub:v8i16 QPR:v8i16:$src1, (mul:v8i16 (NEONvduplane:v8i16 QPR:v8i16:$src3, (imm:i32):$lane), QPR:v8i16:$src2)) // Emits: (VMLSslv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, (EXTRACT_SUBREG:v4i16 QPR:v16i8:$src3, (DSubReg_i16_reg:i32 (imm:i32):$lane)), (SubReg_i16_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v8i16) { SDNode *Result = Emit_134(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLSslv8i16, MVT::v4i16, MVT::v8i16); return Result; } } } } } // Pattern: (sub:v8i16 (build_vector:v8i16)<<P:Predicate_immAllZerosV>>, QPR:v8i16:$src) // Emits: (VNEGs16q:v8i16 QPR:v8i16:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllZerosV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs16q, MVT::v8i16); return Result; } } // Pattern: (sub:v8i16 (bitconvert:v8i16)<<P:Predicate_immAllZerosV_bc>>, QPR:v8i16:$src) // Emits: (VNEGs16q:v8i16 QPR:v16i8:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllZerosV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs16q, MVT::v8i16); return Result; } } if ((Subtarget->hasNEON())) { // Pattern: (sub:v8i16 QPR:v8i16:$src1, (mul:v8i16 QPR:v8i16:$src2, QPR:v8i16:$src3)) // Emits: (VMLSv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2, QPR:v8i16:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLSv8i16, MVT::v8i16); return Result; } } // Pattern: (sub:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Emits: (VSUBv8i16:v8i16 QPR:v8i16:$src1, QPR:v8i16:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBv8i16, MVT::v8i16); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SUB_v2i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (sub:v2i32 DPR:v2i32:$src1, (mul:v2i32 DPR:v2i32:$src2, (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane))) // Emits: (VMLSslv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2i32) { SDNode *Result = Emit_129(N, ARM::VMLSslv2i32, MVT::v2i32); return Result; } } } // Pattern: (sub:v2i32 DPR:v2i32:$src1, (mul:v2i32 (NEONvduplane:v2i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane), DPR:v2i32:$src2)) // Emits: (VMLSslv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2i32) { SDNode *Result = Emit_130(N, ARM::VMLSslv2i32, MVT::v2i32); return Result; } } } } } // Pattern: (sub:v2i32 (build_vector:v2i32)<<P:Predicate_immAllZerosV>>, DPR:v2i32:$src) // Emits: (VNEGs32d:v2i32 DPR:v2i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllZerosV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs32d, MVT::v2i32); return Result; } } // Pattern: (sub:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllZerosV_bc>>, DPR:v2i32:$src) // Emits: (VNEGs32d:v2i32 DPR:f64:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllZerosV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs32d, MVT::v2i32); return Result; } } if ((Subtarget->hasNEON())) { // Pattern: (sub:v2i32 DPR:v2i32:$src1, (mul:v2i32 DPR:v2i32:$src2, DPR:v2i32:$src3)) // Emits: (VMLSv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2, DPR:v2i32:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLSv2i32, MVT::v2i32); return Result; } } // Pattern: (sub:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VSUBv2i32:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBv2i32, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SUB_v4i32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (sub:v4i32 QPR:v4i32:$src1, (mul:v4i32 QPR:v4i32:$src2, (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane))) // Emits: (VMLSslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v2i32) { SDNode *Result = Emit_129(N, ARM::VMLSslv4i32, MVT::v4i32); return Result; } } } // Pattern: (sub:v4i32 QPR:v4i32:$src1, (mul:v4i32 (NEONvduplane:v4i32 DPR_VFP2:v2i32:$src3, (imm:i32):$lane), QPR:v4i32:$src2)) // Emits: (VMLSslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, DPR_VFP2:v2i32:$src3, (imm:i32):$lane) // Pattern complexity = 12 cost = 1 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v2i32) { SDNode *Result = Emit_130(N, ARM::VMLSslv4i32, MVT::v4i32); return Result; } } } } } { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDValue N10 = N1.getNode()->getOperand(0); // Pattern: (sub:v4i32 QPR:v4i32:$src1, (mul:v4i32 QPR:v4i32:$src2, (NEONvduplane:v4i32 QPR:v4i32:$src3, (imm:i32):$lane))) // Emits: (VMLSslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 { SDValue N11 = N1.getNode()->getOperand(1); if (N11.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N110 = N11.getNode()->getOperand(0); SDValue N111 = N11.getNode()->getOperand(1); if (N111.getNode()->getOpcode() == ISD::Constant && N110.getValueType() == MVT::v4i32) { SDNode *Result = Emit_137(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLSslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } // Pattern: (sub:v4i32 QPR:v4i32:$src1, (mul:v4i32 (NEONvduplane:v4i32 QPR:v4i32:$src3, (imm:i32):$lane), QPR:v4i32:$src2)) // Emits: (VMLSslv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, (EXTRACT_SUBREG:v2i32 QPR:v16i8:$src3, (DSubReg_i32_reg:i32 (imm:i32):$lane)), (SubReg_i32_lane:i32 (imm:i32):$lane)) // Pattern complexity = 12 cost = 2 size = 0 if (N10.getNode()->getOpcode() == ARMISD::VDUPLANE) { SDValue N100 = N10.getNode()->getOperand(0); SDValue N101 = N10.getNode()->getOperand(1); if (N101.getNode()->getOpcode() == ISD::Constant) { SDValue N11 = N1.getNode()->getOperand(1); if (N100.getValueType() == MVT::v4i32) { SDNode *Result = Emit_138(N, TargetOpcode::EXTRACT_SUBREG, ARM::VMLSslv4i32, MVT::v2i32, MVT::v4i32); return Result; } } } } } // Pattern: (sub:v4i32 (build_vector:v4i32)<<P:Predicate_immAllZerosV>>, QPR:v4i32:$src) // Emits: (VNEGs32q:v4i32 QPR:v4i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllZerosV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs32q, MVT::v4i32); return Result; } } // Pattern: (sub:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllZerosV_bc>>, QPR:v4i32:$src) // Emits: (VNEGs32q:v4i32 QPR:v16i8:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllZerosV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VNEGs32q, MVT::v4i32); return Result; } } if ((Subtarget->hasNEON())) { // Pattern: (sub:v4i32 QPR:v4i32:$src1, (mul:v4i32 QPR:v4i32:$src2, QPR:v4i32:$src3)) // Emits: (VMLSv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2, QPR:v4i32:$src3) // Pattern complexity = 6 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::MUL) { SDNode *Result = Emit_125(N, ARM::VMLSv4i32, MVT::v4i32); return Result; } } // Pattern: (sub:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VSUBv4i32:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_44(N, ARM::VSUBv4i32, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SUB_v1i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VSUBv1i64, MVT::v1i64); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_SUB_v2i64(SDNode *N) { if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VSUBv2i64, MVT::v2i64); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_313(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, Tmp1, Tmp2, Tmp3 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_314(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, N1, Tmp1, Tmp2); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_315(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N1, CPTmpN0_0, CPTmpN0_1, Tmp2 }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 4); SDValue InFlag(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } SDNode *Select_ISD_SUBC_i32(SDNode *N) { if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (subc:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (SUBSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_143(N, ARM::SUBSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (subc:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (RSBSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_148(N, ARM::RSBSrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (subc:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2SUBSrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_144(N, ARM::t2SUBSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (subc:i32 t2_so_reg:i32:$lhs, GPR:i32:$rhs) // Emits: (t2RSBSrs:i32 GPR:i32:$rhs, t2_so_reg:i32:$lhs) // Pattern complexity = 12 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_315(N, ARM::t2RSBSrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (subc:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (SUBSri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_141(N, ARM::SUBSri, MVT::i32); return Result; } } // Pattern: (subc:i32 (imm:i32)<<P:Predicate_so_imm>>:$b, GPR:i32:$a) // Emits: (RSBSri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N0.getNode())) { SDNode *Result = Emit_313(N, ARM::RSBSri, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (subc:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2SUBSri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_141(N, ARM::t2SUBSri, MVT::i32); return Result; } } // Pattern: (subc:i32 (imm:i32)<<P:Predicate_t2_so_imm>>:$lhs, GPR:i32:$rhs) // Emits: (t2RSBSri:i32 GPR:i32:$rhs, (imm:i32):$lhs) // Pattern complexity = 7 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N0.getNode())) { SDNode *Result = Emit_314(N, ARM::t2RSBSri, MVT::i32); return Result; } } // Pattern: (subc:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (SUBSrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDNode *Result = Emit_142(N, ARM::SUBSrr, MVT::i32); return Result; } // Pattern: (subc:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2SUBSrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_142(N, ARM::t2SUBSrr, MVT::i32); return Result; } // Pattern: (subc:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tSUBrr:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_146(N, ARM::tSUBrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_316(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp4 = CurDAG->getRegister(0, MVT::i32); SDValue InFlag = N->getOperand(2); SDValue Ops0[] = { N1, Tmp1, Tmp2, Tmp3, Tmp4, InFlag }; SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, Ops0, 6); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } DISABLE_INLINE SDNode *Emit_317(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32); SDValue InFlag = N->getOperand(2); SDNode *ResNode = CurDAG->SelectNodeTo(N, Opc0, VT0, MVT::Flag, N1, Tmp1, InFlag); InFlag = SDValue(ResNode, 1); ReplaceUses(SDValue(N, 1), InFlag); return ResNode; } SDNode *Select_ISD_SUBE_i32(SDNode *N) { // Pattern: (sube:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (SBCrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_152(N, ARM::SBCrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (sube:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (SBCSSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_155(N, ARM::SBCSSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { // Pattern: (sube:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (RSCrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDNode *Result = Emit_159(N, ARM::RSCrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } // Pattern: (sube:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (RSCSrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 SDNode *Result = Emit_160(N, ARM::RSCSrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } // Pattern: (sube:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2SBCrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_157(N, ARM::t2SBCrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (sube:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2SBCSrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_158(N, ARM::t2SBCSrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (sube:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (SBCri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_150(N, ARM::SBCri, MVT::i32); return Result; } } // Pattern: (sube:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (SBCSSri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_153(N, ARM::SBCSSri, MVT::i32); return Result; } } if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm(N0.getNode())) { // Pattern: (sube:i32 (imm:i32)<<P:Predicate_so_imm>>:$b, GPR:i32:$a) // Emits: (RSCri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 { SDNode *Result = Emit_316(N, ARM::RSCri, MVT::i32); return Result; } // Pattern: (sube:i32 (imm:i32)<<P:Predicate_so_imm>>:$b, GPR:i32:$a) // Emits: (RSCSri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 SDNode *Result = Emit_317(N, ARM::RSCSri, MVT::i32); return Result; } } // Pattern: (sube:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2SBCri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_150(N, ARM::t2SBCri, MVT::i32); return Result; } } // Pattern: (sube:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2SBCSri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (N->hasAnyUseOfValue(1))) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_153(N, ARM::t2SBCSri, MVT::i32); return Result; } } // Pattern: (sube:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (SBCrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (!N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_151(N, ARM::SBCrr, MVT::i32); return Result; } // Pattern: (sube:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (SBCSSrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 if ((!Subtarget->isThumb()) && (N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_154(N, ARM::SBCSSrr, MVT::i32); return Result; } // Pattern: (sube:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tSBC:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_156(N, ARM::tSBC, MVT::i32); return Result; } // Pattern: (sube:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2SBCrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (!N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_151(N, ARM::t2SBCrr, MVT::i32); return Result; } // Pattern: (sube:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2SBCSrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2()) && (N->hasAnyUseOfValue(1))) { SDNode *Result = Emit_154(N, ARM::t2SBCSrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_UINT_TO_FP_v2f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v2i32) { SDNode *Result = Emit_31(N, ARM::VCVTu2fd, MVT::v2f32); return Result; } } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_UINT_TO_FP_v4f32(SDNode *N) { if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getValueType() == MVT::v4i32) { SDNode *Result = Emit_31(N, ARM::VCVTu2fq, MVT::v4f32); return Result; } } CannotYetSelect(N); return NULL; } DISABLE_INLINE SDNode *Emit_318(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { N0, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_319(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1, SDValue &CPTmpN0_2) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN0_0, CPTmpN0_1, CPTmpN0_2, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 6); } DISABLE_INLINE SDNode *Emit_320(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getRegister(ARM::CPSR, MVT::i32); SDValue Tmp2 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, N0, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_321(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N0)->getZExtValue()), MVT::i32); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_322(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0, SDValue &CPTmpN0_0, SDValue &CPTmpN0_1) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { CPTmpN0_0, CPTmpN0_1, Tmp1, Tmp2 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } DISABLE_INLINE SDNode *Emit_323(SDNode *N, unsigned Opc0, MVT::SimpleValueType VT0) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); SDValue Tmp0 = CurDAG->getTargetConstant(((unsigned) cast<ConstantSDNode>(N1)->getZExtValue()), MVT::i32); SDValue Tmp1 = CurDAG->getTargetConstant(0xEULL, MVT::i32); SDValue Tmp2 = CurDAG->getRegister(0, MVT::i32); SDValue Tmp3 = CurDAG->getRegister(0, MVT::i32); SDValue Ops0[] = { Tmp0, Tmp1, Tmp2, Tmp3 }; return CurDAG->SelectNodeTo(N, Opc0, VT0, Ops0, 4); } SDNode *Select_ISD_XOR_i32(SDNode *N) { // Pattern: (xor:i32 so_reg:i32:$src, (imm:i32)<<P:Predicate_immAllOnes>>) // Emits: (MVNs:i32 so_reg:i32:$src) // Pattern complexity = 19 cost = 1 size = 0 if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N1.getNode())) { SDNode *Result = Emit_319(N, ARM::MVNs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } } // Pattern: (xor:i32 t2_so_reg:i32:$src, (imm:i32)<<P:Predicate_immAllOnes>>) // Emits: (t2MVNs:i32 t2_so_reg:i32:$src) // Pattern complexity = 17 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N1.getNode())) { SDNode *Result = Emit_322(N, ARM::t2MVNs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); // Pattern: (xor:i32 GPR:i32:$a, so_reg:i32:$b) // Emits: (EORrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; SDValue CPTmpN1_2; if (SelectShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2)) { SDNode *Result = Emit_57(N, ARM::EORrs, MVT::i32, CPTmpN1_0, CPTmpN1_1, CPTmpN1_2); return Result; } } // Pattern: (xor:i32 so_reg:i32:$b, GPR:i32:$a) // Emits: (EORrs:i32 GPR:i32:$a, so_reg:i32:$b) // Pattern complexity = 15 cost = 1 size = 0 SDValue CPTmpN0_0; SDValue CPTmpN0_1; SDValue CPTmpN0_2; if (SelectShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2)) { SDNode *Result = Emit_88(N, ARM::EORrs, MVT::i32, CPTmpN0_0, CPTmpN0_1, CPTmpN0_2); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); // Pattern: (xor:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Emits: (t2EORrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue N1 = N->getOperand(1); SDValue CPTmpN1_0; SDValue CPTmpN1_1; if (SelectT2ShifterOperandReg(N, N1, CPTmpN1_0, CPTmpN1_1)) { SDNode *Result = Emit_68(N, ARM::t2EORrs, MVT::i32, CPTmpN1_0, CPTmpN1_1); return Result; } } // Pattern: (xor:i32 (imm:i32)<<P:Predicate_t2_so_imm>>:$src, (imm:i32)<<P:Predicate_immAllOnes>>) // Emits: (t2MVNi:i32 (imm:i32):$src) // Pattern complexity = 12 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N0.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N1.getNode())) { SDNode *Result = Emit_321(N, ARM::t2MVNi, MVT::i32); return Result; } } // Pattern: (xor:i32 t2_so_reg:i32:$rhs, GPR:i32:$lhs) // Emits: (t2EORrs:i32 GPR:i32:$lhs, t2_so_reg:i32:$rhs) // Pattern complexity = 12 cost = 1 size = 0 { SDValue CPTmpN0_0; SDValue CPTmpN0_1; if (SelectT2ShifterOperandReg(N, N0, CPTmpN0_0, CPTmpN0_1)) { SDNode *Result = Emit_103(N, ARM::t2EORrs, MVT::i32, CPTmpN0_0, CPTmpN0_1); return Result; } } // Pattern: (xor:i32 (imm:i32)<<P:Predicate_immAllOnes>>, (imm:i32)<<P:Predicate_t2_so_imm>>:$src) // Emits: (t2MVNi:i32 (imm:i32):$src) // Pattern complexity = 12 cost = 1 size = 0 if (N0.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N0.getNode())) { SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_323(N, ARM::t2MVNi, MVT::i32); return Result; } } // Pattern: (xor:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_immAllOnes>>) // Emits: (t2MVNr:i32 GPR:i32:$src) // Pattern complexity = 8 cost = 1 size = 0 SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N1.getNode())) { SDNode *Result = Emit_292(N, ARM::t2MVNr, MVT::i32); return Result; } } if ((!Subtarget->isThumb())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (xor:i32 GPR:i32:$a, (imm:i32)<<P:Predicate_so_imm>>:$b) // Emits: (EORri:i32 GPR:i32:$a, (imm:i32):$b) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::EORri, MVT::i32); return Result; } // Pattern: (xor:i32 GPR:i32:$src, (imm:i32)<<P:Predicate_immAllOnes>>) // Emits: (MVNr:i32 GPR:i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_immAllOnes(N1.getNode())) { SDNode *Result = Emit_318(N, ARM::MVNr, MVT::i32); return Result; } } } // Pattern: (xor:i32 tGPR:i32:$src, (imm:i32)<<P:Predicate_immAllOnes>>) // Emits: (tMVN:i32 tGPR:i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_immAllOnes(N1.getNode())) { SDNode *Result = Emit_320(N, ARM::tMVN, MVT::i32); return Result; } } if ((Subtarget->isThumb2())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant) { // Pattern: (xor:i32 GPR:i32:$lhs, (imm:i32)<<P:Predicate_t2_so_imm>>:$rhs) // Emits: (t2EORri:i32 GPR:i32:$lhs, (imm:i32):$rhs) // Pattern complexity = 7 cost = 1 size = 0 if (Predicate_t2_so_imm(N1.getNode())) { SDNode *Result = Emit_55(N, ARM::t2EORri, MVT::i32); return Result; } // Pattern: (xor:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_t2_so_imm2part>>:$RHS) // Emits: (t2EORri:i32 (t2EORri:i32 GPR:i32:$LHS, (t2_so_imm2part_1:i32 (imm:i32):$RHS)), (t2_so_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 if (Predicate_t2_so_imm2part(N1.getNode())) { SDNode *Result = Emit_71(N, ARM::t2EORri, ARM::t2EORri, MVT::i32, MVT::i32); return Result; } } } if ((!Subtarget->isThumb())) { // Pattern: (xor:i32 GPR:i32:$LHS, (imm:i32)<<P:Predicate_so_imm2part>>:$RHS) // Emits: (EORri:i32 (EORri:i32 GPR:i32:$LHS, (so_imm2part_1:i32 (imm:i32):$RHS)), (so_imm2part_2:i32 (imm:i32):$RHS)) // Pattern complexity = 7 cost = 2 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::Constant && Predicate_so_imm2part(N1.getNode())) { SDNode *Result = Emit_74(N, ARM::EORri, ARM::EORri, MVT::i32, MVT::i32); return Result; } } // Pattern: (xor:i32 GPR:i32:$a, GPR:i32:$b) // Emits: (EORrr:i32 GPR:i32:$a, GPR:i32:$b) // Pattern complexity = 3 cost = 1 size = 0 SDNode *Result = Emit_56(N, ARM::EORrr, MVT::i32); return Result; } // Pattern: (xor:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Emits: (tEOR:i32 tGPR:i32:$lhs, tGPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb1Only())) { SDNode *Result = Emit_66(N, ARM::tEOR, MVT::i32); return Result; } // Pattern: (xor:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Emits: (t2EORrr:i32 GPR:i32:$lhs, GPR:i32:$rhs) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->isThumb2())) { SDNode *Result = Emit_56(N, ARM::t2EORrr, MVT::i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_XOR_v2i32(SDNode *N) { // Pattern: (xor:v2i32 DPR:v2i32:$src, (build_vector:v2i32)<<P:Predicate_immAllOnesV>>) // Emits: (VMVNd:v2i32 DPR:v2i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllOnesV(N1.getNode())) { SDNode *Result = Emit_292(N, ARM::VMVNd, MVT::v2i32); return Result; } } // Pattern: (xor:v2i32 DPR:v2i32:$src, (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>) // Emits: (VMVNd:v2i32 DPR:f64:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N1.getNode())) { SDNode *Result = Emit_292(N, ARM::VMVNd, MVT::v2i32); return Result; } } // Pattern: (xor:v2i32 (build_vector:v2i32)<<P:Predicate_immAllOnesV>>, DPR:v2i32:$src) // Emits: (VMVNd:v2i32 DPR:v2i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllOnesV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VMVNd, MVT::v2i32); return Result; } } // Pattern: (xor:v2i32 (bitconvert:v2i32)<<P:Predicate_immAllOnesV_bc>>, DPR:v2i32:$src) // Emits: (VMVNd:v2i32 DPR:f64:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VMVNd, MVT::v2i32); return Result; } } // Pattern: (xor:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Emits: (VEORd:v2i32 DPR:v2i32:$src1, DPR:v2i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VEORd, MVT::v2i32); return Result; } CannotYetSelect(N); return NULL; } SDNode *Select_ISD_XOR_v4i32(SDNode *N) { // Pattern: (xor:v4i32 QPR:v4i32:$src, (build_vector:v4i32)<<P:Predicate_immAllOnesV>>) // Emits: (VMVNq:v4i32 QPR:v4i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllOnesV(N1.getNode())) { SDNode *Result = Emit_292(N, ARM::VMVNq, MVT::v4i32); return Result; } } // Pattern: (xor:v4i32 QPR:v4i32:$src, (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>) // Emits: (VMVNq:v4i32 QPR:v16i8:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); SDValue N1 = N->getOperand(1); if (N1.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N1.getNode())) { SDNode *Result = Emit_292(N, ARM::VMVNq, MVT::v4i32); return Result; } } // Pattern: (xor:v4i32 (build_vector:v4i32)<<P:Predicate_immAllOnesV>>, QPR:v4i32:$src) // Emits: (VMVNq:v4i32 QPR:v4i32:$src) // Pattern complexity = 7 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BUILD_VECTOR && Predicate_immAllOnesV(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VMVNq, MVT::v4i32); return Result; } } // Pattern: (xor:v4i32 (bitconvert:v4i32)<<P:Predicate_immAllOnesV_bc>>, QPR:v4i32:$src) // Emits: (VMVNq:v4i32 QPR:v16i8:$src) // Pattern complexity = 7 cost = 1 size = 0 { SDValue N0 = N->getOperand(0); if (N0.getNode()->getOpcode() == ISD::BIT_CONVERT && Predicate_immAllOnesV_bc(N0.getNode())) { SDNode *Result = Emit_312(N, ARM::VMVNq, MVT::v4i32); return Result; } } // Pattern: (xor:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Emits: (VEORq:v4i32 QPR:v4i32:$src1, QPR:v4i32:$src2) // Pattern complexity = 3 cost = 1 size = 0 if ((Subtarget->hasNEON())) { SDNode *Result = Emit_44(N, ARM::VEORq, MVT::v4i32); return Result; } CannotYetSelect(N); return NULL; } // The main instruction selector code. SDNode *SelectCode(SDNode *N) { MVT::SimpleValueType NVT = N->getValueType(0).getSimpleVT().SimpleTy; switch (N->getOpcode()) { default: assert(!N->isMachineOpcode() && "Node already selected!"); break; case ISD::EntryToken: // These nodes remain the same. case ISD::BasicBlock: case ISD::Register: case ISD::HANDLENODE: case ISD::TargetConstant: case ISD::TargetConstantFP: case ISD::TargetConstantPool: case ISD::TargetFrameIndex: case ISD::TargetExternalSymbol: case ISD::TargetBlockAddress: case ISD::TargetJumpTable: case ISD::TargetGlobalTLSAddress: case ISD::TargetGlobalAddress: case ISD::TokenFactor: case ISD::CopyFromReg: case ISD::CopyToReg: { return NULL; } case ISD::AssertSext: case ISD::AssertZext: { ReplaceUses(SDValue(N, 0), N->getOperand(0)); return NULL; } case ISD::INLINEASM: return Select_INLINEASM(N); case ISD::EH_LABEL: return Select_EH_LABEL(N); case ISD::UNDEF: return Select_UNDEF(N); case ARMISD::BR2_JT: { return Select_ARMISD_BR2_JT(N); break; } case ARMISD::BR_JT: { return Select_ARMISD_BR_JT(N); break; } case ARMISD::CALL: { return Select_ARMISD_CALL(N); break; } case ARMISD::CALL_NOLINK: { return Select_ARMISD_CALL_NOLINK(N); break; } case ARMISD::CALL_PRED: { return Select_ARMISD_CALL_PRED(N); break; } case ARMISD::CMP: { return Select_ARMISD_CMP(N); break; } case ARMISD::CMPFP: { return Select_ARMISD_CMPFP(N); break; } case ARMISD::CMPFPw0: { return Select_ARMISD_CMPFPw0(N); break; } case ARMISD::CMPZ: { return Select_ARMISD_CMPZ(N); break; } case ARMISD::EH_SJLJ_SETJMP: { switch (NVT) { case MVT::i32: return Select_ARMISD_EH_SJLJ_SETJMP_i32(N); default: break; } break; } case ARMISD::FMSTAT: { return Select_ARMISD_FMSTAT(N); break; } case ARMISD::FTOSI: { switch (NVT) { case MVT::f32: return Select_ARMISD_FTOSI_f32(N); default: break; } break; } case ARMISD::FTOUI: { switch (NVT) { case MVT::f32: return Select_ARMISD_FTOUI_f32(N); default: break; } break; } case ARMISD::MEMBARRIER: { return Select_ARMISD_MEMBARRIER(N); break; } case ARMISD::PIC_ADD: { switch (NVT) { case MVT::i32: return Select_ARMISD_PIC_ADD_i32(N); default: break; } break; } case ARMISD::RBIT: { switch (NVT) { case MVT::i32: return Select_ARMISD_RBIT_i32(N); default: break; } break; } case ARMISD::RET_FLAG: { return Select_ARMISD_RET_FLAG(N); break; } case ARMISD::RRX: { switch (NVT) { case MVT::i32: return Select_ARMISD_RRX_i32(N); default: break; } break; } case ARMISD::SITOF: { switch (NVT) { case MVT::f32: return Select_ARMISD_SITOF_f32(N); case MVT::f64: return Select_ARMISD_SITOF_f64(N); default: break; } break; } case ARMISD::SRA_FLAG: { switch (NVT) { case MVT::i32: return Select_ARMISD_SRA_FLAG_i32(N); default: break; } break; } case ARMISD::SRL_FLAG: { switch (NVT) { case MVT::i32: return Select_ARMISD_SRL_FLAG_i32(N); default: break; } break; } case ARMISD::SYNCBARRIER: { return Select_ARMISD_SYNCBARRIER(N); break; } case ARMISD::THREAD_POINTER: { switch (NVT) { case MVT::i32: return Select_ARMISD_THREAD_POINTER_i32(N); default: break; } break; } case ARMISD::UITOF: { switch (NVT) { case MVT::f32: return Select_ARMISD_UITOF_f32(N); case MVT::f64: return Select_ARMISD_UITOF_f64(N); default: break; } break; } case ARMISD::VCEQ: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VCEQ_v8i8(N); case MVT::v16i8: return Select_ARMISD_VCEQ_v16i8(N); case MVT::v4i16: return Select_ARMISD_VCEQ_v4i16(N); case MVT::v8i16: return Select_ARMISD_VCEQ_v8i16(N); case MVT::v2i32: return Select_ARMISD_VCEQ_v2i32(N); case MVT::v4i32: return Select_ARMISD_VCEQ_v4i32(N); default: break; } break; } case ARMISD::VCGE: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VCGE_v8i8(N); case MVT::v16i8: return Select_ARMISD_VCGE_v16i8(N); case MVT::v4i16: return Select_ARMISD_VCGE_v4i16(N); case MVT::v8i16: return Select_ARMISD_VCGE_v8i16(N); case MVT::v2i32: return Select_ARMISD_VCGE_v2i32(N); case MVT::v4i32: return Select_ARMISD_VCGE_v4i32(N); default: break; } break; } case ARMISD::VCGEU: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VCGEU_v8i8(N); case MVT::v16i8: return Select_ARMISD_VCGEU_v16i8(N); case MVT::v4i16: return Select_ARMISD_VCGEU_v4i16(N); case MVT::v8i16: return Select_ARMISD_VCGEU_v8i16(N); case MVT::v2i32: return Select_ARMISD_VCGEU_v2i32(N); case MVT::v4i32: return Select_ARMISD_VCGEU_v4i32(N); default: break; } break; } case ARMISD::VCGT: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VCGT_v8i8(N); case MVT::v16i8: return Select_ARMISD_VCGT_v16i8(N); case MVT::v4i16: return Select_ARMISD_VCGT_v4i16(N); case MVT::v8i16: return Select_ARMISD_VCGT_v8i16(N); case MVT::v2i32: return Select_ARMISD_VCGT_v2i32(N); case MVT::v4i32: return Select_ARMISD_VCGT_v4i32(N); default: break; } break; } case ARMISD::VCGTU: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VCGTU_v8i8(N); case MVT::v16i8: return Select_ARMISD_VCGTU_v16i8(N); case MVT::v4i16: return Select_ARMISD_VCGTU_v4i16(N); case MVT::v8i16: return Select_ARMISD_VCGTU_v8i16(N); case MVT::v2i32: return Select_ARMISD_VCGTU_v2i32(N); case MVT::v4i32: return Select_ARMISD_VCGTU_v4i32(N); default: break; } break; } case ARMISD::VDUP: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VDUP_v8i8(N); case MVT::v16i8: return Select_ARMISD_VDUP_v16i8(N); case MVT::v4i16: return Select_ARMISD_VDUP_v4i16(N); case MVT::v8i16: return Select_ARMISD_VDUP_v8i16(N); case MVT::v2i32: return Select_ARMISD_VDUP_v2i32(N); case MVT::v4i32: return Select_ARMISD_VDUP_v4i32(N); case MVT::v2f32: return Select_ARMISD_VDUP_v2f32(N); case MVT::v4f32: return Select_ARMISD_VDUP_v4f32(N); default: break; } break; } case ARMISD::VDUPLANE: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VDUPLANE_v8i8(N); case MVT::v16i8: return Select_ARMISD_VDUPLANE_v16i8(N); case MVT::v4i16: return Select_ARMISD_VDUPLANE_v4i16(N); case MVT::v8i16: return Select_ARMISD_VDUPLANE_v8i16(N); case MVT::v2i32: return Select_ARMISD_VDUPLANE_v2i32(N); case MVT::v4i32: return Select_ARMISD_VDUPLANE_v4i32(N); case MVT::v2i64: return Select_ARMISD_VDUPLANE_v2i64(N); case MVT::v2f32: return Select_ARMISD_VDUPLANE_v2f32(N); case MVT::v4f32: return Select_ARMISD_VDUPLANE_v4f32(N); case MVT::v2f64: return Select_ARMISD_VDUPLANE_v2f64(N); default: break; } break; } case ARMISD::VEXT: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VEXT_v8i8(N); case MVT::v16i8: return Select_ARMISD_VEXT_v16i8(N); case MVT::v4i16: return Select_ARMISD_VEXT_v4i16(N); case MVT::v8i16: return Select_ARMISD_VEXT_v8i16(N); case MVT::v2i32: return Select_ARMISD_VEXT_v2i32(N); case MVT::v4i32: return Select_ARMISD_VEXT_v4i32(N); case MVT::v2f32: return Select_ARMISD_VEXT_v2f32(N); case MVT::v4f32: return Select_ARMISD_VEXT_v4f32(N); default: break; } break; } case ARMISD::VGETLANEs: { switch (NVT) { case MVT::i32: return Select_ARMISD_VGETLANEs_i32(N); default: break; } break; } case ARMISD::VGETLANEu: { switch (NVT) { case MVT::i32: return Select_ARMISD_VGETLANEu_i32(N); default: break; } break; } case ARMISD::VMOVDRR: { switch (NVT) { case MVT::f64: return Select_ARMISD_VMOVDRR_f64(N); default: break; } break; } case ARMISD::VQRSHRNs: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQRSHRNs_v8i8(N); case MVT::v4i16: return Select_ARMISD_VQRSHRNs_v4i16(N); case MVT::v2i32: return Select_ARMISD_VQRSHRNs_v2i32(N); default: break; } break; } case ARMISD::VQRSHRNsu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQRSHRNsu_v8i8(N); case MVT::v4i16: return Select_ARMISD_VQRSHRNsu_v4i16(N); case MVT::v2i32: return Select_ARMISD_VQRSHRNsu_v2i32(N); default: break; } break; } case ARMISD::VQRSHRNu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQRSHRNu_v8i8(N); case MVT::v4i16: return Select_ARMISD_VQRSHRNu_v4i16(N); case MVT::v2i32: return Select_ARMISD_VQRSHRNu_v2i32(N); default: break; } break; } case ARMISD::VQSHLs: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQSHLs_v8i8(N); case MVT::v16i8: return Select_ARMISD_VQSHLs_v16i8(N); case MVT::v4i16: return Select_ARMISD_VQSHLs_v4i16(N); case MVT::v8i16: return Select_ARMISD_VQSHLs_v8i16(N); case MVT::v2i32: return Select_ARMISD_VQSHLs_v2i32(N); case MVT::v4i32: return Select_ARMISD_VQSHLs_v4i32(N); case MVT::v1i64: return Select_ARMISD_VQSHLs_v1i64(N); case MVT::v2i64: return Select_ARMISD_VQSHLs_v2i64(N); default: break; } break; } case ARMISD::VQSHLsu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQSHLsu_v8i8(N); case MVT::v16i8: return Select_ARMISD_VQSHLsu_v16i8(N); case MVT::v4i16: return Select_ARMISD_VQSHLsu_v4i16(N); case MVT::v8i16: return Select_ARMISD_VQSHLsu_v8i16(N); case MVT::v2i32: return Select_ARMISD_VQSHLsu_v2i32(N); case MVT::v4i32: return Select_ARMISD_VQSHLsu_v4i32(N); case MVT::v1i64: return Select_ARMISD_VQSHLsu_v1i64(N); case MVT::v2i64: return Select_ARMISD_VQSHLsu_v2i64(N); default: break; } break; } case ARMISD::VQSHLu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQSHLu_v8i8(N); case MVT::v16i8: return Select_ARMISD_VQSHLu_v16i8(N); case MVT::v4i16: return Select_ARMISD_VQSHLu_v4i16(N); case MVT::v8i16: return Select_ARMISD_VQSHLu_v8i16(N); case MVT::v2i32: return Select_ARMISD_VQSHLu_v2i32(N); case MVT::v4i32: return Select_ARMISD_VQSHLu_v4i32(N); case MVT::v1i64: return Select_ARMISD_VQSHLu_v1i64(N); case MVT::v2i64: return Select_ARMISD_VQSHLu_v2i64(N); default: break; } break; } case ARMISD::VQSHRNs: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQSHRNs_v8i8(N); case MVT::v4i16: return Select_ARMISD_VQSHRNs_v4i16(N); case MVT::v2i32: return Select_ARMISD_VQSHRNs_v2i32(N); default: break; } break; } case ARMISD::VQSHRNsu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQSHRNsu_v8i8(N); case MVT::v4i16: return Select_ARMISD_VQSHRNsu_v4i16(N); case MVT::v2i32: return Select_ARMISD_VQSHRNsu_v2i32(N); default: break; } break; } case ARMISD::VQSHRNu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VQSHRNu_v8i8(N); case MVT::v4i16: return Select_ARMISD_VQSHRNu_v4i16(N); case MVT::v2i32: return Select_ARMISD_VQSHRNu_v2i32(N); default: break; } break; } case ARMISD::VREV16: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VREV16_v8i8(N); case MVT::v16i8: return Select_ARMISD_VREV16_v16i8(N); default: break; } break; } case ARMISD::VREV32: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VREV32_v8i8(N); case MVT::v16i8: return Select_ARMISD_VREV32_v16i8(N); case MVT::v4i16: return Select_ARMISD_VREV32_v4i16(N); case MVT::v8i16: return Select_ARMISD_VREV32_v8i16(N); default: break; } break; } case ARMISD::VREV64: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VREV64_v8i8(N); case MVT::v16i8: return Select_ARMISD_VREV64_v16i8(N); case MVT::v4i16: return Select_ARMISD_VREV64_v4i16(N); case MVT::v8i16: return Select_ARMISD_VREV64_v8i16(N); case MVT::v2i32: return Select_ARMISD_VREV64_v2i32(N); case MVT::v4i32: return Select_ARMISD_VREV64_v4i32(N); case MVT::v2f32: return Select_ARMISD_VREV64_v2f32(N); case MVT::v4f32: return Select_ARMISD_VREV64_v4f32(N); default: break; } break; } case ARMISD::VRSHRN: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VRSHRN_v8i8(N); case MVT::v4i16: return Select_ARMISD_VRSHRN_v4i16(N); case MVT::v2i32: return Select_ARMISD_VRSHRN_v2i32(N); default: break; } break; } case ARMISD::VRSHRs: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VRSHRs_v8i8(N); case MVT::v16i8: return Select_ARMISD_VRSHRs_v16i8(N); case MVT::v4i16: return Select_ARMISD_VRSHRs_v4i16(N); case MVT::v8i16: return Select_ARMISD_VRSHRs_v8i16(N); case MVT::v2i32: return Select_ARMISD_VRSHRs_v2i32(N); case MVT::v4i32: return Select_ARMISD_VRSHRs_v4i32(N); case MVT::v1i64: return Select_ARMISD_VRSHRs_v1i64(N); case MVT::v2i64: return Select_ARMISD_VRSHRs_v2i64(N); default: break; } break; } case ARMISD::VRSHRu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VRSHRu_v8i8(N); case MVT::v16i8: return Select_ARMISD_VRSHRu_v16i8(N); case MVT::v4i16: return Select_ARMISD_VRSHRu_v4i16(N); case MVT::v8i16: return Select_ARMISD_VRSHRu_v8i16(N); case MVT::v2i32: return Select_ARMISD_VRSHRu_v2i32(N); case MVT::v4i32: return Select_ARMISD_VRSHRu_v4i32(N); case MVT::v1i64: return Select_ARMISD_VRSHRu_v1i64(N); case MVT::v2i64: return Select_ARMISD_VRSHRu_v2i64(N); default: break; } break; } case ARMISD::VSHL: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VSHL_v8i8(N); case MVT::v16i8: return Select_ARMISD_VSHL_v16i8(N); case MVT::v4i16: return Select_ARMISD_VSHL_v4i16(N); case MVT::v8i16: return Select_ARMISD_VSHL_v8i16(N); case MVT::v2i32: return Select_ARMISD_VSHL_v2i32(N); case MVT::v4i32: return Select_ARMISD_VSHL_v4i32(N); case MVT::v1i64: return Select_ARMISD_VSHL_v1i64(N); case MVT::v2i64: return Select_ARMISD_VSHL_v2i64(N); default: break; } break; } case ARMISD::VSHLLi: { switch (NVT) { case MVT::v8i16: return Select_ARMISD_VSHLLi_v8i16(N); case MVT::v4i32: return Select_ARMISD_VSHLLi_v4i32(N); case MVT::v2i64: return Select_ARMISD_VSHLLi_v2i64(N); default: break; } break; } case ARMISD::VSHLLs: { switch (NVT) { case MVT::v8i16: return Select_ARMISD_VSHLLs_v8i16(N); case MVT::v4i32: return Select_ARMISD_VSHLLs_v4i32(N); case MVT::v2i64: return Select_ARMISD_VSHLLs_v2i64(N); default: break; } break; } case ARMISD::VSHLLu: { switch (NVT) { case MVT::v8i16: return Select_ARMISD_VSHLLu_v8i16(N); case MVT::v4i32: return Select_ARMISD_VSHLLu_v4i32(N); case MVT::v2i64: return Select_ARMISD_VSHLLu_v2i64(N); default: break; } break; } case ARMISD::VSHRN: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VSHRN_v8i8(N); case MVT::v4i16: return Select_ARMISD_VSHRN_v4i16(N); case MVT::v2i32: return Select_ARMISD_VSHRN_v2i32(N); default: break; } break; } case ARMISD::VSHRs: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VSHRs_v8i8(N); case MVT::v16i8: return Select_ARMISD_VSHRs_v16i8(N); case MVT::v4i16: return Select_ARMISD_VSHRs_v4i16(N); case MVT::v8i16: return Select_ARMISD_VSHRs_v8i16(N); case MVT::v2i32: return Select_ARMISD_VSHRs_v2i32(N); case MVT::v4i32: return Select_ARMISD_VSHRs_v4i32(N); case MVT::v1i64: return Select_ARMISD_VSHRs_v1i64(N); case MVT::v2i64: return Select_ARMISD_VSHRs_v2i64(N); default: break; } break; } case ARMISD::VSHRu: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VSHRu_v8i8(N); case MVT::v16i8: return Select_ARMISD_VSHRu_v16i8(N); case MVT::v4i16: return Select_ARMISD_VSHRu_v4i16(N); case MVT::v8i16: return Select_ARMISD_VSHRu_v8i16(N); case MVT::v2i32: return Select_ARMISD_VSHRu_v2i32(N); case MVT::v4i32: return Select_ARMISD_VSHRu_v4i32(N); case MVT::v1i64: return Select_ARMISD_VSHRu_v1i64(N); case MVT::v2i64: return Select_ARMISD_VSHRu_v2i64(N); default: break; } break; } case ARMISD::VSLI: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VSLI_v8i8(N); case MVT::v16i8: return Select_ARMISD_VSLI_v16i8(N); case MVT::v4i16: return Select_ARMISD_VSLI_v4i16(N); case MVT::v8i16: return Select_ARMISD_VSLI_v8i16(N); case MVT::v2i32: return Select_ARMISD_VSLI_v2i32(N); case MVT::v4i32: return Select_ARMISD_VSLI_v4i32(N); case MVT::v1i64: return Select_ARMISD_VSLI_v1i64(N); case MVT::v2i64: return Select_ARMISD_VSLI_v2i64(N); default: break; } break; } case ARMISD::VSRI: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VSRI_v8i8(N); case MVT::v16i8: return Select_ARMISD_VSRI_v16i8(N); case MVT::v4i16: return Select_ARMISD_VSRI_v4i16(N); case MVT::v8i16: return Select_ARMISD_VSRI_v8i16(N); case MVT::v2i32: return Select_ARMISD_VSRI_v2i32(N); case MVT::v4i32: return Select_ARMISD_VSRI_v4i32(N); case MVT::v1i64: return Select_ARMISD_VSRI_v1i64(N); case MVT::v2i64: return Select_ARMISD_VSRI_v2i64(N); default: break; } break; } case ARMISD::VTST: { switch (NVT) { case MVT::v8i8: return Select_ARMISD_VTST_v8i8(N); case MVT::v16i8: return Select_ARMISD_VTST_v16i8(N); case MVT::v4i16: return Select_ARMISD_VTST_v4i16(N); case MVT::v8i16: return Select_ARMISD_VTST_v8i16(N); case MVT::v2i32: return Select_ARMISD_VTST_v2i32(N); case MVT::v4i32: return Select_ARMISD_VTST_v4i32(N); default: break; } break; } case ARMISD::Wrapper: { switch (NVT) { case MVT::i32: return Select_ARMISD_Wrapper_i32(N); default: break; } break; } case ARMISD::WrapperJT: { switch (NVT) { case MVT::i32: return Select_ARMISD_WrapperJT_i32(N); default: break; } break; } case ARMISD::tCALL: { return Select_ARMISD_tCALL(N); break; } case ISD::ADD: { switch (NVT) { case MVT::i32: return Select_ISD_ADD_i32(N); case MVT::v8i8: return Select_ISD_ADD_v8i8(N); case MVT::v16i8: return Select_ISD_ADD_v16i8(N); case MVT::v4i16: return Select_ISD_ADD_v4i16(N); case MVT::v8i16: return Select_ISD_ADD_v8i16(N); case MVT::v2i32: return Select_ISD_ADD_v2i32(N); case MVT::v4i32: return Select_ISD_ADD_v4i32(N); case MVT::v1i64: return Select_ISD_ADD_v1i64(N); case MVT::v2i64: return Select_ISD_ADD_v2i64(N); default: break; } break; } case ISD::ADDC: { switch (NVT) { case MVT::i32: return Select_ISD_ADDC_i32(N); default: break; } break; } case ISD::ADDE: { switch (NVT) { case MVT::i32: return Select_ISD_ADDE_i32(N); default: break; } break; } case ISD::AND: { switch (NVT) { case MVT::i32: return Select_ISD_AND_i32(N); case MVT::v2i32: return Select_ISD_AND_v2i32(N); case MVT::v4i32: return Select_ISD_AND_v4i32(N); default: break; } break; } case ISD::ATOMIC_CMP_SWAP: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_CMP_SWAP_i32(N); default: break; } break; } case ISD::ATOMIC_LOAD_ADD: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_LOAD_ADD_i32(N); default: break; } break; } case ISD::ATOMIC_LOAD_AND: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_LOAD_AND_i32(N); default: break; } break; } case ISD::ATOMIC_LOAD_NAND: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_LOAD_NAND_i32(N); default: break; } break; } case ISD::ATOMIC_LOAD_OR: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_LOAD_OR_i32(N); default: break; } break; } case ISD::ATOMIC_LOAD_SUB: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_LOAD_SUB_i32(N); default: break; } break; } case ISD::ATOMIC_LOAD_XOR: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_LOAD_XOR_i32(N); default: break; } break; } case ISD::ATOMIC_SWAP: { switch (NVT) { case MVT::i32: return Select_ISD_ATOMIC_SWAP_i32(N); default: break; } break; } case ISD::BIT_CONVERT: { switch (NVT) { case MVT::i32: return Select_ISD_BIT_CONVERT_i32(N); case MVT::f32: return Select_ISD_BIT_CONVERT_f32(N); case MVT::f64: return Select_ISD_BIT_CONVERT_f64(N); case MVT::v8i8: return Select_ISD_BIT_CONVERT_v8i8(N); case MVT::v16i8: return Select_ISD_BIT_CONVERT_v16i8(N); case MVT::v4i16: return Select_ISD_BIT_CONVERT_v4i16(N); case MVT::v8i16: return Select_ISD_BIT_CONVERT_v8i16(N); case MVT::v2i32: return Select_ISD_BIT_CONVERT_v2i32(N); case MVT::v4i32: return Select_ISD_BIT_CONVERT_v4i32(N); case MVT::v1i64: return Select_ISD_BIT_CONVERT_v1i64(N); case MVT::v2i64: return Select_ISD_BIT_CONVERT_v2i64(N); case MVT::v2f32: return Select_ISD_BIT_CONVERT_v2f32(N); case MVT::v4f32: return Select_ISD_BIT_CONVERT_v4f32(N); case MVT::v2f64: return Select_ISD_BIT_CONVERT_v2f64(N); default: break; } break; } case ISD::BR: { return Select_ISD_BR(N); break; } case ISD::BRIND: { return Select_ISD_BRIND(N); break; } case ISD::BSWAP: { switch (NVT) { case MVT::i32: return Select_ISD_BSWAP_i32(N); default: break; } break; } case ISD::BUILD_VECTOR: { switch (NVT) { case MVT::v8i8: return Select_ISD_BUILD_VECTOR_v8i8(N); case MVT::v16i8: return Select_ISD_BUILD_VECTOR_v16i8(N); case MVT::v4i16: return Select_ISD_BUILD_VECTOR_v4i16(N); case MVT::v8i16: return Select_ISD_BUILD_VECTOR_v8i16(N); case MVT::v2i32: return Select_ISD_BUILD_VECTOR_v2i32(N); case MVT::v4i32: return Select_ISD_BUILD_VECTOR_v4i32(N); case MVT::v1i64: return Select_ISD_BUILD_VECTOR_v1i64(N); case MVT::v2i64: return Select_ISD_BUILD_VECTOR_v2i64(N); default: break; } break; } case ISD::CALLSEQ_END: { return Select_ISD_CALLSEQ_END(N); break; } case ISD::CALLSEQ_START: { return Select_ISD_CALLSEQ_START(N); break; } case ISD::CTLZ: { switch (NVT) { case MVT::i32: return Select_ISD_CTLZ_i32(N); default: break; } break; } case ISD::Constant: { switch (NVT) { case MVT::i32: return Select_ISD_Constant_i32(N); default: break; } break; } case ISD::ConstantFP: { switch (NVT) { case MVT::f32: return Select_ISD_ConstantFP_f32(N); case MVT::f64: return Select_ISD_ConstantFP_f64(N); default: break; } break; } case ISD::EXTRACT_VECTOR_ELT: { switch (NVT) { case MVT::i32: return Select_ISD_EXTRACT_VECTOR_ELT_i32(N); case MVT::f32: return Select_ISD_EXTRACT_VECTOR_ELT_f32(N); case MVT::f64: return Select_ISD_EXTRACT_VECTOR_ELT_f64(N); default: break; } break; } case ISD::FABS: { switch (NVT) { case MVT::f32: return Select_ISD_FABS_f32(N); case MVT::f64: return Select_ISD_FABS_f64(N); default: break; } break; } case ISD::FADD: { switch (NVT) { case MVT::f32: return Select_ISD_FADD_f32(N); case MVT::f64: return Select_ISD_FADD_f64(N); case MVT::v2f32: return Select_ISD_FADD_v2f32(N); case MVT::v4f32: return Select_ISD_FADD_v4f32(N); default: break; } break; } case ISD::FDIV: { switch (NVT) { case MVT::f32: return Select_ISD_FDIV_f32(N); case MVT::f64: return Select_ISD_FDIV_f64(N); default: break; } break; } case ISD::FMUL: { switch (NVT) { case MVT::f32: return Select_ISD_FMUL_f32(N); case MVT::f64: return Select_ISD_FMUL_f64(N); case MVT::v2f32: return Select_ISD_FMUL_v2f32(N); case MVT::v4f32: return Select_ISD_FMUL_v4f32(N); default: break; } break; } case ISD::FNEG: { switch (NVT) { case MVT::f32: return Select_ISD_FNEG_f32(N); case MVT::f64: return Select_ISD_FNEG_f64(N); case MVT::v2f32: return Select_ISD_FNEG_v2f32(N); case MVT::v4f32: return Select_ISD_FNEG_v4f32(N); default: break; } break; } case ISD::FP_EXTEND: { switch (NVT) { case MVT::f64: return Select_ISD_FP_EXTEND_f64(N); default: break; } break; } case ISD::FP_ROUND: { switch (NVT) { case MVT::f32: return Select_ISD_FP_ROUND_f32(N); default: break; } break; } case ISD::FP_TO_SINT: { switch (NVT) { case MVT::v2i32: return Select_ISD_FP_TO_SINT_v2i32(N); case MVT::v4i32: return Select_ISD_FP_TO_SINT_v4i32(N); default: break; } break; } case ISD::FP_TO_UINT: { switch (NVT) { case MVT::v2i32: return Select_ISD_FP_TO_UINT_v2i32(N); case MVT::v4i32: return Select_ISD_FP_TO_UINT_v4i32(N); default: break; } break; } case ISD::FSQRT: { switch (NVT) { case MVT::f32: return Select_ISD_FSQRT_f32(N); case MVT::f64: return Select_ISD_FSQRT_f64(N); default: break; } break; } case ISD::FSUB: { switch (NVT) { case MVT::f32: return Select_ISD_FSUB_f32(N); case MVT::f64: return Select_ISD_FSUB_f64(N); case MVT::v2f32: return Select_ISD_FSUB_v2f32(N); case MVT::v4f32: return Select_ISD_FSUB_v4f32(N); default: break; } break; } case ISD::INSERT_VECTOR_ELT: { switch (NVT) { case MVT::v8i8: return Select_ISD_INSERT_VECTOR_ELT_v8i8(N); case MVT::v16i8: return Select_ISD_INSERT_VECTOR_ELT_v16i8(N); case MVT::v4i16: return Select_ISD_INSERT_VECTOR_ELT_v4i16(N); case MVT::v8i16: return Select_ISD_INSERT_VECTOR_ELT_v8i16(N); case MVT::v2i32: return Select_ISD_INSERT_VECTOR_ELT_v2i32(N); case MVT::v4i32: return Select_ISD_INSERT_VECTOR_ELT_v4i32(N); case MVT::v2f32: return Select_ISD_INSERT_VECTOR_ELT_v2f32(N); case MVT::v4f32: return Select_ISD_INSERT_VECTOR_ELT_v4f32(N); case MVT::v2f64: return Select_ISD_INSERT_VECTOR_ELT_v2f64(N); default: break; } break; } case ISD::INTRINSIC_VOID: { return Select_ISD_INTRINSIC_VOID(N); break; } case ISD::INTRINSIC_WO_CHAIN: { switch (NVT) { case MVT::v8i8: return Select_ISD_INTRINSIC_WO_CHAIN_v8i8(N); case MVT::v16i8: return Select_ISD_INTRINSIC_WO_CHAIN_v16i8(N); case MVT::v4i16: return Select_ISD_INTRINSIC_WO_CHAIN_v4i16(N); case MVT::v8i16: return Select_ISD_INTRINSIC_WO_CHAIN_v8i16(N); case MVT::v2i32: return Select_ISD_INTRINSIC_WO_CHAIN_v2i32(N); case MVT::v4i32: return Select_ISD_INTRINSIC_WO_CHAIN_v4i32(N); case MVT::v1i64: return Select_ISD_INTRINSIC_WO_CHAIN_v1i64(N); case MVT::v2i64: return Select_ISD_INTRINSIC_WO_CHAIN_v2i64(N); case MVT::v2f32: return Select_ISD_INTRINSIC_WO_CHAIN_v2f32(N); case MVT::v4f32: return Select_ISD_INTRINSIC_WO_CHAIN_v4f32(N); default: break; } break; } case ISD::INTRINSIC_W_CHAIN: { switch (NVT) { case MVT::v8i8: return Select_ISD_INTRINSIC_W_CHAIN_v8i8(N); case MVT::v16i8: return Select_ISD_INTRINSIC_W_CHAIN_v16i8(N); case MVT::v4i16: return Select_ISD_INTRINSIC_W_CHAIN_v4i16(N); case MVT::v8i16: return Select_ISD_INTRINSIC_W_CHAIN_v8i16(N); case MVT::v2i32: return Select_ISD_INTRINSIC_W_CHAIN_v2i32(N); case MVT::v4i32: return Select_ISD_INTRINSIC_W_CHAIN_v4i32(N); case MVT::v1i64: return Select_ISD_INTRINSIC_W_CHAIN_v1i64(N); case MVT::v2i64: return Select_ISD_INTRINSIC_W_CHAIN_v2i64(N); case MVT::v2f32: return Select_ISD_INTRINSIC_W_CHAIN_v2f32(N); case MVT::v4f32: return Select_ISD_INTRINSIC_W_CHAIN_v4f32(N); default: break; } break; } case ISD::LOAD: { switch (NVT) { case MVT::i32: return Select_ISD_LOAD_i32(N); case MVT::f32: return Select_ISD_LOAD_f32(N); case MVT::f64: return Select_ISD_LOAD_f64(N); case MVT::v2f64: return Select_ISD_LOAD_v2f64(N); default: break; } break; } case ISD::MUL: { switch (NVT) { case MVT::i32: return Select_ISD_MUL_i32(N); case MVT::v8i8: return Select_ISD_MUL_v8i8(N); case MVT::v16i8: return Select_ISD_MUL_v16i8(N); case MVT::v4i16: return Select_ISD_MUL_v4i16(N); case MVT::v8i16: return Select_ISD_MUL_v8i16(N); case MVT::v2i32: return Select_ISD_MUL_v2i32(N); case MVT::v4i32: return Select_ISD_MUL_v4i32(N); default: break; } break; } case ISD::MULHS: { switch (NVT) { case MVT::i32: return Select_ISD_MULHS_i32(N); default: break; } break; } case ISD::OR: { switch (NVT) { case MVT::i32: return Select_ISD_OR_i32(N); case MVT::v2i32: return Select_ISD_OR_v2i32(N); case MVT::v4i32: return Select_ISD_OR_v4i32(N); default: break; } break; } case ISD::ROTR: { switch (NVT) { case MVT::i32: return Select_ISD_ROTR_i32(N); default: break; } break; } case ISD::SCALAR_TO_VECTOR: { switch (NVT) { case MVT::v8i8: return Select_ISD_SCALAR_TO_VECTOR_v8i8(N); case MVT::v16i8: return Select_ISD_SCALAR_TO_VECTOR_v16i8(N); case MVT::v4i16: return Select_ISD_SCALAR_TO_VECTOR_v4i16(N); case MVT::v8i16: return Select_ISD_SCALAR_TO_VECTOR_v8i16(N); case MVT::v2i32: return Select_ISD_SCALAR_TO_VECTOR_v2i32(N); case MVT::v4i32: return Select_ISD_SCALAR_TO_VECTOR_v4i32(N); case MVT::v2f32: return Select_ISD_SCALAR_TO_VECTOR_v2f32(N); case MVT::v4f32: return Select_ISD_SCALAR_TO_VECTOR_v4f32(N); case MVT::v2f64: return Select_ISD_SCALAR_TO_VECTOR_v2f64(N); default: break; } break; } case ISD::SHL: { switch (NVT) { case MVT::i32: return Select_ISD_SHL_i32(N); default: break; } break; } case ISD::SIGN_EXTEND_INREG: { switch (NVT) { case MVT::i32: return Select_ISD_SIGN_EXTEND_INREG_i32(N); default: break; } break; } case ISD::SINT_TO_FP: { switch (NVT) { case MVT::v2f32: return Select_ISD_SINT_TO_FP_v2f32(N); case MVT::v4f32: return Select_ISD_SINT_TO_FP_v4f32(N); default: break; } break; } case ISD::SRA: { switch (NVT) { case MVT::i32: return Select_ISD_SRA_i32(N); default: break; } break; } case ISD::SRL: { switch (NVT) { case MVT::i32: return Select_ISD_SRL_i32(N); default: break; } break; } case ISD::STORE: { switch (NVT) { case MVT::i32: return Select_ISD_STORE_i32(N); default: return Select_ISD_STORE(N); break; } break; } case ISD::SUB: { switch (NVT) { case MVT::i32: return Select_ISD_SUB_i32(N); case MVT::v8i8: return Select_ISD_SUB_v8i8(N); case MVT::v16i8: return Select_ISD_SUB_v16i8(N); case MVT::v4i16: return Select_ISD_SUB_v4i16(N); case MVT::v8i16: return Select_ISD_SUB_v8i16(N); case MVT::v2i32: return Select_ISD_SUB_v2i32(N); case MVT::v4i32: return Select_ISD_SUB_v4i32(N); case MVT::v1i64: return Select_ISD_SUB_v1i64(N); case MVT::v2i64: return Select_ISD_SUB_v2i64(N); default: break; } break; } case ISD::SUBC: { switch (NVT) { case MVT::i32: return Select_ISD_SUBC_i32(N); default: break; } break; } case ISD::SUBE: { switch (NVT) { case MVT::i32: return Select_ISD_SUBE_i32(N); default: break; } break; } case ISD::UINT_TO_FP: { switch (NVT) { case MVT::v2f32: return Select_ISD_UINT_TO_FP_v2f32(N); case MVT::v4f32: return Select_ISD_UINT_TO_FP_v4f32(N); default: break; } break; } case ISD::XOR: { switch (NVT) { case MVT::i32: return Select_ISD_XOR_i32(N); case MVT::v2i32: return Select_ISD_XOR_v2i32(N); case MVT::v4i32: return Select_ISD_XOR_v4i32(N); default: break; } break; } } // end of big switch. if (N->getOpcode() != ISD::INTRINSIC_W_CHAIN && N->getOpcode() != ISD::INTRINSIC_WO_CHAIN && N->getOpcode() != ISD::INTRINSIC_VOID) { CannotYetSelect(N); } else { CannotYetSelectIntrinsic(N); } return NULL; }